Issue 135410
Summary [SLPVectorizer] Miscompile in SLP vectorizer
Labels miscompilation, vectorizers, llvm:SLPVectorizer
Assignees alexey-bataev
Reporter danilaml
    The following IR
```llvm
define <4 x float> @foo(i64 %0) {
entry:
  %1 = trunc i64 0 to i32
  %2 = sitofp i32 %1 to float
  %3 = sitofp i64 0 to float
  %4 = fadd float %3, %2
  %to_max.i = fcmp ogt float %4, 0.000000e+00
  %5 = trunc i64 0 to i32
  %6 = sitofp i32 %5 to float
  %7 = sitofp i64 0 to float
  %8 = fadd float %7, %6
  %to_max.i.1 = fcmp ogt float %8, 0.000000e+00
  %9 = trunc i64 %0 to i32
  %10 = sitofp i32 %9 to float
  %11 = sitofp i64 %0 to float
  %12 = fadd float %11, %10
 %to_max.i.2 = fcmp ogt float %12, 0.000000e+00
  %13 = trunc i64 0 to i32
 %14 = sitofp i32 %13 to float
  %15 = sitofp i64 0 to float
  %16 = fadd float %15, %14
  %to_max.i.3 = fcmp ogt float %16, 0.000000e+00
  %r0 = insertelement <4 x float> poison, float %4, i32 0
  %r1 = insertelement <4 x float> %r0, float %8, i32 1
  %r2 = insertelement <4 x float> %r1, float %12, i32 2
  %r3 = insertelement <4 x float> %r2, float %16, i32 3
  ret <4 x float> %r3
}
```
Is optimized by `opt -passes=slp-vectorizer` to
```llvm
define <4 x float> @foo(i64 %0) {
entry:
  %1 = trunc i64 %0 to i32
  %2 = insertelement <4 x i32> <i32 0, i32 0, i32 poison, i32 0>, i32 %1, i32 2
  %3 = sext <4 x i32> %2 to <4 x i64>
  %4 = sitofp <4 x i64> %3 to <4 x float>
  %5 = sitofp <4 x i32> %2 to <4 x float>
  %6 = fadd <4 x float> %4, %5
  %7 = fcmp ogt <4 x float> %6, zeroinitializer
  ret <4 x float> %6
}
```
Which is incorrect as can be seen when passing `i64 2147516416` as an argument to this function.
Third element of the returned vector is `65536.000000` before optimization and `-4294901760.000000` after.

Checked by running `llvm-lli` on
```llvm
;target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

declare noundef i32 @printf(ptr noundef readonly captures(none), ...)
@str = private unnamed_addr constant [8 x i8] c"%f, %f\0A\00", align 1

define <4 x float> @foo(i64 %0) {
entry:
  %1 = trunc i64 0 to i32
  %2 = sitofp i32 %1 to float
  %3 = sitofp i64 0 to float
  %4 = fadd float %3, %2
  %to_max.i = fcmp ogt float %4, 0.000000e+00
  %5 = trunc i64 0 to i32
  %6 = sitofp i32 %5 to float
 %7 = sitofp i64 0 to float
  %8 = fadd float %7, %6
  %to_max.i.1 = fcmp ogt float %8, 0.000000e+00
  %9 = trunc i64 %0 to i32
  %10 = sitofp i32 %9 to float
  %11 = sitofp i64 %0 to float
  %12 = fadd float %11, %10
 %to_max.i.2 = fcmp ogt float %12, 0.000000e+00
  %13 = trunc i64 0 to i32
 %14 = sitofp i32 %13 to float
  %15 = sitofp i64 0 to float
  %16 = fadd float %15, %14
  %to_max.i.3 = fcmp ogt float %16, 0.000000e+00
  %r0 = insertelement <4 x float> poison, float %4, i32 0
  %r1 = insertelement <4 x float> %r0, float %8, i32 1
  %r2 = insertelement <4 x float> %r1, float %12, i32 2
  %r3 = insertelement <4 x float> %r2, float %16, i32 3
  ret <4 x float> %r3
}

define <4 x float> @bar(i64 %0) {
entry:
  %1 = trunc i64 %0 to i32
  %2 = insertelement <4 x i32> <i32 0, i32 0, i32 poison, i32 0>, i32 %1, i32 2
  %3 = sext <4 x i32> %2 to <4 x i64>
  %4 = sitofp <4 x i64> %3 to <4 x float>
  %5 = sitofp <4 x i32> %2 to <4 x float>
  %6 = fadd <4 x float> %4, %5
  %7 = fcmp ogt <4 x float> %6, zeroinitializer
 ret <4 x float> %6
}

define i32 @main() {
  %r1 = call <4 x float> @foo(i64 2147516416)
  %r10 = extractelement <4 x float> %r1, i32 2
  %res1 = fpext float %r10 to double
  %r2 = call <4 x float> @bar(i64 2147516416)
 %r20 = extractelement <4 x float> %r2, i32 2
  %res2 = fpext float %r20 to double
  %n = call i32 (ptr, ...) @printf(ptr @str, double %res1, double %res2)
  ret i32 0
}
```
bisect pointed to https://github.com/llvm/llvm-project/commit/6425f2d66740b84fc3027b649cd4baf660c384e8 commit.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to