Issue 125374
Summary [LoopVectorize] Miscompilation at Os
Labels miscompilation, loopoptim, vectorizers
Assignees
Reporter dtcxzyw
    Reproducer: https://alive2.llvm.org/ce/z/ygvCK5
```
; bin/opt -passes=loop-vectorize 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"

define i32 @main() {
entry:
  br label %for.body.i.i

for.body.i.i:                                     ; preds = %for.body.i.i, %entry
  %indvars.iv.i.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i.i, %for.body.i.i ]
  %conv678.i.i = phi i8 [ 1, %entry ], [ %add.i.i.i, %for.body.i.i ]
  %add.i.i.i = add i8 0, %conv678.i.i
 %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1
  %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i

o.exit:                                           ; preds = %for.body.i.i
  %conv6.i.i = zext i8 %add.i.i.i to i32
  ret i32 %conv6.i.i
}
```
Before:
```
Entering function main
  br label %for.body.i.i jump to %for.body.i.i
    phi i64 %indvars.iv.i.i -> i64 0
 phi i8 %conv678.i.i -> i8 1
  %add.i.i.i = add i8 0, %conv678.i.i -> i8 1
 %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1 -> i64 1
 %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1 -> F
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i jump to %for.body.i.i
 phi i64 %indvars.iv.i.i -> i64 1
    phi i8 %conv678.i.i -> i8 1
 %add.i.i.i = add i8 0, %conv678.i.i -> i8 1
  %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1 -> i64 2
  %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1 -> T
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i jump to %o.exit
  %conv6.i.i = zext i8 %add.i.i.i to i32 -> i32 1
  ret i32 %conv6.i.i
Exiting function main
```
After:
```
define i32 @main() {
entry:
  br i1 false, label %scalar.ph, label %vector.ph

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

vector.body: ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <2 x i8> [ <i8 1, i8 0>, %vector.ph ], [ splat (i8 1), %vector.body ]
  %index.next = add nuw i64 %index, 2
  br i1 true, label %middle.block, label %vector.body, !llvm.loop !0

middle.block:                                     ; preds = %vector.body
  %0 = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> splat (i8 1))
  br i1 true, label %o.exit, label %scalar.ph

scalar.ph: ; preds = %entry, %middle.block
  %bc.resume.val = phi i64 [ 2, %middle.block ], [ 0, %entry ]
  %bc.merge.rdx = phi i8 [ %0, %middle.block ], [ 1, %entry ]
  br label %for.body.i.i

for.body.i.i: ; preds = %scalar.ph, %for.body.i.i
 %indvars.iv.i.i = phi i64 [ %bc.resume.val, %scalar.ph ], [ %indvars.iv.next.i.i, %for.body.i.i ]
  %conv678.i.i = phi i8 [ %bc.merge.rdx, %scalar.ph ], [ %add.i.i.i, %for.body.i.i ]
  %add.i.i.i = add i8 0, %conv678.i.i
  %indvars.iv.next.i.i = add i64 %indvars.iv.i.i, 1
 %exitcond.not.i.i = icmp eq i64 %indvars.iv.i.i, 1
  br i1 %exitcond.not.i.i, label %o.exit, label %for.body.i.i, !llvm.loop !3

o.exit:                                           ; preds = %middle.block, %for.body.i.i
  %add.i.i.i.lcssa = phi i8 [ %add.i.i.i, %for.body.i.i ], [ %0, %middle.block ]
  %conv6.i.i = zext i8 %add.i.i.i.lcssa to i32
  ret i32 %conv6.i.i
}
```
```
Entering function main
  br i1 false, label %scalar.ph, label %vector.ph jump to %vector.ph
 br label %vector.body jump to %vector.body
    phi i64 %index -> i64 0
 phi <2 x i8> %vec.phi -> { i8 1, i8 0 }
  %index.next = add nuw i64 %index, 2 -> i64 2
  br i1 true, label %middle.block, label %vector.body, !llvm.loop !0 jump to %middle.block
  %0 = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> splat (i8 1)) -> i8 2
  br i1 true, label %o.exit, label %scalar.ph jump to %o.exit
    phi i8 %add.i.i.i.lcssa -> i8 2
  %conv6.i.i = zext i8 %add.i.i.i.lcssa to i32 -> i32 2
  ret i32 %conv6.i.i
Exiting function main
```
llvm version: 5c3c0a8cec9205efba78583bd0b8a646270968a1
cc @fhahn 
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to