Issue |
139090
|
Summary |
[SLP-Vectorizer] Miscompile on Given IR
|
Labels |
new issue
|
Assignees |
|
Reporter |
Nirhar
|
Consider the IR:
```
; ModuleID = 'reduced.ll'
source_filename = "reduced.ll"
target triple = "x86_64-unknown-linux-gnu"
@global = global i32 0
define i64 @main() #0 {
bb:
%alloca = alloca i32, align 8
%load = load i32, ptr @global, align 8
%add = add i32 1, %load
%sub = sub i32 0, %add
%mul = mul i32 %sub, 10
%add1 = add i32 %mul, 10
%mul2 = mul i32 0, 0
%or = or i32 %mul2, 0
%mul3 = mul i32 %add, 0
%or4 = or i32 %mul3, 0
%mul5 = mul i32 0, 0
%or6 = or i32 %mul5, 0
%add7 = add i32 1, 0
%sub8 = sub i32 0, 0
%mul9 = mul i32 %sub8, 0
%or10 = or i32 %mul9, 0
%sub11 = sub i32 0, %add7
%mul12 = mul i32 %sub11, 0
%or13 = or i32 %mul12, 0
%sub14 = sub i32 0, 0
%mul15 = mul i32 %sub14, 0
%or16 = or i32 %mul15, 0
%mul17 = mul i32 0, 0
%or18 = or i32 %mul17, 0
%mul19 = mul i32 0, 0
%or20 = or i32 %mul19, 0
br label %bb26
bb21: ; preds = %bb26
%getelementptr = getelementptr i8, ptr %alloca, i64 40
%load22 = load i32, ptr %getelementptr, align 8
%sext = sext i32 %load22 to i64
%sub23 = sub i32 1, %sub11
%sext24 = sext i32 %sub23 to i64
%or25 = or i64 %sext, %sext24
ret i64 %or25
bb26: ; preds = %bb26, %bb
%phi = phi i64 [ 1, %bb ], [ 0, %bb26 ]
%getelementptr27 = getelementptr i32, ptr %alloca, i64 10
store i32 %add1, ptr %getelementptr27, align 4
%add28 = add i64 %phi, 10
%getelementptr29 = getelementptr i32, ptr %alloca, i64 %add28
store i32 %or, ptr %getelementptr29, align 4
%add30 = add i64 %phi, 11
%getelementptr31 = getelementptr i32, ptr %alloca, i64 %add30
store i32 %or4, ptr %getelementptr31, align 4
%add32 = add i64 %phi, 12
%getelementptr33 = getelementptr i32, ptr %alloca, i64 %add32
store i32 %or6, ptr %getelementptr33, align 4
%add34 = add i64 %phi, 13
%getelementptr35 = getelementptr i32, ptr %alloca, i64 %add34
store i32 %or10, ptr %getelementptr35, align 4
%add36 = add i64 %phi, 14
%getelementptr37 = getelementptr i32, ptr %alloca, i64 %add36
store i32 %or13, ptr %getelementptr37, align 4
%add38 = add i64 %phi, 15
%getelementptr39 = getelementptr i32, ptr %alloca, i64 %add38
store i32 %or16, ptr %getelementptr39, align 4
%add40 = add i64 %phi, 16
%getelementptr41 = getelementptr i32, ptr %alloca, i64 %add40
store i32 %or18, ptr %getelementptr41, align 4
%add42 = add i64 %phi, 17
%getelementptr43 = getelementptr i32, ptr %alloca, i64 %add42
store i32 %or20, ptr %getelementptr43, align 4
br i1 true, label %bb21, label %bb26
}
attributes #0 = { "target-features"="+avx2" }
```
running `lli` on the above IR returns `2`. However, if I transform the IR with `opt -passes=slp-vectorizer` the transformed IR:
```
source_filename = "reduced.ll"
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"
target triple = "x86_64-unknown-linux-gnu"
@global = global i32 0
define i64 @main() #0 {
bb:
%alloca = alloca i32, align 8
%load = load i32, ptr @global, align 8
%add7 = add i32 1, 0
%0 = insertelement <4 x i32> <i32 poison, i32 0, i32 poison, i32 0>, i32 %load, i32 0
%1 = insertelement <4 x i32> %0, i32 %add7, i32 2
%2 = sub <4 x i32> <i32 -1, i32 0, i32 0, i32 0>, %1
%3 = extractelement <4 x i32> %2, i32 0
%sub = sub i32 0, %3
%mul = mul i32 %sub, 10
%add1 = add i32 %mul, 10
%4 = shufflevector <4 x i32> %2, <4 x i32> poison, <8 x i32> <i32 0, i32 poison, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison>
%5 = shufflevector <8 x i32> <i32 0, i32 poison, i32 0, i32 poison, i32 poison, i32 poison, i32 0, i32 0>, <8 x i32> %4, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 11, i32 12, i32 6, i32 7>
%6 = mul <8 x i32> zeroinitializer, %5
%7 = or <8 x i32> %6, zeroinitializer
br label %bb26
bb21: ; preds = %bb26
%getelementptr = getelementptr i8, ptr %alloca, i64 40
%load22 = load i32, ptr %getelementptr, align 8
%sext = sext i32 %load22 to i64
%8 = extractelement <4 x i32> %2, i32 2
%sub23 = sub i32 1, %8
%sext24 = sext i32 %sub23 to i64
%or25 = or i64 %sext, %sext24
ret i64 %or25
bb26: ; preds = %bb26, %bb
%phi = phi i64 [ 1, %bb ], [ 0, %bb26 ]
%getelementptr27 = getelementptr i32, ptr %alloca, i64 10
store i32 %add1, ptr %getelementptr27, align 4
%add28 = add i64 %phi, 10
%getelementptr29 = getelementptr i32, ptr %alloca, i64 %add28
store <8 x i32> %7, ptr %getelementptr29, align 4
br i1 true, label %bb21, label %bb26
}
attributes #0 = { "target-features"="+avx2" }
```
returns `22` when run with `lli`
The proof of transformation is shown here: https://godbolt.org/z/TE9GTjaMr
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs