Skip to content

Commit 18f24fe

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, or r12.
1 parent 4214f25 commit 18f24fe

File tree

6 files changed

+188
-91
lines changed

6 files changed

+188
-91
lines changed

llvm/lib/Target/ARM/Thumb1InstrInfo.cpp

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "Thumb1InstrInfo.h"
1414
#include "ARMSubtarget.h"
15+
#include "llvm/CodeGen/LivePhysRegs.h"
1516
#include "llvm/CodeGen/MachineFrameInfo.h"
1617
#include "llvm/CodeGen/MachineInstrBuilder.h"
1718
#include "llvm/CodeGen/MachineMemOperand.h"
@@ -53,27 +54,66 @@ void Thumb1InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
5354
.addReg(SrcReg, getKillRegState(KillSrc))
5455
.add(predOps(ARMCC::AL));
5556
else {
56-
// FIXME: Can also use 'mov hi, $src; mov $dst, hi',
57-
// with hi as either r10 or r11.
58-
5957
const TargetRegisterInfo *RegInfo = st.getRegisterInfo();
60-
if (MBB.computeRegisterLiveness(RegInfo, ARM::CPSR, I)
61-
== MachineBasicBlock::LQR_Dead) {
58+
if (MBB.computeRegisterLiveness(RegInfo, ARM::CPSR, I, 20) ==
59+
MachineBasicBlock::LQR_Dead) {
6260
BuildMI(MBB, I, DL, get(ARM::tMOVSr), DestReg)
6361
.addReg(SrcReg, getKillRegState(KillSrc))
6462
->addRegisterDead(ARM::CPSR, RegInfo);
6563
return;
6664
}
6765

68-
// 'MOV lo, lo' is unpredictable on < v6, so use the stack to do it
69-
BuildMI(MBB, I, DL, get(ARM::tPUSH))
70-
.add(predOps(ARMCC::AL))
71-
.addReg(SrcReg, getKillRegState(KillSrc));
72-
BuildMI(MBB, I, DL, get(ARM::tPOP))
73-
.add(predOps(ARMCC::AL))
74-
.addReg(DestReg, getDefRegState(true));
66+
LivePhysRegs UsedRegs(*RegInfo);
67+
UsedRegs.addLiveOuts(MBB);
68+
69+
const MCPhysReg *CSRegs = RegInfo->getCalleeSavedRegs(&MF);
70+
for (unsigned i = 0; CSRegs[i]; ++i)
71+
UsedRegs.addReg(CSRegs[i]);
72+
73+
auto InstUpToMBBI = MBB.end();
74+
while (InstUpToMBBI != I)
75+
// The pre-decrement is on purpose here.
76+
// We want to have the liveness right before MBBI.
77+
UsedRegs.stepBackward(*--InstUpToMBBI);
78+
79+
// Look for a temporary register to use.
80+
81+
BitVector GPRsNoLRSP = RegInfo->getAllocatableSet(
82+
MF, RegInfo->getRegClass(ARM::hGPRRegClassID));
83+
84+
MachineRegisterInfo &MRI = MF.getRegInfo();
85+
Register Reg = 0;
86+
for (auto RegT : GPRsNoLRSP.set_bits()) {
87+
if (UsedRegs.available(MRI, RegT)) {
88+
// Remember the first pop-friendly register and exit.
89+
Reg = RegT;
90+
// Otherwise, remember that the register will be available to
91+
// save a pop-friendly register.
92+
break;
93+
}
94+
95+
// Can also use 'mov hi, $src; mov $dst, hi',
96+
// with hi as either r10 or r11, or r12 (Scratch Register)
97+
if (Reg) {
98+
// Use high register to move source to destination
99+
BuildMI(MBB, I, DL, get(ARM::tMOVr), Reg)
100+
.addReg(SrcReg, getKillRegState(KillSrc))
101+
.add(predOps(ARMCC::AL));
102+
BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
103+
.addReg(Reg, RegState::Kill)
104+
.add(predOps(ARMCC::AL));
105+
return;
106+
}
107+
108+
// 'MOV lo, lo' is unpredictable on < v6, so use the stack to do it
109+
BuildMI(MBB, I, DL, get(ARM::tPUSH))
110+
.add(predOps(ARMCC::AL))
111+
.addReg(SrcReg, getKillRegState(KillSrc));
112+
BuildMI(MBB, I, DL, get(ARM::tPOP))
113+
.add(predOps(ARMCC::AL))
114+
.addReg(DestReg, getDefRegState(true));
115+
}
75116
}
76-
}
77117

78118
void Thumb1InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
79119
MachineBasicBlock::iterator I,

llvm/test/CodeGen/ARM/sadd_sat.ll

Lines changed: 113 additions & 56 deletions
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 r12, r1
134+
; CHECK-T15TE-NEXT: mov r0, r12
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

Lines changed: 8 additions & 8 deletions
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 r12, r0
669+
; THUMB-NEXT: mov r4, r12
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 r12, r4
685+
; THUMB-NEXT: mov r1, r12
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 r12, r1
790+
; THUMB-NEXT: mov r3, r12
791791
; THUMB-NEXT: adcs r3, r2
792-
; THUMB-NEXT: push {r2}
793-
; THUMB-NEXT: pop {r3}
792+
; THUMB-NEXT: mov r12, r2
793+
; THUMB-NEXT: mov r3, r12
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

Lines changed: 4 additions & 4 deletions
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 r12, r1
261+
; CHECK-THUMB1-NOMOV-NEXT: mov r0, r12
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 r12, r4
265+
; CHECK-THUMB1-NOMOV-NEXT: mov r0, r12
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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,18 @@ while.body:
3535
br label %while.body
3636
}
3737
; CHECK: adds r3, r0, r1
38-
; CHECK: push {r5}
39-
; CHECK: pop {r1}
38+
; CHECK: mov r12, r5
39+
; CHECK: mov r1, r12
4040
; CHECK: adcs r1, r5
4141
; CHECK: ldr r0, [sp, #12] @ 4-byte Reload
4242
; CHECK: ldr r2, [sp, #8] @ 4-byte Reload
4343
; CHECK: adds r2, r0, r2
44-
; CHECK: push {r5}
45-
; CHECK: pop {r4}
44+
; CHECK: mov r12, r5
45+
; CHECK: mov r4, r12
4646
; CHECK: adcs r4, r5
4747
; CHECK: adds r0, r2, r5
48-
; CHECK: push {r3}
49-
; CHECK: pop {r0}
48+
; CHECK: mov r12, r3
49+
; CHECK: mov r0, r12
5050
; CHECK: adcs r0, r4
5151
; CHECK: ldr r6, [sp, #4] @ 4-byte Reload
5252
; CHECK: str r0, [r6]

0 commit comments

Comments
 (0)