| Issue |
207990
|
| Summary |
[SLPVectorizer] nsw not dropped when convertin mul by signed_min to shl
|
| Labels |
miscompilation,
llvm:SLPVectorizer
|
| Assignees |
|
| Reporter |
nikic
|
https://alive2.llvm.org/ce/z/SeLxEo
```llvm
; RUN: opt -passes=slp-vectorizer -slp-threshold=-1000 < %s
define void @src(ptr %p, i32 %x, i32 %y) {
%a = shl nsw i32 %x, 1
%b = mul nsw i32 %y, -2147483648
store i32 %a, ptr %p, align 4
%p1 = getelementptr inbounds i32, ptr %p, i64 1
store i32 %b, ptr %p1, align 4
ret void
}
define void @tgt(ptr %p, i32 %x, i32 %y) {
%1 = insertelement <2 x i32> poison, i32 %x, i32 0
%2 = insertelement <2 x i32> %1, i32 %y, i32 1
%3 = shl nsw <2 x i32> %2, <i32 1, i32 31>
%4 = extractelement <2 x i32> %3, i32 0
store i32 %4, ptr %p, align 4
%p1 = getelementptr inbounds i32, ptr %p, i64 1
%5 = extractelement <2 x i32> %3, i32 1
store i32 %5, ptr %p1, align 4
ret void
}
```
`mul nsw 1, u0x80000000` is well-defined, but `shl nsw 1, 31` is poison.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs