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

Reply via email to