Skip to content

[LoopVectorize] Miscompilation at Os #125374

@dtcxzyw

Description

@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: 5c3c0a8
cc @fhahn

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions