Files
clang-p2996/llvm/test/Transforms/LoopFlatten/pr59339.ll
2022-12-05 15:38:47 +00:00

60 lines
2.1 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -S -opaque-pointers -loop-flatten -verify-loop-info -verify-dom-info -verify-scev -verify | FileCheck %s
; FIXME: This incorrectly triggers, thus resulting in a miscompilation.
; The problem is that there is a linear use of the induction variable, i*3+j,
; but only the part i*3 is used for indexing.
define void @test0(i16* %0, i16* %1) {
; CHECK-LABEL: @test0(
; CHECK-NEXT: [[FLATTEN_TRIPCOUNT:%.*]] = mul i64 3, 2
; CHECK-NEXT: br label [[DOTPREHEADER:%.*]]
; CHECK: .preheader:
; CHECK-NEXT: [[TMP3:%.*]] = phi i64 [ 0, [[TMP2:%.*]] ], [ [[TMP7:%.*]], [[TMP6:%.*]] ]
; CHECK-NEXT: [[TMP4:%.*]] = mul i64 [[TMP3]], 3
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i16, ptr [[TMP1:%.*]], i64 [[TMP4]]
; CHECK-NEXT: br label [[TMP9:%.*]]
; CHECK: 6:
; CHECK-NEXT: [[TMP7]] = add i64 [[TMP3]], 1
; CHECK-NEXT: [[TMP8:%.*]] = icmp slt i64 [[TMP7]], [[FLATTEN_TRIPCOUNT]]
; CHECK-NEXT: br i1 [[TMP8]], label [[DOTPREHEADER]], label [[TMP16:%.*]]
; CHECK: 9:
; CHECK-NEXT: [[TMP10:%.*]] = phi i64 [ 0, [[DOTPREHEADER]] ]
; CHECK-NEXT: [[TMP11:%.*]] = load i16, ptr [[TMP5]], align 2
; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[TMP10]], [[TMP4]]
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i16, ptr [[TMP0:%.*]], i64 [[TMP3]]
; CHECK-NEXT: store i16 [[TMP11]], ptr [[TMP13]], align 2
; CHECK-NEXT: [[TMP14:%.*]] = add nuw nsw i64 [[TMP10]], 1
; CHECK-NEXT: [[TMP15:%.*]] = icmp ult i64 [[TMP14]], 3
; CHECK-NEXT: br label [[TMP6]]
; CHECK: 16:
; CHECK-NEXT: ret void
;
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
}