[llvm] r222583 - R600/SI: Emit s_mov_b32 m0, -1 before every DS instruction

David Majnemer david.majnemer at gmail.com
Fri Nov 21 22:12:37 PST 2014


This is causing my LLVM build to complain that NeedM0 is never read, only
stored to. Is the variable dead or should it be used for something?

On Fri, Nov 21, 2014 at 2:31 PM, Tom Stellard <thomas.stellard at amd.com>
wrote:

> Author: tstellar
> Date: Fri Nov 21 16:31:44 2014
> New Revision: 222583
>
> URL: http://llvm.org/viewvc/llvm-project?rev=222583&view=rev
> Log:
> R600/SI: Emit s_mov_b32 m0, -1 before every DS instruction
>
> This s_mov_b32 will write to a virtual register from the M0Reg
> class and all the ds instructions now take an extra M0Reg explicit
> argument.
>
> This change is necessary to prevent issues with the scheduler
> mixing together instructions that expect different values in the m0
> registers.
>
> Modified:
>     llvm/trunk/lib/Target/R600/SIISelLowering.cpp
>     llvm/trunk/lib/Target/R600/SIInstrFormats.td
>     llvm/trunk/lib/Target/R600/SIInstrInfo.td
>     llvm/trunk/lib/Target/R600/SIInstructions.td
>     llvm/trunk/lib/Target/R600/SILoadStoreOptimizer.cpp
>     llvm/trunk/lib/Target/R600/SILowerControlFlow.cpp
>     llvm/trunk/test/CodeGen/R600/shl_add_ptr.ll
>
> Modified: llvm/trunk/lib/Target/R600/SIISelLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SIISelLowering.cpp?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/SIISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/R600/SIISelLowering.cpp Fri Nov 21 16:31:44 2014
> @@ -1986,6 +1986,7 @@ void SITargetLowering::AdjustInstrPostIn
>    const SIInstrInfo *TII = static_cast<const SIInstrInfo *>(
>        getTargetMachine().getSubtargetImpl()->getInstrInfo());
>
> +  MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo();
>    TII->legalizeOperands(MI);
>
>    if (TII->isMIMG(MI->getOpcode())) {
> @@ -2005,7 +2006,6 @@ void SITargetLowering::AdjustInstrPostIn
>
>      unsigned NewOpcode = TII->getMaskedMIMGOp(MI->getOpcode(), BitsSet);
>      MI->setDesc(TII->get(NewOpcode));
> -    MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo();
>      MRI.setRegClass(VReg, RC);
>      return;
>    }
>
> Modified: llvm/trunk/lib/Target/R600/SIInstrFormats.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SIInstrFormats.td?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/SIInstrFormats.td (original)
> +++ llvm/trunk/lib/Target/R600/SIInstrFormats.td Fri Nov 21 16:31:44 2014
> @@ -546,6 +546,7 @@ class DS <bits<8> op, dag outs, dag ins,
>
>    let LGKM_CNT = 1;
>    let UseNamedOperandTable = 1;
> +  let DisableEncoding = "$m0";
>  }
>
>  class MUBUF <bits<7> op, dag outs, dag ins, string asm, list<dag>
> pattern> :
>
> Modified: llvm/trunk/lib/Target/R600/SIInstrInfo.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SIInstrInfo.td?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/SIInstrInfo.td (original)
> +++ llvm/trunk/lib/Target/R600/SIInstrInfo.td Fri Nov 21 16:31:44 2014
> @@ -948,7 +948,7 @@ class DS_1A <bits<8> op, dag outs, dag i
>  class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> :
> DS_1A <
>    op,
>    (outs regClass:$vdst),
> -  (ins i1imm:$gds, VReg_32:$addr, ds_offset:$offset),
> +  (ins i1imm:$gds, VReg_32:$addr, ds_offset:$offset, M0Reg:$m0),
>    asm#" $vdst, $addr"#"$offset"#" [M0]",
>    []> {
>    let data0 = 0;
> @@ -960,7 +960,8 @@ class DS_Load_Helper <bits<8> op, string
>  class DS_Load2_Helper <bits<8> op, string asm, RegisterClass regClass> :
> DS <
>    op,
>    (outs regClass:$vdst),
> -  (ins i1imm:$gds, VReg_32:$addr, ds_offset0:$offset0,
> ds_offset1:$offset1),
> +  (ins i1imm:$gds, VReg_32:$addr, ds_offset0:$offset0,
> ds_offset1:$offset1,
> +        M0Reg:$m0),
>    asm#" $vdst, $addr"#"$offset0"#"$offset1 [M0]",
>    []> {
>    let data0 = 0;
> @@ -973,7 +974,7 @@ class DS_Load2_Helper <bits<8> op, strin
>  class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> :
> DS_1A <
>    op,
>    (outs),
> -  (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, ds_offset:$offset),
> +  (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, ds_offset:$offset,
> M0Reg:$m0),
>    asm#" $addr, $data0"#"$offset"#" [M0]",
>    []> {
>    let data1 = 0;
> @@ -986,7 +987,7 @@ class DS_Store2_Helper <bits<8> op, stri
>    op,
>    (outs),
>    (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, regClass:$data1,
> -       ds_offset0:$offset0, ds_offset1:$offset1),
> +       ds_offset0:$offset0, ds_offset1:$offset1, M0Reg:$m0),
>    asm#" $addr, $data0, $data1"#"$offset0"#"$offset1 [M0]",
>    []> {
>    let mayStore = 1;
> @@ -999,7 +1000,7 @@ class DS_Store2_Helper <bits<8> op, stri
>  class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc, string
> noRetOp = ""> : DS_1A <
>    op,
>    (outs rc:$vdst),
> -  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, ds_offset:$offset),
> +  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, ds_offset:$offset,
> M0Reg:$m0),
>    asm#" $vdst, $addr, $data0"#"$offset"#" [M0]", []>,
>    AtomicNoRet<noRetOp, 1> {
>
> @@ -1014,7 +1015,7 @@ class DS_1A1D_RET <bits<8> op, string as
>  class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc, string
> noRetOp = ""> : DS_1A <
>    op,
>    (outs rc:$vdst),
> -  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1,
> ds_offset:$offset),
> +  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1,
> ds_offset:$offset, M0Reg:$m0),
>    asm#" $vdst, $addr, $data0, $data1"#"$offset"#" [M0]",
>    []>,
>    AtomicNoRet<noRetOp, 1> {
> @@ -1027,7 +1028,7 @@ class DS_1A2D_RET <bits<8> op, string as
>  class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc, string
> noRetOp = asm> : DS_1A <
>    op,
>    (outs),
> -  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1,
> ds_offset:$offset),
> +  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1,
> ds_offset:$offset, M0Reg:$m0),
>    asm#" $addr, $data0, $data1"#"$offset"#" [M0]",
>    []>,
>    AtomicNoRet<noRetOp, 0> {
> @@ -1039,7 +1040,7 @@ class DS_1A2D_NORET <bits<8> op, string
>  class DS_1A1D_NORET <bits<8> op, string asm, RegisterClass rc, string
> noRetOp = asm> : DS_1A <
>    op,
>    (outs),
> -  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, ds_offset:$offset),
> +  (ins i1imm:$gds, VReg_32:$addr, rc:$data0, ds_offset:$offset,
> M0Reg:$m0),
>    asm#" $addr, $data0"#"$offset"#" [M0]",
>    []>,
>    AtomicNoRet<noRetOp, 0> {
>
> Modified: llvm/trunk/lib/Target/R600/SIInstructions.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SIInstructions.td?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/SIInstructions.td (original)
> +++ llvm/trunk/lib/Target/R600/SIInstructions.td Fri Nov 21 16:31:44 2014
> @@ -2614,7 +2614,7 @@ def : ROTRPattern <V_ALIGNBIT_B32>;
>
>  class DSReadPat <DS inst, ValueType vt, PatFrag frag> : Pat <
>    (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))),
> -  (inst (i1 0), $ptr, (as_i16imm $offset))
> +  (inst (i1 0), $ptr, (as_i16imm $offset), (S_MOV_B32 -1))
>  >;
>
>  def : DSReadPat <DS_READ_I8,  i32, sextloadi8_local>;
> @@ -2632,12 +2632,12 @@ def : DSReadPat <DS_READ_B64, v2i32, loc
>  def : Pat <
>    (v2i32 (local_load (DS64Bit4ByteAligned i32:$ptr, i8:$offset0,
>                                                      i8:$offset1))),
> -  (DS_READ2_B32 (i1 0), $ptr, $offset0, $offset1)
> +  (DS_READ2_B32 (i1 0), $ptr, $offset0, $offset1, (S_MOV_B32 -1))
>  >;
>
>  class DSWritePat <DS inst, ValueType vt, PatFrag frag> : Pat <
>    (frag vt:$value, (DS1Addr1Offset i32:$ptr, i32:$offset)),
> -  (inst (i1 0), $ptr, $value, (as_i16imm $offset))
> +  (inst (i1 0), $ptr, $value, (as_i16imm $offset), (S_MOV_B32 -1))
>  >;
>
>  def : DSWritePat <DS_WRITE_B8, i32, truncstorei8_local>;
> @@ -2653,12 +2653,13 @@ def : Pat <
>    (local_store v2i32:$value, (DS64Bit4ByteAligned i32:$ptr, i8:$offset0,
>                                                              i8:$offset1)),
>    (DS_WRITE2_B32 (i1 0), $ptr, (EXTRACT_SUBREG $value, sub0),
> -                        (EXTRACT_SUBREG $value, sub1), $offset0, $offset1)
> +                        (EXTRACT_SUBREG $value, sub1), $offset0, $offset1,
> +                        (S_MOV_B32 -1))
>  >;
>
>  class DSAtomicRetPat<DS inst, ValueType vt, PatFrag frag> : Pat <
>    (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value),
> -  (inst (i1 0), $ptr, $value, (as_i16imm $offset))
> +  (inst (i1 0), $ptr, $value, (as_i16imm $offset), (S_MOV_B32 -1))
>  >;
>
>  // Special case of DSAtomicRetPat for add / sub 1 -> inc / dec
> @@ -2674,13 +2675,13 @@ class DSAtomicRetPat<DS inst, ValueType
>  class DSAtomicIncRetPat<DS inst, ValueType vt,
>                          Instruction LoadImm, PatFrag frag> : Pat <
>    (frag (DS1Addr1Offset i32:$ptr, i32:$offset), (vt 1)),
> -  (inst (i1 0), $ptr, (LoadImm (vt -1)), (as_i16imm $offset))
> +  (inst (i1 0), $ptr, (LoadImm (vt -1)), (as_i16imm $offset), (S_MOV_B32
> -1))
>  >;
>
>
>  class DSAtomicCmpXChg <DS inst, ValueType vt, PatFrag frag> : Pat <
>    (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$cmp, vt:$swap),
> -  (inst (i1 0), $ptr, $cmp, $swap, (as_i16imm $offset))
> +  (inst (i1 0), $ptr, $cmp, $swap, (as_i16imm $offset), (S_MOV_B32 -1))
>  >;
>
>
>
> Modified: llvm/trunk/lib/Target/R600/SILoadStoreOptimizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SILoadStoreOptimizer.cpp?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/SILoadStoreOptimizer.cpp (original)
> +++ llvm/trunk/lib/Target/R600/SILoadStoreOptimizer.cpp Fri Nov 21
> 16:31:44 2014
> @@ -222,6 +222,7 @@ MachineBasicBlock::iterator  SILoadStore
>    // Be careful, since the addresses could be subregisters themselves in
> weird
>    // cases, like vectors of pointers.
>    const MachineOperand *AddrReg = TII->getNamedOperand(*I,
> AMDGPU::OpName::addr);
> +  const MachineOperand *M0Reg = TII->getNamedOperand(*I,
> AMDGPU::OpName::m0);
>
>    unsigned DestReg0 = TII->getNamedOperand(*I,
> AMDGPU::OpName::vdst)->getReg();
>    unsigned DestReg1
> @@ -262,6 +263,7 @@ MachineBasicBlock::iterator  SILoadStore
>      .addOperand(*AddrReg) // addr
>      .addImm(NewOffset0) // offset0
>      .addImm(NewOffset1) // offset1
> +    .addOperand(*M0Reg) // M0
>      .addMemOperand(*I->memoperands_begin())
>      .addMemOperand(*Paired->memoperands_begin());
>
> @@ -280,6 +282,9 @@ MachineBasicBlock::iterator  SILoadStore
>    LiveInterval &AddrRegLI = LIS->getInterval(AddrReg->getReg());
>    LIS->shrinkToUses(&AddrRegLI);
>
> +  LiveInterval &M0RegLI = LIS->getInterval(M0Reg->getReg());
> +  LIS->shrinkToUses(&M0RegLI);
> +
>    LIS->getInterval(DestReg); // Create new LI
>
>    DEBUG(dbgs() << "Inserted read2: " << *Read2 << '\n');
> @@ -295,6 +300,7 @@ MachineBasicBlock::iterator SILoadStoreO
>    // Be sure to use .addOperand(), and not .addReg() with these. We want
> to be
>    // sure we preserve the subregister index and any register flags set on
> them.
>    const MachineOperand *Addr = TII->getNamedOperand(*I,
> AMDGPU::OpName::addr);
> +  const MachineOperand *M0Reg = TII->getNamedOperand(*I,
> AMDGPU::OpName::m0);
>    const MachineOperand *Data0 = TII->getNamedOperand(*I,
> AMDGPU::OpName::data0);
>    const MachineOperand *Data1
>      = TII->getNamedOperand(*Paired, AMDGPU::OpName::data0);
> @@ -333,11 +339,13 @@ MachineBasicBlock::iterator SILoadStoreO
>      .addOperand(*Data1) // data1
>      .addImm(NewOffset0) // offset0
>      .addImm(NewOffset1) // offset1
> +    .addOperand(*M0Reg)  // m0
>      .addMemOperand(*I->memoperands_begin())
>      .addMemOperand(*Paired->memoperands_begin());
>
>    // XXX - How do we express subregisters here?
> -  unsigned OrigRegs[] = { Data0->getReg(), Data1->getReg(),
> Addr->getReg() };
> +  unsigned OrigRegs[] = { Data0->getReg(), Data1->getReg(),
> Addr->getReg(),
> +                          M0Reg->getReg()};
>
>    LIS->RemoveMachineInstrFromMaps(I);
>    LIS->RemoveMachineInstrFromMaps(Paired);
>
> Modified: llvm/trunk/lib/Target/R600/SILowerControlFlow.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SILowerControlFlow.cpp?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/R600/SILowerControlFlow.cpp (original)
> +++ llvm/trunk/lib/Target/R600/SILowerControlFlow.cpp Fri Nov 21 16:31:44
> 2014
> @@ -88,7 +88,6 @@ private:
>    void Kill(MachineInstr &MI);
>    void Branch(MachineInstr &MI);
>
> -  void InitM0ForLDS(MachineBasicBlock::iterator MI);
>    void LoadM0(MachineInstr &MI, MachineInstr *MovRel);
>    void IndirectSrc(MachineInstr &MI);
>    void IndirectDst(MachineInstr &MI);
> @@ -325,14 +324,6 @@ void SILowerControlFlowPass::Kill(Machin
>    MI.eraseFromParent();
>  }
>
> -/// The m0 register stores the maximum allowable address for LDS reads and
> -/// writes.  Its value must be at least the size in bytes of LDS
> allocated by
> -/// the shader.  For simplicity, we set it to the maximum possible value.
> -void SILowerControlFlowPass::InitM0ForLDS(MachineBasicBlock::iterator MI)
> {
> -    BuildMI(*MI->getParent(), MI, MI->getDebugLoc(),
> TII->get(AMDGPU::S_MOV_B32),
> -            AMDGPU::M0).addImm(0xffffffff);
> -}
> -
>  void SILowerControlFlowPass::LoadM0(MachineInstr &MI, MachineInstr
> *MovRel) {
>
>    MachineBasicBlock &MBB = *MI.getParent();
> @@ -391,12 +382,6 @@ void SILowerControlFlowPass::LoadM0(Mach
>              .addReg(Save);
>
>    }
> -  // FIXME: Are there any values other than the LDS address clamp that
> need to
> -  // be stored in the m0 register and may be live for more than a few
> -  // instructions?  If so, we should save the m0 register at the beginning
> -  // of this function and restore it here.
> -  // FIXME: Add support for LDS direct loads.
> -  InitM0ForLDS(&MI);
>    MI.eraseFromParent();
>  }
>
> @@ -465,7 +450,6 @@ bool SILowerControlFlowPass::runOnMachin
>
>        MachineInstr &MI = *I;
>        if (TII->isDS(MI.getOpcode())) {
> -        NeedM0 = true;
>          NeedWQM = true;
>        }
>
> @@ -544,13 +528,6 @@ bool SILowerControlFlowPass::runOnMachin
>      }
>    }
>
> -  if (NeedM0) {
> -    MachineBasicBlock &MBB = MF.front();
> -    // Initialize M0 to a value that won't cause LDS access to be
> discarded
> -    // due to offset clamping
> -    InitM0ForLDS(MBB.getFirstNonPHI());
> -  }
> -
>    if (NeedWQM && MFI->getShaderType() == ShaderType::PIXEL) {
>      MachineBasicBlock &MBB = MF.front();
>      BuildMI(MBB, MBB.getFirstNonPHI(), DebugLoc(),
> TII->get(AMDGPU::S_WQM_B64),
>
> Modified: llvm/trunk/test/CodeGen/R600/shl_add_ptr.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/R600/shl_add_ptr.ll?rev=222583&r1=222582&r2=222583&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/R600/shl_add_ptr.ll (original)
> +++ llvm/trunk/test/CodeGen/R600/shl_add_ptr.ll Fri Nov 21 16:31:44 2014
> @@ -68,7 +68,8 @@ define void @load_shl_base_lds_max_offse
>  ; pointer can be used with an offset into the second one.
>
>  ; SI-LABEL: {{^}}load_shl_base_lds_2:
> -; SI: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 2, {{v[0-9]+}}
> +; SI: s_mov_b32 m0, -1
> +; SI-NEXT: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 2, {{v[0-9]+}}
>  ; SI-NEXT: ds_read2st64_b32 {{v\[[0-9]+:[0-9]+\]}}, [[PTR]] offset0:1
> offset1:9 [M0]
>  ; SI: s_endpgm
>  define void @load_shl_base_lds_2(float addrspace(1)* %out) #0 {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141121/00524a92/attachment.html>


More information about the llvm-commits mailing list