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