blob: a3ce98a42ed5cc8868cf7adb68598630c4bc9c7d [file]
; 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
; There should be no reason to interchange this, unless it is forced.
;
; for (int i = 0; i<1024; i++)
; for (int j = 0; j<1024; j++)
; A[i][j] = 42;
@A = dso_local local_unnamed_addr global [1024 x [1024 x i32]] zeroinitializer, align 4
define dso_local void @f() local_unnamed_addr #0 {
; CHECK-LABEL: define dso_local void @f() local_unnamed_addr {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: br label %[[INNER_BODY_PREHEADER:.*]]
; CHECK: [[OUTER_HEADER_PREHEADER:.*]]:
; CHECK-NEXT: br label %[[OUTER_HEADER:.*]]
; CHECK: [[OUTER_HEADER]]:
; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_NEXT:%.*]], %[[INNER_HEADER:.*]] ], [ 0, %[[OUTER_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[INNER_BODY_SPLIT1:.*]]
; CHECK: [[INNER_BODY_PREHEADER]]:
; CHECK-NEXT: br label %[[INNER_BODY:.*]]
; CHECK: [[INNER_HEADER]]:
; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i64 [[I]], 1
; CHECK-NEXT: [[EXITCOND20_NOT:%.*]] = icmp eq i64 [[I_NEXT]], 1024
; CHECK-NEXT: br i1 [[EXITCOND20_NOT]], label %[[INNER_BODY_SPLIT:.*]], label %[[OUTER_HEADER]]
; CHECK: [[INNER_BODY]]:
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[TMP0:%.*]], %[[INNER_BODY_SPLIT]] ], [ 0, %[[INNER_BODY_PREHEADER]] ]
; CHECK-NEXT: br label %[[OUTER_HEADER_PREHEADER]]
; CHECK: [[INNER_BODY_SPLIT1]]:
; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds nuw [1024 x [1024 x i32]], ptr @A, i64 0, i64 [[I]], i64 [[J]]
; CHECK-NEXT: store i32 42, ptr [[ARRAYIDX6]], align 4
; CHECK-NEXT: [[J_NEXT:%.*]] = add nuw nsw i64 [[J]], 1
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[J_NEXT]], 1024
; CHECK-NEXT: br label %[[INNER_HEADER]]
; CHECK: [[INNER_BODY_SPLIT]]:
; CHECK-NEXT: [[TMP0]] = add nuw nsw i64 [[J]], 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 1024
; CHECK-NEXT: br i1 [[TMP1]], label %[[EXIT:.*]], label %[[INNER_BODY]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: ret void
;
entry:
br label %outer.header
outer.header:
%i = phi i64 [ 0, %entry ], [ %i.next, %inner.header ]
br label %inner.body
inner.header:
%i.next = add nuw nsw i64 %i, 1
%exitcond20.not = icmp eq i64 %i.next, 1024
br i1 %exitcond20.not, label %exit, label %outer.header
inner.body:
%j = phi i64 [ 0, %outer.header ], [ %j.next, %inner.body ]
%arrayidx6 = getelementptr inbounds nuw [1024 x [1024 x i32]], ptr @A, i64 0, i64 %i, i64 %j
store i32 42, ptr %arrayidx6, align 4
%j.next = add nuw nsw i64 %j, 1
%exitcond.not = icmp eq i64 %j.next, 1024
br i1 %exitcond.not, label %inner.header, label %inner.body
exit:
ret void
}