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

Reply via email to