[Beignet] [PATCH 2/5] GBE: refine longjmp checking.

Zhigang Gong zhigang.gong at intel.com
Sun Sep 13 23:19:33 PDT 2015


Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
---
 backend/src/backend/gen_insn_selection.cpp |  2 +-
 backend/src/ir/function.hpp                | 17 +++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index ab00269..57dbec9 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -1154,7 +1154,7 @@ namespace gbe
     SelectionInstruction *insn = this->appendInsn(SEL_OP_JMPI, 0, 1);
     insn->src(0) = src;
     insn->index = index.value();
-    insn->extra.longjmp = abs(index - origin) > 800;
+    insn->extra.longjmp = ctx.getFunction().getDistance(origin, index) > 8000;
     return insn->extra.longjmp ? 2 : 1;
   }
 
diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp
index b5f4ba2..b924332 100644
--- a/backend/src/ir/function.hpp
+++ b/backend/src/ir/function.hpp
@@ -487,6 +487,23 @@ namespace ir {
     Register getSurfaceBaseReg(uint8_t bti) const;
     void appendSurface(uint8_t bti, Register reg);
     /*! Output the control flow graph to .dot file */
+    /*! Get instruction distance between two BBs */
+    INLINE uint32_t getDistance(LabelIndex b0, LabelIndex b1) const {
+      int start, end;
+      if (b0.value() < b1.value()) {
+        start = b0.value();
+        end = b1.value() - 1;
+      } else {
+        start = b1.value();
+        end = b0.value() - 1;
+      }
+      uint32_t insnNum = 0;
+      for(int i = start; i <= end; i++) {
+        BasicBlock &bb = getBlock(LabelIndex(i));
+        insnNum += bb.size();
+      }
+      return insnNum;
+    }
     void outputCFG();
   private:
     friend class Context;           //!< Can freely modify a function
-- 
1.9.1



More information about the Beignet mailing list