blob: a4d74fa5971cd07173f3e8c07a29ae07b4390c50 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes=loop-interchange -loop-interchange-profitabilities=ignore -S | FileCheck %s
; for (i = 0; i < 5; i++)
; for (j = 0; (j < i) & (j < 100); j++)
; A[j*5 + i] += 1;
;
; We currently doesn't support interchanging triangular loops, so the above
; loops must not be interchanged.
;
define void @complex_inner_latch_cond(ptr %A) {
; CHECK-LABEL: define void @complex_inner_latch_cond(
; CHECK-SAME: ptr [[A:%.*]]) {
; CHECK-NEXT: [[FOR_J_PREHEADER:.*]]:
; CHECK-NEXT: br label %[[FOR_J:.*]]
; CHECK: [[FOR_J]]:
; CHECK-NEXT: [[I:%.*]] = phi i64 [ 0, %[[FOR_J_PREHEADER]] ], [ [[I_NEXT:%.*]], %[[FOR_I_LATCH:.*]] ]
; CHECK-NEXT: br label %[[FOR_I_HEADER_PREHEADER:.*]]
; CHECK: [[FOR_I_HEADER_PREHEADER]]:
; CHECK-NEXT: [[J:%.*]] = phi i64 [ 0, %[[FOR_J]] ], [ [[J_NEXT:%.*]], %[[FOR_I_HEADER_PREHEADER]] ]
; CHECK-NEXT: [[GEP:%.*]] = getelementptr [5 x i8], ptr [[A]], i64 [[J]], i64 [[I]]
; CHECK-NEXT: [[OLD:%.*]] = load i8, ptr [[GEP]], align 1
; CHECK-NEXT: [[NEW:%.*]] = add i8 [[OLD]], 1
; CHECK-NEXT: store i8 [[NEW]], ptr [[GEP]], align 1
; CHECK-NEXT: [[J_NEXT]] = add i64 [[J]], 1
; CHECK-NEXT: [[C0:%.*]] = icmp slt i64 [[J_NEXT]], [[I]]
; CHECK-NEXT: [[C1:%.*]] = icmp slt i64 [[J_NEXT]], 100
; CHECK-NEXT: [[EC_J_NOT:%.*]] = and i1 [[C0]], [[C1]]
; CHECK-NEXT: br i1 [[EC_J_NOT]], label %[[FOR_I_HEADER_PREHEADER]], label %[[FOR_I_LATCH]]
; CHECK: [[FOR_I_LATCH]]:
; CHECK-NEXT: [[I_NEXT]] = add i64 [[I]], 1
; CHECK-NEXT: [[EC_I:%.*]] = icmp eq i64 [[I_NEXT]], 5
; CHECK-NEXT: br i1 [[EC_I]], label %[[EXIT:.*]], label %[[FOR_J]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: ret void
;
entry:
br label %for.i.header
for.i.header:
%i = phi i64 [ 0, %entry ], [ %i.next, %for.i.latch ]
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i.header ], [ %j.next, %for.j ]
%gep = getelementptr [5 x i8], ptr %A, i64 %j, i64 %i
%old = load i8, ptr %gep
%new = add i8 %old, 1
store i8 %new, ptr %gep
%j.next = add i64 %j, 1
%c0 = icmp slt i64 %j.next, %i
%c1 = icmp slt i64 %j.next, 100
%ec.j.not = and i1 %c0, %c1
br i1 %ec.j.not, label %for.j, label %for.i.latch
for.i.latch:
%i.next = add i64 %i, 1
%ec.i = icmp eq i64 %i.next, 5
br i1 %ec.i, label %exit, label %for.i.header
exit:
ret void
}