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