xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/cmpxchg-idioms.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_return(i32* %p, i32 %oldval, i32 %newval) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_return:
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; CHECK: ldrex [[LOADED:r[0-9]+]], [r0]
7*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[LOADED]], r1
8*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[FAILED:LBB[0-9]+_[0-9]+]]
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ishst
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
13*9880d681SAndroid Build Coastguard Worker; CHECK: strex [[STATUS:r[0-9]+]], {{r[0-9]+}}, [r0]
14*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[STATUS]], [[SUCCESS:LBB[0-9]+_[0-9]+]]
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK: ldrex [[LOADED]], [r0]
17*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[LOADED]], r1
18*9880d681SAndroid Build Coastguard Worker; CHECK: beq [[LOOP]]
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; CHECK: [[FAILED]]:
21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
22*9880d681SAndroid Build Coastguard Worker; CHECK: clrex
23*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish
24*9880d681SAndroid Build Coastguard Worker; CHECK: movs r0, #0
25*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK: [[SUCCESS]]:
28*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
29*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish
30*9880d681SAndroid Build Coastguard Worker; CHECK: movs r0, #1
31*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i32* %p, i32 %oldval, i32 %newval seq_cst seq_cst
34*9880d681SAndroid Build Coastguard Worker  %success = extractvalue { i32, i1 } %pair, 1
35*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %success to i32
36*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i1 @test_return_bool(i8* %value, i8 %oldValue, i8 %newValue) {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_return_bool:
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK: uxtb [[OLDBYTE:r[0-9]+]], r1
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexb [[LOADED:r[0-9]+]], [r0]
45*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[LOADED]], [[OLDBYTE]]
46*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[FAIL:LBB[0-9]+_[0-9]+]]
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ishst
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
51*9880d681SAndroid Build Coastguard Worker; CHECK: strexb [[STATUS:r[0-9]+]], {{r[0-9]+}}, [r0]
52*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[STATUS]], [[SUCCESS:LBB[0-9]+_[0-9]+]]
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexb [[LOADED]], [r0]
55*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[LOADED]], [[OLDBYTE]]
56*9880d681SAndroid Build Coastguard Worker; CHECK: beq [[LOOP]]
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  ; FIXME: this eor is redundant. Need to teach DAG combine that.
60*9880d681SAndroid Build Coastguard Worker; CHECK: [[FAIL]]:
61*9880d681SAndroid Build Coastguard Worker; CHECK: clrex
62*9880d681SAndroid Build Coastguard Worker; CHECK: movs [[TMP:r[0-9]+]], #0
63*9880d681SAndroid Build Coastguard Worker; CHECK: eor r0, [[TMP]], #1
64*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK: [[SUCCESS]]:
67*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
68*9880d681SAndroid Build Coastguard Worker; CHECK: movs [[TMP:r[0-9]+]], #1
69*9880d681SAndroid Build Coastguard Worker; CHECK: eor r0, [[TMP]], #1
70*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i8* %value, i8 %oldValue, i8 %newValue acq_rel monotonic
74*9880d681SAndroid Build Coastguard Worker  %success = extractvalue { i8, i1 } %pair, 1
75*9880d681SAndroid Build Coastguard Worker  %failure = xor i1 %success, 1
76*9880d681SAndroid Build Coastguard Worker  ret i1 %failure
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine void @test_conditional(i32* %p, i32 %oldval, i32 %newval) {
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_conditional:
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK: ldrex [[LOADED:r[0-9]+]], [r0]
83*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[LOADED]], r1
84*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[FAILED:LBB[0-9]+_[0-9]+]]
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ishst
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
89*9880d681SAndroid Build Coastguard Worker; CHECK: strex [[STATUS:r[0-9]+]], r2, [r0]
90*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[STATUS]], [[SUCCESS:LBB[0-9]+_[0-9]+]]
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; CHECK: ldrex [[LOADED]], [r0]
93*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[LOADED]], r1
94*9880d681SAndroid Build Coastguard Worker; CHECK: beq [[LOOP]]
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK: [[FAILED]]:
97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
98*9880d681SAndroid Build Coastguard Worker; CHECK: clrex
99*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish
100*9880d681SAndroid Build Coastguard Worker; CHECK: b.w _baz
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; CHECK: [[SUCCESS]]:
103*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
104*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish
105*9880d681SAndroid Build Coastguard Worker; CHECK: b.w _bar
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i32* %p, i32 %oldval, i32 %newval seq_cst seq_cst
108*9880d681SAndroid Build Coastguard Worker  %success = extractvalue { i32, i1 } %pair, 1
109*9880d681SAndroid Build Coastguard Worker  br i1 %success, label %true, label %false
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workertrue:
112*9880d681SAndroid Build Coastguard Worker  tail call void @bar() #2
113*9880d681SAndroid Build Coastguard Worker  br label %end
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerfalse:
116*9880d681SAndroid Build Coastguard Worker  tail call void @baz() #2
117*9880d681SAndroid Build Coastguard Worker  br label %end
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerend:
120*9880d681SAndroid Build Coastguard Worker  ret void
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdeclare void @bar()
124*9880d681SAndroid Build Coastguard Workerdeclare void @baz()
125