1
+ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
1
2
# RUN: llc -mtriple=thumbv8.1m.main -run-pass=arm-low-overhead-loops %s -verify-machineinstrs -o - | FileCheck %s
2
3
3
- # CHECK-NOT: DoLoopStart
4
- # CHECK-NOT: DLS
5
- # CHECK: bb.1.for.body:
6
- # CHECK: $lr = t2SUBri killed renamable $lr, 1, 14, $noreg, def $cpsr
7
- # CHECK-NOT: t2CMPri $lr
8
- # CHECK: tBcc %bb.3, 1, $cpsr
9
- # CHECK: tB %bb.2, 14, $noreg
10
- # CHECK: bb.2.for.cond.cleanup:
11
- # CHECK: bb.3.for.header:
12
-
13
4
--- |
14
5
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
15
6
target triple = "thumbv8.1m.main"
16
-
7
+
17
8
define void @size_limit(i32* nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) {
18
9
entry :
19
10
call void @llvm.set.loop.iterations.i32(i32 %N)
20
11
%scevgep = getelementptr i32, i32* %a, i32 -1
21
12
%scevgep4 = getelementptr i32, i32* %c, i32 -1
22
13
%scevgep8 = getelementptr i32, i32* %b, i32 -1
23
14
br label %for.header
24
-
15
+
25
16
for.body : ; preds = %for.header
26
17
%scevgep11 = getelementptr i32, i32* %lsr.iv9, i32 1
27
18
%ld1 = load i32, i32* %scevgep11, align 4
36
27
%count.next = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %count, i32 1)
37
28
%cmp = icmp ne i32 %count.next, 0
38
29
br i1 %cmp, label %for.header, label %for.cond.cleanup
39
-
30
+
40
31
for.cond.cleanup : ; preds = %for.body
41
32
ret void
42
-
33
+
43
34
for.header : ; preds = %for.body, %entry
44
35
%lsr.iv9 = phi i32* [ %scevgep8, %entry ], [ %scevgep10, %for.body ]
45
36
%lsr.iv5 = phi i32* [ %scevgep4, %entry ], [ %scevgep6, %for.body ]
46
37
%lsr.iv1 = phi i32* [ %scevgep, %entry ], [ %scevgep2, %for.body ]
47
38
%count = phi i32 [ %N, %entry ], [ %count.next, %for.body ]
48
39
br label %for.body
49
40
}
50
-
41
+
51
42
; Function Attrs : nounwind
52
43
declare i32 @llvm.arm.space(i32 immarg, i32) # 0
53
-
44
+
54
45
; Function Attrs : noduplicate nounwind
55
46
declare void @llvm.set.loop.iterations.i32(i32) # 1
56
-
47
+
57
48
; Function Attrs : noduplicate nounwind
58
49
declare i32 @llvm.loop.decrement.reg.i32.i32.i32(i32, i32) # 1
59
-
50
+
60
51
attributes # 0 = { nounwind }
61
52
attributes # 1 = { noduplicate nounwind }
62
53
@@ -98,44 +89,95 @@ frameInfo:
98
89
restorePoint : ' '
99
90
fixedStack : []
100
91
stack :
101
- - { id: 0, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4,
102
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
92
+ - { id: 0, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4,
93
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
103
94
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
104
- - { id: 1, name: '', type: spill-slot, offset: -16, size: 4, alignment: 4,
105
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
95
+ - { id: 1, name: '', type: spill-slot, offset: -16, size: 4, alignment: 4,
96
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
106
97
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
107
- - { id: 2, name: '', type: spill-slot, offset: -20, size: 4, alignment: 4,
108
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
98
+ - { id: 2, name: '', type: spill-slot, offset: -20, size: 4, alignment: 4,
99
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
109
100
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
110
- - { id: 3, name: '', type: spill-slot, offset: -24, size: 4, alignment: 4,
111
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
101
+ - { id: 3, name: '', type: spill-slot, offset: -24, size: 4, alignment: 4,
102
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
112
103
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
113
- - { id: 4, name: '', type: spill-slot, offset: -28, size: 4, alignment: 4,
114
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
104
+ - { id: 4, name: '', type: spill-slot, offset: -28, size: 4, alignment: 4,
105
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
115
106
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
116
- - { id: 5, name: '', type: spill-slot, offset: -32, size: 4, alignment: 4,
117
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
107
+ - { id: 5, name: '', type: spill-slot, offset: -32, size: 4, alignment: 4,
108
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
118
109
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
119
- - { id: 6, name: '', type: spill-slot, offset: -36, size: 4, alignment: 4,
120
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
110
+ - { id: 6, name: '', type: spill-slot, offset: -36, size: 4, alignment: 4,
111
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
121
112
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
122
- - { id: 7, name: '', type: spill-slot, offset: -40, size: 4, alignment: 4,
123
- stack-id : default, callee-saved-register: '', callee-saved-restored: true,
113
+ - { id: 7, name: '', type: spill-slot, offset: -40, size: 4, alignment: 4,
114
+ stack-id : default, callee-saved-register: '', callee-saved-restored: true,
124
115
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
125
- - { id: 8, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
126
- stack-id : default, callee-saved-register: '$lr', callee-saved-restored: false,
116
+ - { id: 8, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
117
+ stack-id : default, callee-saved-register: '$lr', callee-saved-restored: false,
127
118
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
128
- - { id: 9, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
129
- stack-id : default, callee-saved-register: '$r7', callee-saved-restored: true,
119
+ - { id: 9, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
120
+ stack-id : default, callee-saved-register: '$r7', callee-saved-restored: true,
130
121
debug-info-variable : ' ' , debug-info-expression: '', debug-info-location: '' }
131
122
callSites : []
132
123
constants : []
133
124
machineFunctionInfo : {}
134
125
body : |
126
+ ; CHECK-LABEL: name: size_limit
127
+ ; CHECK: bb.0.entry:
128
+ ; CHECK: successors: %bb.3(0x80000000)
129
+ ; CHECK: liveins: $r0, $r1, $r2, $r3, $r7, $lr
130
+ ; CHECK: frame-setup tPUSH 14, $noreg, killed $r7, killed $lr, implicit-def $sp, implicit $sp
131
+ ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 8
132
+ ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4
133
+ ; CHECK: frame-setup CFI_INSTRUCTION offset $r7, -8
134
+ ; CHECK: $sp = frame-setup tSUBspi $sp, 8, 14, $noreg
135
+ ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 40
136
+ ; CHECK: renamable $r0, dead $cpsr = tSUBi8 killed renamable $r0, 4, 14, $noreg
137
+ ; CHECK: renamable $r2, dead $cpsr = tSUBi8 killed renamable $r2, 4, 14, $noreg
138
+ ; CHECK: renamable $r1, dead $cpsr = tSUBi8 killed renamable $r1, 4, 14, $noreg
139
+ ; CHECK: tSTRspi killed $r1, $sp, 7, 14, $noreg :: (store 4 into %stack.0)
140
+ ; CHECK: tSTRspi killed $r2, $sp, 6, 14, $noreg :: (store 4 into %stack.1)
141
+ ; CHECK: tSTRspi killed $r0, $sp, 5, 14, $noreg :: (store 4 into %stack.2)
142
+ ; CHECK: tSTRspi killed $r3, $sp, 4, 14, $noreg :: (store 4 into %stack.3)
143
+ ; CHECK: tB %bb.3, 14, $noreg
144
+ ; CHECK: bb.1.for.body:
145
+ ; CHECK: successors: %bb.3(0x40000000), %bb.2(0x40000000)
146
+ ; CHECK: $r0 = tLDRspi $sp, 3, 14, $noreg :: (load 4 from %stack.4)
147
+ ; CHECK: renamable $r1, renamable $r0 = t2LDR_PRE renamable $r0, 4, 14, $noreg :: (load 4 from %ir.scevgep11)
148
+ ; CHECK: $r2 = tLDRspi $sp, 2, 14, $noreg :: (load 4 from %stack.5)
149
+ ; CHECK: renamable $r3, renamable $r2 = t2LDR_PRE renamable $r2, 4, 14, $noreg :: (load 4 from %ir.scevgep7)
150
+ ; CHECK: renamable $r1, dead $cpsr = nsw tMUL killed renamable $r3, killed renamable $r1, 14, $noreg
151
+ ; CHECK: $r3 = tLDRspi $sp, 1, 14, $noreg :: (load 4 from %stack.6)
152
+ ; CHECK: early-clobber renamable $r3 = t2STR_PRE killed renamable $r1, renamable $r3, 4, 14, $noreg :: (store 4 into %ir.scevgep3)
153
+ ; CHECK: $r1 = tLDRspi $sp, 0, 14, $noreg :: (load 4 from %stack.7)
154
+ ; CHECK: $lr = tMOVr killed $r1, 14, $noreg
155
+ ; CHECK: $lr = t2SUBri killed renamable $lr, 1, 14, $noreg, def $cpsr
156
+ ; CHECK: $r12 = tMOVr $lr, 14, $noreg
157
+ ; CHECK: tSTRspi killed $r0, $sp, 7, 14, $noreg :: (store 4 into %stack.0)
158
+ ; CHECK: tSTRspi killed $r2, $sp, 6, 14, $noreg :: (store 4 into %stack.1)
159
+ ; CHECK: tSTRspi killed $r3, $sp, 5, 14, $noreg :: (store 4 into %stack.2)
160
+ ; CHECK: t2STRi12 killed $r12, $sp, 16, 14, $noreg :: (store 4 into %stack.3)
161
+ ; CHECK: tBcc %bb.3, 1, $cpsr
162
+ ; CHECK: tB %bb.2, 14, $noreg
163
+ ; CHECK: bb.2.for.cond.cleanup:
164
+ ; CHECK: $sp = tADDspi $sp, 8, 14, $noreg
165
+ ; CHECK: tPOP_RET 14, $noreg, def $r7, def $pc
166
+ ; CHECK: bb.3.for.header:
167
+ ; CHECK: successors: %bb.1(0x80000000)
168
+ ; CHECK: $r0 = tLDRspi $sp, 4, 14, $noreg :: (load 4 from %stack.3)
169
+ ; CHECK: $r1 = tLDRspi $sp, 5, 14, $noreg :: (load 4 from %stack.2)
170
+ ; CHECK: $r2 = tLDRspi $sp, 6, 14, $noreg :: (load 4 from %stack.1)
171
+ ; CHECK: $r3 = tLDRspi $sp, 7, 14, $noreg :: (load 4 from %stack.0)
172
+ ; CHECK: tSTRspi killed $r0, $sp, 0, 14, $noreg :: (store 4 into %stack.7)
173
+ ; CHECK: tSTRspi killed $r1, $sp, 1, 14, $noreg :: (store 4 into %stack.6)
174
+ ; CHECK: tSTRspi killed $r2, $sp, 2, 14, $noreg :: (store 4 into %stack.5)
175
+ ; CHECK: tSTRspi killed $r3, $sp, 3, 14, $noreg :: (store 4 into %stack.4)
176
+ ; CHECK: tB %bb.1, 14, $noreg
135
177
bb.0.entry:
136
178
successors: %bb.3(0x80000000)
137
179
liveins: $r0, $r1, $r2, $r3, $r7, $lr
138
-
180
+
139
181
frame-setup tPUSH 14, $noreg, killed $r7, killed $lr, implicit-def $sp, implicit $sp
140
182
frame-setup CFI_INSTRUCTION def_cfa_offset 8
141
183
frame-setup CFI_INSTRUCTION offset $lr, -4
@@ -151,10 +193,10 @@ body: |
151
193
tSTRspi killed $r0, $sp, 5, 14, $noreg :: (store 4 into %stack.2)
152
194
tSTRspi killed $r3, $sp, 4, 14, $noreg :: (store 4 into %stack.3)
153
195
tB %bb.3, 14, $noreg
154
-
196
+
155
197
bb.1.for.body:
156
198
successors: %bb.3(0x40000000), %bb.2(0x40000000)
157
-
199
+
158
200
$r0 = tLDRspi $sp, 3, 14, $noreg :: (load 4 from %stack.4)
159
201
renamable $r1, renamable $r0 = t2LDR_PRE renamable $r0, 4, 14, $noreg :: (load 4 from %ir.scevgep11)
160
202
$r2 = tLDRspi $sp, 2, 14, $noreg :: (load 4 from %stack.5)
@@ -172,14 +214,14 @@ body: |
172
214
t2STRi12 killed $r12, $sp, 16, 14, $noreg :: (store 4 into %stack.3)
173
215
t2LoopEnd killed renamable $lr, %bb.3, implicit-def dead $cpsr
174
216
tB %bb.2, 14, $noreg
175
-
217
+
176
218
bb.2.for.cond.cleanup:
177
219
$sp = tADDspi $sp, 8, 14, $noreg
178
220
tPOP_RET 14, $noreg, def $r7, def $pc
179
-
221
+
180
222
bb.3.for.header:
181
223
successors: %bb.1(0x80000000)
182
-
224
+
183
225
$r0 = tLDRspi $sp, 4, 14, $noreg :: (load 4 from %stack.3)
184
226
$r1 = tLDRspi $sp, 5, 14, $noreg :: (load 4 from %stack.2)
185
227
$r2 = tLDRspi $sp, 6, 14, $noreg :: (load 4 from %stack.1)
0 commit comments