11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2- ; RUN: opt < %s -passes=loop-reduce -S | FileCheck %s
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
34
45target datalayout = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
56target triple = "mips-unknown-linux-gnu"
@@ -8,20 +9,34 @@ target triple = "mips-unknown-linux-gnu"
89
910; Function Attrs: nofree norecurse nosync nounwind memory(write, argmem: none, inaccessiblemem: none)
1011define dso_local void @in128000 (i32 noundef signext %k , i32 noundef signext %n ) local_unnamed_addr #0 {
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]]
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]]
2540;
2641entry:
2742 br label %for.body
@@ -40,20 +55,32 @@ for.body: ; preds = %entry, %for.body
4055
4156; Function Attrs: nofree norecurse nosync nounwind memory(write, argmem: none, inaccessiblemem: none)
4257define dso_local void @in1000 (i32 noundef signext %k , i32 noundef signext %n ) local_unnamed_addr #0 {
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]]
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]]
5784;
5885entry:
5986 br label %for.body
0 commit comments