blob: 283202f0cc1f693301df43cc2964b213a95a27e0 [file] [log] [blame]
Tim Northoverb4ddc082014-05-30 10:09:59 +00001; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s | FileCheck %s
2
3define i32 @test_return(i32* %p, i32 %oldval, i32 %newval) {
4; CHECK-LABEL: test_return:
5
Tim Northoverb4ddc082014-05-30 10:09:59 +00006; CHECK: ldrex [[LOADED:r[0-9]+]], [r0]
7; CHECK: cmp [[LOADED]], r1
8; CHECK: bne [[FAILED:LBB[0-9]+_[0-9]+]]
9
Tim Northoverd32f8e62016-02-22 20:55:50 +000010; CHECK: dmb ishst
Tim Northoverb4ddc082014-05-30 10:09:59 +000011
Tim Northoverd32f8e62016-02-22 20:55:50 +000012; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
13; CHECK: strex [[STATUS:r[0-9]+]], {{r[0-9]+}}, [r0]
14; CHECK: cbz [[STATUS]], [[SUCCESS:LBB[0-9]+_[0-9]+]]
15
16; CHECK: ldrex [[LOADED]], [r0]
17; CHECK: cmp [[LOADED]], r1
18; CHECK: beq [[LOOP]]
Tim Northoverb4ddc082014-05-30 10:09:59 +000019
20; CHECK: [[FAILED]]:
21; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
Tim Northoverd32f8e62016-02-22 20:55:50 +000022; CHECK: clrex
Adam Nemet5a6d5bc2015-07-17 18:14:19 +000023; CHECK: dmb ish
Matthias Braun9e859802015-07-17 23:18:30 +000024; CHECK: movs r0, #0
Tim Northoverb4ddc082014-05-30 10:09:59 +000025; CHECK: bx lr
26
Tim Northoverd32f8e62016-02-22 20:55:50 +000027; CHECK: [[SUCCESS]]:
28; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
29; CHECK: dmb ish
30; CHECK: movs r0, #1
31; CHECK: bx lr
32
Tim Northover420a2162014-06-13 14:24:07 +000033 %pair = cmpxchg i32* %p, i32 %oldval, i32 %newval seq_cst seq_cst
34 %success = extractvalue { i32, i1 } %pair, 1
Tim Northoverb4ddc082014-05-30 10:09:59 +000035 %conv = zext i1 %success to i32
36 ret i32 %conv
37}
38
39define i1 @test_return_bool(i8* %value, i8 %oldValue, i8 %newValue) {
40; CHECK-LABEL: test_return_bool:
41
Matthias Braun9e859802015-07-17 23:18:30 +000042; CHECK: uxtb [[OLDBYTE:r[0-9]+]], r1
Tim Northoverb4ddc082014-05-30 10:09:59 +000043
Tim Northoverb4ddc082014-05-30 10:09:59 +000044; CHECK: ldrexb [[LOADED:r[0-9]+]], [r0]
45; CHECK: cmp [[LOADED]], [[OLDBYTE]]
Tim Northover420a2162014-06-13 14:24:07 +000046; CHECK: bne [[FAIL:LBB[0-9]+_[0-9]+]]
Tim Northoverb4ddc082014-05-30 10:09:59 +000047
Tim Northoverd32f8e62016-02-22 20:55:50 +000048; CHECK: dmb ishst
49
50; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
Tim Northoverb4ddc082014-05-30 10:09:59 +000051; CHECK: strexb [[STATUS:r[0-9]+]], {{r[0-9]+}}, [r0]
Tim Northoverd32f8e62016-02-22 20:55:50 +000052; CHECK: cbz [[STATUS]], [[SUCCESS:LBB[0-9]+_[0-9]+]]
53
54; CHECK: ldrexb [[LOADED]], [r0]
55; CHECK: cmp [[LOADED]], [[OLDBYTE]]
56; CHECK: beq [[LOOP]]
57
Tim Northoverb4ddc082014-05-30 10:09:59 +000058
Tim Northover420a2162014-06-13 14:24:07 +000059 ; FIXME: this eor is redundant. Need to teach DAG combine that.
Tim Northoverd32f8e62016-02-22 20:55:50 +000060; CHECK: [[FAIL]]:
61; CHECK: clrex
62; CHECK: movs [[TMP:r[0-9]+]], #0
Tim Northover420a2162014-06-13 14:24:07 +000063; CHECK: eor r0, [[TMP]], #1
Tim Northoverb4ddc082014-05-30 10:09:59 +000064; CHECK: bx lr
65
Tim Northoverd32f8e62016-02-22 20:55:50 +000066; CHECK: [[SUCCESS]]:
67; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
68; CHECK: movs [[TMP:r[0-9]+]], #1
Tim Northover420a2162014-06-13 14:24:07 +000069; CHECK: eor r0, [[TMP]], #1
70; CHECK: bx lr
71
72
73 %pair = cmpxchg i8* %value, i8 %oldValue, i8 %newValue acq_rel monotonic
74 %success = extractvalue { i8, i1 } %pair, 1
75 %failure = xor i1 %success, 1
Tim Northoverb4ddc082014-05-30 10:09:59 +000076 ret i1 %failure
77}
78
79define void @test_conditional(i32* %p, i32 %oldval, i32 %newval) {
80; CHECK-LABEL: test_conditional:
81
Tim Northoverb4ddc082014-05-30 10:09:59 +000082; CHECK: ldrex [[LOADED:r[0-9]+]], [r0]
83; CHECK: cmp [[LOADED]], r1
84; CHECK: bne [[FAILED:LBB[0-9]+_[0-9]+]]
85
Tim Northoverd32f8e62016-02-22 20:55:50 +000086; CHECK: dmb ishst
Tim Northoverb4ddc082014-05-30 10:09:59 +000087
Tim Northoverd32f8e62016-02-22 20:55:50 +000088; CHECK: [[LOOP:LBB[0-9]+_[0-9]+]]:
89; CHECK: strex [[STATUS:r[0-9]+]], r2, [r0]
90; CHECK: cbz [[STATUS]], [[SUCCESS:LBB[0-9]+_[0-9]+]]
91
92; CHECK: ldrex [[LOADED]], [r0]
93; CHECK: cmp [[LOADED]], r1
94; CHECK: beq [[LOOP]]
Tim Northoverb4ddc082014-05-30 10:09:59 +000095
96; CHECK: [[FAILED]]:
97; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
Tim Northoverd32f8e62016-02-22 20:55:50 +000098; CHECK: clrex
Tim Northoverb4ddc082014-05-30 10:09:59 +000099; CHECK: dmb ish
100; CHECK: b.w _baz
101
Tim Northoverd32f8e62016-02-22 20:55:50 +0000102; CHECK: [[SUCCESS]]:
103; CHECK-NOT: cmp {{r[0-9]+}}, {{r[0-9]+}}
104; CHECK: dmb ish
105; CHECK: b.w _bar
106
Tim Northover420a2162014-06-13 14:24:07 +0000107 %pair = cmpxchg i32* %p, i32 %oldval, i32 %newval seq_cst seq_cst
108 %success = extractvalue { i32, i1 } %pair, 1
Tim Northoverb4ddc082014-05-30 10:09:59 +0000109 br i1 %success, label %true, label %false
110
111true:
112 tail call void @bar() #2
113 br label %end
114
115false:
116 tail call void @baz() #2
117 br label %end
118
119end:
120 ret void
121}
122
123declare void @bar()
124declare void @baz()