[Beignet] [PATCH] GBE: fix a assert when structure argument's first field don't used.

Yang Rong rong.r.yang at intel.com
Thu Nov 26 20:20:12 PST 2015


If use stucture argument's other field but don't use first field, the
argument's curbe payload will not be allocated, cause assert.
Set the maxID to 1 for this case, because each filed deallocate separately.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/backend/gen_reg_allocation.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/backend/src/backend/gen_reg_allocation.cpp b/backend/src/backend/gen_reg_allocation.cpp
index cd819d1..633d741 100644
--- a/backend/src/backend/gen_reg_allocation.cpp
+++ b/backend/src/backend/gen_reg_allocation.cpp
@@ -1050,6 +1050,7 @@ namespace gbe
 
   INLINE bool GenRegAllocator::Opaque::allocate(Selection &selection) {
     using namespace ir;
+    const Function::PushMap &pushMap = ctx.fn.getPushMap();
 
     if (ctx.reservedSpillRegs != 0) {
       reservedReg = ctx.allocate(ctx.reservedSpillRegs * GEN_REG_SIZE, GEN_REG_SIZE, false);
@@ -1174,6 +1175,15 @@ namespace gbe
         delete boolsMap;
     }
 
+    for (auto &it : this->intervals) {
+      if (it.maxID == -INT_MAX)  continue;
+      if(pushMap.find(it.reg) != pushMap.end()) {
+        uint32_t argID = ctx.fn.getPushLocation(it.reg)->argID;
+        ir::Register argReg = ctx.fn.getArg(argID).reg;
+        intervals[argReg].maxID = std::max(intervals[argReg].maxID, 1);
+      }
+    }
+
     if (ctx.inProfilingMode) {
       /* If we are in profiling mode, we always need xyz dim info and timestamp curbes.
          xyz dim info related curbe registers just live for the first INSN, but timestamp
-- 
2.1.4



More information about the Beignet mailing list