Issue 149347
Summary [LoopVectorize] Miscompilation at -Os
Labels miscompilation, generated by fuzzer, vectorization
Assignees
Reporter dtcxzyw
    Reproducer: https://alive2.llvm.org/ce/z/gVth4Q
```
; bin/opt -passes=loop-vectorize test.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"

@g_126 = global i32 0

define i1 @src() {
entry:
  br label %for.cond232.preheader.i.i.i.i

for.cond232.preheader.i.i.i.i: ; preds = %safe_mod_func_uint32_t_u_u.exit.i.i.i.i, %entry
 %storemerge552.i.i.i.i = phi i16 [ 0, %entry ], [ %add302.i.i.i.i, %safe_mod_func_uint32_t_u_u.exit.i.i.i.i ]
  br i1 true, label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i, label %cond.false.i518.i.i.i.i

cond.false.i518.i.i.i.i: ; preds = %for.cond232.preheader.i.i.i.i
  br label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i

safe_mod_func_uint32_t_u_u.exit.i.i.i.i: ; preds = %cond.false.i518.i.i.i.i, %for.cond232.preheader.i.i.i.i
 %cond.i519.i.i.i.i = phi i32 [ 0, %cond.false.i518.i.i.i.i ], [ 1, %for.cond232.preheader.i.i.i.i ]
  store i32 %cond.i519.i.i.i.i, ptr @g_126, align 4
  %add302.i.i.i.i = add i16 %storemerge552.i.i.i.i, 1
 %exitcond559.not.i.i.i.i = icmp eq i16 %add302.i.i.i.i, 3
  br i1 %exitcond559.not.i.i.i.i, label %for.inc309.i.i.i.i, label %for.cond232.preheader.i.i.i.i

for.inc309.i.i.i.i: ; preds = %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
  %0 = load i32, ptr @g_126, align 4
  %tobool205.not.i.i.i.i = icmp eq i32 %0, 0
  ret i1 %tobool205.not.i.i.i.i
}
```
Output:
```
define i1 @src() {
entry:
 br i1 false, label %scalar.ph, label %vector.ph

vector.ph: ; preds = %entry
  br label %vector.body

vector.body:                                      ; preds = %vector.ph
  store i32 0, ptr @g_126, align 4
  br label %middle.block

middle.block:                                     ; preds = %vector.body
  br label %for.inc309.i.i.i.i

scalar.ph: ; preds = %entry
  %bc.resume.val = phi i16 [ 0, %entry ]
  br label %for.cond232.preheader.i.i.i.i

for.cond232.preheader.i.i.i.i: ; preds = %scalar.ph, %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
 %storemerge552.i.i.i.i = phi i16 [ %bc.resume.val, %scalar.ph ], [ %add302.i.i.i.i, %safe_mod_func_uint32_t_u_u.exit.i.i.i.i ]
  br i1 true, label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i, label %cond.false.i518.i.i.i.i

cond.false.i518.i.i.i.i: ; preds = %for.cond232.preheader.i.i.i.i
  br label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i

safe_mod_func_uint32_t_u_u.exit.i.i.i.i: ; preds = %cond.false.i518.i.i.i.i, %for.cond232.preheader.i.i.i.i
 %cond.i519.i.i.i.i = phi i32 [ 0, %cond.false.i518.i.i.i.i ], [ 1, %for.cond232.preheader.i.i.i.i ]
  store i32 %cond.i519.i.i.i.i, ptr @g_126, align 4
  %add302.i.i.i.i = add i16 %storemerge552.i.i.i.i, 1
 %exitcond559.not.i.i.i.i = icmp eq i16 %add302.i.i.i.i, 3
  br i1 %exitcond559.not.i.i.i.i, label %for.inc309.i.i.i.i, label %for.cond232.preheader.i.i.i.i, !llvm.loop !0

for.inc309.i.i.i.i: ; preds = %middle.block, %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
  %0 = load i32, ptr @g_126, align 4
  %tobool205.not.i.i.i.i = icmp eq i32 %0, 0
  ret i1 %tobool205.not.i.i.i.i
}

!0 = distinct !{!0, !1, !2}
!1 = !{!"llvm.loop.unroll.runtime.disable"}
!2 = !{!"llvm.loop.isvectorized", i32 1}

```

