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

Song, Ruiling ruiling.song at intel.com
Fri Apr 7 06:12:47 UTC 2017



> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Xiuli Pan
> Sent: Thursday, March 23, 2017 3:13 PM
> To: beignet at lists.freedesktop.org
> Cc: Pan, Xiuli <xiuli.pan at intel.com>
> Subject: [Beignet] [PATCH 1/2] Backend: Store the spill register information
> 
> 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);
> +            }
What kind of issue do you want to solve here? Could you give some further explanation? It's better giving an example.
As I understand, you seem to use the register region parameter(width, vstride, hstride) of the instruction that define the register??
Like a small code piece:
%3 = add %1, %2
%4 = sub %3, %0
If %3 is spilled, when you are inserting unspill instruction before its use, looks like you are trying to use the register region parameters of %3 in the first instruction?
Am I understand wrong?

Thanks!
Ruiling
> +
> +            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
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list