<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
}
```

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
}
```

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">