<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59618>59618</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            AMDGPU: selectiondag generates broken code when SALU compare result it used by VALU select instruction
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AMDGPU
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jayfoad
      </td>
    </tr>
</table>

<pre>
    It seems hard to get a small test case for this. This is the best I've come up with so far:
```
define void @f(i32 %arg, float* %ptr) {
bb:
  %i = load <2 x i32>, <2 x i32> addrspace(4)* null, align 4294967296
  %i1 = extractelement <2 x i32> %i, i64 1
  %i2 = extractelement <2 x i32> %i, i64 0
  %i3 = lshr i32 %i1, 1
  %i4 = icmp ne i32 %i2, 0
  %i5 = select i1 %i4, i32 %i3, i32 0
  %i6 = sitofp i32 %i5 to float
  %i7 = call float @llvm.fabs.f32(float %i6)
  %i8 = uitofp i1 %i4 to float
 %i9 = lshr i32 1, %i2
  %i10 = select i1 %i4, i32 %i9, i32 0
  %i11 = sitofp i32 %i10 to float
  %i12 = select i1 %i4, i32 %i1, i32 0
  %i13 = sitofp i32 %i12 to float
  br label %bb14

bb14:
  %i15 = phi float [ 0.0, %bb ], [ %i19, %bb14 ]
  %i16 = fadd float %i15, %i8
 %i17 = fadd float %i16, %i7
  %i18 = fadd float %i17, %i11
  %i19 = fadd float %i18, %i13
  %i20 = icmp sgt i32 %arg, 0
  br i1 %i20, label %bb14, label %bb21

bb21:
  store float %i15, float* %ptr, align 4
  ret void
}

declare float @llvm.fabs.f32(float)
```
If I compile this with `llc -march=amdgcn -mcpu=gfx1010 -stop-before=si-fix-sgpr-copies` I get:
```
  bb.0.bb:
 successors: %bb.1(0x80000000)
    liveins: $vgpr0, $vgpr1, $vgpr2
 
    %13:vgpr_32 = COPY $vgpr2
    %12:vgpr_32 = COPY $vgpr1
 %11:vgpr_32 = COPY $vgpr0
    %17:sreg_64 = S_MOV_B64 0
 %18:sreg_64_xexec = S_LOAD_DWORDX2_IMM killed %17, 0, 0 :: (invariant load (s64) from `<2 x i32> addrspace(4)* null`, align 4294967296, addrspace 4)
 %19:sreg_32 = COPY %18.sub1
    %20:sreg_32 = COPY %18.sub0
 %15:sreg_32 = S_MOV_B32 0
    S_CMP_LG_U32 %20, %15, implicit-def $scc
 %21:sreg_32 = S_CSELECT_B32 %19, %15, implicit $scc
    %22:sreg_32 = S_MOV_B32 1
    %23:sreg_32 = S_LSHR_B32 %22, %20, implicit-def dead $scc
    S_CMP_LG_U32 %20, %15, implicit-def $scc
    %24:sreg_32 = S_CSELECT_B32 killed %23, %15, implicit $scc
    %25:sreg_32 = S_LSHR_B32 %19, %22, implicit-def dead $scc
    S_CMP_LG_U32 %20, %15, implicit-def $scc
    %26:sreg_64 = REG_SEQUENCE %12, %subreg.sub0, %13, %subreg.sub1
    %14:vreg_64 = COPY %26
    %27:sreg_32 = S_CSELECT_B32 killed %25, %15, implicit $scc
    %28:vgpr_32 = V_CVT_F32_I32_e64 killed %27, 0, 0, implicit $mode, implicit $exec
    %29:sreg_32 = S_MOV_B32 2147483647
    %30:sreg_32 = COPY %28
    %0:sgpr_32 = S_AND_B32 killed %30, killed %29, implicit-def dead $scc ; !!! SCC DEAD HERE !!!
 %31:sgpr_32 = S_MOV_B32 1065353216
    %16:sgpr_32 = S_MOV_B32 0
 %33:sreg_32_xm0_xexec = COPY $scc ; !!! SCC USED HERE !!!
    %34:vgpr_32 = COPY killed %31
    %32:vgpr_32 = V_CNDMASK_B32_e64 0, %16, 0, %34, %33, implicit $exec
    %1:sgpr_32 = COPY %32
    %35:vgpr_32 = V_CVT_F32_UBYTE0_e64 killed %24, 0, 0, implicit $exec
    %2:sgpr_32 = COPY %35
    %36:vgpr_32 = V_CVT_F32_I32_e64 killed %21, 0, 0, implicit $mode, implicit $exec
    %3:sgpr_32 = COPY %36
    %37:sreg_32 = V_CMP_LT_I32_e64 %11, %22, implicit $exec
    %4:vreg_1 = COPY %37
 
  bb.1.bb14:
    successors: %bb.2(0x04000000), %bb.1(0x7c000000)
 
    %5:sreg_32 = PHI %15, %bb.0, %7, %bb.1
    %6:sgpr_32 = PHI %16, %bb.0, %8, %bb.1
    %38:sreg_32 = COPY %4
    %7:sreg_32 = SI_IF_BREAK %38, %5, implicit-def dead $scc
    %39:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %6, 0, %1, 0, 0, implicit $mode, implicit $exec
    %40:vgpr_32 = nofpexcept V_ADD_F32_e64 0, killed %39, 0, %0, 0, 0, implicit $mode, implicit $exec
    %41:vgpr_32 = nofpexcept V_ADD_F32_e64 0, killed %40, 0, %2, 0, 0, implicit $mode, implicit $exec
    %42:vgpr_32 = nofpexcept V_ADD_F32_e64 0, killed %41, 0, %3, 0, 0, implicit $mode, implicit $exec
 %8:sgpr_32 = COPY %42
    SI_LOOP %7, %bb.1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
    S_BRANCH %bb.2
  
 bb.2.bb21:
    %9:vgpr_32 = PHI %6, %bb.1
    %10:sreg_32 = PHI %7, %bb.1
    SI_END_CF %10, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
    FLAT_STORE_DWORD %14, %9, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32) into %ir.ptr)
 SI_RETURN
```
I've added `!!!` comments to indicate the problem. The problem is that `%32 = V_CNDMASK` wants to use the condition that was calculated by one of the earlier `S_CMP_LG_U32` instructions, so it inserts a copy from `$scc`, but it does it at a point where `$scc` is dead because it has been clobbered by the `%0 = S_AND_B32` instruction.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0WFtz2roW_jXKy5owluTrAw8EyC6zc-kJSc7ZTx7ZlkG7xvZYIk3__RlJNtgG0nR3didTQFrXb120JCal2JScT5F3g7zFFdurbdVM_2Y_8oplV0mV_ZiuFEjOdxK2rMlAVbDhChjIHSsKUFwqSJnkkFcNqK2QE3jeCglCgtpySPT-CpHgjUNa7Tjsa_gu1BZkBTlrEJ0hZ4GcGfKd9s_8zHguSg5vlcgAuU6OSCgoAUQ81mwQmUNeVEwhMtNLtWoQiQAFN5Y5SQ5iQe8LQHQBRcUyQHRO4B0EJYgutZzBArAsa2TNUo5I6CISaQXlvig0JSvEpgSXRG7kByTy-wqw0cDfVcNSxQu-46UaidZkWozwXcB9XvJrvE6fl1rP5LaBFh6BNeFAgWuIRLqroeQHOqLpBsI8Qyd5wVMF2iXNa9S2LLT7MWDzLZtQVV4fSD2dJzZGPdLAkKY6b8yeDm1RvO0mOUvkJKcEkbDd0IJ1AHrcoeHet4pa-8Z69GI0RMUgYl3uh8z5mbvRWXcxPucvds46jMnPlODzSuhZJeRESdJAwRJe6P0kwW5bTG0ZYHdUCNjGuN6KLgDeDTgTp0UoSQB5C_PDu7EM0WELu2azL82GPmdZBsewYa_DO-zFBAdnaf2ONhgIDs8SBx0xHuQ3js5ShwdqOig351gOcqNg2FacHrBtuIhBZ4jycIHgIewE92CXqmr4CTwn7evQXzq-hivT_lrRwaKvI-NpwY5iL1TRoX5GzXWVw0o341oU3LRs25GR7xRFCtc71qRbRBdsl23SEq53ab1HdLHJ37GDHbiWqqqvE55XDUd0IcV1Lt6v5aZurtOqFlwi34GVPiQuNXeAJJk4k36blvs05VJWjUR0ZlGdYERC5z107L9eMwAoxBsXZUvrvm3qpk1h8x33vnc1f-RFxMMU0Znejakt0Pnj17_GHC0p-YAUHxMc4w_onKHIANGZbPgm9m1rXsf3j6_xTa-5a6rwSBW_83eetrR3j7NFvPjv49PifyRe3d_DN1EUPGslmxzW_4EG1-ATivKNNYKVqj0DSSh9fbpB3lQ7HfZPHoK-c_Yc1GsdC7jHOGmDos6JISoeDidyn-ABLsT5kLiPjTeibBHst1GAdTy__xrf_RG_2BInXZuzJSh2dSFSoa4znutAyTQ9ajAlPNQwXy_vlvNno8W6dk7aUFLrGLlo7ggBekJ4t_7y1KkkpFVpPRk4kHET2aHuf4xAa477IQjHvCP081ichq7v4gFV6-u_76I_qsWn5R_xevmfl-XDfNnWv5Un90nDNzYRWw30ZGsYTnP8vvWEdwlN_KERwWdx9j6PczjqR6_x_PU5vqUkXlESc9_ty-31jbHgXZXx8ZruRkNt4zo_ZjjBbuCG1HeDAQe9VOwkHNAZsp4b63j2sBjBQo3RPXeij3IHENWzDbZ_sJ7PYbGcLeDL8ml5XD-2AopPTDhUr-N71KMED-OJ_YscvSZGe8Uev--cXpPvzo7z1r6slxesbaF1zx1FPbhG5OMT7jWePyzuZ-s_tcUmUw4Z7x9SxOppv9CfJsgYwy7adHjaUu9i1r7c_PW8dMaJ615O3NMkvWSDN7TB_5XKwb9ZOfSSUcOUouMW8Wr73vPBJjuDnGueZ_UeWhMeqg1G85KewyajmwScHdeIGdcc9ziudTeHdpIL0vEkN7BofDB8_bI6tjorp8u8oC-6L2NceJ0M_1RGeEkGDS90JndAdtKzV_HqNr55Ws7-bKVY-afH0NlzTLNEo8Qrq7zm7ymvFbzGs8XC5GC_Hgfl-LuZ6Dq_pL7XT6K-Gc7vmjEepD9rhuv0zSC_a8a4K37aDDzokf_YDJOi53uD22ua61V89_j49aQqLiWd0fBRRn4IzDq-eZo9zL8cSr67WNtPvTQZ3X8NmuPMbuvSv1SDeDwdtAznC3-9ipcPi3h-27L-O77f3s2e4_Xz49PS3r7aCc8aFP3kHBqt5QVTsUyb3iXNvhPoL_oCH4EoVWUeDJqJfd9sLVmv4qfl88vTw_mrvX1pZVmms1Ff2LoJwXf0lX_HSyVBVSDKTKRMcfNIWzdVUvDdBJ6PP-wDLlNWijeeDbS876wVtpdWTlqVmVCiKi3ndyYhZUW6L5jiGSQ_oCo5VLmh5awpBG-0-P4Mr-WKUqpmn2pBUiMnKxBKr_JGSWCQVvWP493Vhs7eTZO90qRZxaX-ZAoY1JUoFXzfcg1vj147aIKf8JRpD4SCLZOQcF5CWlRJwhtrtTbXouAMZ9CRsZOrbEqziEbsik-xH2DPw6HrXW2nScD9wHUyx8k5T708T0JGEpL7SegHWRJciSlxCMGEONjzAuJOeJZHjPIgcUgU5VGCXIfvmCgm5qWnajZXQso9n3qRj8Mr8xglzSM-IQlLv_EyQ3Q2u1_88fUFEYK8xVUz1azXyX4jkesUQip5FKaEKvi0paez9sVSVGXGNrDhJW-Y4hKSpvqm0akyrhEtYT27ezFPSazh0HC5L0wA9tIi96q3u9fPI1BX-6aYbpWq9fiAyC0itxuhtvtkklY7RG61We3Hdd1Uf_NUIXJrHJaI3Bqf_x8AAP__6oCc1g">