<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/127534>127534</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".

Reduced reproducer:

```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

define i64 @"main"(ptr addrspace(1) %p, i1 %check) {
entry:
  br label %loop0.pre

loop0.pre:
  br i1 %check, label %exit, label %loop0

loop0:
  %length = load atomic i32, ptr addrspace(1) %p unordered, align 4
  %28 = icmp ugt i32 %length, 1
  br i1 %28, label %loop0.out, label %loop1.preheader

loop0.out:
  %t = add i32 0, 1
  br i1 false, label %loop1.preheader, label %mid

loop1.preheader:
  %length.lcssa = phi i32 [ %length, %loop0.out ], [ %length, %loop0 ]
  %local = phi i32 [ 0, %loop0 ], [ %t, %loop0.out ]
  br label %loop1

loop1:
  %iv1 = phi i32 [ 4, %loop1.preheader ], [ %iv1.next, %loop1.guarded ]
  %82 = icmp ult i32 %iv1, %length.lcssa
  %wc = call i1 @llvm.experimental.widenable.condition()
  %guard.chk = and i1 %82, %wc
  br i1 %guard.chk, label %loop1.guarded, label %deopt-exit

loop1.guarded:
  %iv1.next = add nuw nsw i32 %iv1, 1
  %chk = icmp ugt i32 %iv1, 310
  br i1 %chk, label %loop1.exit, label %loop1

deopt-exit:
  %100 = call i64 (...) @llvm.experimental.deoptimize.i64(i32 13) [ "deopt"() ]
  ret i64 %100

loop1.exit:
  ret i64 0

mid:
  br label %loop0.pre

exit:
  ret i64 0
}

declare i64 @foo()

declare i64 @llvm.experimental.deoptimize.i64(...)

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite)
declare noundef i1 @llvm.experimental.widenable.condition()
```


Steps to reproduce:
`$opt -passes='print<scalar-evolution>,loop-mssa(licm,loop-simplifycfg,loop-predication)'`

Proof: https://godbolt.org/z/8hsbahTjq

Looks like `LoopSimplifyCFGPass` is guilty - it doesn’t invalidate SCEV when removing a dead exit:

```c++
  void handleDeadExits() {
...
      for (Instruction *I : DeadInstructions) {
        SE.forgetBlockAndLoopDispositions(I);
        I->replaceAllUsesWith(PoisonValue::get(I->getType()));
        I->eraseFromParent();
      }
```


</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0V19vo7oS_zTOiwUCQwh5yANtmruV9qHa7t37eGXsCfHG2FzbJO1--isbSEjaPefoSCeiKdgzv_nDb8YTaq1oFMAGLR8QIVTC0UaurREhaLld0N4dtNlclhe15u-bbW-EarDuDZaaUYkdWCdUg8gjPgMGxXSvHBjg2B0AU2vBOKEV3lMhewMYFYmw1YkKSWsJlfuqdfeknHlHpPz25dXjfEVkjREpECkwIuTbl1csLFbaYTrpYeqw18SjKolRUqGk-ga8Z8Cxgc5of2tQVg1bqEiGS8pTi5LKUdOAw5w6Kum77h1G2dbbg6hFWQVRR1YJyqqMhC__mN4--rsiD1-RuNykpERZlZIy2pfJeKfCUjGpF3n0GpaFX446Mm2U419Ghj3i38XFVWdEJ2Fy860s_lvkUa-OSp9VJIXq36JG9YMKSioOe6EAiyLHKE8QIS0Vyu-SsnMGU86N7SgDRMp0yPiy8-kXqb9lB2DHsLx6QEkFIc8hlxjXBktag_RyUusuiTsDg9Hr41X2BvDxqgpvwt0sBOUZzoTht0A17hBil5pyTJ1uBcMiIx7ht_HgXmnDPR29GJWiUTifMEkZ8ARrO9w3zoNdTXn59DYCUn70Ntb9xxhSn4ADUA5mnhUveo1o4BvlPNhN7u3tqbTwh8jzvVbwq6W50H0GY8mspcF0dxBDyMuH27DnsWG03Ia13wkFgclE6Aj32MkH8Sue-9TeZxxLZ_HNohKn9IPBfAY6y8WdaXFKYwVv7ka46anhwOdBlWTGEnlhiTilk-YssZPSmQUlRqUM5MlD14nhrQMjWlCOyvgsOCjfzGKmFRe-SyJPsfUEEpyJ2eE4MEXxkYclGS2f2S1BLwqf8GaM7GaHg-5cFMpwRp5J8ibJIVUXxqr-jJU93-UineQnl-8ra5TL0uS-NXzm8aftIZ1628Xzq5tpksyy7tseKeM4Dr3gsxcQQEQrfkHs2zcpvZtpFuQDR0iQGFrmsDqwwoAb8b3Nee7mHk1So4Av0T_vn78FWG2nyJmk5tLW91pfSPNx9y_EPCRoPCKzB7zrFQsHduWcsSirsPJVLWvKjljpvQHAStt3xbDSvToLxbHtgPWSunAyn4WUBlxvFG6h1eFgF4oyBtaKWkIL_njFBig_G-FgsD457jE57P9W0VxO-DGapHp10Fns9HUeGMeBIkEk153DUedHFIuyLSKrzgjlUPZoGZXURHDSsg8WsidEHv2bilpf5KSUgrXTkhVtJ8X-ne2baakzwAWjg3drRFYXp16M1nsf_8G5zqcXkR0iu0bzWksXa9MgsvuFyK482Joevv_836D3VeujxVIcwwTlR5_X0ezj7l8v1FpUJH5Kanoh3TuOsHCYa7AKPRFUJmi9dlioE5WCUwf49fHpBz4fQGEDrT75kY5iDpTjKwHnGWWIPPjL0_KkBccHqriELVD-9CacnQokzAqeUl7Qf_ba-DJ8VtaZfiAWItUz9inw2rMNe0XA4-f1Kd5rP_s8SM2OleI-8K2wnbZiVCmffYazudZzhLInA52kDCop_23B_kf4U6t80cJq9YPKPhAhqxpwHsIrNOC-v3cwsmm4PsKCoRZ2Rrcv1IByo_RMbizUWyou-Cbj62xNF7BJV9m6TIt1sV4cNnVS8H29KpZ0mbCC8D3POMnIuiYZMEjzhdiQhCwTkq7SkqzJOi7yVZ6uWc1zskpJwlCeQEuFjEOtaNMshLU9bFKyWmb5IvQZO474YfLNKv_yxyHfbPxaVPeN9eUmrLNXICecDL8OgsJyi6vLNP8PTfGIrMIPBeCL3sjNXY0Id-jrmOkWkV0IZfgXdUb_BOYQ2YXQLSK7MfrThvw_AAD__0Qmz3w">