[Beignet] [PATCH 1/2] Backend: Store the spill register information

Xiuli Pan xiuli.pan at intel.com
Thu Mar 23 07:13:00 UTC 2017


From: Pan Xiuli <xiuli.pan at intel.com>

In some case we may use some subnr of a spilled reg, we need use the
reg information of the spilled reg in unspill.
V2: Fix some uninit register problem.

Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
---
 backend/src/backend/gen_insn_selection.cpp | 38 ++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index 1cab40c..ea538d0 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -995,6 +995,14 @@ namespace gbe
                                     uint32_t registerPool) {
     GBE_ASSERT(registerPool != 0);
 
+    struct SpillReg {
+      uint32_t type:4;       //!< Gen type
+      uint32_t vstride:4;    //!< Vertical stride
+      uint32_t width:3;        //!< Width
+      uint32_t hstride:2;      //!< Horizontal stride
+    };
+    map <uint32_t, struct SpillReg> SpillRegs;
+
     for (auto &block : blockList)
       for (auto &insn : block.insnList) {
         // spill / unspill insn should be skipped when do spilling
@@ -1059,10 +1067,22 @@ namespace gbe
                                             1 + (ctx.reservedSpillRegs * 8) / ctx.getSimdWidth(), 0);
             unspill->state = GenInstructionState(simdWidth);
             unspill->state.noMask = 1;
-            unspill->dst(0) = GenRegister(GEN_GENERAL_REGISTER_FILE,
-                                          registerPool + regSlot.poolOffset, 0,
-                                          selReg.type, selReg.vstride,
-                                          selReg.width, selReg.hstride);
+            auto it = SpillRegs.find(selReg.value.reg);
+            GenRegister dst0;
+            if( it != SpillRegs.end()) {
+              dst0 = GenRegister(GEN_GENERAL_REGISTER_FILE,
+                                 registerPool + regSlot.poolOffset, 0,
+                                 it->second.type, it->second.vstride,
+                                 it->second.width, it->second.hstride);
+            } else {
+              dst0 = GenRegister(GEN_GENERAL_REGISTER_FILE,
+                                 registerPool + regSlot.poolOffset, 0,
+                                 selReg.type, selReg.vstride,
+                                 selReg.width, selReg.hstride);
+            }
+
+            dst0.value.reg = selReg.value.reg;
+            unspill->dst(0) = dst0;
             for(uint32_t i = 1; i < 1 + (ctx.reservedSpillRegs * 8) / ctx.getSimdWidth(); i++)
               unspill->dst(i) = ctx.getSimdWidth() == 8 ?
                                 GenRegister::vec8(GEN_GENERAL_REGISTER_FILE, registerPool + (i - 1), 0 ) :
@@ -1074,7 +1094,7 @@ namespace gbe
 
           GenRegister src = insn.src(regSlot.srcID);
           // change nr/subnr, keep other register settings
-          src.nr = registerPool + regSlot.poolOffset; src.subnr = 0; src.physical = 1;
+          src.nr = registerPool + regSlot.poolOffset + src.nr; src.physical = 1;
           insn.src(regSlot.srcID) = src;
         };
 
@@ -1121,6 +1141,14 @@ namespace gbe
             spill->state  = insn.state;//GenInstructionState(simdWidth);
             spill->state.accWrEnable = 0;
             spill->state.saturate = 0;
+            // Store the spilled regiter type.
+            struct SpillReg tmp;
+            tmp.type = selReg.type;
+            tmp.vstride = selReg.vstride;
+            tmp.hstride = selReg.hstride;
+            tmp.width= selReg.width;
+            SpillRegs[selReg.value.reg] = tmp;
+
             if (insn.opcode == SEL_OP_SEL)
               spill->state.predicate = GEN_PREDICATE_NONE;
             spill->src(0) = GenRegister(GEN_GENERAL_REGISTER_FILE,
-- 
2.7.4



More information about the Beignet mailing list