Issue 184944
Summary [LoopVectorize] Missed Loop Vectorize Regression at -O3 (trunk vs 21)
Labels new issue
Assignees
Reporter zxt5
    Compiler explorer: https://godbolt.org/z/TszTYz94Y

C reproducer:

```c
_Bool c;
short d, j, k;
#define e(a, b) {__typeof__(a) f = a; __typeof__(b) g = b; f > g ?: g;}
#define h(a, b) {__typeof__(a) f = a; f;}
void l(char m, char n[][0][20][20]) {
  for (;;) {
    for (_Bool i = 0; i < 1; i = m)
 for (short o = m; o; o = j)
        ;
    for (char p = 0; p < 20; p = 43)
      for (int q = 0; q < k; q += 4) {
        c = n[0][q][2][1];
 d = (e(d, (h(6 && m, ))));
      }
  }
}
int main() {}
```

clang-trunk -O3 fails to vectorize the loop `q`:

```
36:
 %37 = phi i16 [ %60, %23 ], [ %35, %24 ], !dbg !78
    #dbg_value(i8 poison, !38, !DIExpression(), !60)
  br label %38

38:
  %39 = phi i16 [ %14, %12 ], [ %37, %36 ]
  br i1 %5, label %40, label %67, !dbg !82

40:
  br i1 %18, label %24, label %41, !dbg !61

41:
  %42 = phi i64 [ %61, %41 ], [ 0, %40 ]
  %43 = phi i16 [ %60, %41 ], [ %39, %40 ]
  %44 = phi i64 [ %62, %41 ], [ 0, %40 ]
    #dbg_value(i64 %42, !48, !DIExpression(), !63)
  %45 = getelementptr inbounds nuw [20 x [20 x i8]], ptr %1, i64 %42, !dbg !64
 %46 = getelementptr inbounds nuw i8, ptr %45, i64 41, !dbg !64
  %47 = load i8, ptr %46, align 1, !dbg !64
  %48 = icmp ne i8 %47, 0, !dbg !86
  %49 = zext i1 %48 to i8, !dbg !87
  store i8 %49, ptr @c, align 1, !dbg !88
 #dbg_value(i16 %43, !52, !DIExpression(), !71)
    #dbg_value(i32 %10, !56, !DIExpression(), !71)
  %50 = sext i16 %43 to i32, !dbg !72
  %51 = icmp sgt i32 %50, %10, !dbg !89
  %52 = or i1 %9, %51, !dbg !78
  %53 = zext i1 %52 to i16, !dbg !78
  store i16 %53, ptr @d, align 2, !dbg !90
 #dbg_value(i64 %42, !48, !DIExpression(DW_OP_constu, 4, DW_OP_or, DW_OP_stack_value), !63)
  %54 = getelementptr inbounds nuw [20 x [20 x i8]], ptr %1, i64 %42, !dbg !64
  %55 = getelementptr inbounds nuw i8, ptr %54, i64 1641, !dbg !64
  %56 = load i8, ptr %55, align 1, !dbg !64
  %57 = icmp ne i8 %56, 0, !dbg !91
  %58 = zext i1 %57 to i8, !dbg !92
  store i8 %58, ptr @c, align 1, !dbg !93
    #dbg_value(i16 %53, !52, !DIExpression(), !71)
  %59 = or i1 %9, %51, !dbg !94
  %60 = zext i1 %59 to i16, !dbg !94
 store i16 %60, ptr @d, align 2, !dbg !95
  %61 = add nuw nsw i64 %42, 8, !dbg !96
    #dbg_value(i64 %61, !48, !DIExpression(), !63)
  %62 = add i64 %44, 2, !dbg !97
  %63 = icmp eq i64 %62, %19, !dbg !97
  br i1 %63, label %23, label %41, !dbg !97
```

while -O2 vectorizes the loop:

```
40:
 %41 = phi i64 [ %48, %40 ], [ 0, %38 ]
  %42 = mul i64 %41, 1600, !dbg !67
  %43 = getelementptr inbounds nuw i8, ptr %1, i64 %42, !dbg !67
  %44 = getelementptr inbounds nuw i8, ptr %43, i64 11241, !dbg !67
  %45 = load i8, ptr %44, align 1, !dbg !67
  %46 = icmp ne i8 %45, 0
  %47 = zext i1 %46 to i8
  %48 = add nuw i64 %41, 8
  %49 = icmp eq i64 %48, %32, !dbg !72
  br i1 %49, label %50, label %40, !dbg !72

50:
  store i8 %47, ptr @c, align 1, !dbg !77
  store i16 1, ptr @d, align 2, !dbg !84
  br i1 %34, label %51, label %52, !dbg !72
```

Bisected to [ea2f539](https://github.com/llvm/llvm-project/commit/ea2f5395b1acdc6eaf69a79b7660d7fa7d08c271), which is committed by @ArneStenkrona2.


_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to