Skip to content

Commit 77803e4

Browse files
authored
[loop-interchange] Move tests over to use remarks (#123053)
Checking the remark message if interchange did or didn't happen is more straight forward than the full IR for these cases. This comment was also made when I moved some tests away from relying on debug builds in change #116780, and this is a prep step for #119345 that is going to change these test cases.
1 parent da5ec78 commit 77803e4

6 files changed

+117
-388
lines changed

llvm/test/Transforms/LoopInterchange/gh54176-scalar-deps.ll

Lines changed: 20 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2-
; RUN: opt < %s -passes=loop-interchange -S | FileCheck %s
1+
; RUN: opt < %s -passes=loop-interchange -pass-remarks-output=%t -disable-output
2+
; RUN: FileCheck -input-file %t %s
33

44
@f = dso_local local_unnamed_addr global [4 x [9 x i32]] [[9 x i32] [i32 5, i32 3, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0], [9 x i32] zeroinitializer, [9 x i32] zeroinitializer, [9 x i32] zeroinitializer], align 4
55
@g = common dso_local local_unnamed_addr global i32 0, align 4
@@ -23,54 +23,18 @@
2323
; return g;
2424
; }
2525
;
26+
define dso_local i32 @test1(i1 %cond) {
27+
;
2628
; FIXME: if there's an output dependency inside the loop and Src doesn't
2729
; dominate Dst, we should not interchange. Thus, this currently miscompiles.
2830
;
29-
define dso_local i32 @test1(i1 %cond) {
30-
; CHECK-LABEL: define dso_local i32 @test1(
31-
; CHECK-SAME: i1 [[COND:%.*]]) {
32-
; CHECK-NEXT: [[FOR_PREHEADER:.*:]]
33-
; CHECK-NEXT: br label %[[INNERLOOP_PREHEADER:.*]]
34-
; CHECK: [[OUTERLOOP_PREHEADER:.*]]:
35-
; CHECK-NEXT: br label %[[OUTERLOOP:.*]]
36-
; CHECK: [[OUTERLOOP]]:
37-
; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[INDVARS_IV_NEXT21_I:%.*]], %[[FOR_LATCH:.*]] ], [ 0, %[[OUTERLOOP_PREHEADER]] ]
38-
; CHECK-NEXT: br label %[[INNERLOOP_SPLIT:.*]]
39-
; CHECK: [[INNERLOOP_PREHEADER]]:
40-
; CHECK-NEXT: br label %[[INNERLOOP:.*]]
41-
; CHECK: [[INNERLOOP]]:
42-
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[TMP0:%.*]], %[[IF_END_SPLIT:.*]] ], [ 0, %[[INNERLOOP_PREHEADER]] ]
43-
; CHECK-NEXT: br label %[[OUTERLOOP_PREHEADER]]
44-
; CHECK: [[INNERLOOP_SPLIT]]:
45-
; CHECK-NEXT: [[ARRAYIDX6_I:%.*]] = getelementptr inbounds [4 x [9 x i32]], ptr @f, i64 0, i64 [[J]], i64 [[I]]
46-
; CHECK-NEXT: [[I1:%.*]] = load i32, ptr [[ARRAYIDX6_I]], align 4
47-
; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[I1]], 0
48-
; CHECK-NEXT: br i1 [[TOBOOL_I]], label %[[LAND_END:.*]], label %[[LAND_RHS:.*]]
49-
; CHECK: [[LAND_RHS]]:
50-
; CHECK-NEXT: store i32 3, ptr @g, align 4
51-
; CHECK-NEXT: br label %[[LAND_END]]
52-
; CHECK: [[LAND_END]]:
53-
; CHECK-NEXT: br i1 [[COND]], label %[[IF_END:.*]], label %[[IF_THEN:.*]]
54-
; CHECK: [[IF_THEN]]:
55-
; CHECK-NEXT: [[I2:%.*]] = load i32, ptr @g, align 4
56-
; CHECK-NEXT: [[INC_I:%.*]] = add i32 [[I2]], 1
57-
; CHECK-NEXT: store i32 [[INC_I]], ptr @g, align 4
58-
; CHECK-NEXT: br label %[[IF_END]]
59-
; CHECK: [[IF_END]]:
60-
; CHECK-NEXT: [[J_NEXT:%.*]] = add nuw nsw i64 [[J]], 1
61-
; CHECK-NEXT: [[EXITCOND_I:%.*]] = icmp eq i64 [[J_NEXT]], 3
62-
; CHECK-NEXT: br label %[[FOR_LATCH]]
63-
; CHECK: [[IF_END_SPLIT]]:
64-
; CHECK-NEXT: [[TMP0]] = add nuw nsw i64 [[J]], 1
65-
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 3
66-
; CHECK-NEXT: br i1 [[TMP1]], label %[[EXIT:.*]], label %[[INNERLOOP]]
67-
; CHECK: [[FOR_LATCH]]:
68-
; CHECK-NEXT: [[INDVARS_IV_NEXT21_I]] = add nsw i64 [[I]], 1
69-
; CHECK-NEXT: [[CMP_I:%.*]] = icmp slt i64 [[I]], 2
70-
; CHECK-NEXT: br i1 [[CMP_I]], label %[[OUTERLOOP]], label %[[IF_END_SPLIT]]
71-
; CHECK: [[EXIT]]:
72-
; CHECK-NEXT: [[I3:%.*]] = load i32, ptr @g, align 4
73-
; CHECK-NEXT: ret i32 [[I3]]
31+
; CHECK: --- !Passed
32+
; CHECK-NEXT: Pass: loop-interchange
33+
; CHECK-NEXT: Name: Interchanged
34+
; CHECK-NEXT: Function: test1
35+
; CHECK-NEXT: Args:
36+
; CHECK-NEXT: - String: Loop interchanged with enclosing loop.
37+
; CHECK-NEXT: ...
7438
;
7539
for.preheader:
7640
br label %outerloop
@@ -133,54 +97,18 @@ exit:
13397
; return g;
13498
; }
13599
;
100+
define dso_local i32 @test2(i1 %cond) {
101+
;
136102
; FIXME: if there's an output dependency inside the loop and Src doesn't
137103
; dominate Dst, we should not interchange. Thus, this currently miscompiles.
138104
;
139-
define dso_local i32 @test2(i1 %cond) {
140-
; CHECK-LABEL: define dso_local i32 @test2(
141-
; CHECK-SAME: i1 [[COND:%.*]]) {
142-
; CHECK-NEXT: [[FOR_PREHEADER:.*:]]
143-
; CHECK-NEXT: br label %[[INNERLOOP_PREHEADER:.*]]
144-
; CHECK: [[OUTERLOOP_PREHEADER:.*]]:
145-
; CHECK-NEXT: br label %[[OUTERLOOP:.*]]
146-
; CHECK: [[OUTERLOOP]]:
147-
; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[INDVARS_IV_NEXT21_I:%.*]], %[[FOR_LATCH:.*]] ], [ 0, %[[OUTERLOOP_PREHEADER]] ]
148-
; CHECK-NEXT: br label %[[INNERLOOP_SPLIT:.*]]
149-
; CHECK: [[INNERLOOP_PREHEADER]]:
150-
; CHECK-NEXT: br label %[[INNERLOOP:.*]]
151-
; CHECK: [[INNERLOOP]]:
152-
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[TMP0:%.*]], %[[IF_END_SPLIT:.*]] ], [ 0, %[[INNERLOOP_PREHEADER]] ]
153-
; CHECK-NEXT: br label %[[OUTERLOOP_PREHEADER]]
154-
; CHECK: [[INNERLOOP_SPLIT]]:
155-
; CHECK-NEXT: [[ARRAYIDX6_I:%.*]] = getelementptr inbounds [4 x [9 x i32]], ptr @f, i64 0, i64 [[J]], i64 [[I]]
156-
; CHECK-NEXT: [[I1:%.*]] = load i32, ptr [[ARRAYIDX6_I]], align 4
157-
; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[I1]], 0
158-
; CHECK-NEXT: store i32 3, ptr @g, align 4
159-
; CHECK-NEXT: br i1 [[TOBOOL_I]], label %[[LAND_END:.*]], label %[[LAND_RHS:.*]]
160-
; CHECK: [[LAND_RHS]]:
161-
; CHECK-NEXT: br label %[[LAND_END]]
162-
; CHECK: [[LAND_END]]:
163-
; CHECK-NEXT: br i1 [[COND]], label %[[IF_END:.*]], label %[[IF_THEN:.*]]
164-
; CHECK: [[IF_THEN]]:
165-
; CHECK-NEXT: [[I2:%.*]] = load i32, ptr @g, align 4
166-
; CHECK-NEXT: [[INC_I:%.*]] = add i32 [[I2]], 1
167-
; CHECK-NEXT: store i32 [[INC_I]], ptr @g, align 4
168-
; CHECK-NEXT: br label %[[IF_END]]
169-
; CHECK: [[IF_END]]:
170-
; CHECK-NEXT: [[J_NEXT:%.*]] = add nuw nsw i64 [[J]], 1
171-
; CHECK-NEXT: [[EXITCOND_I:%.*]] = icmp eq i64 [[J_NEXT]], 3
172-
; CHECK-NEXT: br label %[[FOR_LATCH]]
173-
; CHECK: [[IF_END_SPLIT]]:
174-
; CHECK-NEXT: [[TMP0]] = add nuw nsw i64 [[J]], 1
175-
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 3
176-
; CHECK-NEXT: br i1 [[TMP1]], label %[[EXIT:.*]], label %[[INNERLOOP]]
177-
; CHECK: [[FOR_LATCH]]:
178-
; CHECK-NEXT: [[INDVARS_IV_NEXT21_I]] = add nsw i64 [[I]], 1
179-
; CHECK-NEXT: [[CMP_I:%.*]] = icmp slt i64 [[I]], 2
180-
; CHECK-NEXT: br i1 [[CMP_I]], label %[[OUTERLOOP]], label %[[IF_END_SPLIT]]
181-
; CHECK: [[EXIT]]:
182-
; CHECK-NEXT: [[I3:%.*]] = load i32, ptr @g, align 4
183-
; CHECK-NEXT: ret i32 [[I3]]
105+
; CHECK: --- !Passed
106+
; CHECK-NEXT: Pass: loop-interchange
107+
; CHECK-NEXT: Name: Interchanged
108+
; CHECK-NEXT: Function: test2
109+
; CHECK-NEXT: Args:
110+
; CHECK-NEXT: - String: Loop interchanged with enclosing loop.
111+
; CHECK-NEXT: ...
184112
;
185113
for.preheader:
186114
br label %outerloop

