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

    <tr>
        <th>Summary</th>
        <td>
            [SCEV] Assertion `isAvailableAtLoopEntry(RHS, L) && "RHS is not available at Loop Entry"' failed
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:SCEV
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            aleks-tmb
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          aleks-tmb
      </td>
    </tr>
</table>

<pre>
    During our local testing, we encountered the assertion failure `isAvailableAtLoopEntry(RHS, L) && "RHS is not available at Loop Entry".
Here is a case breakdown with a reduced reproducer.

1. The IR before `loop-simplifycfg` pass:
```llvm
define void @main(i32 %0, i1 %check) {
entry: 
  br label %loop0

loop0: 
  br label %bb0

bb0:                  
  br i1 false, label %bb3, label %bb1

bb1: 
  br i1 %check, label %bb2, label %loop1

loop1: 
  br i1 true, label %loop0, label %loop1

bb2:                       
  br label %bb3

bb3:                                
  %length = phi i32 [ %0, %bb2 ], [ 0, %bb0 ]
  br label %exit

exit: 
  ret void
}
```

![Image](https://github.com/user-attachments/assets/6b896da6-cc9e-41f4-ac9d-ce31b17ceef0)

SCEV detects the constant branch `br i1 false, label %bb3, label %bb1` and determines `%length` to be `%0`

2. The transformation made by `loop-simplifycfg`:
```llvm
define void @main(i32 %0, i1 %check) {
entry:
  switch i32 0, label %entry.split [
    i32 1, label %bb3.loopexit
  ]

entry.split:                                      ; preds = %entry
  br label %loop0

loop0.loopexit: ; preds = %loop1
  br label %loop0

loop0: ; preds = %loop0.loopexit, %entry.split
  br i1 %check, label %bb2, label %loop1.preheader

loop1.preheader: ; preds = %loop0
  br label %loop1

loop1: ; preds = %loop1.preheader, %loop1
  br i1 true, label %loop0.loopexit, label %loop1

bb2: ; preds = %loop0
  br label %bb3

bb3.loopexit: ; preds = %entry
  br label %bb3

bb3: ; preds = %bb3.loopexit, %bb2
  %length = phi i32 [ %0, %bb2 ], [ 0, %bb3.loopexit ]
  br label %exit

exit: ; preds = %bb3
  ret void
}
```

![Image](https://github.com/user-attachments/assets/380d7f8b-2224-48fa-b9a6-9a0e1c49957e)

In that IR SCEV does not handle constant switch. 
If a later pass checks whether `%0` is available at the loop entry containing the `%length` PHI, the answer will be No, causing the assertion to fail.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8Vk1v4zYQ_TX0ZSCDoizJOvhgrzdIgEVR7Ba9U-TIYiOTAknFzb8vSPlDdpw0LboNAoQiZ4bvkY8vw51TO424IvmGMMY7fHaJ39eEMZJvZ3zwrbGr8_SsNvJ1tR2s0jswg4XOCN6BR-eV3hH2BQ4IqIUZtEeLEnyLwJ1D65XR0HDVDRaBFFS59QtXHa87XPtvxvRftbevhC2_P_4Idb4RVgFhBWEFEMa-P_4A5UAbD_yUB9xDyIRjKpsTun5EiyGSg-AOobbIn6U5aDgo3wIHi3IQKMFib00Y2pBF6Dqdw28twtN3qLExI8jOmD5xat93qnkVzY4UFHruHMlCBino-Nt1L3tC1xIbpRFejJJAFnTPlSZsqTIGhOU0kFJpGIoWxXOkV24IXWNEn62B0DVAbaHjNXYhMGxPR3Tj8F5QXR9DwiBbw5ufU4ZKoeGdwwBkkp3dfKenaul0uyvkV_Hs6jvgTC-Qb2t4O-CbePpehVD8HqMrWldUjmnZ-2nX-WE_1DvfAsm20LcK4nXlm_OVjRyB5Nv4lW_gMk3j9C0O_FP5EUgcnQ7Aoo_SCEvldiqfMZiwlOSbpz3fYdxs2XrfR6WxB8Iedsq3Qz0XZk_Yw-DQJtx7Lto9au8IewiPLA6KelkVkheJEBUmi7RZJFxUMhGYpXVaCsSGElaNm_748vV3kOhReBffqjDaea491JZr0YZH8E-kU1DgWsaKdq80ulDgfMhh2Ruo8Th7Ic_Gx-ct164xds-jXey5RKhf33mJP-URxqtyB-VFG6Vwrc0YNXd9p3yQQgyGGJfeHs08ID5KAY46Oe0zVviERo9KzTbQW5QuivQE42_d4oIgSPC2xumZfcJx7qVOqo-vYUrs33jGvLfYIpdoJ-4xmXwXyF0ObyzoLv1J-ZHE1aG8a1dX1D_wrU_infrWx3d2_95vfe9N2lXds6X9B_53KftZI7wD7X81x2xJZdks64QxtkgWy4YndcWLpOIUU7GoqrzEszk-afAt96ElGH3S4NiBtFzLbuKVo1_Mg88_NcCh4x5tbBQgqt_BoUXfop34XuxRpp1McN9wnBBvORT3XOnQZ4WVWxv99fEpXENsr7Q7oIWD6rpgrb-YsCD44E65l_7Lm9iCzWdylckqq_gMV2m5SMuSLmk-a1dMFozhQjSyKVMqC8aZaBguMyyyOivLmVoxynKapYxWacbyOS0KIaqSsSqnRclqsqC4D3sEP54bu5sp5wZcpRmtMjqL4nDHbjNadhb_CR37TbsKc0k97BxZ0E457y6FvPJdbFRjQr6F9ZnYT2ooCSvjgaGcDbZbfSC6SGX8k_TW_IHCE_YQqQfdHdm_rNhfAQAA__9AaldE">