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

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.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs