blob: 745a28f91e9657a9460d939e1cf82b505ab455f7 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes=loop-interchange -cache-line-size=64 -loop-interchange-profitabilities=ignore -S | FileCheck %s
@a = global i32 0
@b = global i8 0
@c = global i32 0
@d = global i32 0
@e = global [1 x [1 x i32]] zeroinitializer
define void @pr43326() {
; CHECK-LABEL: define void @pr43326() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
; CHECK-NEXT: [[TOBOOL_NOT2:%.*]] = icmp eq i32 [[TMP0]], 0
; CHECK-NEXT: br i1 [[TOBOOL_NOT2]], label %[[FOR_END14:.*]], label %[[OUTER_PREHEADER:.*]]
; CHECK: [[OUTER_PREHEADER]]:
; CHECK-NEXT: [[D_PROMOTED:%.*]] = load i32, ptr @d, align 4
; CHECK-NEXT: [[A_PROMOTED:%.*]] = load i32, ptr @a, align 4
; CHECK-NEXT: br label %[[OUTER_HEADER:.*]]
; CHECK: [[OUTER_HEADER]]:
; CHECK-NEXT: [[INC1312:%.*]] = phi i32 [ [[A_PROMOTED]], %[[OUTER_PREHEADER]] ], [ [[INC13:%.*]], %[[FOR_INC12:.*]] ]
; CHECK-NEXT: [[XOR_LCSSA_LCSSA11:%.*]] = phi i32 [ [[D_PROMOTED]], %[[OUTER_PREHEADER]] ], [ [[XOR_LCSSA_LCSSA:%.*]], %[[FOR_INC12]] ]
; CHECK-NEXT: br label %[[INNER1_HEADER_PREHEADER:.*]]
; CHECK: [[INNER1_HEADER_PREHEADER]]:
; CHECK-NEXT: br label %[[INNER1_HEADER:.*]]
; CHECK: [[INNER1_HEADER]]:
; CHECK-NEXT: [[J:%.*]] = phi i8 [ [[TMP5:%.*]], %[[FOR_INC10_SPLIT:.*]] ], [ 0, %[[INNER1_HEADER_PREHEADER]] ]
; CHECK-NEXT: [[XOR_LCSSA9:%.*]] = phi i32 [ [[XOR_LCSSA:%.*]], %[[FOR_INC10_SPLIT]] ], [ [[XOR_LCSSA_LCSSA11]], %[[INNER1_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[INNER2_HEADER_PREHEADER:.*]]
; CHECK: [[INNER1_HEADER_SPLIT:.*]]:
; CHECK-NEXT: [[IDXPROM8:%.*]] = sext i8 [[J]] to i64
; CHECK-NEXT: br label %[[INNER2_HEADER_SPLIT:.*]]
; CHECK: [[INNER2_HEADER_PREHEADER]]:
; CHECK-NEXT: br label %[[INNER2_HEADER:.*]]
; CHECK: [[INNER2_HEADER]]:
; CHECK-NEXT: [[K:%.*]] = phi i32 [ [[TMP2:%.*]], %[[FOR_INC_SPLIT:.*]] ], [ 0, %[[INNER2_HEADER_PREHEADER]] ]
; CHECK-NEXT: [[XOR5:%.*]] = phi i32 [ [[XOR:%.*]], %[[FOR_INC_SPLIT]] ], [ [[XOR_LCSSA9]], %[[INNER2_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[INNER1_HEADER_SPLIT]]
; CHECK: [[INNER2_HEADER_SPLIT]]:
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[K]] to i64
; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds [1 x [1 x i32]], ptr @e, i64 0, i64 [[IDXPROM]], i64 [[IDXPROM8]]
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX9]], align 4
; CHECK-NEXT: [[XOR]] = xor i32 [[XOR5]], [[TMP1]]
; CHECK-NEXT: br label %[[FOR_INC:.*]]
; CHECK: [[FOR_INC]]:
; CHECK-NEXT: [[K_NEXT:%.*]] = add nsw i32 [[K]], 1
; CHECK-NEXT: [[CMP5:%.*]] = icmp slt i32 [[K_NEXT]], 42
; CHECK-NEXT: br label %[[FOR_END:.*]]
; CHECK: [[FOR_INC_SPLIT]]:
; CHECK-NEXT: [[TMP2]] = add nsw i32 [[K]], 1
; CHECK-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 42
; CHECK-NEXT: br i1 [[TMP3]], label %[[INNER2_HEADER]], label %[[FOR_INC10_SPLIT]]
; CHECK: [[FOR_END]]:
; CHECK-NEXT: br label %[[FOR_INC10:.*]]
; CHECK: [[FOR_INC10]]:
; CHECK-NEXT: [[J_NEXT:%.*]] = add i8 [[J]], -1
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[J_NEXT]], -10
; CHECK-NEXT: br label %[[FOR_INC_SPLIT]]
; CHECK: [[FOR_INC10_SPLIT]]:
; CHECK-NEXT: [[XOR_LCSSA]] = phi i32 [ [[XOR]], %[[FOR_INC_SPLIT]] ]
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[TMP2]], %[[FOR_INC_SPLIT]] ]
; CHECK-NEXT: [[TMP5]] = add i8 [[J]], -1
; CHECK-NEXT: [[TMP6:%.*]] = icmp sgt i8 [[TMP5]], -10
; CHECK-NEXT: br i1 [[TMP6]], label %[[INNER1_HEADER]], label %[[FOR_END11:.*]]
; CHECK: [[FOR_END11]]:
; CHECK-NEXT: [[XOR_LCSSA_LCSSA]] = phi i32 [ [[XOR_LCSSA]], %[[FOR_INC10_SPLIT]] ]
; CHECK-NEXT: [[DEC_LCSSA:%.*]] = phi i8 [ [[TMP5]], %[[FOR_INC10_SPLIT]] ]
; CHECK-NEXT: [[INC_LCSSA_LCSSA:%.*]] = phi i32 [ [[TMP4]], %[[FOR_INC10_SPLIT]] ]
; CHECK-NEXT: br label %[[FOR_INC12]]
; CHECK: [[FOR_INC12]]:
; CHECK-NEXT: [[INC13]] = add nsw i32 [[INC1312]], 1
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp slt i32 [[INC13]], 42
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label %[[OUTER_HEADER]], label %[[FOR_COND_FOR_END14_CRIT_EDGE:.*]]
; CHECK: [[FOR_COND_FOR_END14_CRIT_EDGE]]:
; CHECK-NEXT: [[INC13_LCSSA:%.*]] = phi i32 [ [[INC13]], %[[FOR_INC12]] ]
; CHECK-NEXT: [[INC_LCSSA_LCSSA_LCSSA:%.*]] = phi i32 [ [[INC_LCSSA_LCSSA]], %[[FOR_INC12]] ]
; CHECK-NEXT: [[XOR_LCSSA_LCSSA_LCSSA:%.*]] = phi i32 [ [[XOR_LCSSA_LCSSA]], %[[FOR_INC12]] ]
; CHECK-NEXT: [[DEC_LCSSA_LCSSA:%.*]] = phi i8 [ [[DEC_LCSSA]], %[[FOR_INC12]] ]
; CHECK-NEXT: store i8 [[DEC_LCSSA_LCSSA]], ptr @b, align 1
; CHECK-NEXT: store i32 [[XOR_LCSSA_LCSSA_LCSSA]], ptr @d, align 4
; CHECK-NEXT: store i32 [[INC_LCSSA_LCSSA_LCSSA]], ptr @c, align 4
; CHECK-NEXT: store i32 [[INC13_LCSSA]], ptr @a, align 4
; CHECK-NEXT: br label %[[FOR_END14]]
; CHECK: [[FOR_END14]]:
; CHECK-NEXT: ret void
;
entry:
%0 = load i32, ptr @a
%tobool.not2 = icmp eq i32 %0, 0
br i1 %tobool.not2, label %for.end14, label %outer.preheader
outer.preheader: ; preds = %entry
%d.promoted = load i32, ptr @d
%a.promoted = load i32, ptr @a
br label %outer.header
outer.header: ; preds = %outer.preheader, %for.inc12
%inc1312 = phi i32 [ %a.promoted, %outer.preheader ], [ %inc13, %for.inc12 ]
%xor.lcssa.lcssa11 = phi i32 [ %d.promoted, %outer.preheader ], [ %xor.lcssa.lcssa, %for.inc12 ]
br label %inner1.header
inner1.header: ; preds = %outer.header, %for.inc10
%xor.lcssa9 = phi i32 [ %xor.lcssa.lcssa11, %outer.header ], [ %xor.lcssa, %for.inc10 ]
%j = phi i8 [ 0, %outer.header ], [ %j.next, %for.inc10 ]
%idxprom8 = sext i8 %j to i64
br label %inner2.header
inner2.header: ; preds = %inner1.header, %for.inc
%xor5 = phi i32 [ %xor.lcssa9, %inner1.header ], [ %xor, %for.inc ]
%k = phi i32 [ 0, %inner1.header ], [ %k.next, %for.inc ]
%idxprom = sext i32 %k to i64
%arrayidx9 = getelementptr inbounds [1 x [1 x i32]], ptr @e, i64 0, i64 %idxprom, i64 %idxprom8
%1 = load i32, ptr %arrayidx9
%xor = xor i32 %xor5, %1
br label %for.inc
for.inc: ; preds = %inner2.header
%k.next = add nsw i32 %k, 1
%cmp5 = icmp slt i32 %k.next, 42
br i1 %cmp5, label %inner2.header, label %for.end
for.end: ; preds = %for.inc
%xor.lcssa = phi i32 [ %xor, %for.inc ]
%inc.lcssa = phi i32 [ %k.next, %for.inc ]
br label %for.inc10
for.inc10: ; preds = %for.end
%j.next = add i8 %j, -1
%cmp = icmp sgt i8 %j.next, -10
br i1 %cmp, label %inner1.header, label %for.end11
for.end11: ; preds = %for.inc10
%xor.lcssa.lcssa = phi i32 [ %xor.lcssa, %for.inc10 ]
%dec.lcssa = phi i8 [ %j.next, %for.inc10 ]
%inc.lcssa.lcssa = phi i32 [ %inc.lcssa, %for.inc10 ]
br label %for.inc12
for.inc12: ; preds = %for.end11
%inc13 = add nsw i32 %inc1312, 1
%tobool.not = icmp slt i32 %inc13, 42
br i1 %tobool.not, label %outer.header, label %for.cond.for.end14_crit_edge
for.cond.for.end14_crit_edge: ; preds = %for.inc12
%inc13.lcssa = phi i32 [ %inc13, %for.inc12 ]
%inc.lcssa.lcssa.lcssa = phi i32 [ %inc.lcssa.lcssa, %for.inc12 ]
%xor.lcssa.lcssa.lcssa = phi i32 [ %xor.lcssa.lcssa, %for.inc12 ]
%dec.lcssa.lcssa = phi i8 [ %dec.lcssa, %for.inc12 ]
store i8 %dec.lcssa.lcssa, ptr @b
store i32 %xor.lcssa.lcssa.lcssa, ptr @d
store i32 %inc.lcssa.lcssa.lcssa, ptr @c
store i32 %inc13.lcssa, ptr @a
br label %for.end14
for.end14: ; preds = %for.cond.for.end14_crit_edge, %entry
ret void
}