Skip to content

Commit 14476b8

Browse files
committed
[ARM] setCallFrameSize in ABS lowering.
ABS needs apparently to generate multiple BBs in EmitInstrWithCustomInserter. The CallFrameSize needs to be copied to prevent the verifier from complaining.
1 parent ec9eefc commit 14476b8

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12383,6 +12383,11 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
1238312383
// fall through to SinkMBB
1238412384
RSBBB->addSuccessor(SinkBB);
1238512385

12386+
// Set the call frame size on entry to the new basic blocks.
12387+
unsigned CallFrameSize = TII->getCallFrameSizeAt(MI);
12388+
RSBBB->setCallFrameSize(CallFrameSize);
12389+
SinkBB->setCallFrameSize(CallFrameSize);
12390+
1238612391
// insert a cmp at the end of BB
1238712392
BuildMI(BB, dl, TII->get(isThumb2 ? ARM::t2CMPri : ARM::CMPri))
1238812393
.addReg(ABSSrcReg)

llvm/test/CodeGen/Thumb2/abs.ll

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,53 @@ define i128 @abs128(i128 %x) {
205205
ret i128 %abs
206206
}
207207

208+
define dso_local void @pr147162(ptr %p, ptr %q) #0 {
209+
; CHECKT1-LABEL: pr147162:
210+
; CHECKT1: @ %bb.0: @ %entry
211+
; CHECKT1-NEXT: .save {r7, lr}
212+
; CHECKT1-NEXT: push {r7, lr}
213+
; CHECKT1-NEXT: .pad #8
214+
; CHECKT1-NEXT: sub sp, #8
215+
; CHECKT1-NEXT: mov r3, r0
216+
; CHECKT1-NEXT: ldrb r0, [r0]
217+
; CHECKT1-NEXT: ldrb r1, [r1]
218+
; CHECKT1-NEXT: movs r2, #1
219+
; CHECKT1-NEXT: str r2, [sp]
220+
; CHECKT1-NEXT: subs r0, r0, r1
221+
; CHECKT1-NEXT: asrs r1, r0, #31
222+
; CHECKT1-NEXT: eors r0, r1
223+
; CHECKT1-NEXT: subs r0, r0, r1
224+
; CHECKT1-NEXT: movs r1, #2
225+
; CHECKT1-NEXT: bl call
226+
; CHECKT1-NEXT: add sp, #8
227+
; CHECKT1-NEXT: pop {r7, pc}
228+
;
229+
; CHECKT2-LABEL: pr147162:
230+
; CHECKT2: @ %bb.0: @ %entry
231+
; CHECKT2-NEXT: .save {r7, lr}
232+
; CHECKT2-NEXT: push {r7, lr}
233+
; CHECKT2-NEXT: .pad #8
234+
; CHECKT2-NEXT: sub sp, #8
235+
; CHECKT2-NEXT: mov r3, r0
236+
; CHECKT2-NEXT: ldrb r0, [r0]
237+
; CHECKT2-NEXT: ldrb r1, [r1]
238+
; CHECKT2-NEXT: movs r2, #1
239+
; CHECKT2-NEXT: str r2, [sp]
240+
; CHECKT2-NEXT: subs r0, r0, r1
241+
; CHECKT2-NEXT: mov.w r1, #2
242+
; CHECKT2-NEXT: it mi
243+
; CHECKT2-NEXT: rsbmi r0, r0, #0
244+
; CHECKT2-NEXT: bl call
245+
; CHECKT2-NEXT: add sp, #8
246+
; CHECKT2-NEXT: pop {r7, pc}
247+
entry:
248+
%0 = load i8, ptr %p, align 1
249+
%conv = zext i8 %0 to i32
250+
%1 = load i8, ptr %q, align 1
251+
%conv1 = zext i8 %1 to i32
252+
%sub = sub nsw i32 %conv, %conv1
253+
%2 = tail call i32 @llvm.abs.i32(i32 %sub, i1 true)
254+
tail call void @call(i32 noundef %2, i32 noundef 2, i32 noundef 1, ptr noundef nonnull %p, i32 noundef 1)
255+
ret void
256+
}
257+
declare void @call(i32, i32, i32, ptr, i32)

0 commit comments

Comments
 (0)