llvm/test/Transforms/LoopInterchange/innermost-latch-uses-values-in-middle-header.ll

Lines changed: 24 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2-
; RUN: opt < %s -passes=loop-interchange -verify-dom-info -verify-loop-info -S 2>&1 | FileCheck %s
1+
; RUN: opt < %s -passes=loop-interchange -verify-dom-info -verify-loop-info -pass-remarks-output=%t -disable-output
2+
; RUN: FileCheck -input-file %t %s
33

44
@a = common global i32 0, align 4
55
@d = common dso_local local_unnamed_addr global [1 x [6 x i32]] zeroinitializer, align 4
@@ -9,53 +9,29 @@
99
; values defined in the new innermost loop not available in the exiting block of
1010
; the entire loop nest.
1111
;
12-
define void @innermost_latch_uses_values_in_middle_header() {
13-
; CHECK-LABEL: define void @innermost_latch_uses_values_in_middle_header() {
14-
; CHECK-NEXT: [[ENTRY:.*]]:
15-
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
16-
; CHECK-NEXT: [[B:%.*]] = add i32 80, 1
17-
; CHECK-NEXT: br label %[[OUTERMOST_HEADER:.*]]
18-
; CHECK: [[OUTERMOST_HEADER]]:
19-
; CHECK-NEXT: [[INDVAR_OUTERMOST:%.*]] = phi i32 [ 10, %[[ENTRY]] ], [ [[INDVAR_OUTERMOST_NEXT:%.*]], %[[OUTERMOST_LATCH:.*]] ]
20-
; CHECK-NEXT: [[TOBOOL71_I:%.*]] = icmp eq i32 [[TMP0]], 0
21-
; CHECK-NEXT: br i1 [[TOBOOL71_I]], label %[[INNERMOST_HEADER_PREHEADER:.*]], label %[[OUTERMOST_LATCH]]
22-
; CHECK: [[MIDDLE_HEADER_PREHEADER:.*]]:
23-
; CHECK-NEXT: br label %[[MIDDLE_HEADER:.*]]
24-
; CHECK: [[MIDDLE_HEADER]]:
25-
; CHECK-NEXT: [[INDVAR_MIDDLE:%.*]] = phi i64 [ [[INDVAR_MIDDLE_NEXT:%.*]], %[[MIDDLE_LATCH:.*]] ], [ 4, %[[MIDDLE_HEADER_PREHEADER]] ]
26-
; CHECK-NEXT: [[INDVAR_MIDDLE_WIDE:%.*]] = zext i32 [[B]] to i64
27-
; CHECK-NEXT: br label %[[INNERMOST_BODY:.*]]
28-
; CHECK: [[INNERMOST_HEADER_PREHEADER]]:
29-
; CHECK-NEXT: br label %[[INNERMOST_HEADER:.*]]
30-
; CHECK: [[INNERMOST_HEADER]]:
31-
; CHECK-NEXT: [[INDVAR_INNERMOST:%.*]] = phi i64 [ [[TMP1:%.*]], %[[INNERMOST_LATCH_SPLIT:.*]] ], [ 4, %[[INNERMOST_HEADER_PREHEADER]] ]
32-
; CHECK-NEXT: br label %[[MIDDLE_HEADER_PREHEADER]]
33-
; CHECK: [[INNERMOST_BODY]]:
34-
; CHECK-NEXT: [[ARRAYIDX9_I:%.*]] = getelementptr inbounds [1 x [6 x i32]], ptr @d, i64 0, i64 [[INDVAR_INNERMOST]], i64 [[INDVAR_MIDDLE]]
35-
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX9_I]], align 4
36-
; CHECK-NEXT: br label %[[INNERMOST_LATCH:.*]]
37-
; CHECK: [[INNERMOST_LATCH]]:
38-
; CHECK-NEXT: [[INDVAR_INNERMOST_NEXT:%.*]] = add nsw i64 [[INDVAR_INNERMOST]], 1
39-
; CHECK-NEXT: [[TOBOOL5_I:%.*]] = icmp eq i64 [[INDVAR_INNERMOST_NEXT]], [[INDVAR_MIDDLE_WIDE]]
40-
; CHECK-NEXT: br label %[[MIDDLE_LATCH]]
41-
; CHECK: [[INNERMOST_LATCH_SPLIT]]:
42-
; CHECK-NEXT: [[INDVAR_MIDDLE_WIDE_LCSSA:%.*]] = phi i64 [ [[INDVAR_MIDDLE_WIDE]], %[[MIDDLE_LATCH]] ]
43-
; CHECK-NEXT: [[TMP1]] = add nsw i64 [[INDVAR_INNERMOST]], 1
44-
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], [[INDVAR_MIDDLE_WIDE_LCSSA]]
45-
; CHECK-NEXT: br i1 [[TMP2]], label %[[OUTERMOST_LATCH_LOOPEXIT:.*]], label %[[INNERMOST_HEADER]]
46-
; CHECK: [[MIDDLE_LATCH]]:
47-
; CHECK-NEXT: [[INDVAR_MIDDLE_NEXT]] = add nsw i64 [[INDVAR_MIDDLE]], -1
48-
; CHECK-NEXT: [[TOBOOL2_I:%.*]] = icmp eq i64 [[INDVAR_MIDDLE_NEXT]], 0
49-
; CHECK-NEXT: br i1 [[TOBOOL2_I]], label %[[INNERMOST_LATCH_SPLIT]], label %[[MIDDLE_HEADER]]
50-
; CHECK: [[OUTERMOST_LATCH_LOOPEXIT]]:
51-
; CHECK-NEXT: br label %[[OUTERMOST_LATCH]]
52-
; CHECK: [[OUTERMOST_LATCH]]:
53-
; CHECK-NEXT: [[INDVAR_OUTERMOST_NEXT]] = add nsw i32 [[INDVAR_OUTERMOST]], -5
54-
; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[INDVAR_OUTERMOST_NEXT]], 0
55-
; CHECK-NEXT: br i1 [[TOBOOL_I]], label %[[OUTERMOST_EXIT:.*]], label %[[OUTERMOST_HEADER]]
56-
; CHECK: [[OUTERMOST_EXIT]]:
57-
; CHECK-NEXT: ret void
12+
; CHECK: --- !Passed
13+
; CHECK: Pass: loop-interchange
14+
; CHECK: Name: Interchanged
15+
; CHECK: Function: innermost_latch_uses_values_in_middle_header
16+
; CHECK: Args:
17+
; CHECK: - String: Loop interchanged with enclosing loop.
18+
; CHECK: ...
19+
; CHECK: --- !Missed
20+
; CHECK: Pass: loop-interchange
21+
; CHECK: Name: UnsupportedInnerLatchPHI
22+
; CHECK: Function: innermost_latch_uses_values_in_middle_header
23+
; CHECK: Args:
24+
; CHECK: - String: Cannot interchange loops because unsupported PHI nodes found in inner loop latch.
25+
; CHECK: ...
26+
; CHECK: --- !Missed
27+
; CHECK: Pass: loop-interchange
28+
; CHECK: Name: UnsupportedExitPHI
29+
; CHECK: Function: innermost_latch_uses_values_in_middle_header
30+
; CHECK: Args:
31+
; CHECK: - String: Found unsupported PHI node in loop exit.
32+
; CHECK: ...
5833
;
34+
define void @innermost_latch_uses_values_in_middle_header() {
5935
entry:
6036
%0 = load i32, ptr @a, align 4
6137
%b = add i32 80, 1

llvm/test/Transforms/LoopInterchange/interchange-flow-dep-outer.ll

Lines changed: 24 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2-
; RUN: opt < %s -passes=loop-interchange -cache-line-size=64 -verify-dom-info -verify-loop-info -S 2>&1 | FileCheck %s
1+
; RUN: opt < %s -passes=loop-interchange -cache-line-size=64 -verify-dom-info -verify-loop-info -pass-remarks-output=%t -disable-output
2+
; RUN: FileCheck -input-file %t %s
33

44
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
55

@@ -24,53 +24,29 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
2424
; So, loops InnerLoopId = 2 and OuterLoopId = 1 should be interchanged,
2525
; but not InnerLoopId = 1 and OuterLoopId = 0.
2626
;
27+
; CHECK: --- !Passed
28+
; CHECK-NEXT: Pass: loop-interchange
29+
; CHECK-NEXT: Name: Interchanged
30+
; CHECK-NEXT: Function: interchange_09
31+
; CHECK-NEXT: Args:
32+
; CHECK-NEXT: - String: Loop interchanged with enclosing loop.
33+
; CHECK-NEXT: ...
34+
; CHECK-NEXT: --- !Missed
35+
; CHECK-NEXT: Pass: loop-interchange
36+
; CHECK-NEXT: Name: NotTightlyNested
37+
; CHECK-NEXT: Function: interchange_09
38+
; CHECK-NEXT: Args:
39+
; CHECK-NEXT: - String: Cannot interchange loops because they are not tightly nested.
40+
; CHECK-NEXT: ...
41+
; CHECK-NEXT: --- !Missed
42+
; CHECK-NEXT: Pass: loop-interchange
43+
; CHECK-NEXT: Name: InterchangeNotProfitable
44+
; CHECK-NEXT: Function: interchange_09
45+
; CHECK-NEXT: Args:
46+
; CHECK-NEXT: - String: Interchanging loops is not considered to improve cache locality nor vectorization.
47+
; CHECK-NEXT: ...
48+
2749
define void @interchange_09(i32 %k) {
28-
; CHECK-LABEL: define void @interchange_09(
29-
; CHECK-SAME: i32 [[K:%.*]]) {
30-
; CHECK-NEXT: [[ENTRY:.*]]:
31-
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
32-
; CHECK: [[FOR_COND_CLEANUP:.*]]:
33-
; CHECK-NEXT: ret void
34-
; CHECK: [[FOR_BODY]]:
35-
; CHECK-NEXT: [[INDVARS_IV45:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDVARS_IV_NEXT46:%.*]], %[[FOR_COND_CLEANUP4:.*]] ]
36-
; CHECK-NEXT: [[CALL:%.*]] = call double @fn1()
37-
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x double], ptr @T, i64 0, i64 [[INDVARS_IV45]]
38-
; CHECK-NEXT: store double [[CALL]], ptr [[ARRAYIDX]], align 8
39-
; CHECK-NEXT: br label %[[FOR_BODY9_PREHEADER:.*]]
40-
; CHECK: [[FOR_COND6_PREHEADER_PREHEADER:.*]]:
41-
; CHECK-NEXT: br label %[[FOR_COND6_PREHEADER:.*]]
42-
; CHECK: [[FOR_COND6_PREHEADER]]:
43-
; CHECK-NEXT: [[INDVARS_IV42:%.*]] = phi i64 [ [[INDVARS_IV_NEXT43:%.*]], %[[FOR_COND_CLEANUP8:.*]] ], [ 0, %[[FOR_COND6_PREHEADER_PREHEADER]] ]
44-
; CHECK-NEXT: br label %[[FOR_BODY9_SPLIT1:.*]]
45-
; CHECK: [[FOR_BODY9_PREHEADER]]:
46-
; CHECK-NEXT: br label %[[FOR_BODY9:.*]]
47-
; CHECK: [[FOR_COND_CLEANUP4]]:
48-
; CHECK-NEXT: [[TMP:%.*]] = load double, ptr [[ARRAYIDX]], align 8
49-
; CHECK-NEXT: call void @fn2(double [[TMP]])
50-
; CHECK-NEXT: [[INDVARS_IV_NEXT46]] = add nuw nsw i64 [[INDVARS_IV45]], 1
51-
; CHECK-NEXT: [[EXITCOND47:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT46]], 100
52-
; CHECK-NEXT: br i1 [[EXITCOND47]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP]]
53-
; CHECK: [[FOR_COND_CLEANUP8]]:
54-
; CHECK-NEXT: [[INDVARS_IV_NEXT43]] = add nuw nsw i64 [[INDVARS_IV42]], 1
55-
; CHECK-NEXT: [[EXITCOND44:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT43]], 1000
56-
; CHECK-NEXT: br i1 [[EXITCOND44]], label %[[FOR_COND6_PREHEADER]], label %[[FOR_BODY9_SPLIT:.*]]
57-
; CHECK: [[FOR_BODY9]]:
58-
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[TMP0:%.*]], %[[FOR_BODY9_SPLIT]] ], [ 1, %[[FOR_BODY9_PREHEADER]] ]
59-
; CHECK-NEXT: br label %[[FOR_COND6_PREHEADER_PREHEADER]]
60-
; CHECK: [[FOR_BODY9_SPLIT1]]:
61-
; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds [1000 x [1000 x i32]], ptr @Arr, i64 0, i64 [[INDVARS_IV]], i64 [[INDVARS_IV42]]
62-
; CHECK-NEXT: [[T1:%.*]] = load i32, ptr [[ARRAYIDX13]], align 4
63-
; CHECK-NEXT: [[T2:%.*]] = trunc i64 [[INDVARS_IV45]] to i32
64-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[T1]], [[T2]]
65-
; CHECK-NEXT: store i32 [[ADD]], ptr [[ARRAYIDX13]], align 4
66-
; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1
67-
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 1000
68-
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP8]]
69-
; CHECK: [[FOR_BODY9_SPLIT]]:
70-
; CHECK-NEXT: [[TMP0]] = add nuw nsw i64 [[INDVARS_IV]], 1
71-
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[TMP0]], 1000
72-
; CHECK-NEXT: br i1 [[TMP1]], label %[[FOR_BODY9]], label %[[FOR_COND_CLEANUP4]]
73-
;
7450
entry:
7551
br label %for.body
7652

0 commit comments

Comments
 (0)