```
Transformation doesn't verify!

ERROR: Value mismatch

Example:

Source:
  >> Jump to %for.cond232.preheader.i.i.i.i
i16 %storemerge552.i.i.i.i = #x0000 (0)
  >> Jump to %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
i32 %cond.i519.i.i.i.i = #x00000001 (1)
i16 %add302.i.i.i.i = #x0001 (1)
i1 %exitcond559.not.i.i.i.i = #x0 (0)
  >> Jump to %for.cond232.preheader.i.i.i.i#2
i16 %storemerge552.i.i.i.i#2 = #x0001 (1)
  >> Jump to %safe_mod_func_uint32_t_u_u.exit.i.i.i.i#2
i32 %cond.i519.i.i.i.i#2 = #x00000001 (1)
i16 %add302.i.i.i.i#2 = #x0002 (2)
i1 %exitcond559.not.i.i.i.i#2 = #x0 (0)
  >> Jump to %for.cond232.preheader.i.i.i.i#3
i16 %storemerge552.i.i.i.i#3 = #x0002 (2)
 >> Jump to %safe_mod_func_uint32_t_u_u.exit.i.i.i.i#3
i32 %cond.i519.i.i.i.i#3 = #x00000001 (1)
i16 %add302.i.i.i.i#3 = #x0003 (3)
i1 %exitcond559.not.i.i.i.i#3 = #x1 (1)
  >> Jump to %for.inc309.i.i.i.i
i32 %#0 = #x00000001 (1)
i1 %tobool205.not.i.i.i.i = #x0 (0)

SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 >	size: 4	align: 4	alloc type: 0	alive: true	address: 4
Contents:
poison


Target:
 >> Jump to %vector.ph
  >> Jump to %vector.body
  >> Jump to %middle.block
  >> Jump to %for.inc309.i.i.i.i
i32 %#0 = #x00000000 (0)
i1 %tobool205.not.i.i.i.i = #x1 (1)
Source value: #x0 (0)
Target value: #x1 (1)
```
llvm version: 4bf82aebc0da985cf6b2e70812714875e8fa78fa

Log before LoopVectorize:
```
Entering function main
  br label %for.cond232.preheader.i.i.i.i jump to %for.cond232.preheader.i.i.i.i
 phi i16 %storemerge552.i.i.i.i -> i16 0
  br i1 true, label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i, label %cond.false.i518.i.i.i.i jump to %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
    phi i32 %cond.i519.i.i.i.i -> i32 1
  store i32 %cond.i519.i.i.i.i, ptr @g_126, align 4
 %add302.i.i.i.i = add i16 %storemerge552.i.i.i.i, 1 -> i16 1
 %exitcond559.not.i.i.i.i = icmp eq i16 %add302.i.i.i.i, 3 -> F
  br i1 %exitcond559.not.i.i.i.i, label %for.inc309.i.i.i.i, label %for.cond232.preheader.i.i.i.i jump to %for.cond232.preheader.i.i.i.i
 phi i16 %storemerge552.i.i.i.i -> i16 1
  br i1 true, label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i, label %cond.false.i518.i.i.i.i jump to %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
    phi i32 %cond.i519.i.i.i.i -> i32 1
  store i32 %cond.i519.i.i.i.i, ptr @g_126, align 4
 %add302.i.i.i.i = add i16 %storemerge552.i.i.i.i, 1 -> i16 2
 %exitcond559.not.i.i.i.i = icmp eq i16 %add302.i.i.i.i, 3 -> F
  br i1 %exitcond559.not.i.i.i.i, label %for.inc309.i.i.i.i, label %for.cond232.preheader.i.i.i.i jump to %for.cond232.preheader.i.i.i.i
 phi i16 %storemerge552.i.i.i.i -> i16 2
  br i1 true, label %safe_mod_func_uint32_t_u_u.exit.i.i.i.i, label %cond.false.i518.i.i.i.i jump to %safe_mod_func_uint32_t_u_u.exit.i.i.i.i
    phi i32 %cond.i519.i.i.i.i -> i32 1
  store i32 %cond.i519.i.i.i.i, ptr @g_126, align 4
 %add302.i.i.i.i = add i16 %storemerge552.i.i.i.i, 1 -> i16 3
 %exitcond559.not.i.i.i.i = icmp eq i16 %add302.i.i.i.i, 3 -> T
  br i1 %exitcond559.not.i.i.i.i, label %for.inc309.i.i.i.i, label %for.cond232.preheader.i.i.i.i jump to %for.inc309.i.i.i.i
  %0 = load i32, ptr @g_126, align 4 -> i32 1
  %tobool205.not.i.i.i.i = icmp eq i32 %0, 0 -> F
  ret i1 %tobool205.not.i.i.i.i
Exiting function main
```
After LoopVectorize:
```
Entering function main
  br i1 false, label %scalar.ph, label %vector.ph jump to %vector.ph
  br label %vector.body jump to %vector.body
  store i32 0, ptr @g_126, align 4
  br label %middle.block jump to %middle.block
  br label %for.inc309.i.i.i.i jump to %for.inc309.i.i.i.i
  %0 = load i32, ptr @g_126, align 4 -> i32 0
 %tobool205.not.i.i.i.i = icmp eq i32 %0, 0 -> T
  ret i1 %tobool205.not.i.i.i.i
Exiting function main
```

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to