Issue 140444
Summary [LoopFullUnroll] Miscompilation at O3
Labels miscompilation, loopoptim, generated by fuzzer
Assignees
Reporter dtcxzyw
    Reproducer:
```
; bin/opt -passes=loop-unroll-full 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"

@g_479 = global i8 -1
@crc32_tab = global [256 x i32] zeroinitializer
@.str.8 = constant [15 x i8] c"checksum = %X\0A\00"

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

for.cond1.preheader.i:                            ; preds = %for.cond1.preheader.i, %entry
  %indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.cond1.preheader.i ]
  %0 = and i64 %indvars.iv.i, 20
  %tobool.not.4.not.i = icmp eq i64 %0, 16
  %xor.5.i = select i1 %tobool.not.4.not.i, i32 0, i32 1
  %arrayidx.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %indvars.iv.i
  store i32 %xor.5.i, ptr %arrayidx.i, align 4
  %indvars.iv.next.i = add i64 %indvars.iv.i, 1
 %exitcond.not.i = icmp eq i64 %indvars.iv.next.i, 256
  br i1 %exitcond.not.i, label %lbl_1516.us.us.i.i, label %for.cond1.preheader.i

lbl_1516.us.us.i.i:                               ; preds = %lbl_1587.us.us.i.i, %for.cond1.preheader.i
  %conv134690.us.us.i.i = phi i8 [ %spec.select.i.i, %lbl_1587.us.us.i.i ], [ 0, %for.cond1.preheader.i ]
  %l_1485.0.us.us.i.i = phi i16 [ %inc130.us.us.i.i, %lbl_1587.us.us.i.i ], [ -14340, %for.cond1.preheader.i ]
  %inc130.us.us.i.i = add i16 %l_1485.0.us.us.i.i, 1
 %tobool132.not.us.us.i.i = icmp eq i8 %conv134690.us.us.i.i, 0
  br i1 %tobool132.not.us.us.i.i, label %lbl_1587.us.us.i.i, label %land.rhs133.us.us.i.i

land.rhs133.us.us.i.i:                            ; preds = %lbl_1516.us.us.i.i
  store i8 25, ptr @g_479, align 1
  br label %lbl_1587.us.us.i.i

lbl_1587.us.us.i.i:                               ; preds = %land.rhs133.us.us.i.i, %lbl_1516.us.us.i.i
 %tobool293.not.not.us.us.i.i = icmp eq i16 %l_1485.0.us.us.i.i, 0
 %spec.select.i.i = select i1 %tobool293.not.not.us.us.i.i, i8 1, i8 0
  br i1 %tobool293.not.not.us.us.i.i, label %func_134.exit, label %lbl_1516.us.us.i.i

func_134.exit:                                    ; preds = %lbl_1587.us.us.i.i
  %1 = load i8, ptr @g_479, align 1
 %idxprom.i.i.i = zext i8 %1 to i64
  %arrayidx.i.i.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %idxprom.i.i.i
  %2 = load i32, ptr %arrayidx.i.i.i, align 4
  %call.i = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %2)
  ret i32 0
}

declare i32 @printf(ptr, ...)
```
```
; ModuleID = 'reduced.ll'
source_filename = "reduced.ll"
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_479 = global i8 -1
@crc32_tab = global [256 x i32] zeroinitializer
@.str.8 = constant [15 x i8] c"checksum = %X\0A\00"

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

for.cond1.preheader.i:                            ; preds = %for.cond1.preheader.i, %entry
  %indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.cond1.preheader.i ]
  %0 = and i64 %indvars.iv.i, 20
  %tobool.not.4.not.i = icmp eq i64 %0, 16
  %xor.5.i = select i1 %tobool.not.4.not.i, i32 0, i32 1
  %arrayidx.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %indvars.iv.i
  store i32 %xor.5.i, ptr %arrayidx.i, align 4
  %indvars.iv.next.i = add i64 %indvars.iv.i, 1
 %exitcond.not.i = icmp eq i64 %indvars.iv.next.i, 256
  br i1 %exitcond.not.i, label %lbl_1516.us.us.i.i.preheader, label %for.cond1.preheader.i

lbl_1516.us.us.i.i.preheader:                     ; preds = %for.cond1.preheader.i
  br label %lbl_1516.us.us.i.i

lbl_1516.us.us.i.i:                               ; preds = %lbl_1516.us.us.i.i.preheader, %lbl_1587.us.us.i.i
 %conv134690.us.us.i.i = phi i8 [ %spec.select.i.i, %lbl_1587.us.us.i.i ], [ 0, %lbl_1516.us.us.i.i.preheader ]
  %l_1485.0.us.us.i.i = phi i16 [ %inc130.us.us.i.i, %lbl_1587.us.us.i.i ], [ -14340, %lbl_1516.us.us.i.i.preheader ]
  %inc130.us.us.i.i = add nsw i16 %l_1485.0.us.us.i.i, 1
  %tobool132.not.us.us.i.i = icmp eq i8 %conv134690.us.us.i.i, 0
  br i1 %tobool132.not.us.us.i.i, label %lbl_1587.us.us.i.i, label %land.rhs133.us.us.i.i

land.rhs133.us.us.i.i: ; preds = %lbl_1516.us.us.i.i
  store i8 25, ptr @g_479, align 1
  br label %lbl_1587.us.us.i.i

lbl_1587.us.us.i.i: ; preds = %land.rhs133.us.us.i.i, %lbl_1516.us.us.i.i
  %tobool293.not.not.us.us.i.i = icmp eq i16 %l_1485.0.us.us.i.i, -1
  %spec.select.i.i = select i1 %tobool293.not.not.us.us.i.i, i8 1, i8 0
  br i1 %tobool293.not.not.us.us.i.i, label %func_134.exit.peel.begin, label %lbl_1516.us.us.i.i, !llvm.loop !0

func_134.exit.peel.begin: ; preds = %lbl_1587.us.us.i.i
  %spec.select.i.i.lcssa = phi i8 [ %spec.select.i.i, %lbl_1587.us.us.i.i ]
  %inc130.us.us.i.i.lcssa = phi i16 [ %inc130.us.us.i.i, %lbl_1587.us.us.i.i ]
  br label %lbl_1516.us.us.i.i.peel

lbl_1516.us.us.i.i.peel: ; preds = %func_134.exit.peel.begin
  %inc130.us.us.i.i.peel = add i16 %inc130.us.us.i.i.lcssa, 1
  %tobool132.not.us.us.i.i.peel = icmp eq i8 %spec.select.i.i.lcssa, 0
  br i1 %tobool132.not.us.us.i.i.peel, label %lbl_1587.us.us.i.i.peel, label %land.rhs133.us.us.i.i.peel

land.rhs133.us.us.i.i.peel: ; preds = %lbl_1516.us.us.i.i.peel
  store i8 25, ptr @g_479, align 1
 br label %lbl_1587.us.us.i.i.peel

lbl_1587.us.us.i.i.peel: ; preds = %land.rhs133.us.us.i.i.peel, %lbl_1516.us.us.i.i.peel
 %tobool293.not.not.us.us.i.i.peel = icmp eq i16 %inc130.us.us.i.i.lcssa, 0
 %spec.select.i.i.peel = select i1 %tobool293.not.not.us.us.i.i.peel, i8 1, i8 0
  br i1 %tobool293.not.not.us.us.i.i.peel, label %func_134.exit.peel.next, label %func_134.exit.peel.next

func_134.exit.peel.next: ; preds = %lbl_1587.us.us.i.i.peel, %lbl_1587.us.us.i.i.peel
  br label %lbl_1516.us.us.i.i.peel.next

lbl_1516.us.us.i.i.peel.next: ; preds = %func_134.exit.peel.next
  br label %func_134.exit

func_134.exit:                                    ; preds = %lbl_1516.us.us.i.i.peel.next
  %1 = load i8, ptr @g_479, align 1
 %idxprom.i.i.i = zext i8 %1 to i64
  %arrayidx.i.i.i = getelementptr [256 x i32], ptr @crc32_tab, i64 0, i64 %idxprom.i.i.i
  %2 = load i32, ptr %arrayidx.i.i.i, align 4
  %call.i = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %2)
  ret i32 0
}

declare i32 @printf(ptr, ...)

!0 = distinct !{!0, !1}
!1 = !{!"llvm.loop.peeled.count", i32 1}
```
Before:
```
checksum = 1
```
After:
```
checksum = 0
```
llvm version: 3ccb15d6caf57f2a866d496ada2fb52d14b179d2

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

Reply via email to