diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -1212,7 +1212,10 @@ } ++I; } - LIS->extendToIndices(SR, EndPoints); + SmallVector Undefs; + IntB.computeSubRangeUndefs(Undefs, SR.LaneMask, *MRI, + *LIS->getSlotIndexes()); + LIS->extendToIndices(SR, EndPoints, Undefs); } // If any dead defs were extended, truncate them. shrinkToUses(&IntB); diff --git a/llvm/test/CodeGen/AMDGPU/coalescer-removepartial-extend-undef-subrange.mir b/llvm/test/CodeGen/AMDGPU/coalescer-removepartial-extend-undef-subrange.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/coalescer-removepartial-extend-undef-subrange.mir @@ -0,0 +1,310 @@ +# RUN: llc -march=amdgcn -run-pass simple-register-coalescing -verify-machineinstrs -o - %s | FileCheck %s +# +# CHECK-LABEL: bb.4: +# CHECK-NOT: COPY +# CHECK-LABEL: bb.5: +# +# After some coalescing work, the copies in bb.4 +# change from: +# %12:vreg_512 = COPY killed %244 +# %242:vreg_512 = COPY killed %12 +# to: +# %90:vreg_512 = COPY %38:vreg_512 +# +# The failure occurs when processing this COPY in removePartialRedundency(). The +# coalescer tries to prune and extend one subrange of %90, the offending subrange +# has a def location in the predecessor path going through bb.26 into bb.4. But for +# another predecessor path 0->1->27->4, the subrange has only one undef location in bb.0. +# Then in findReachingDef(), it will search all the way back through the predecessor +# path: 4->27->1->0 and failed to find a reaching-def (the undef in bb.0) in that +# path and return error message: +# "Use of $noreg does not have a corresponding definition on every path +# LLVM ERROR: Use not jointly dominated by defs" + +--- +name: _amdgpu_ps_main +alignment: 1 +tracksRegLiveness: true +body: | + bb.0: + successors: %bb.1, %bb.2 + liveins: $sgpr2, $sgpr3, $vgpr3 + + %0:vgpr_32 = COPY killed $vgpr3 + %1:sgpr_32 = COPY killed $sgpr3 + %2:sgpr_32 = COPY killed $sgpr2 + %3:sreg_64 = S_GETPC_B64 + %4:sreg_64 = COPY killed %3 + %4.sub0:sreg_64 = COPY killed %2 + %5:sgpr_128 = S_LOAD_DWORDX4_IMM killed %4, 0, 0, 0 + %6:sgpr_32 = S_BUFFER_LOAD_DWORD_IMM killed %5, 1, 0, 0 :: (dereferenceable invariant load 4) + %7:vgpr_32 = V_MOV_B32_e32 1092616192, implicit $exec + %8:vgpr_32 = nnan nsz arcp contract afn reassoc nofpexcept V_MUL_F32_e32 %6, killed %7, implicit $mode, implicit $exec + %9:vgpr_32 = V_MOV_B32_e32 1065353216, implicit $exec + undef %10.sub0:vreg_512 = COPY killed %9 + %10.sub2:vreg_512 = COPY %8 + %10.sub3:vreg_512 = COPY %8 + %11:sreg_64 = nofpexcept V_CMP_GT_F32_e64 0, 1065353216, 0, %0, 0, implicit $mode, implicit $exec + %12:sreg_64 = nofpexcept V_CMP_NGT_F32_e64 0, 1065353216, 0, %0, 0, implicit $mode, implicit $exec + %13:sreg_64_xexec = nofpexcept V_CMP_LT_F32_e64 0, 1065353216, 0, killed %1, 0, implicit $mode, implicit $exec + %14:sreg_64 = nofpexcept V_CMP_GT_F32_e64 0, 0, 0, %0, 0, implicit $mode, implicit $exec + %15:sreg_64 = nofpexcept V_CMP_NGT_F32_e64 0, 0, 0, killed %0, 0, implicit $mode, implicit $exec + %16:sreg_64 = COPY %11 + %17:vreg_512 = COPY %10 + %18:sreg_64 = COPY $exec, implicit-def $exec + %19:sreg_64 = S_AND_B64 %18, %12, implicit-def dead $scc + $exec = S_MOV_B64_term killed %19 + S_CBRANCH_EXECZ %bb.2, implicit $exec + S_BRANCH %bb.1 + + bb.1: + %20:sreg_64 = nofpexcept V_CMP_NGT_F32_e64 0, 1065353216, 0, killed %6, 0, implicit $mode, implicit $exec + %21:sreg_64 = S_MOV_B64 -1 + %22:sreg_64 = S_AND_B64 $exec, killed %20, implicit-def dead $scc + $vcc = COPY killed %22 + S_CBRANCH_VCCNZ %bb.3, implicit killed $vcc + S_BRANCH %bb.27 + + bb.2: + successors: %bb.13, %bb.17 + + $exec = S_OR_B64 $exec, killed %18, implicit-def $scc + %23:vreg_512 = COPY killed %17 + %24:sreg_64 = COPY killed %16 + %25:sreg_64 = COPY $exec, implicit-def $exec + %26:sreg_64 = S_AND_B64 %25, killed %24, implicit-def dead $scc + $exec = S_MOV_B64_term killed %26 + S_CBRANCH_EXECZ %bb.17, implicit $exec + S_BRANCH %bb.13 + + bb.3: + %27:sreg_64 = S_MOV_B64 0 + %28:sreg_64 = IMPLICIT_DEF + %29:sreg_64 = IMPLICIT_DEF + %30:sreg_64 = COPY killed %27 + %31:vreg_512 = COPY killed %10 + S_BRANCH %bb.5 + + bb.4: + %32:sreg_64 = COPY killed %33 + %34:sreg_64 = S_ANDN2_B64 killed %11, $exec, implicit-def dead $scc + %35:sreg_64 = S_AND_B64 killed %32, $exec, implicit-def dead $scc + %36:sreg_64 = S_OR_B64 killed %34, killed %35, implicit-def dead $scc + %16:sreg_64 = COPY killed %36 + %37:vreg_512 = COPY killed %38 + %17:vreg_512 = COPY killed %37 + S_BRANCH %bb.2 + + bb.5: + successors: %bb.6, %bb.7 + + %39:vreg_512 = COPY killed %31 + %40:sreg_64 = COPY killed %30 + %41:sreg_64 = COPY killed %29 + %42:sreg_64 = COPY killed %28 + %43:sreg_64 = S_MOV_B64 -1 + %44:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %13, implicit $exec + V_CMP_NE_U32_e32 1, killed %44, implicit-def $vcc, implicit $exec + $vcc = S_AND_B64 $exec, killed $vcc, implicit-def dead $scc + %45:sreg_64 = COPY %43 + %46:vreg_512 = COPY %39 + S_CBRANCH_VCCNZ %bb.7, implicit killed $vcc + S_BRANCH %bb.6 + + bb.6: + successors: %bb.8, %bb.9 + + %47:sreg_64 = S_MOV_B64 0 + %48:sreg_64 = COPY killed %47 + %49:vreg_512 = COPY %39 + %50:sreg_64 = COPY $exec, implicit-def $exec + %51:sreg_64 = S_AND_B64 %50, %15, implicit-def dead $scc + $exec = S_MOV_B64_term killed %51 + S_CBRANCH_EXECZ %bb.9, implicit $exec + S_BRANCH %bb.8 + + bb.7: + successors: %bb.10, %bb.11 + + %52:vreg_512 = COPY killed %46 + %53:sreg_64 = COPY killed %45 + %54:sreg_64 = S_OR_B64 killed %41, $exec, implicit-def dead $scc + %55:sreg_64 = COPY killed %43 + %56:sreg_64 = COPY %54 + %57:sreg_64 = COPY $exec, implicit-def $exec + %58:sreg_64 = S_AND_B64 %57, killed %53, implicit-def dead $scc + $exec = S_MOV_B64_term killed %58 + S_CBRANCH_EXECZ %bb.11, implicit $exec + S_BRANCH %bb.10 + + bb.8: + undef %59.sub0:vreg_512 = COPY %8 + %59.sub2:vreg_512 = COPY %39.sub2 + %59.sub3:vreg_512 = COPY %39.sub3 + %60:vreg_512 = COPY killed %59 + %61:sreg_64 = COPY $exec + %48:sreg_64 = COPY killed %61 + %49:vreg_512 = COPY killed %60 + + bb.9: + $exec = S_OR_B64 $exec, killed %50, implicit-def $scc + %62:vreg_512 = COPY killed %49 + %63:sreg_64 = COPY killed %48 + %45:sreg_64 = COPY killed %63 + %46:vreg_512 = COPY killed %62 + S_BRANCH %bb.7 + + bb.10: + successors: %bb.12, %bb.25 + + %64:sreg_64 = S_MOV_B64 -1 + %65:sreg_64 = COPY killed %64 + %66:sreg_64 = COPY $exec, implicit-def $exec + %67:sreg_64 = S_AND_B64 %66, %15, implicit-def dead $scc + $exec = S_MOV_B64_term killed %67 + S_CBRANCH_EXECZ %bb.25, implicit $exec + S_BRANCH %bb.12 + + bb.11: + successors: %bb.26(0x04000000), %bb.5(0x7c000000) + + $exec = S_OR_B64 $exec, killed %57, implicit-def $scc + %68:sreg_64 = COPY killed %56 + %69:sreg_64 = COPY killed %55 + %70:sreg_64 = S_AND_B64 $exec, killed %69, implicit-def $scc + %71:sreg_64 = S_OR_B64 %70, killed %40, implicit-def $scc + %72:sreg_64 = S_ANDN2_B64 killed %42, $exec, implicit-def dead $scc + %73:sreg_64 = S_AND_B64 %68, $exec, implicit-def dead $scc + %74:sreg_64 = S_OR_B64 killed %72, killed %73, implicit-def dead $scc + %28:sreg_64 = COPY %74 + %29:sreg_64 = COPY killed %68 + %30:sreg_64 = COPY %71 + %31:vreg_512 = COPY killed %52 + $exec = S_ANDN2_B64_term $exec, %71, implicit-def $scc + S_CBRANCH_EXECNZ %bb.5, implicit $exec + S_BRANCH %bb.26 + + bb.12: + %75:sreg_64 = S_XOR_B64 $exec, -1, implicit-def dead $scc + %65:sreg_64 = COPY killed %75 + S_BRANCH %bb.25 + + bb.13: + successors: %bb.14, %bb.18 + + %76:sreg_64 = S_MOV_B64 -1 + %77:sreg_64 = COPY killed %76 + %78:vreg_512 = COPY %23 + %79:sreg_64 = COPY $exec, implicit-def $exec + %80:sreg_64 = S_AND_B64 %79, %12, implicit-def dead $scc + $exec = S_MOV_B64_term killed %80 + S_CBRANCH_EXECZ %bb.18, implicit $exec + S_BRANCH %bb.14 + + bb.14: + successors: %bb.19, %bb.20 + + %81:sreg_64 = S_MOV_B64 0 + %82:sreg_64 = COPY killed %81 + %83:vreg_512 = COPY %23 + %84:sreg_64 = COPY $exec, implicit-def $exec + %85:sreg_64 = S_AND_B64 %84, killed %15, implicit-def dead $scc + $exec = S_MOV_B64_term killed %85 + S_CBRANCH_EXECZ %bb.20, implicit $exec + S_BRANCH %bb.19 + + bb.15: + S_BRANCH %bb.23 + + bb.16: + + bb.17: + $exec = S_OR_B64 $exec, killed %25, implicit-def $scc + %86:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + EXP_DONE 0, killed %86, undef %87:vgpr_32, undef %88:vgpr_32, undef %89:vgpr_32, -1, 0, 1, implicit $exec + S_ENDPGM 0 + + bb.18: + successors: %bb.21, %bb.16 + + $exec = S_OR_B64 $exec, killed %79, implicit-def $scc + %90:vreg_512 = COPY killed %78 + %91:sreg_64 = COPY killed %77 + %92:sreg_64 = COPY $exec, implicit-def $exec + %93:sreg_64 = S_AND_B64 %92, killed %91, implicit-def dead $scc + $exec = S_MOV_B64_term killed %93 + S_CBRANCH_EXECZ %bb.16, implicit $exec + S_BRANCH %bb.21 + + bb.19: + undef %94.sub0:vreg_512 = COPY %23.sub2 + %94.sub3:vreg_512 = COPY %23.sub3 + %95:vreg_512 = COPY killed %94 + %96:sreg_64 = COPY $exec + %82:sreg_64 = COPY killed %96 + %83:vreg_512 = COPY killed %95 + + bb.20: + $exec = S_OR_B64 $exec, killed %84, implicit-def $scc + %97:vreg_512 = COPY killed %83 + %98:sreg_64 = COPY killed %82 + %99:sreg_64 = S_ORN2_B64 killed %98, $exec, implicit-def dead $scc + %77:sreg_64 = COPY killed %99 + %78:vreg_512 = COPY killed %97 + S_BRANCH %bb.18 + + bb.21: + successors: %bb.22, %bb.23 + + %100:sreg_64 = COPY $exec, implicit-def $exec + %101:sreg_64 = S_AND_B64 %100, killed %12, implicit-def dead $scc + $exec = S_MOV_B64_term killed %101 + S_CBRANCH_EXECZ %bb.23, implicit $exec + S_BRANCH %bb.22 + + bb.22: + %102:vgpr_32 = COPY %90.sub0 + %103:sreg_64 = S_MOV_B64 0 + %104:sreg_64 = COPY killed %103 + %105:vgpr_32 = COPY killed %102 + S_BRANCH %bb.24 + + bb.23: + S_BRANCH %bb.16 + + bb.24: + successors: %bb.15(0x04000000), %bb.24(0x7c000000) + + %106:sreg_64 = COPY killed %104 + %107:sreg_64 = S_AND_B64 $exec, %14, implicit-def $scc + %108:sreg_64 = S_OR_B64 %107, killed %106, implicit-def $scc + %109:vgpr_32 = COPY killed %105 + %110:vgpr_32 = V_CNDMASK_B32_e64 0, killed %109, 0, %90.sub3, %13, implicit $exec + %104:sreg_64 = COPY %108 + %105:vgpr_32 = COPY killed %110 + $exec = S_ANDN2_B64_term $exec, %108, implicit-def $scc + S_CBRANCH_EXECNZ %bb.24, implicit $exec + S_BRANCH %bb.15 + + bb.25: + $exec = S_OR_B64 $exec, killed %66, implicit-def $scc + %111:sreg_64 = COPY killed %65 + %112:sreg_64 = S_ANDN2_B64 killed %54, $exec, implicit-def dead $scc + %113:sreg_64 = COPY killed %112 + %114:sreg_64 = S_ORN2_B64 killed %111, $exec, implicit-def dead $scc + %55:sreg_64 = COPY killed %114 + %56:sreg_64 = COPY killed %113 + S_BRANCH %bb.11 + + bb.26: + $exec = S_OR_B64 $exec, killed %71, implicit-def $scc + %33:sreg_64 = COPY killed %74 + %38:vreg_512 = COPY killed %39 + S_BRANCH %bb.4 + + bb.27: + %33:sreg_64 = COPY killed %21 + %38:vreg_512 = COPY killed %10 + S_BRANCH %bb.4 + +...