diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstructions.td | 8 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp | 3 |
3 files changed, 13 insertions, 10 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index 1319856dd04..387a8a71825 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -1952,8 +1952,7 @@ def SI_IF: PseudoInstSI < } def SI_ELSE : PseudoInstSI < - (outs SReg_64:$dst), (ins SReg_64:$src, brtarget:$target), - [(set i64:$dst, (int_amdgcn_else i64:$src, bb:$target))]> { + (outs SReg_64:$dst), (ins SReg_64:$src, brtarget:$target, i1imm:$execfix)> { let Constraints = "$src = $dst"; } @@ -2132,6 +2131,11 @@ def SI_PC_ADD_REL_OFFSET : PseudoInstSI < let Predicates = [isGCN] in { +def : Pat< + (int_amdgcn_else i64:$src, bb:$target), + (SI_ELSE $src, $target, 0) +>; + def : Pat < (int_AMDGPU_kilp), (SI_KILL 0xbf800000) diff --git a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp index 2fa229c242e..0f9d0917fb7 100644 --- a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp +++ b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp @@ -84,7 +84,7 @@ private: bool skipIfDead(MachineInstr &MI, MachineBasicBlock &NextBB); void If(MachineInstr &MI); - void Else(MachineInstr &MI, bool ExecModified); + void Else(MachineInstr &MI); void Break(MachineInstr &MI); void IfBreak(MachineInstr &MI); void ElseBreak(MachineInstr &MI); @@ -252,7 +252,7 @@ void SILowerControlFlow::If(MachineInstr &MI) { MI.eraseFromParent(); } -void SILowerControlFlow::Else(MachineInstr &MI, bool ExecModified) { +void SILowerControlFlow::Else(MachineInstr &MI) { MachineBasicBlock &MBB = *MI.getParent(); DebugLoc DL = MI.getDebugLoc(); unsigned Dst = MI.getOperand(0).getReg(); @@ -262,7 +262,7 @@ void SILowerControlFlow::Else(MachineInstr &MI, bool ExecModified) { TII->get(AMDGPU::S_OR_SAVEEXEC_B64), Dst) .addReg(Src); // Saved EXEC - if (ExecModified) { + if (MI.getOperand(3).getImm() != 0) { // Adjust the saved exec to account for the modifications during the flow // block that contains the ELSE. This can happen when WQM mode is switched // off. @@ -427,7 +427,6 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) { MachineBasicBlock *EmptyMBBAtEnd = nullptr; MachineBasicBlock::iterator I, Next; - bool ExecModified = false; for (I = MBB.begin(); I != MBB.end(); I = Next) { Next = std::next(I); @@ -438,9 +437,6 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) { if (TII->isFLAT(MI)) NeedFlat = true; - if (I->modifiesRegister(AMDGPU::EXEC, TRI)) - ExecModified = true; - switch (MI.getOpcode()) { default: break; case AMDGPU::SI_IF: @@ -449,7 +445,7 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) { break; case AMDGPU::SI_ELSE: - Else(MI, ExecModified); + Else(MI); break; case AMDGPU::SI_BREAK: diff --git a/llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp b/llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp index c1a237ea5f5..f79fbfea6b4 100644 --- a/llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp +++ b/llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp @@ -434,6 +434,9 @@ void SIWholeQuadMode::processBlock(MachineBasicBlock &MBB, unsigned LiveMaskReg, State = Needs; } + + if (MI.getOpcode() == AMDGPU::SI_ELSE && State == StateExact) + MI.getOperand(3).setImm(1); } if ((BI.OutNeeds & StateWQM) && State != StateWQM) { |