diff --git a/llvm/lib/Target/AMDGPU/SIOptimizeExecMaskingPreRA.cpp b/llvm/lib/Target/AMDGPU/SIOptimizeExecMaskingPreRA.cpp index 03e722105feb7b..7eb1ec941dbd79 100644 --- a/llvm/lib/Target/AMDGPU/SIOptimizeExecMaskingPreRA.cpp +++ b/llvm/lib/Target/AMDGPU/SIOptimizeExecMaskingPreRA.cpp @@ -71,10 +71,8 @@ FunctionPass *llvm::createSIOptimizeExecMaskingPreRAPass() { static bool isFullExecCopy(const MachineInstr& MI, const GCNSubtarget& ST) { unsigned Exec = ST.isWave32() ? AMDGPU::EXEC_LO : AMDGPU::EXEC; - if (MI.isCopy() && MI.getOperand(1).getReg() == Exec) { - assert(MI.isFullCopy()); + if (MI.isFullCopy() && MI.getOperand(1).getReg() == Exec) return true; - } return false; } diff --git a/llvm/test/CodeGen/AMDGPU/optimize-exec-masking-pre-ra.mir b/llvm/test/CodeGen/AMDGPU/optimize-exec-masking-pre-ra.mir index fee6b52d1a1178..ec774291067a9f 100644 --- a/llvm/test/CodeGen/AMDGPU/optimize-exec-masking-pre-ra.mir +++ b/llvm/test/CodeGen/AMDGPU/optimize-exec-masking-pre-ra.mir @@ -117,3 +117,25 @@ body: | bb.1: ... + +# Don't crash on exec copy to SGPR subregister. +--- +name: exec_copy_to_subreg +tracksRegLiveness: true +body: | + ; GCN-LABEL: name: exec_copy_to_subreg + ; GCN: bb.0: + ; GCN: successors: %bb.1(0x80000000) + ; GCN: dead undef %0.sub0:sreg_256 = COPY $exec + ; GCN: dead %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, undef %2:sreg_64_xexec, implicit $exec + ; GCN: S_BRANCH %bb.1 + ; GCN: bb.1: + bb.0: + + undef %0.sub0:sreg_256 = COPY $exec + %2:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, undef %1:sreg_64_xexec, implicit $exec + S_BRANCH %bb.1 + + bb.1: + +...