| Issue |
183956
|
| Summary |
[SLP] Missed SLP Vectorize Regression at O3 (trunk vs 15)
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
zxt5
|
https://godbolt.org/z/58hjdfTnv
C reproducer:
```c
char b;
long d[6];
static long *c = &d[1];
static short e() {
b = 0;
for (; b <= 3; b++) {
long a = *c;
*d = (d[b] = 1) && a;
}
}
void f() {
long **a = &c;
for (; b;) {
a == &a;
*d &= *a == 0;
}
}
void main() {
f();
e();
}
```
clang-trunk -O3 does not vectorize the loop in function `e()`:
```
define dso_local void @main() local_unnamed_addr #1 !dbg !41 {
#dbg_value(ptr poison, !32, !DIExpression(), !42)
%1 = load i8, ptr @b, align 1
%2 = icmp eq i8 %1, 0
%3 = freeze ptr getelementptr inbounds nuw (i8, ptr @d, i64 8)
br i1 %2, label %8, label %4, !dbg !44
4:
%5 = icmp eq ptr %3, null
br i1 %5, label %6, label %7
6:
br label %6, !dbg !45
7:
br label %7, !dbg !46
8:
%9 = load i64, ptr %3, align 8, !dbg !47
#dbg_value(i64 %9, !56, !DIExpression(), !60)
%10 = icmp ne i64 %9, 0, !dbg !61
%11 = zext i1 %10 to i64, !dbg !62
store i64 %11, ptr @d, align 16, !dbg !63
%12 = load i64, ptr %3, align 8, !dbg !64
#dbg_value(i64 %12, !56, !DIExpression(), !60)
store i64 1, ptr getelementptr inbounds nuw (i8, ptr @d, i64 8), align 8, !dbg !65
%13 = icmp ne i64 %12, 0, !dbg !61
%14 = zext i1 %13 to i64, !dbg !66
store i64 %14, ptr @d, align 16, !dbg !67
%15 = load i64, ptr %3, align 8, !dbg !68
#dbg_value(i64 %15, !56, !DIExpression(), !60)
store i64 1, ptr getelementptr inbounds nuw (i8, ptr @d, i64 16), align 16, !dbg !69
%16 = icmp ne i64 %15, 0, !dbg !61
%17 = zext i1 %16 to i64, !dbg !70
store i64 %17, ptr @d, align 16, !dbg !71
%18 = load i64, ptr %3, align 8, !dbg !72
#dbg_value(i64 %18, !56, !DIExpression(), !60)
store i64 1, ptr getelementptr inbounds nuw (i8, ptr @d, i64 24), align 8, !dbg !73
%19 = icmp ne i64 %18, 0, !dbg !61
%20 = zext i1 %19 to i64, !dbg !74
store i64 %20, ptr @d, align 16, !dbg !75
store i8 4, ptr @b, align 1, !dbg !76
ret void, !dbg !77
}
```
clang-15 -O3 vectorizes the loop in function `e()`:
```
define dso_local void @main() local_unnamed_addr #1 !dbg !35 {
%1 = load i8, ptr @b, align 1
%2 = icmp eq i8 %1, 0
br i1 %2, label %4, label %3, !dbg !37
3:
br label %3
4:
call void @llvm.dbg.value(metadata i64 undef, metadata !39, metadata !DIExpression()), !dbg !48
call void @llvm.dbg.value(metadata i64 undef, metadata !39, metadata !DIExpression()), !dbg !48
call void @llvm.dbg.value(metadata i64 1, metadata !39, metadata !DIExpression()), !dbg !48
store i64 1, ptr @d, align 16, !dbg !50
call void @llvm.dbg.value(metadata i64 1, metadata !39, metadata !DIExpression()), !dbg !48
store <2 x i64> <i64 1, i64 1>, ptr getelementptr inbounds ([6 x i64], ptr @d, i64 0, i64 2), align 16, !dbg !53
store <2 x i64> <i64 1, i64 1>, ptr @d, align 16, !dbg !50
store i8 4, ptr @b, align 1, !dbg !54
ret void, !dbg !55
}
```
Bisect to [0e7ed32](https://github.com/llvm/llvm-project/commit/0e7ed32c71362f3547329c6ee8573a8bc191f58a), which is committed by @alexey-bataev
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs