| 476 | } |
| 477 | |
| 478 | void CondExecPred::scn_do_execute() { |
| 479 | auto&& mgr = owner_graph()->static_infer_manager(); |
| 480 | PredEvaluator eval{*this, mgr.infer_value(input().back())}; |
| 481 | auto mode = m_param.mode; |
| 482 | if (mode == Mode::CASE || mode == Mode::CASE_FALLBACK) { |
| 483 | bool enabled = false; |
| 484 | for (size_t i = 0; i < input().size() - 1; ++i) { |
| 485 | auto cur = eval(mgr.infer_value(input(i))) == PredEvaluator::EQ; |
| 486 | m_masks[i]->enable(cur); |
| 487 | enabled |= cur; |
| 488 | } |
| 489 | if (mode == Mode::CASE_FALLBACK) { |
| 490 | m_masks.back()->enable(!enabled); |
| 491 | } |
| 492 | } else { |
| 493 | mgb_assert(mode == Mode::PIECEWISE); |
| 494 | const DeviceTensorND *val_prev = nullptr, *val_cur = nullptr; |
| 495 | for (size_t i = 0; i < input().size(); ++i) { |
| 496 | val_prev = val_cur; |
| 497 | if (i == input().size() - 1) { |
| 498 | val_cur = nullptr; |
| 499 | } else { |
| 500 | val_cur = &mgr.infer_value(input(i)); |
| 501 | } |
| 502 | |
| 503 | PredEvaluator::Result el, er; |
| 504 | if (!val_prev) { |
| 505 | el = PredEvaluator::GT; |
| 506 | } else { |
| 507 | el = eval(*val_prev); |
| 508 | } |
| 509 | if (!val_cur) { |
| 510 | er = PredEvaluator::LT; |
| 511 | } else { |
| 512 | er = eval(*val_cur); |
| 513 | } |
| 514 | m_masks[i]->enable(el != PredEvaluator::LT && er == PredEvaluator::LT); |
| 515 | } |
| 516 | } |
| 517 | } |
| 518 | |
| 519 | VarNode* CondExecPred::out_var_from_mask(ExecutionMask* mask) const { |
| 520 | for (size_t i = 0; i < output().size(); ++i) { |
nothing calls this directly
no test coverage detected