| ; 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 |
| } |