[LoopVectorize] speculates a poison-capable SCEV udiv across a loop bypass result a miscompilation
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
### Reproducer
```llvm
declare i32 @llvm.cttz.i32(i32, i1 immarg)
define i32 @src(i32 %x, i1 %skip, ptr %a) {
entry:
%ct = call i32 @llvm.cttz.i32(i32 %x, i1 true)
%d = add nuw nsw i32 %ct, 1
br label %loop
loop:
%i = phi i32 [ 0, %entry ], [ %inc, %body ]
br i1 %skip, label %exit, label %body
body:
%inc = add nuw nsw i32 %i, %d
%done = icmp uge i32 %inc, 64
br i1 %done, label %exit, label %loop, !llvm.loop !0
exit:
%r = phi i32 [ 0, %loop ], [ %inc, %body ]
ret i32 %r
}
!0 = distinct !{!0, !1, !2}
!1 = !{!"llvm.loop.vectorize.width", i32 4}
!2 = !{!"llvm.loop.vectorize.enable"}
```
Result is:
```
$ alive-tv --disable-undef-input --disable-poison-input --passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 ./repro.ll
...
Transformation doesn't verify!
ERROR: Source is more defined than target
NOTE: The counterexample is unique.
```
alive: https://alive2.llvm.org/ce/z/XekZhP
Contributor guide
Assessment
This issue has not been assessed yet.