From: Luo Xionghu <[email protected]> This regression is caused by structural analysis when check the if-then node, acturally there are four types of if-then node according to the topology and fallthrough information. fallthrough check is added in this patch.
Signed-off-by: Luo Xionghu <[email protected]> --- backend/src/backend/gen_insn_selection.cpp | 4 +++- backend/src/ir/function.hpp | 5 +++++ backend/src/ir/structural_analysis.cpp | 9 ++++++++- backend/src/ir/structural_analysis.hpp | 16 +++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp index b7a39af..9a552b1 100644 --- a/backend/src/backend/gen_insn_selection.cpp +++ b/backend/src/backend/gen_insn_selection.cpp @@ -4018,7 +4018,9 @@ namespace gbe sel.curr.physicalFlag = 0; sel.curr.flagIndex = (uint64_t)pred; sel.curr.externFlag = 1; - sel.curr.inversePredicate = 1; + if(insn.getParent()->need_reverse ){ + sel.curr.inversePredicate = 1; + } sel.curr.predicate = GEN_PREDICATE_NORMAL; sel.IF(GenRegister::immd(0), jip, uip); sel.curr.inversePredicate = 0; diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp index c5582b4..b877bce 100644 --- a/backend/src/ir/function.hpp +++ b/backend/src/ir/function.hpp @@ -87,6 +87,11 @@ namespace ir { set <Register> definedPhiRegs; /* these three are used by structure transforming */ public: + /*if need_reverse is true, need to reverse prediction. + *if condition is TRUE, IF instruction will execute the following block, + * different from BRA instruction, so all the IF instruction need_reverse + * except two special case(fallthrough is the same with succs.). */ + bool need_reverse; /* if needEndif is true, it means that this bb is the exit of an * outermost structure, so this block needs another endif to match * the if inserted at the entry of this structure, otherwise this diff --git a/backend/src/ir/structural_analysis.cpp b/backend/src/ir/structural_analysis.cpp index dfc2118..c106fa7 100644 --- a/backend/src/ir/structural_analysis.cpp +++ b/backend/src/ir/structural_analysis.cpp @@ -120,6 +120,7 @@ namespace analysis /* since this node is an if node, so we remove the BRA instruction at the bottom of the exit BB of 'node', * and insert IF instead */ + pbb->need_reverse = node->need_reverse; pbb->erase(it); ir::Instruction insn = ir::IF(matchingElseLabel, reg); ir::Instruction* p_new_insn = pbb->getParent().newInstruction(insn); @@ -724,7 +725,7 @@ namespace analysis n = *(++(node->succs().begin())); /* check for if node then n */ - if(n->succs().size() == 1 && + if( n->succs().size() == 1 && n->preds().size() == 1 && *(n->succs().begin()) == m && !n->hasBarrier() && !node->hasBarrier()) @@ -734,6 +735,9 @@ namespace analysis nset.insert(n); Node* p = new IfThenNode(node, n); + if(node->fallthrough() == m){ + node->need_reverse = false; + } if(node->canBeHandled == false || n->canBeHandled == false) p->canBeHandled = false; @@ -752,6 +756,9 @@ namespace analysis nset.insert(m); Node* p = new IfThenNode(node, m); + if(node->fallthrough() == n){ + node->need_reverse = false; + } if(node->canBeHandled == false || m->canBeHandled == false) p->canBeHandled = false; diff --git a/backend/src/ir/structural_analysis.hpp b/backend/src/ir/structural_analysis.hpp index 06c2f5f..f7a34d1 100644 --- a/backend/src/ir/structural_analysis.hpp +++ b/backend/src/ir/structural_analysis.hpp @@ -87,7 +87,7 @@ namespace analysis class Node { public: - Node(RegionType rtype, const NodeList& children): has_barrier(false), mark(false), canBeHandled(true) + Node(RegionType rtype, const NodeList& children): has_barrier(false), mark(false), canBeHandled(true), need_reverse(true) { this->rtype = rtype; this->children = children; @@ -118,6 +118,20 @@ namespace analysis bool canBeHandled; //label is for debug int label; + /* need_reverse should be false under two circumstance, + * fallthrough is the same with succs: + * (1) n->succs == m && node->fallthrough == m + * node + * | \ + * | \ + * m<--n + * (2) m->succs == n && node->fallthrough == n + * node + * | \ + * | \ + * m-->n + * */ + bool need_reverse; }; /* represents basic block */ -- 1.7.9.5 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
