Skip to content

Commit 1bae5be

Browse files
committed
[ARM] Add signext/zeroext to libcalls in AtomicExpand
The AArch32 PCS requires the caller to sign- or zero-extend small integer types to 32-bit before passing them to a function. For most calls this is handled by clang by setting the zeroext or signext parameter attributes, but we were adding calls to library functions in AtomicExpandPass without doing this. Fixes #61880
1 parent afbfb86 commit 1bae5be

File tree

3 files changed

+47
-20
lines changed

3 files changed

+47
-20
lines changed

llvm/lib/CodeGen/AtomicExpandPass.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,6 +1999,19 @@ bool AtomicExpandImpl::expandAtomicOpToLibcall(
19991999
Value *IntValue =
20002000
Builder.CreateBitOrPointerCast(ValueOperand, SizedIntTy);
20012001
Args.push_back(IntValue);
2002+
2003+
// Set the zeroext/signext attributes on the parameter if needed to match
2004+
// the target's ABI.
2005+
if (TLI->shouldExtendTypeInLibCall(
2006+
TLI->getMemValueType(DL, SizedIntTy))) {
2007+
// The only atomic operations affected by signedness are min/max, and
2008+
// we don't have __atomic_ libcalls for them, so IsSigned is always
2009+
// false.
2010+
if (TLI->shouldSignExtendTypeInLibCall(SizedIntTy, false /*IsSigned*/))
2011+
Attr = Attr.addParamAttribute(Ctx, Args.size() - 1, Attribute::SExt);
2012+
else
2013+
Attr = Attr.addParamAttribute(Ctx, Args.size() - 1, Attribute::ZExt);
2014+
}
20022015
} else {
20032016
AllocaValue = AllocaBuilder.CreateAlloca(ValueOperand->getType());
20042017
AllocaValue->setAlignment(AllocaAlignment);

llvm/test/CodeGen/ARM/atomic-load-store.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ define void @test3(ptr %ptr1, ptr %ptr2) {
143143
; ARMV4-NEXT: mov r4, r1
144144
; ARMV4-NEXT: mov r1, #0
145145
; ARMV4-NEXT: bl __atomic_load_1
146-
; ARMV4-NEXT: mov r1, r0
146+
; ARMV4-NEXT: and r1, r0, #255
147147
; ARMV4-NEXT: mov r0, r4
148148
; ARMV4-NEXT: mov r2, #0
149149
; ARMV4-NEXT: bl __atomic_store_1
@@ -214,7 +214,7 @@ define void @test4(ptr %ptr1, ptr %ptr2) {
214214
; ARMV4-NEXT: mov r4, r1
215215
; ARMV4-NEXT: mov r1, #5
216216
; ARMV4-NEXT: bl __atomic_load_1
217-
; ARMV4-NEXT: mov r1, r0
217+
; ARMV4-NEXT: and r1, r0, #255
218218
; ARMV4-NEXT: mov r0, r4
219219
; ARMV4-NEXT: mov r2, #5
220220
; ARMV4-NEXT: bl __atomic_store_1
@@ -698,6 +698,9 @@ define void @store_atomic_f16__seq_cst(ptr %ptr, half %val1) {
698698
; ARMV4-LABEL: store_atomic_f16__seq_cst:
699699
; ARMV4: @ %bb.0:
700700
; ARMV4-NEXT: push {r11, lr}
701+
; ARMV4-NEXT: mov r2, #255
702+
; ARMV4-NEXT: orr r2, r2, #65280
703+
; ARMV4-NEXT: and r1, r1, r2
701704
; ARMV4-NEXT: mov r2, #5
702705
; ARMV4-NEXT: bl __atomic_store_2
703706
; ARMV4-NEXT: pop {r11, lr}
@@ -759,6 +762,9 @@ define void @store_atomic_bf16__seq_cst(ptr %ptr, bfloat %val1) {
759762
; ARMV4-LABEL: store_atomic_bf16__seq_cst:
760763
; ARMV4: @ %bb.0:
761764
; ARMV4-NEXT: push {r11, lr}
765+
; ARMV4-NEXT: mov r2, #255
766+
; ARMV4-NEXT: orr r2, r2, #65280
767+
; ARMV4-NEXT: and r1, r1, r2
762768
; ARMV4-NEXT: mov r2, #5
763769
; ARMV4-NEXT: bl __atomic_store_2
764770
; ARMV4-NEXT: pop {r11, lr}

llvm/test/CodeGen/ARM/thumbv6m-atomic32.ll

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ define void @trunc_store8(ptr %p, i32 %val) {
365365
; NO-ATOMIC32: @ %bb.0:
366366
; NO-ATOMIC32-NEXT: .save {r7, lr}
367367
; NO-ATOMIC32-NEXT: push {r7, lr}
368+
; NO-ATOMIC32-NEXT: uxtb r1, r1
368369
; NO-ATOMIC32-NEXT: movs r2, #5
369370
; NO-ATOMIC32-NEXT: bl __atomic_store_1
370371
; NO-ATOMIC32-NEXT: pop {r7, pc}
@@ -385,6 +386,7 @@ define i8 @trunc_rmw8(ptr %p, i32 %val) {
385386
; NO-ATOMIC32: @ %bb.0:
386387
; NO-ATOMIC32-NEXT: .save {r7, lr}
387388
; NO-ATOMIC32-NEXT: push {r7, lr}
389+
; NO-ATOMIC32-NEXT: uxtb r1, r1
388390
; NO-ATOMIC32-NEXT: movs r2, #5
389391
; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_1
390392
; NO-ATOMIC32-NEXT: pop {r7, pc}
@@ -411,31 +413,32 @@ define i8 @trunc_rmw8_signed(ptr %p, i32 %val) {
411413
; NO-ATOMIC32-NEXT: sub sp, #8
412414
; NO-ATOMIC32-NEXT: mov r4, r1
413415
; NO-ATOMIC32-NEXT: mov r5, r0
414-
; NO-ATOMIC32-NEXT: ldrb r2, [r0]
416+
; NO-ATOMIC32-NEXT: ldrb r0, [r0]
415417
; NO-ATOMIC32-NEXT: b .LBB18_2
416418
; NO-ATOMIC32-NEXT: .LBB18_1: @ %atomicrmw.start
417419
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB18_2 Depth=1
420+
; NO-ATOMIC32-NEXT: uxtb r2, r0
418421
; NO-ATOMIC32-NEXT: mov r0, r5
419422
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_1
420-
; NO-ATOMIC32-NEXT: ldr r2, [sp, #4]
421-
; NO-ATOMIC32-NEXT: cmp r0, #0
423+
; NO-ATOMIC32-NEXT: mov r1, r0
424+
; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
425+
; NO-ATOMIC32-NEXT: cmp r1, #0
422426
; NO-ATOMIC32-NEXT: bne .LBB18_4
423427
; NO-ATOMIC32-NEXT: .LBB18_2: @ %atomicrmw.start
424428
; NO-ATOMIC32-NEXT: @ =>This Inner Loop Header: Depth=1
425429
; NO-ATOMIC32-NEXT: add r1, sp, #4
426-
; NO-ATOMIC32-NEXT: strb r2, [r1]
430+
; NO-ATOMIC32-NEXT: strb r0, [r1]
427431
; NO-ATOMIC32-NEXT: movs r3, #5
428432
; NO-ATOMIC32-NEXT: str r3, [sp]
429-
; NO-ATOMIC32-NEXT: sxtb r0, r4
430-
; NO-ATOMIC32-NEXT: sxtb r6, r2
431-
; NO-ATOMIC32-NEXT: cmp r6, r0
433+
; NO-ATOMIC32-NEXT: sxtb r2, r4
434+
; NO-ATOMIC32-NEXT: sxtb r6, r0
435+
; NO-ATOMIC32-NEXT: cmp r6, r2
432436
; NO-ATOMIC32-NEXT: bgt .LBB18_1
433437
; NO-ATOMIC32-NEXT: @ %bb.3: @ %atomicrmw.start
434438
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB18_2 Depth=1
435-
; NO-ATOMIC32-NEXT: mov r2, r4
439+
; NO-ATOMIC32-NEXT: mov r0, r4
436440
; NO-ATOMIC32-NEXT: b .LBB18_1
437441
; NO-ATOMIC32-NEXT: .LBB18_4: @ %atomicrmw.end
438-
; NO-ATOMIC32-NEXT: mov r0, r2
439442
; NO-ATOMIC32-NEXT: add sp, #8
440443
; NO-ATOMIC32-NEXT: pop {r4, r5, r6, pc}
441444
;
@@ -463,6 +466,7 @@ define i8 @trunc_cmpxchg8(ptr %p, i32 %cmp, i32 %new) {
463466
; NO-ATOMIC32-NEXT: strb r1, [r4]
464467
; NO-ATOMIC32-NEXT: movs r3, #5
465468
; NO-ATOMIC32-NEXT: str r3, [sp]
469+
; NO-ATOMIC32-NEXT: uxtb r2, r2
466470
; NO-ATOMIC32-NEXT: mov r1, r4
467471
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_1
468472
; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
@@ -489,6 +493,7 @@ define void @trunc_store16(ptr %p, i32 %val) {
489493
; NO-ATOMIC32: @ %bb.0:
490494
; NO-ATOMIC32-NEXT: .save {r7, lr}
491495
; NO-ATOMIC32-NEXT: push {r7, lr}
496+
; NO-ATOMIC32-NEXT: uxth r1, r1
492497
; NO-ATOMIC32-NEXT: movs r2, #5
493498
; NO-ATOMIC32-NEXT: bl __atomic_store_2
494499
; NO-ATOMIC32-NEXT: pop {r7, pc}
@@ -509,6 +514,7 @@ define i16 @trunc_rmw16(ptr %p, i32 %val) {
509514
; NO-ATOMIC32: @ %bb.0:
510515
; NO-ATOMIC32-NEXT: .save {r7, lr}
511516
; NO-ATOMIC32-NEXT: push {r7, lr}
517+
; NO-ATOMIC32-NEXT: uxth r1, r1
512518
; NO-ATOMIC32-NEXT: movs r2, #5
513519
; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_2
514520
; NO-ATOMIC32-NEXT: pop {r7, pc}
@@ -535,31 +541,32 @@ define i16 @trunc_rmw16_signed(ptr %p, i32 %val) {
535541
; NO-ATOMIC32-NEXT: sub sp, #8
536542
; NO-ATOMIC32-NEXT: mov r4, r1
537543
; NO-ATOMIC32-NEXT: mov r5, r0
538-
; NO-ATOMIC32-NEXT: ldrh r2, [r0]
544+
; NO-ATOMIC32-NEXT: ldrh r0, [r0]
539545
; NO-ATOMIC32-NEXT: b .LBB22_2
540546
; NO-ATOMIC32-NEXT: .LBB22_1: @ %atomicrmw.start
541547
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB22_2 Depth=1
548+
; NO-ATOMIC32-NEXT: uxth r2, r0
542549
; NO-ATOMIC32-NEXT: mov r0, r5
543550
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2
544-
; NO-ATOMIC32-NEXT: ldr r2, [sp, #4]
545-
; NO-ATOMIC32-NEXT: cmp r0, #0
551+
; NO-ATOMIC32-NEXT: mov r1, r0
552+
; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
553+
; NO-ATOMIC32-NEXT: cmp r1, #0
546554
; NO-ATOMIC32-NEXT: bne .LBB22_4
547555
; NO-ATOMIC32-NEXT: .LBB22_2: @ %atomicrmw.start
548556
; NO-ATOMIC32-NEXT: @ =>This Inner Loop Header: Depth=1
549557
; NO-ATOMIC32-NEXT: add r1, sp, #4
550-
; NO-ATOMIC32-NEXT: strh r2, [r1]
558+
; NO-ATOMIC32-NEXT: strh r0, [r1]
551559
; NO-ATOMIC32-NEXT: movs r3, #5
552560
; NO-ATOMIC32-NEXT: str r3, [sp]
553-
; NO-ATOMIC32-NEXT: sxth r0, r4
554-
; NO-ATOMIC32-NEXT: sxth r6, r2
555-
; NO-ATOMIC32-NEXT: cmp r6, r0
561+
; NO-ATOMIC32-NEXT: sxth r2, r4
562+
; NO-ATOMIC32-NEXT: sxth r6, r0
563+
; NO-ATOMIC32-NEXT: cmp r6, r2
556564
; NO-ATOMIC32-NEXT: bgt .LBB22_1
557565
; NO-ATOMIC32-NEXT: @ %bb.3: @ %atomicrmw.start
558566
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB22_2 Depth=1
559-
; NO-ATOMIC32-NEXT: mov r2, r4
567+
; NO-ATOMIC32-NEXT: mov r0, r4
560568
; NO-ATOMIC32-NEXT: b .LBB22_1
561569
; NO-ATOMIC32-NEXT: .LBB22_4: @ %atomicrmw.end
562-
; NO-ATOMIC32-NEXT: mov r0, r2
563570
; NO-ATOMIC32-NEXT: add sp, #8
564571
; NO-ATOMIC32-NEXT: pop {r4, r5, r6, pc}
565572
;
@@ -587,6 +594,7 @@ define i16 @trunc_cmpxchg16(ptr %p, i32 %cmp, i32 %new) {
587594
; NO-ATOMIC32-NEXT: strh r1, [r4]
588595
; NO-ATOMIC32-NEXT: movs r3, #5
589596
; NO-ATOMIC32-NEXT: str r3, [sp]
597+
; NO-ATOMIC32-NEXT: uxth r2, r2
590598
; NO-ATOMIC32-NEXT: mov r1, r4
591599
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2
592600
; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]

0 commit comments

Comments
 (0)