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