[Beignet] [PATCH v2] fix opencv_test_imgproc subcase OCL_ImgProc/Accumulate.Mask regression.

xionghu.luo at intel.com xionghu.luo at intel.com
Mon Aug 25 19:12:28 PDT 2014


From: Luo Xionghu <xionghu.luo at intel.com>

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.

v2: add inversePredicate member and function for BranchInstruction;
print the exact meanning of IF instruction in GEN_IR.

Signed-off-by: Luo Xionghu <xionghu.luo at intel.com>
---
 backend/src/backend/gen_insn_selection.cpp |    2 +-
 backend/src/ir/instruction.cpp             |   12 +++++++++---
 backend/src/ir/instruction.hpp             |    4 +++-
 backend/src/ir/structural_analysis.cpp     |   10 ++++++++--
 backend/src/ir/structural_analysis.hpp     |   16 +++++++++++++++-
 5 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index b7a39af..170a9d8 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -4018,7 +4018,7 @@ namespace gbe
           sel.curr.physicalFlag = 0;
           sel.curr.flagIndex = (uint64_t)pred;
           sel.curr.externFlag = 1;
-          sel.curr.inversePredicate = 1;
+          sel.curr.inversePredicate = insn.getInversePredicated();
           sel.curr.predicate = GEN_PREDICATE_NORMAL;
           sel.IF(GenRegister::immd(0), jip, uip);
           sel.curr.inversePredicate = 0;
