Skip to content

Commit 40650f2

Browse files
committed
[ARM][atomicrmw] Fix CMP_SWAP_32 expand assert
This assert is intended to ensure that the high registers are not selected when it is passed to one of the thumb UXT instructions. However it was triggering even for 32 bit where no UXT instruction is emitted. Fixes PR51313. Differential Revision: https://reviews.llvm.org/D107363
1 parent f819e4c commit 40650f2

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1647,7 +1647,7 @@ bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &MBB,
16471647
"CMP_SWAP not expected to be custom expanded for Thumb1");
16481648
assert((UxtOp == 0 || UxtOp == ARM::tUXTB || UxtOp == ARM::tUXTH) &&
16491649
"ARMv8-M.baseline does not have t2UXTB/t2UXTH");
1650-
assert(ARM::tGPRRegClass.contains(DesiredReg) &&
1650+
assert((UxtOp == 0 || ARM::tGPRRegClass.contains(DesiredReg)) &&
16511651
"DesiredReg used for UXT op must be tGPR");
16521652
}
16531653

llvm/test/CodeGen/ARM/cmpxchg.mir

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -o - %s -mtriple=armv7-unknown-linux-gnu -verify-machineinstrs -run-pass=arm-pseudo | FileCheck %s
3+
# RUN: llc -o - %s -mtriple=thumbv7-unknown-linux-gnu -verify-machineinstrs -run-pass=arm-pseudo | FileCheck %s --check-prefix=THUMB
34
---
45
name: func
56
tracksRegLiveness: true
@@ -23,5 +24,62 @@ body: |
2324
; CHECK: CMPri killed $r2, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
2425
; CHECK: Bcc %bb.1, 1 /* CC::ne */, killed $cpsr
2526
; CHECK: .3:
27+
; THUMB-LABEL: name: func
28+
; THUMB: successors: %bb.1(0x80000000)
29+
; THUMB: liveins: $r0_r1, $r4_r5, $r3, $lr
30+
; THUMB: .1:
31+
; THUMB: successors: %bb.3(0x40000000), %bb.2(0x40000000)
32+
; THUMB: liveins: $r4, $r5, $r3
33+
; THUMB: $r0, $r1 = t2LDREXD $r3, 14 /* CC::al */, $noreg
34+
; THUMB: tCMPhir killed $r0, $r4, 14 /* CC::al */, $noreg, implicit-def $cpsr
35+
; THUMB: tCMPhir killed $r1, $r5, 0 /* CC::eq */, killed $cpsr, implicit-def $cpsr
36+
; THUMB: tBcc %bb.3, 1 /* CC::ne */, killed $cpsr
37+
; THUMB: .2:
38+
; THUMB: successors: %bb.1(0x40000000), %bb.3(0x40000000)
39+
; THUMB: liveins: $r4, $r5, $r3
40+
; THUMB: early-clobber $r2 = t2STREXD $r4, $r5, $r3, 14 /* CC::al */, $noreg
41+
; THUMB: t2CMPri killed $r2, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
42+
; THUMB: tBcc %bb.1, 1 /* CC::ne */, killed $cpsr
43+
; THUMB: .3:
2644
dead early-clobber renamable $r0_r1, dead early-clobber renamable $r2 = CMP_SWAP_64 killed renamable $r3, killed renamable $r4_r5, renamable $r4_r5 :: (volatile load store monotonic monotonic (s64))
2745
...
46+
---
47+
name: func2
48+
tracksRegLiveness: true
49+
body: |
50+
bb.0:
51+
liveins: $r1, $r2, $r3, $r12, $lr
52+
; CHECK-LABEL: name: func2
53+
; CHECK: successors: %bb.1(0x80000000)
54+
; CHECK: liveins: $r1, $r2, $r3, $r12, $lr
55+
; CHECK: .1:
56+
; CHECK: successors: %bb.3(0x40000000), %bb.2(0x40000000)
57+
; CHECK: liveins: $lr, $r3, $r12
58+
; CHECK: $r1 = LDREX $r3, 14 /* CC::al */, $noreg
59+
; CHECK: CMPrr killed $r1, $r12, 14 /* CC::al */, $noreg, implicit-def $cpsr
60+
; CHECK: Bcc %bb.3, 1 /* CC::ne */, killed $cpsr
61+
; CHECK: .2:
62+
; CHECK: successors: %bb.1(0x40000000), %bb.3(0x40000000)
63+
; CHECK: liveins: $lr, $r3, $r12
64+
; CHECK: early-clobber $r2 = STREX $lr, $r3, 14 /* CC::al */, $noreg
65+
; CHECK: CMPri killed $r2, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
66+
; CHECK: Bcc %bb.1, 1 /* CC::ne */, killed $cpsr
67+
; CHECK: .3:
68+
; THUMB-LABEL: name: func2
69+
; THUMB: successors: %bb.1(0x80000000)
70+
; THUMB: liveins: $r1, $r2, $r3, $r12, $lr
71+
; THUMB: .1:
72+
; THUMB: successors: %bb.3(0x40000000), %bb.2(0x40000000)
73+
; THUMB: liveins: $lr, $r3, $r12
74+
; THUMB: $r1 = t2LDREX $r3, 0, 14 /* CC::al */, $noreg
75+
; THUMB: tCMPhir killed $r1, $r12, 14 /* CC::al */, $noreg, implicit-def $cpsr
76+
; THUMB: tBcc %bb.3, 1 /* CC::ne */, killed $cpsr
77+
; THUMB: .2:
78+
; THUMB: successors: %bb.1(0x40000000), %bb.3(0x40000000)
79+
; THUMB: liveins: $lr, $r3, $r12
80+
; THUMB: early-clobber $r2 = t2STREX $lr, $r3, 0, 14 /* CC::al */, $noreg
81+
; THUMB: t2CMPri killed $r2, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
82+
; THUMB: tBcc %bb.1, 1 /* CC::ne */, killed $cpsr
83+
; THUMB: .3:
84+
dead early-clobber renamable $r1, dead early-clobber renamable $r2 = CMP_SWAP_32 killed renamable $r3, killed renamable $r12, killed renamable $lr
85+
...

0 commit comments

Comments
 (0)