1 ; RUN: opt -atomic-expand -S -mtriple=thumbv7s-apple-ios7.0 %s | FileCheck %s
3 define i32 @test_cmpxchg_seq_cst(i32* %addr, i32 %desired, i32 %new) {
4 ; CHECK-LABEL: @test_cmpxchg_seq_cst
6 ; CHECK: br label %[[START:.*]]
9 ; CHECK: [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
10 ; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
11 ; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[FAILURE_BB:.*]]
13 ; CHECK: [[TRY_STORE]]:
14 ; CHECK: [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
15 ; CHECK: [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
16 ; CHECK: br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB]]
18 ; CHECK: [[SUCCESS_BB]]:
19 ; CHECK: fence seq_cst
20 ; CHECK: br label %[[END:.*]]
22 ; CHECK: [[FAILURE_BB]]:
23 ; CHECK: fence seq_cst
24 ; CHECK: br label %[[END]]
27 ; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
28 ; CHECK: ret i32 [[LOADED]]
30 %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
31 %oldval = extractvalue { i32, i1 } %pair, 0
35 define i1 @test_cmpxchg_weak_fail(i32* %addr, i32 %desired, i32 %new) {
36 ; CHECK-LABEL: @test_cmpxchg_weak_fail
37 ; CHECK: fence release
38 ; CHECK: br label %[[START:.*]]
41 ; CHECK: [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
42 ; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
43 ; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[FAILURE_BB:.*]]
45 ; CHECK: [[TRY_STORE]]:
46 ; CHECK: [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
47 ; CHECK: [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
48 ; CHECK: br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
50 ; CHECK: [[SUCCESS_BB]]:
51 ; CHECK: fence seq_cst
52 ; CHECK: br label %[[END:.*]]
54 ; CHECK: [[FAILURE_BB]]:
56 ; CHECK: br label %[[END]]
59 ; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
60 ; CHECK: ret i1 [[SUCCESS]]
62 %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst monotonic
63 %oldval = extractvalue { i32, i1 } %pair, 1
67 define i32 @test_cmpxchg_monotonic(i32* %addr, i32 %desired, i32 %new) {
68 ; CHECK-LABEL: @test_cmpxchg_monotonic
70 ; CHECK: br label %[[START:.*]]
73 ; CHECK: [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
74 ; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
75 ; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[FAILURE_BB:.*]]
77 ; CHECK: [[TRY_STORE]]:
78 ; CHECK: [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
79 ; CHECK: [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
80 ; CHECK: br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
82 ; CHECK: [[SUCCESS_BB]]:
84 ; CHECK: br label %[[END:.*]]
86 ; CHECK: [[FAILURE_BB]]:
88 ; CHECK: br label %[[END]]
91 ; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
92 ; CHECK: ret i32 [[LOADED]]
94 %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new monotonic monotonic
95 %oldval = extractvalue { i32, i1 } %pair, 0