Skip to content

Commit 7104372

Browse files
committed
[loop-interchange] Move tests to use remarks
Checking the remark message if interchange did or didn't happen is more straight forward than checking 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 steps.
1 parent 24c2744 commit 7104372

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)