[Beignet] [PATCH] GBE: Fix a bug in phicopy coaleasing.

Ruiling Song ruiling.song at intel.com
Thu Jul 16 01:40:33 PDT 2015


we cannot simply 'break', the isOpt is not set correctly when break.
let's use if() check which will not interfere with the old isOpt logic.

Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
 backend/src/llvm/llvm_gen_backend.cpp | 89 +++++++++++++++++------------------
 1 file changed, 44 insertions(+), 45 deletions(-)

diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 0ec113d..1e141cd 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -2191,55 +2191,54 @@ namespace gbe
         const ir::Register phiCopySrc = phiCopyDefInsn->getSrc(0);
         const ir::UseSet *phiCopySrcUse = dag->getRegUse(phiCopySrc);
         const ir::DefSet *phiCopySrcDef = dag->getRegDef(phiCopySrc);
-        // non-ssa value. skip opt on such kind of value
-        if (phiCopySrcDef->size() > 1) break;
-        // we can only coalesce instruction dest
-        if ((*(phiCopySrcDef->begin()))->getType() != ValueDef::DEF_INSN_DST) break;
-
-        const ir::Instruction *phiCopySrcDefInsn = (*(phiCopySrcDef->begin()))->getInstruction();
-        if(bb == phiDefBB && bb == phiCopySrcDefInsn->getParent()) {
-          // phiCopy, phiCopySrc defined in same basicblock as phi
-          // try to coalease phiCopy and phiCopySrc first.
-          // consider below situation:
-          // bb1:
-          //    ...
-          // bb2:
-          //    x = phi [x1, bb1], [x2, bb2]
-          //    x2 = x+1;
-          // after de-ssa:
-          // bb2:
-          //    mov x, x-copy
-          //    add x2, x, 1
-          //    mov x-copy, x2
-          //  obviously x2, x-copy and x2 can be mapped to same virtual register
-
-          ir::BasicBlock::const_iterator iter = ir::BasicBlock::const_iterator(phiCopySrcDefInsn);
-          ir::BasicBlock::const_iterator iterE = bb->end();
-          // check no use of phi in this basicblock between [phiCopySrc def, bb end]
-          bool phiPhiCopySrcInterfere = false;
-          while (iter != iterE) {
-            const ir::Instruction *insn = iter.node();
-            // check phiUse
-            for (unsigned i = 0; i < insn->getSrcNum(); i++) {
-              ir::Register src = insn->getSrc(i);
-              if (src == phi) {
-                phiPhiCopySrcInterfere = true; break;
+
+        // we should only do coaleasing on instruction-def and ssa-value
+        if (phiCopySrcDef->size() == 1 && (*(phiCopySrcDef->begin()))->getType() == ValueDef::DEF_INSN_DST) {
+          const ir::Instruction *phiCopySrcDefInsn = (*(phiCopySrcDef->begin()))->getInstruction();
+          if(bb == phiDefBB && bb == phiCopySrcDefInsn->getParent()) {
+            // phiCopy, phiCopySrc defined in same basicblock as phi
+            // try to coalease phiCopy and phiCopySrc first.
+            // consider below situation:
+            // bb1:
+            //    ...
+            // bb2:
+            //    x = phi [x1, bb1], [x2, bb2]
+            //    x2 = x+1;
+            // after de-ssa:
+            // bb2:
+            //    mov x, x-copy
+            //    add x2, x, 1
+            //    mov x-copy, x2
+            //  obviously x2, x-copy and x2 can be mapped to same virtual register
+
+            ir::BasicBlock::const_iterator iter = ir::BasicBlock::const_iterator(phiCopySrcDefInsn);
+            ir::BasicBlock::const_iterator iterE = bb->end();
+            // check no use of phi in this basicblock between [phiCopySrc def, bb end]
+            bool phiPhiCopySrcInterfere = false;
+            while (iter != iterE) {
+              const ir::Instruction *insn = iter.node();
+              // check phiUse
+              for (unsigned i = 0; i < insn->getSrcNum(); i++) {
+                ir::Register src = insn->getSrc(i);
+                if (src == phi) {
+                  phiPhiCopySrcInterfere = true; break;
+                }
               }
+              ++iter;
             }
-            ++iter;
-          }
-          if (!phiPhiCopySrcInterfere) {
-            // phiCopy source can be coaleased with phiCopy
-            const_cast<Instruction *>(phiCopyDefInsn)->remove();
+            if (!phiPhiCopySrcInterfere) {
+              // phiCopy source can be coaleased with phiCopy
+              const_cast<Instruction *>(phiCopyDefInsn)->remove();
 
-            for (auto &s : *phiCopySrcDef) {
-              const Instruction *phiSrcDefInsn = s->getInstruction();
-              replaceDst(const_cast<Instruction *>(phiSrcDefInsn), phiCopySrc, phiCopy);
-            }
+              for (auto &s : *phiCopySrcDef) {
+                const Instruction *phiSrcDefInsn = s->getInstruction();
+                replaceDst(const_cast<Instruction *>(phiSrcDefInsn), phiCopySrc, phiCopy);
+              }
 
-            for (auto &s : *phiCopySrcUse) {
-              const Instruction *phiSrcUseInsn = s->getInstruction();
-              replaceSrc(const_cast<Instruction *>(phiSrcUseInsn), phiCopySrc, phiCopy);
+              for (auto &s : *phiCopySrcUse) {
+                const Instruction *phiSrcUseInsn = s->getInstruction();
+                replaceSrc(const_cast<Instruction *>(phiSrcUseInsn), phiCopySrc, phiCopy);
+              }
             }
           }
         }
-- 
2.3.6



More information about the Beignet mailing list