11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2- ; RUN: opt < %s -passes=loop-reduce,loop-term-fold -S | FileCheck %s --check-prefix=CHECK-OPT
3- ; RUN: llc < %s -o - | FileCheck %s --check-prefix=CHECK-LLC
2+ ; RUN: opt < %s -passes=loop-reduce -S | FileCheck %s
43
54target datalayout = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
65target triple = "mips-unknown-linux-gnu"
@@ -9,34 +8,20 @@ target triple = "mips-unknown-linux-gnu"
98
109; Function Attrs: nofree norecurse nosync nounwind memory(write, argmem: none, inaccessiblemem: none)
1110define dso_local void @in128000 (i32 noundef signext %k , i32 noundef signext %n ) local_unnamed_addr #0 {
12- ; CHECK-LLC-LABEL: in128000:
13- ; CHECK-LLC: # %bb.0: # %entry
14- ; CHECK-LLC-NEXT: lui $1, %hi(x)
15- ; CHECK-LLC-NEXT: addiu $2, $1, %lo(x)
16- ; CHECK-LLC-NEXT: lui $1, 7
17- ; CHECK-LLC-NEXT: ori $1, $1, 53248
18- ; CHECK-LLC-NEXT: addu $3, $2, $1
19- ; CHECK-LLC-NEXT: $BB0_1: # %for.body
20- ; CHECK-LLC-NEXT: # =>This Inner Loop Header: Depth=1
21- ; CHECK-LLC-NEXT: sw $4, 0($2)
22- ; CHECK-LLC-NEXT: addiu $2, $2, 4
23- ; CHECK-LLC-NEXT: bne $2, $3, $BB0_1
24- ; CHECK-LLC-NEXT: nop
25- ; CHECK-LLC-NEXT: # %bb.2: # %for.cond.cleanup
26- ; CHECK-LLC-NEXT: jr $ra
27- ; CHECK-LLC-NEXT: nop
28- ; CHECK-OPT-LABEL: define dso_local void @in128000(
29- ; CHECK-OPT-SAME: i32 noundef signext [[K:%.*]], i32 noundef signext [[N:%.*]]) local_unnamed_addr {
30- ; CHECK-OPT-NEXT: [[ENTRY:.*]]:
31- ; CHECK-OPT-NEXT: br label %[[FOR_BODY:.*]]
32- ; CHECK-OPT: [[FOR_COND_CLEANUP:.*]]:
33- ; CHECK-OPT-NEXT: ret void
34- ; CHECK-OPT: [[FOR_BODY]]:
35- ; CHECK-OPT-NEXT: [[LSR_IV1:%.*]] = phi ptr [ [[SCEVGEP:%.*]], %[[FOR_BODY]] ], [ @x, %[[ENTRY]] ]
36- ; CHECK-OPT-NEXT: store i32 [[K]], ptr [[LSR_IV1]], align 4
37- ; CHECK-OPT-NEXT: [[SCEVGEP]] = getelementptr i8, ptr [[LSR_IV1]], i32 4
38- ; CHECK-OPT-NEXT: [[LSR_FOLD_TERM_COND_REPLACED_TERM_COND:%.*]] = icmp eq ptr [[SCEVGEP]], getelementptr inbounds nuw (i8, ptr @x, i32 512000)
39- ; CHECK-OPT-NEXT: br i1 [[LSR_FOLD_TERM_COND_REPLACED_TERM_COND]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
11+ ; CHECK-LABEL: define dso_local void @in128000(
12+ ; CHECK-SAME: i32 noundef signext [[K:%.*]], i32 noundef signext [[N:%.*]]) local_unnamed_addr {
13+ ; CHECK-NEXT: [[ENTRY:.*]]:
14+ ; CHECK-NEXT: br label %[[FOR_BODY:.*]]
15+ ; CHECK: [[FOR_COND_CLEANUP:.*]]:
16+ ; CHECK-NEXT: ret void
17+ ; CHECK: [[FOR_BODY]]:
18+ ; CHECK-NEXT: [[LSR_IV1:%.*]] = phi ptr [ [[SCEVGEP:%.*]], %[[FOR_BODY]] ], [ @x, %[[ENTRY]] ]
19+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], %[[FOR_BODY]] ], [ 128000, %[[ENTRY]] ]
20+ ; CHECK-NEXT: store i32 [[K]], ptr [[LSR_IV1]], align 4
21+ ; CHECK-NEXT: [[LSR_IV_NEXT]] = add nsw i32 [[LSR_IV]], -1
22+ ; CHECK-NEXT: [[SCEVGEP]] = getelementptr i8, ptr [[LSR_IV1]], i32 4
23+ ; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[LSR_IV_NEXT]], 0
24+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
4025;
4126entry:
4227 br label %for.body
@@ -55,32 +40,20 @@ for.body: ; preds = %entry, %for.body
5540
5641; Function Attrs: nofree norecurse nosync nounwind memory(write, argmem: none, inaccessiblemem: none)
5742define dso_local void @in1000 (i32 noundef signext %k , i32 noundef signext %n ) local_unnamed_addr #0 {
58- ; CHECK-LLC-LABEL: in1000:
59- ; CHECK-LLC: # %bb.0: # %entry
60- ; CHECK-LLC-NEXT: lui $1, %hi(x)
61- ; CHECK-LLC-NEXT: addiu $2, $1, %lo(x)
62- ; CHECK-LLC-NEXT: addiu $3, $2, 4000
63- ; CHECK-LLC-NEXT: $BB1_1: # %for.body
64- ; CHECK-LLC-NEXT: # =>This Inner Loop Header: Depth=1
65- ; CHECK-LLC-NEXT: sw $4, 0($2)
66- ; CHECK-LLC-NEXT: addiu $2, $2, 4
67- ; CHECK-LLC-NEXT: bne $2, $3, $BB1_1
68- ; CHECK-LLC-NEXT: nop
69- ; CHECK-LLC-NEXT: # %bb.2: # %for.cond.cleanup
70- ; CHECK-LLC-NEXT: jr $ra
71- ; CHECK-LLC-NEXT: nop
72- ; CHECK-OPT-LABEL: define dso_local void @in1000(
73- ; CHECK-OPT-SAME: i32 noundef signext [[K:%.*]], i32 noundef signext [[N:%.*]]) local_unnamed_addr {
74- ; CHECK-OPT-NEXT: [[ENTRY:.*]]:
75- ; CHECK-OPT-NEXT: br label %[[FOR_BODY:.*]]
76- ; CHECK-OPT: [[FOR_COND_CLEANUP:.*]]:
77- ; CHECK-OPT-NEXT: ret void
78- ; CHECK-OPT: [[FOR_BODY]]:
79- ; CHECK-OPT-NEXT: [[LSR_IV1:%.*]] = phi ptr [ [[SCEVGEP:%.*]], %[[FOR_BODY]] ], [ @x, %[[ENTRY]] ]
80- ; CHECK-OPT-NEXT: store i32 [[K]], ptr [[LSR_IV1]], align 4
81- ; CHECK-OPT-NEXT: [[SCEVGEP]] = getelementptr i8, ptr [[LSR_IV1]], i32 4
82- ; CHECK-OPT-NEXT: [[LSR_FOLD_TERM_COND_REPLACED_TERM_COND:%.*]] = icmp eq ptr [[SCEVGEP]], getelementptr inbounds nuw (i8, ptr @x, i32 4000)
83- ; CHECK-OPT-NEXT: br i1 [[LSR_FOLD_TERM_COND_REPLACED_TERM_COND]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
43+ ; CHECK-LABEL: define dso_local void @in1000(
44+ ; CHECK-SAME: i32 noundef signext [[K:%.*]], i32 noundef signext [[N:%.*]]) local_unnamed_addr {
45+ ; CHECK-NEXT: [[ENTRY:.*]]:
46+ ; CHECK-NEXT: br label %[[FOR_BODY:.*]]
47+ ; CHECK: [[FOR_COND_CLEANUP:.*]]:
48+ ; CHECK-NEXT: ret void
49+ ; CHECK: [[FOR_BODY]]:
50+ ; CHECK-NEXT: [[LSR_IV1:%.*]] = phi ptr [ [[SCEVGEP:%.*]], %[[FOR_BODY]] ], [ @x, %[[ENTRY]] ]
51+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], %[[FOR_BODY]] ], [ 1000, %[[ENTRY]] ]
52+ ; CHECK-NEXT: store i32 [[K]], ptr [[LSR_IV1]], align 4
53+ ; CHECK-NEXT: [[LSR_IV_NEXT]] = add nsw i32 [[LSR_IV]], -1
54+ ; CHECK-NEXT: [[SCEVGEP]] = getelementptr i8, ptr [[LSR_IV1]], i32 4
55+ ; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[LSR_IV_NEXT]], 0
56+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
8457;
8558entry:
8659 br label %for.body
0 commit comments