Skip to content

Commit a6a3a94

Browse files
committed
[Thumb1] Resolve FIXME: use 'mov hi, $src; mov $dst, hi'
Consider the following: ldr r0, [r4] ldr r7, [r0, #4] cmp r7, r3 bhi .LBB0_6 cmp r0, r2 push {r0} pop {r4} bne .LBB0_3 movs r0, r6 pop {r4, r5, r6, r7} pop {r1} bx r1 Here is a snippet of the generated THUMB1 code of the K&R malloc function that clang currently compiles to. push {r0} ends up being popped to pop {r4}. movs r4, r0 would destroy the flags set by cmp right above. The compiler has no alternative in this case, except one: the only alternative is to transfer through a high register. However, it seems like LLVM does not consider that this is a valid approach, even though it is a free clobbering a high register. This patch addresses the FIXME so the compiler can do that when it can in r10 or r11.
1 parent 513448d commit a6a3a94

File tree

6 files changed

+202
-75
lines changed

6 files changed

+202
-75
lines changed

llvm/lib/Target/ARM/Thumb1InstrInfo.cpp

+26-3
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ void Thumb1InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
5353
.addReg(SrcReg, getKillRegState(KillSrc))
5454
.add(predOps(ARMCC::AL));
5555
else {
56-
// FIXME: Can also use 'mov hi, $src; mov $dst, hi',
57-
// with hi as either r10 or r11.
58-
5956
const TargetRegisterInfo *RegInfo = st.getRegisterInfo();
6057
if (MBB.computeRegisterLiveness(RegInfo, ARM::CPSR, I)
6158
== MachineBasicBlock::LQR_Dead) {
@@ -65,6 +62,32 @@ void Thumb1InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
6562
return;
6663
}
6764

65+
// Can also use 'mov hi, $src; mov $dst, hi',
66+
// with hi as either r10 or r11.
67+
if (MBB.computeRegisterLiveness(RegInfo, ARM::R10, I) ==
68+
MachineBasicBlock::LQR_Dead) {
69+
// Use high register to move source to destination
70+
BuildMI(MBB, I, DL, get(ARM::tMOVr), ARM::R10)
71+
.addReg(SrcReg, getKillRegState(KillSrc))
72+
.add(predOps(ARMCC::AL));
73+
BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
74+
.addReg(ARM::R10, RegState::Kill)
75+
.add(predOps(ARMCC::AL));
76+
return;
77+
}
78+
79+
if (MBB.computeRegisterLiveness(RegInfo, ARM::R11, I) ==
80+
MachineBasicBlock::LQR_Dead) {
81+
// Use high register to move source to destination
82+
BuildMI(MBB, I, DL, get(ARM::tMOVr), ARM::R11)
83+
.addReg(SrcReg, getKillRegState(KillSrc))
84+
.add(predOps(ARMCC::AL));
85+
BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
86+
.addReg(ARM::R11, RegState::Kill)
87+
.add(predOps(ARMCC::AL));
88+
return;
89+
}
90+
6891
// 'MOV lo, lo' is unpredictable on < v6, so use the stack to do it
6992
BuildMI(MBB, I, DL, get(ARM::tPUSH))
7093
.add(predOps(ARMCC::AL))

llvm/test/CodeGen/ARM/sadd_sat.ll

+113-56
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
130130
; CHECK-T15TE-NEXT: bics r4, r1
131131
; CHECK-T15TE-NEXT: asrs r1, r3, #31
132132
; CHECK-T15TE-NEXT: cmp r4, #0
133-
; CHECK-T15TE-NEXT: push {r1}
134-
; CHECK-T15TE-NEXT: pop {r0}
133+
; CHECK-T15TE-NEXT: mov r10, r1
134+
; CHECK-T15TE-NEXT: mov r0, r10
135135
; CHECK-T15TE-NEXT: bmi .LBB1_2
136136
; CHECK-T15TE-NEXT: @ %bb.1:
137137
; CHECK-T15TE-NEXT: movs r0, r2
@@ -151,28 +151,28 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
151151
}
152152

153153
define signext i16 @func16(i16 signext %x, i16 signext %y) nounwind {
154-
; CHECK-T1-LABEL: func16:
155-
; CHECK-T1: @ %bb.0:
156-
; CHECK-T1-NEXT: adds r0, r0, r1
157-
; CHECK-T1-NEXT: ldr r1, .LCPI2_0
158-
; CHECK-T1-NEXT: cmp r0, r1
159-
; CHECK-T1-NEXT: blt .LBB2_2
160-
; CHECK-T1-NEXT: @ %bb.1:
161-
; CHECK-T1-NEXT: {{movs|mov}} r0, r1
162-
; CHECK-T1-NEXT: .LBB2_2:
163-
; CHECK-T1-NEXT: ldr r1, .LCPI2_1
164-
; CHECK-T1-NEXT: cmp r0, r1
165-
; CHECK-T1-NEXT: bgt .LBB2_4
166-
; CHECK-T1-NEXT: @ %bb.3:
167-
; CHECK-T1-NEXT: {{movs|mov}} r0, r1
168-
; CHECK-T1-NEXT: .LBB2_4:
169-
; CHECK-T1-NEXT: bx lr
170-
; CHECK-T1-NEXT: .p2align 2
171-
; CHECK-T1-NEXT: @ %bb.5:
172-
; CHECK-T1-NEXT: .LCPI2_0:
173-
; CHECK-T1-NEXT: .long 32767 @ 0x7fff
174-
; CHECK-T1-NEXT: .LCPI2_1:
175-
; CHECK-T1-NEXT: .long 4294934528 @ 0xffff8000
154+
; CHECK-T16-LABEL: func16:
155+
; CHECK-T16: @ %bb.0:
156+
; CHECK-T16-NEXT: adds r0, r0, r1
157+
; CHECK-T16-NEXT: ldr r1, .LCPI2_0
158+
; CHECK-T16-NEXT: cmp r0, r1
159+
; CHECK-T16-NEXT: blt .LBB2_2
160+
; CHECK-T16-NEXT: @ %bb.1:
161+
; CHECK-T16-NEXT: mov r0, r1
162+
; CHECK-T16-NEXT: .LBB2_2:
163+
; CHECK-T16-NEXT: ldr r1, .LCPI2_1
164+
; CHECK-T16-NEXT: cmp r0, r1
165+
; CHECK-T16-NEXT: bgt .LBB2_4
166+
; CHECK-T16-NEXT: @ %bb.3:
167+
; CHECK-T16-NEXT: mov r0, r1
168+
; CHECK-T16-NEXT: .LBB2_4:
169+
; CHECK-T16-NEXT: bx lr
170+
; CHECK-T16-NEXT: .p2align 2
171+
; CHECK-T16-NEXT: @ %bb.5:
172+
; CHECK-T16-NEXT: .LCPI2_0:
173+
; CHECK-T16-NEXT: .long 32767 @ 0x7fff
174+
; CHECK-T16-NEXT: .LCPI2_1:
175+
; CHECK-T16-NEXT: .long 4294934528 @ 0xffff8000
176176
;
177177
; CHECK-T2NODSP-LABEL: func16:
178178
; CHECK-T2NODSP: @ %bb.0:
@@ -210,6 +210,29 @@ define signext i16 @func16(i16 signext %x, i16 signext %y) nounwind {
210210
; CHECK-ARMBASEDSP-NEXT: asr r0, r0, #16
211211
; CHECK-ARMBASEDSP-NEXT: bx lr
212212
;
213+
; CHECK-T15TE-LABEL: func16:
214+
; CHECK-T15TE: @ %bb.0:
215+
; CHECK-T15TE-NEXT: adds r0, r0, r1
216+
; CHECK-T15TE-NEXT: ldr r1, .LCPI2_0
217+
; CHECK-T15TE-NEXT: cmp r0, r1
218+
; CHECK-T15TE-NEXT: blt .LBB2_2
219+
; CHECK-T15TE-NEXT: @ %bb.1:
220+
; CHECK-T15TE-NEXT: movs r0, r1
221+
; CHECK-T15TE-NEXT: .LBB2_2:
222+
; CHECK-T15TE-NEXT: ldr r1, .LCPI2_1
223+
; CHECK-T15TE-NEXT: cmp r0, r1
224+
; CHECK-T15TE-NEXT: bgt .LBB2_4
225+
; CHECK-T15TE-NEXT: @ %bb.3:
226+
; CHECK-T15TE-NEXT: movs r0, r1
227+
; CHECK-T15TE-NEXT: .LBB2_4:
228+
; CHECK-T15TE-NEXT: bx lr
229+
; CHECK-T15TE-NEXT: .p2align 2
230+
; CHECK-T15TE-NEXT: @ %bb.5:
231+
; CHECK-T15TE-NEXT: .LCPI2_0:
232+
; CHECK-T15TE-NEXT: .long 32767 @ 0x7fff
233+
; CHECK-T15TE-NEXT: .LCPI2_1:
234+
; CHECK-T15TE-NEXT: .long 4294934528 @ 0xffff8000
235+
;
213236
; CHECK-ARMDSP-LABEL: func16:
214237
; CHECK-ARMDSP: @ %bb.0:
215238
; CHECK-ARMDSP-NEXT: qadd16 r0, r0, r1
@@ -220,22 +243,22 @@ define signext i16 @func16(i16 signext %x, i16 signext %y) nounwind {
220243
}
221244

222245
define signext i8 @func8(i8 signext %x, i8 signext %y) nounwind {
223-
; CHECK-T1-LABEL: func8:
224-
; CHECK-T1: @ %bb.0:
225-
; CHECK-T1-NEXT: adds r0, r0, r1
226-
; CHECK-T1-NEXT: movs r1, #127
227-
; CHECK-T1-NEXT: cmp r0, #127
228-
; CHECK-T1-NEXT: blt .LBB3_2
229-
; CHECK-T1-NEXT: @ %bb.1:
230-
; CHECK-T1-NEXT: {{movs|mov}} r0, r1
231-
; CHECK-T1-NEXT: .LBB3_2:
232-
; CHECK-T1-NEXT: mvns r1, r1
233-
; CHECK-T1-NEXT: cmp r0, r1
234-
; CHECK-T1-NEXT: bgt .LBB3_4
235-
; CHECK-T1-NEXT: @ %bb.3:
236-
; CHECK-T1-NEXT: {{movs|mov}} r0, r1
237-
; CHECK-T1-NEXT: .LBB3_4:
238-
; CHECK-T1-NEXT: bx lr
246+
; CHECK-T16-LABEL: func8:
247+
; CHECK-T16: @ %bb.0:
248+
; CHECK-T16-NEXT: adds r0, r0, r1
249+
; CHECK-T16-NEXT: movs r1, #127
250+
; CHECK-T16-NEXT: cmp r0, #127
251+
; CHECK-T16-NEXT: blt .LBB3_2
252+
; CHECK-T16-NEXT: @ %bb.1:
253+
; CHECK-T16-NEXT: mov r0, r1
254+
; CHECK-T16-NEXT: .LBB3_2:
255+
; CHECK-T16-NEXT: mvns r1, r1
256+
; CHECK-T16-NEXT: cmp r0, r1
257+
; CHECK-T16-NEXT: bgt .LBB3_4
258+
; CHECK-T16-NEXT: @ %bb.3:
259+
; CHECK-T16-NEXT: mov r0, r1
260+
; CHECK-T16-NEXT: .LBB3_4:
261+
; CHECK-T16-NEXT: bx lr
239262
;
240263
; CHECK-T2NODSP-LABEL: func8:
241264
; CHECK-T2NODSP: @ %bb.0:
@@ -266,6 +289,23 @@ define signext i8 @func8(i8 signext %x, i8 signext %y) nounwind {
266289
; CHECK-ARMBASEDSP-NEXT: asr r0, r0, #24
267290
; CHECK-ARMBASEDSP-NEXT: bx lr
268291
;
292+
; CHECK-T15TE-LABEL: func8:
293+
; CHECK-T15TE: @ %bb.0:
294+
; CHECK-T15TE-NEXT: adds r0, r0, r1
295+
; CHECK-T15TE-NEXT: movs r1, #127
296+
; CHECK-T15TE-NEXT: cmp r0, #127
297+
; CHECK-T15TE-NEXT: blt .LBB3_2
298+
; CHECK-T15TE-NEXT: @ %bb.1:
299+
; CHECK-T15TE-NEXT: movs r0, r1
300+
; CHECK-T15TE-NEXT: .LBB3_2:
301+
; CHECK-T15TE-NEXT: mvns r1, r1
302+
; CHECK-T15TE-NEXT: cmp r0, r1
303+
; CHECK-T15TE-NEXT: bgt .LBB3_4
304+
; CHECK-T15TE-NEXT: @ %bb.3:
305+
; CHECK-T15TE-NEXT: movs r0, r1
306+
; CHECK-T15TE-NEXT: .LBB3_4:
307+
; CHECK-T15TE-NEXT: bx lr
308+
;
269309
; CHECK-ARMDSP-LABEL: func8:
270310
; CHECK-ARMDSP: @ %bb.0:
271311
; CHECK-ARMDSP-NEXT: qadd8 r0, r0, r1
@@ -276,22 +316,22 @@ define signext i8 @func8(i8 signext %x, i8 signext %y) nounwind {
276316
}
277317

278318
define signext i4 @func3(i4 signext %x, i4 signext %y) nounwind {
279-
; CHECK-T1-LABEL: func3:
280-
; CHECK-T1: @ %bb.0:
281-
; CHECK-T1-NEXT: adds r0, r0, r1
282-
; CHECK-T1-NEXT: movs r1, #7
283-
; CHECK-T1-NEXT: cmp r0, #7
284-
; CHECK-T1-NEXT: blt .LBB4_2
285-
; CHECK-T1-NEXT: @ %bb.1:
286-
; CHECK-T1-NEXT: {{movs|mov}} r0, r1
287-
; CHECK-T1-NEXT: .LBB4_2:
288-
; CHECK-T1-NEXT: mvns r1, r1
289-
; CHECK-T1-NEXT: cmp r0, r1
290-
; CHECK-T1-NEXT: bgt .LBB4_4
291-
; CHECK-T1-NEXT: @ %bb.3:
292-
; CHECK-T1-NEXT: {{movs|mov}} r0, r1
293-
; CHECK-T1-NEXT: .LBB4_4:
294-
; CHECK-T1-NEXT: bx lr
319+
; CHECK-T16-LABEL: func3:
320+
; CHECK-T16: @ %bb.0:
321+
; CHECK-T16-NEXT: adds r0, r0, r1
322+
; CHECK-T16-NEXT: movs r1, #7
323+
; CHECK-T16-NEXT: cmp r0, #7
324+
; CHECK-T16-NEXT: blt .LBB4_2
325+
; CHECK-T16-NEXT: @ %bb.1:
326+
; CHECK-T16-NEXT: mov r0, r1
327+
; CHECK-T16-NEXT: .LBB4_2:
328+
; CHECK-T16-NEXT: mvns r1, r1
329+
; CHECK-T16-NEXT: cmp r0, r1
330+
; CHECK-T16-NEXT: bgt .LBB4_4
331+
; CHECK-T16-NEXT: @ %bb.3:
332+
; CHECK-T16-NEXT: mov r0, r1
333+
; CHECK-T16-NEXT: .LBB4_4:
334+
; CHECK-T16-NEXT: bx lr
295335
;
296336
; CHECK-T2NODSP-LABEL: func3:
297337
; CHECK-T2NODSP: @ %bb.0:
@@ -324,6 +364,23 @@ define signext i4 @func3(i4 signext %x, i4 signext %y) nounwind {
324364
; CHECK-ARMBASEDSP-NEXT: asr r0, r0, #28
325365
; CHECK-ARMBASEDSP-NEXT: bx lr
326366
;
367+
; CHECK-T15TE-LABEL: func3:
368+
; CHECK-T15TE: @ %bb.0:
369+
; CHECK-T15TE-NEXT: adds r0, r0, r1
370+
; CHECK-T15TE-NEXT: movs r1, #7
371+
; CHECK-T15TE-NEXT: cmp r0, #7
372+
; CHECK-T15TE-NEXT: blt .LBB4_2
373+
; CHECK-T15TE-NEXT: @ %bb.1:
374+
; CHECK-T15TE-NEXT: movs r0, r1
375+
; CHECK-T15TE-NEXT: .LBB4_2:
376+
; CHECK-T15TE-NEXT: mvns r1, r1
377+
; CHECK-T15TE-NEXT: cmp r0, r1
378+
; CHECK-T15TE-NEXT: bgt .LBB4_4
379+
; CHECK-T15TE-NEXT: @ %bb.3:
380+
; CHECK-T15TE-NEXT: movs r0, r1
381+
; CHECK-T15TE-NEXT: .LBB4_4:
382+
; CHECK-T15TE-NEXT: bx lr
383+
;
327384
; CHECK-ARMDSP-LABEL: func3:
328385
; CHECK-ARMDSP: @ %bb.0:
329386
; CHECK-ARMDSP-NEXT: lsl r0, r0, #28

llvm/test/CodeGen/ARM/select_const.ll

+8-8
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,8 @@ define i64 @opaque_constant1(i1 %cond, i64 %x) {
665665
; THUMB-NEXT: movs r7, #1
666666
; THUMB-NEXT: ands r0, r7
667667
; THUMB-NEXT: subs r1, r0, #1
668-
; THUMB-NEXT: push {r0}
669-
; THUMB-NEXT: pop {r4}
668+
; THUMB-NEXT: mov r10, r0
669+
; THUMB-NEXT: mov r4, r10
670670
; THUMB-NEXT: sbcs r4, r1
671671
; THUMB-NEXT: cmp r0, #0
672672
; THUMB-NEXT: bne .LBB24_2
@@ -681,8 +681,8 @@ define i64 @opaque_constant1(i1 %cond, i64 %x) {
681681
; THUMB-NEXT: ands r5, r0
682682
; THUMB-NEXT: movs r6, #0
683683
; THUMB-NEXT: subs r0, r5, #1
684-
; THUMB-NEXT: push {r4}
685-
; THUMB-NEXT: pop {r1}
684+
; THUMB-NEXT: mov r10, r4
685+
; THUMB-NEXT: mov r1, r10
686686
; THUMB-NEXT: sbcs r1, r6
687687
; THUMB-NEXT: eors r3, r7
688688
; THUMB-NEXT: ldr r6, .LCPI24_0
@@ -786,11 +786,11 @@ define i64 @func(i64 %arg) {
786786
; THUMB-NEXT: push {r4, lr}
787787
; THUMB-NEXT: movs r2, #0
788788
; THUMB-NEXT: adds r3, r0, #1
789-
; THUMB-NEXT: push {r1}
790-
; THUMB-NEXT: pop {r3}
789+
; THUMB-NEXT: mov r10, r1
790+
; THUMB-NEXT: mov r3, r10
791791
; THUMB-NEXT: adcs r3, r2
792-
; THUMB-NEXT: push {r2}
793-
; THUMB-NEXT: pop {r3}
792+
; THUMB-NEXT: mov r10, r2
793+
; THUMB-NEXT: mov r3, r10
794794
; THUMB-NEXT: adcs r3, r2
795795
; THUMB-NEXT: subs r4, r3, #1
796796
; THUMB-NEXT: adds r0, r0, #1

llvm/test/CodeGen/ARM/wide-compares.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,12 @@ define {i32, i32} @test_slt_not(i32 %c, i32 %d, i64 %a, i64 %b) {
257257
; CHECK-THUMB1-NOMOV-NEXT: ldr r5, [sp, #16]
258258
; CHECK-THUMB1-NOMOV-NEXT: subs r2, r2, r5
259259
; CHECK-THUMB1-NOMOV-NEXT: sbcs r3, r0
260-
; CHECK-THUMB1-NOMOV-NEXT: push {r1}
261-
; CHECK-THUMB1-NOMOV-NEXT: pop {r0}
260+
; CHECK-THUMB1-NOMOV-NEXT: mov r10, r1
261+
; CHECK-THUMB1-NOMOV-NEXT: mov r0, r10
262262
; CHECK-THUMB1-NOMOV-NEXT: blt .LBB3_2
263263
; CHECK-THUMB1-NOMOV-NEXT: @ %bb.1: @ %entry
264-
; CHECK-THUMB1-NOMOV-NEXT: push {r4}
265-
; CHECK-THUMB1-NOMOV-NEXT: pop {r0}
264+
; CHECK-THUMB1-NOMOV-NEXT: mov r10, r4
265+
; CHECK-THUMB1-NOMOV-NEXT: mov r0, r10
266266
; CHECK-THUMB1-NOMOV-NEXT: .LBB3_2: @ %entry
267267
; CHECK-THUMB1-NOMOV-NEXT: bge .LBB3_4
268268
; CHECK-THUMB1-NOMOV-NEXT: @ %bb.3: @ %entry

llvm/test/CodeGen/Thumb/pr35836.ll

+47
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,57 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
12
; RUN: llc < %s | FileCheck %s
23

34
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
45
target triple = "thumbv5e-none-linux-gnueabi"
56

67
; Function Attrs: norecurse nounwind optsize
78
define void @f(i32,i32,i32,i32,ptr %x4p, ptr %x5p, ptr %x6p) {
9+
; CHECK-LABEL: f:
10+
; CHECK: @ %bb.0: @ %if.end
11+
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
12+
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
13+
; CHECK-NEXT: .pad #24
14+
; CHECK-NEXT: sub sp, #24
15+
; CHECK-NEXT: add r4, sp, #8
16+
; CHECK-NEXT: stm r4!, {r0, r1, r2, r3} @ 16-byte Folded Spill
17+
; CHECK-NEXT: movs r5, #0
18+
; CHECK-NEXT: ldr r0, [sp, #52]
19+
; CHECK-NEXT: str r0, [sp, #4] @ 4-byte Spill
20+
; CHECK-NEXT: ldr r0, [sp, #48]
21+
; CHECK-NEXT: str r0, [sp] @ 4-byte Spill
22+
; CHECK-NEXT: ldr r7, [sp, #44]
23+
; CHECK-NEXT: .LBB0_1: @ %while.body
24+
; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
25+
; CHECK-NEXT: ldr r0, [sp, #20] @ 4-byte Reload
26+
; CHECK-NEXT: ldr r1, [sp, #16] @ 4-byte Reload
27+
; CHECK-NEXT: adds r3, r0, r1
28+
; CHECK-NEXT: mov r10, r5
29+
; CHECK-NEXT: mov r1, r10
30+
; CHECK-NEXT: adcs r1, r5
31+
; CHECK-NEXT: ldr r0, [sp, #12] @ 4-byte Reload
32+
; CHECK-NEXT: ldr r2, [sp, #8] @ 4-byte Reload
33+
; CHECK-NEXT: adds r2, r0, r2
34+
; CHECK-NEXT: mov r10, r5
35+
; CHECK-NEXT: mov r4, r10
36+
; CHECK-NEXT: adcs r4, r5
37+
; CHECK-NEXT: adds r0, r2, r5
38+
; CHECK-NEXT: mov r10, r3
39+
; CHECK-NEXT: mov r0, r10
40+
; CHECK-NEXT: adcs r0, r4
41+
; CHECK-NEXT: ldr r6, [sp, #4] @ 4-byte Reload
42+
; CHECK-NEXT: str r0, [r6]
43+
; CHECK-NEXT: ldr r0, [r7]
44+
; CHECK-NEXT: ldr r6, [sp] @ 4-byte Reload
45+
; CHECK-NEXT: ldr r6, [r6]
46+
; CHECK-NEXT: adds r0, r6, r0
47+
; CHECK-NEXT: mov r10, r5
48+
; CHECK-NEXT: mov r6, r10
49+
; CHECK-NEXT: adcs r6, r5
50+
; CHECK-NEXT: adds r2, r2, r5
51+
; CHECK-NEXT: adcs r4, r3
52+
; CHECK-NEXT: adcs r0, r1
53+
; CHECK-NEXT: adcs r6, r5
54+
; CHECK-NEXT: b .LBB0_1
855
if.end:
956
br label %while.body
1057

llvm/test/CodeGen/Thumb/urem-seteq-illegal-types.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
122122
; CHECK-NEXT: movs r3, #1
123123
; CHECK-NEXT: movs r4, #0
124124
; CHECK-NEXT: cmp r0, #170
125-
; CHECK-NEXT: push {r3}
126-
; CHECK-NEXT: pop {r0}
125+
; CHECK-NEXT: mov r10, r3
126+
; CHECK-NEXT: mov r0, r10
127127
; CHECK-NEXT: bhi .LBB4_2
128128
; CHECK-NEXT: @ %bb.1:
129129
; CHECK-NEXT: movs r0, r4
@@ -134,8 +134,8 @@ define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
134134
; CHECK-NEXT: movs r1, #73
135135
; CHECK-NEXT: lsls r1, r1, #23
136136
; CHECK-NEXT: cmp r5, r1
137-
; CHECK-NEXT: push {r3}
138-
; CHECK-NEXT: pop {r1}
137+
; CHECK-NEXT: mov r10, r3
138+
; CHECK-NEXT: mov r1, r10
139139
; CHECK-NEXT: bhi .LBB4_4
140140
; CHECK-NEXT: @ %bb.3:
141141
; CHECK-NEXT: movs r1, r4

0 commit comments

Comments
 (0)