diff --git a/backend/src/ir/instruction.cpp b/backend/src/ir/instruction.cpp
index bfb2000..370fb87 100644
--- a/backend/src/ir/instruction.cpp
+++ b/backend/src/ir/instruction.cpp
@@ -348,13 +348,14 @@ namespace ir {
       public NDstPolicy<BranchInstruction, 0>
     {
     public:
-      INLINE BranchInstruction(Opcode op, LabelIndex labelIndex, Register predicate) {
+      INLINE BranchInstruction(Opcode op, LabelIndex labelIndex, Register predicate, bool inv_pred=false) {
         GBE_ASSERT(op == OP_BRA || op == OP_IF);
         this->opcode = op;
         this->predicate = predicate;
         this->labelIndex = labelIndex;
         this->hasPredicate = true;
         this->hasLabel = true;
+        this->inversePredicate = inv_pred;
       }
       INLINE BranchInstruction(Opcode op, LabelIndex labelIndex) {
         GBE_ASSERT(op == OP_BRA || op == OP_ELSE || op == OP_ENDIF);
@@ -385,11 +386,13 @@ namespace ir {
         predicate = reg;
       }
       INLINE bool isPredicated(void) const { return hasPredicate; }
+      INLINE bool getInversePredicated(void) const { return inversePredicate; }
       INLINE bool wellFormed(const Function &fn, std::string &why) const;
       INLINE void out(std::ostream &out, const Function &fn) const;
       Register predicate;    //!< Predication means conditional branch
       LabelIndex labelIndex; //!< Index of the label the branch targets
       bool hasPredicate:1;   //!< Is it predicated?
+      bool inversePredicate:1;   //!< Is it inverse predicated?
       bool hasLabel:1;       //!< Is there any target label?
       Register dst[0];       //!< No destination
     };
@@ -1142,6 +1145,8 @@ namespace ir {
 
     INLINE void BranchInstruction::out(std::ostream &out, const Function &fn) const {
       this->outOpcode(out);
+      if(opcode == OP_IF && inversePredicate)
+        out << " !";
       if (hasPredicate)
         out << "<%" << this->getSrc(fn, 0) << ">";
       if (hasLabel) out << " -> label$" << labelIndex;
@@ -1463,6 +1468,7 @@ DECL_MEM_FN(LoadInstruction, bool, isAligned(void), isAligned())
 DECL_MEM_FN(LoadImmInstruction, Type, getType(void), getType())
 DECL_MEM_FN(LabelInstruction, LabelIndex, getLabelIndex(void), getLabelIndex())
 DECL_MEM_FN(BranchInstruction, bool, isPredicated(void), isPredicated())
+DECL_MEM_FN(BranchInstruction, bool, getInversePredicated(void), getInversePredicated())
 DECL_MEM_FN(BranchInstruction, LabelIndex, getLabelIndex(void), getLabelIndex())
 DECL_MEM_FN(SyncInstruction, uint32_t, getParameters(void), getParameters())
 DECL_MEM_FN(SampleInstruction, Type, getSrcType(void), getSrcType())
@@ -1615,8 +1621,8 @@ DECL_MEM_FN(GetImageInfoInstruction, uint8_t, getImageIndex(void), getImageIndex
   }
 
   // IF
-  Instruction IF(LabelIndex labelIndex, Register pred) {
-    return internal::BranchInstruction(OP_IF, labelIndex, pred).convert();
+  Instruction IF(LabelIndex labelIndex, Register pred, bool inv_pred) {
+    return internal::BranchInstruction(OP_IF, labelIndex, pred, inv_pred).convert();
   }
 
   // ELSE
diff --git a/backend/src/ir/instruction.hpp b/backend/src/ir/instruction.hpp
index e245638..39fb2db 100644
--- a/backend/src/ir/instruction.hpp
+++ b/backend/src/ir/instruction.hpp
@@ -430,6 +430,8 @@ namespace ir {
   public:
     /*! Indicate if the branch is predicated */
     bool isPredicated(void) const;
+    /*! Indicate if the branch is inverse predicated */
+    bool getInversePredicated(void) const;
     /*! Return the predicate register (if predicated) */
     RegisterData getPredicate(void) const {
       GBE_ASSERTM(this->isPredicated() == true, "Branch is not predicated");
@@ -663,7 +665,7 @@ namespace ir {
   /*! (pred) bra labelIndex */
   Instruction BRA(LabelIndex labelIndex, Register pred);
   /*! (pred) if labelIndex */
-  Instruction IF(LabelIndex labelIndex, Register pred);
+  Instruction IF(LabelIndex labelIndex, Register pred, bool inv_pred=true);
   /*! else labelIndex */
   Instruction ELSE(LabelIndex labelIndex);
   /*! endif */
diff --git a/backend/src/ir/structural_analysis.cpp b/backend/src/ir/structural_analysis.cpp
index dfc2118..e6fa777 100644
--- a/backend/src/ir/structural_analysis.cpp
+++ b/backend/src/ir/structural_analysis.cpp
@@ -121,7 +121,7 @@ namespace analysis
      * and insert IF instead
      */
     pbb->erase(it);
-    ir::Instruction insn = ir::IF(matchingElseLabel, reg);
+    ir::Instruction insn = ir::IF(matchingElseLabel, reg, node->inversePredicate);
     ir::Instruction* p_new_insn = pbb->getParent().newInstruction(insn);
     pbb->append(*p_new_insn);
     pbb->matchingEndifLabel = matchingEndifLabel;
@@ -724,7 +724,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 +734,9 @@ namespace analysis
         nset.insert(n);
 
         Node* p = new IfThenNode(node, n);
+        if(node->fallthrough() == m){
+          node->inversePredicate = false;
+        }
 
         if(node->canBeHandled == false || n->canBeHandled == false)
           p->canBeHandled = false;
@@ -752,6 +755,9 @@ namespace analysis
         nset.insert(m);
 
         Node* p = new IfThenNode(node, m);
+        if(node->fallthrough() == n){
+          node->inversePredicate = 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..03df39e 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), inversePredicate(true)
     {
       this->rtype = rtype;
       this->children = children;
@@ -118,6 +118,20 @@ namespace analysis
     bool canBeHandled;
     //label is for debug
     int label;
+    /* inversePredicate 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 inversePredicate;
   };
 
   /* represents basic block */
-- 
1.7.9.5



More information about the Beignet mailing list