Index: lib/Target/AMDGPU/SIInstructions.td =================================================================== --- lib/Target/AMDGPU/SIInstructions.td +++ lib/Target/AMDGPU/SIInstructions.td @@ -1951,8 +1951,7 @@ } 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, SSrc_32:$execfix)> { let Constraints = "$src = $dst"; } @@ -2131,6 +2130,11 @@ 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) Index: lib/Target/AMDGPU/SILowerControlFlow.cpp =================================================================== --- lib/Target/AMDGPU/SILowerControlFlow.cpp +++ lib/Target/AMDGPU/SILowerControlFlow.cpp @@ -83,7 +83,7 @@ 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); @@ -251,7 +251,7 @@ 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(); @@ -261,7 +261,7 @@ 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. @@ -426,7 +426,6 @@ MachineBasicBlock *EmptyMBBAtEnd = nullptr; MachineBasicBlock::iterator I, Next; - bool ExecModified = false; for (I = MBB.begin(); I != MBB.end(); I = Next) { Next = std::next(I); @@ -437,9 +436,6 @@ if (TII->isFLAT(MI)) NeedFlat = true; - if (I->modifiesRegister(AMDGPU::EXEC, TRI)) - ExecModified = true; - switch (MI.getOpcode()) { default: break; case AMDGPU::SI_IF: @@ -448,7 +444,7 @@ break; case AMDGPU::SI_ELSE: - Else(MI, ExecModified); + Else(MI); break; case AMDGPU::SI_BREAK: Index: lib/Target/AMDGPU/SIWholeQuadMode.cpp =================================================================== --- lib/Target/AMDGPU/SIWholeQuadMode.cpp +++ lib/Target/AMDGPU/SIWholeQuadMode.cpp @@ -461,6 +461,9 @@ State = Needs; } + + if (MI.getOpcode() == AMDGPU::SI_ELSE && State == StateExact) + MI.getOperand(3).setImm(1); } if ((BI.OutNeeds & StateWQM) && State != StateWQM) {