Issue 130930
Summary [SCEV] Assertion `isAvailableAtLoopEntry(RHS, L) && "RHS is not available at Loop Entry"' failed
Labels llvm:SCEV
Assignees aleks-tmb
Reporter aleks-tmb
    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.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to