Skip to content

LoopFlatten miscompile #59339

@jreiffers

Description

@jreiffers

Input:

; RUN: opt < %s -S -opaque-pointers -loop-flatten -verify-loop-info -verify-dom-info -verify-scev -verify

define void @test0(i16* %0, i16* %1) {
2:
  br label %.preheader

.preheader:
  %3 = phi i64 [ 0, %2 ], [ %7, %6 ]
  %4 = mul i64 %3, 3
  %5 = getelementptr i16, ptr %1, i64 %4
  br label %9

6:
  %7 = add i64 %3, 1
  %8 = icmp slt i64 %7, 2
  br i1 %8, label %.preheader, label %16

9:
  %10 = phi i64 [ 0, %.preheader ], [ %14, %9 ]
  %11 = load i16, ptr %5, align 2
  %12 = add i64 %10, %4
  %13 = getelementptr i16, ptr %0, i64 %12
  store i16 %11, ptr %13, align 2
  %14 = add nuw nsw i64 %10, 1
  %15 = icmp ult i64 %14, 3
  br i1 %15, label %9, label %6

16:
  ret void
}

Note that %3 goes from 0 to 1, so the loads for %11 are %1[0], %1[0], %1[0], %1[3], %1[3], %1[3].

The output is:

define void @test0(ptr %0, ptr %1) {
  %flatten.tripcount = mul i64 3, 2
  br label %.preheader

.preheader:                                       ; preds = %6, %2
  %3 = phi i64 [ 0, %2 ], [ %7, %6 ]
  %4 = mul i64 %3, 3
  %5 = getelementptr i16, ptr %1, i64 %4
  br label %9

6:                                                ; preds = %9
  %7 = add i64 %3, 1
  %8 = icmp slt i64 %7, %flatten.tripcount
  br i1 %8, label %.preheader, label %16

9:                                                ; preds = %.preheader
  %10 = phi i64 [ 0, %.preheader ]
  %11 = load i16, ptr %5, align 2
  %12 = add i64 %10, %4
  %13 = getelementptr i16, ptr %0, i64 %3
  store i16 %11, ptr %13, align 2
  %14 = add nuw nsw i64 %10, 1
  %15 = icmp ult i64 %14, 3
  br label %6

16:                                               ; preds = %6
  ret void
}

Now, %3 goes from 0 to 5, and the loads are from %1[0], %1[3], %1[6], ...

The culprit seems to be 3ea6a9a.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions