Issue |
129057
|
Summary |
[SLPVectorizer] Miscompilation at O3
|
Labels |
miscompilation,
llvm:SLPVectorizer
|
Assignees |
|
Reporter |
dtcxzyw
|
Reproducer:
```
; bin/opt -passes=slp-vectorizer reduced.ll -S
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"
@f = global i32 zeroinitializer
@.str = constant [4 x i8] c"%d\0A\00"
define i32 @main() {
entry:
store i32 152, ptr @f, align 4
%agg.tmp.sroa.0.0.copyload.i = load i32, ptr @f, align 4
%add.i.i = shl i32 %agg.tmp.sroa.0.0.copyload.i, 24
%sext.i = add i32 %add.i.i, 83886080
%conv2.i = ashr i32 %sext.i, 24
%and.i = and i32 %conv2.i, 66440127
%cmp3.i.i = icmp ugt i32 %and.i, 33554431
%shl.i.i = select i1 %cmp3.i.i, i32 0, i32 6
%cond.i.i = shl i32 %and.i, %shl.i.i
%0 = trunc i32 %cond.i.i to i8
%sext.1.i = add i32 0, 83886080
%conv2.1.i = ashr i32 %sext.1.i, 24
%and.1.i = and i32 %conv2.1.i, 1
%cmp3.i.1.i = icmp ugt i32 0, 0
%shl.i.1.i = select i1 %cmp3.i.1.i, i32 0, i32 0
%cond.i.1.i = shl i32 %and.1.i, %shl.i.1.i
%1 = trunc i32 %cond.i.1.i to i8
%conv17.1.i = and i8 %0, %1
%sext.2.i = add i32 0, 83886080
%conv2.2.i = ashr i32 %sext.2.i, 24
%and.2.i = and i32 %conv2.2.i, 1
%shl.i.2.i = select i1 false, i32 0, i32 0
%cond.i.2.i = shl i32 %and.2.i, %shl.i.2.i
%2 = trunc i32 %cond.i.2.i to i8
%conv17.2.i = and i8 %conv17.1.i, %2
%sext.3.i = add i32 0, 83886080
%conv2.3.i = ashr i32 %sext.3.i, 24
%and.3.i = and i32 %conv2.3.i, 1
%shl.i.3.i = select i1 false, i32 0, i32 0
%cond.i.3.i = shl i32 %and.3.i, %shl.i.3.i
%3 = trunc i32 %cond.i.3.i to i8
%conv17.3.i = and i8 %conv17.2.i, %3
%sext.4.i = add i32 0, 83886080
%conv2.4.i = ashr i32 %sext.4.i, 24
%and.4.i = and i32 %conv2.4.i, 1
%shl.i.4.i = select i1 false, i32 0, i32 0
%cond.i.4.i = shl i32 %and.4.i, %shl.i.4.i
%4 = trunc i32 %cond.i.4.i to i8
%conv17.4.i = and i8 %conv17.3.i, %4
%sext.5.i = add i32 0, 83886080
%conv2.5.i = ashr i32 %sext.5.i, 24
%and.5.i = and i32 %conv2.5.i, 1
%shl.i.5.i = select i1 false, i32 0, i32 0
%cond.i.5.i = shl i32 %and.5.i, %shl.i.5.i
%5 = trunc i32 %cond.i.5.i to i8
%conv17.5.i = and i8 %conv17.4.i, %5
%sext.6.i = add i32 0, 83886080
%conv2.6.i = ashr i32 %sext.6.i, 24
%and.6.i = and i32 %conv2.6.i, 1
%shl.i.6.i = select i1 false, i32 0, i32 0
%cond.i.6.i = shl i32 %and.6.i, %shl.i.6.i
%6 = trunc i32 %cond.i.6.i to i8
%conv17.6.i = and i8 %conv17.5.i, %6
%sext.7.i = add i32 0, 83886080
%conv2.7.i = ashr i32 %sext.7.i, 24
%and.7.i = and i32 %conv2.7.i, 1
%shl.i.7.i = select i1 false, i32 0, i32 0
%cond.i.7.i = shl i32 %and.7.i, %shl.i.7.i
%7 = trunc i32 %cond.i.7.i to i8
%conv17.7.i = and i8 %conv17.6.i, %7
%conv = zext i8 %conv17.7.i to i32
%call1 = call i32 (ptr, ...) @printf(ptr @.str, i32 %conv)
ret i32 0
}
declare i32 @printf(ptr, ...)
```
```
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"
@f = global i32 0
@.str = constant [4 x i8] c"%d\0A\00"
define i32 @main() {
entry:
store i32 152, ptr @f, align 4
%agg.tmp.sroa.0.0.copyload.i = load i32, ptr @f, align 4
%add.i.i = shl i32 %agg.tmp.sroa.0.0.copyload.i, 24
%0 = insertelement <8 x i32> <i32 poison, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080>, i32 %add.i.i, i32 0
%1 = add <8 x i32> <i32 83886080, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, %0
%2 = ashr <8 x i32> %1, splat (i32 24)
%3 = trunc <8 x i32> %2 to <8 x i8>
%4 = and <8 x i8> %3, <i8 -65, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%5 = zext <8 x i8> %4 to <8 x i32>
%6 = shufflevector <8 x i32> %5, <8 x i32> poison, <2 x i32> <i32 0, i32 poison>
%7 = shufflevector <2 x i32> %6, <2 x i32> <i32 poison, i32 0>, <2 x i32> <i32 0, i32 3>
%8 = icmp ugt <2 x i32> %7, <i32 33554431, i32 0>
%9 = call <8 x i1> @llvm.vector.insert.v8i1.v2i1(<8 x i1> <i1 poison, i1 poison, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <2 x i1> %8, i64 0)
%10 = select <8 x i1> %9, <8 x i8> zeroinitializer, <8 x i8> <i8 6, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
%11 = shl <8 x i8> %4, %10
%12 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %11)
%conv = zext i8 %12 to i32
%call1 = call i32 (ptr, ...) @printf(ptr @.str, i32 %conv)
ret i32 0
}
declare i32 @printf(ptr, ...)
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <8 x i1> @llvm.vector.insert.v8i1.v2i1(<8 x i1>, <2 x i1>, i64 immarg) #0
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>) #0
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```
llubi output:
Before SLP:
```
Entering function main
store i32 152, ptr @f, align 4
%agg.tmp.sroa.0.0.copyload.i = load i32, ptr @f, align 4 -> i32 152
%add.i.i = shl i32 %agg.tmp.sroa.0.0.copyload.i, 24 -> i32 -1744830464
%sext.i = add i32 %add.i.i, 83886080 -> i32 -1660944384
%conv2.i = ashr i32 %sext.i, 24 -> i32 -99
%and.i = and i32 %conv2.i, 66440127 -> i32 66440093
%cmp3.i.i = icmp ugt i32 %and.i, 33554431 -> T
%shl.i.i = select i1 %cmp3.i.i, i32 0, i32 6 -> i32 0
%cond.i.i = shl i32 %and.i, %shl.i.i -> i32 66440093
%0 = trunc i32 %cond.i.i to i8 -> i8 -99
%sext.1.i = add i32 0, 83886080 -> i32 83886080
%conv2.1.i = ashr i32 %sext.1.i, 24 -> i32 5
%and.1.i = and i32 %conv2.1.i, 1 -> i32 1
%cmp3.i.1.i = icmp ugt i32 0, 0 -> F
%shl.i.1.i = select i1 %cmp3.i.1.i, i32 0, i32 0 -> i32 0
%cond.i.1.i = shl i32 %and.1.i, %shl.i.1.i -> i32 1
%1 = trunc i32 %cond.i.1.i to i8 -> i8 1
%conv17.1.i = and i8 %0, %1 -> i8 1
%sext.2.i = add i32 0, 83886080 -> i32 83886080
%conv2.2.i = ashr i32 %sext.2.i, 24 -> i32 5
%and.2.i = and i32 %conv2.2.i, 1 -> i32 1
%shl.i.2.i = select i1 false, i32 0, i32 0 -> i32 0
%cond.i.2.i = shl i32 %and.2.i, %shl.i.2.i -> i32 1
%2 = trunc i32 %cond.i.2.i to i8 -> i8 1
%conv17.2.i = and i8 %conv17.1.i, %2 -> i8 1
%sext.3.i = add i32 0, 83886080 -> i32 83886080
%conv2.3.i = ashr i32 %sext.3.i, 24 -> i32 5
%and.3.i = and i32 %conv2.3.i, 1 -> i32 1
%shl.i.3.i = select i1 false, i32 0, i32 0 -> i32 0
%cond.i.3.i = shl i32 %and.3.i, %shl.i.3.i -> i32 1
%3 = trunc i32 %cond.i.3.i to i8 -> i8 1
%conv17.3.i = and i8 %conv17.2.i, %3 -> i8 1
%sext.4.i = add i32 0, 83886080 -> i32 83886080
%conv2.4.i = ashr i32 %sext.4.i, 24 -> i32 5
%and.4.i = and i32 %conv2.4.i, 1 -> i32 1
%shl.i.4.i = select i1 false, i32 0, i32 0 -> i32 0
%cond.i.4.i = shl i32 %and.4.i, %shl.i.4.i -> i32 1
%4 = trunc i32 %cond.i.4.i to i8 -> i8 1
%conv17.4.i = and i8 %conv17.3.i, %4 -> i8 1
%sext.5.i = add i32 0, 83886080 -> i32 83886080
%conv2.5.i = ashr i32 %sext.5.i, 24 -> i32 5
%and.5.i = and i32 %conv2.5.i, 1 -> i32 1
%shl.i.5.i = select i1 false, i32 0, i32 0 -> i32 0
%cond.i.5.i = shl i32 %and.5.i, %shl.i.5.i -> i32 1
%5 = trunc i32 %cond.i.5.i to i8 -> i8 1
%conv17.5.i = and i8 %conv17.4.i, %5 -> i8 1
%sext.6.i = add i32 0, 83886080 -> i32 83886080
%conv2.6.i = ashr i32 %sext.6.i, 24 -> i32 5
%and.6.i = and i32 %conv2.6.i, 1 -> i32 1
%shl.i.6.i = select i1 false, i32 0, i32 0 -> i32 0
%cond.i.6.i = shl i32 %and.6.i, %shl.i.6.i -> i32 1
%6 = trunc i32 %cond.i.6.i to i8 -> i8 1
%conv17.6.i = and i8 %conv17.5.i, %6 -> i8 1
%sext.7.i = add i32 0, 83886080 -> i32 83886080
%conv2.7.i = ashr i32 %sext.7.i, 24 -> i32 5
%and.7.i = and i32 %conv2.7.i, 1 -> i32 1
%shl.i.7.i = select i1 false, i32 0, i32 0 -> i32 0
%cond.i.7.i = shl i32 %and.7.i, %shl.i.7.i -> i32 1
%7 = trunc i32 %cond.i.7.i to i8 -> i8 1
%conv17.7.i = and i8 %conv17.6.i, %7 -> i8 1
%conv = zext i8 %conv17.7.i to i32 -> i32 1
%call1 = call i32 (ptr, ...) @printf(ptr @.str, i32 %conv)
Printf: 1
-> i32 2
ret i32 0
Exiting function main
```
After SLP:
```
Entering function main
store i32 152, ptr @f, align 4
%agg.tmp.sroa.0.0.copyload.i = load i32, ptr @f, align 4 -> i32 152
%add.i.i = shl i32 %agg.tmp.sroa.0.0.copyload.i, 24 -> i32 -1744830464
%0 = insertelement <8 x i32> <i32 poison, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080>, i32 %add.i.i, i32 0 -> { i32 -1744830464, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080 }
%1 = add <8 x i32> <i32 83886080, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, %0 -> { i32 -1660944384, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080, i32 83886080 }
%2 = ashr <8 x i32> %1, splat (i32 24) -> { i32 -99, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5 }
%3 = trunc <8 x i32> %2 to <8 x i8> -> { i8 -99, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5 }
%4 = and <8 x i8> %3, <i8 -65, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> -> { i8 -99, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1 }
%5 = zext <8 x i8> %4 to <8 x i32> -> { i32 157, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 }
%6 = shufflevector <8 x i32> %5, <8 x i32> poison, <2 x i32> <i32 0, i32 poison> -> { i32 157, poison }
%7 = shufflevector <2 x i32> %6, <2 x i32> <i32 poison, i32 0>, <2 x i32> <i32 0, i32 3> -> { i32 157, i32 0 }
%8 = icmp ugt <2 x i32> %7, <i32 33554431, i32 0> -> { F, F }
%9 = call <8 x i1> @llvm.vector.insert.v8i1.v2i1(<8 x i1> <i1 poison, i1 poison, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <2 x i1> %8, i64 0) -> { F, F, F, F, F, F, F, F }
%10 = select <8 x i1> %9, <8 x i8> zeroinitializer, <8 x i8> <i8 6, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0> -> { i8 6, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0 }
%11 = shl <8 x i8> %4, %10 -> { i8 64, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1 }
%12 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %11) -> i8 0
%conv = zext i8 %12 to i32 -> i32 0
%call1 = call i32 (ptr, ...) @printf(ptr @.str, i32 %conv)
Printf: 0
-> i32 2
ret i32 0
Exiting function main
```
llvm version: a88f4f1962b47aa8db49b8687a7f8b9097a3d13b
C reproducer:
```
#include "csmith.h"
struct d {
uint8_t a;
uint16_t b
} f;
static uint64_t c[] = {66440127};
uint64_t e;
uint8_t h = 5;
uint32_t g(uint8_t, struct d);
int32_t j() {
int16_t i = 10;
struct d k = {152};
for (e = 0; e < 22; ++e) {
int32_t l[0];
struct d *m = &f;
h &= safe_lshift_func_int32_t_s_u(
safe_add_func_int8_t_s_s(g(0, *m = k), 5) & c[0],
safe_add_func_int16_t_s_s(6, (k.a > k.b) < l));
}
return i;
}
uint32_t g(uint8_t, struct d n) { return n.a; }
int main() {
j();
printf("%d\n", h);
}
```
```
> gcc -w -I/usr/include/csmith -fsanitize=address,undefined test.c && ./a.out
5
> bin/clang -w -I/usr/include/csmith -O3 test.c && ./a.out
0
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs