1 ; RUN: opt < %s -instcombine -S | FileCheck %s 2 3 define i64 @cmpxchg_0(i64* %ptr, i64 %compare, i64 %new_value) { 4 ; CHECK-LABEL: @cmpxchg_0( 5 ; CHECK-NEXT: %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst 6 ; CHECK-NEXT: %tmp2 = extractvalue { i64, i1 } %tmp0, 0 7 ; CHECK-NEXT: ret i64 %tmp2 8 ; 9 %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst 10 %tmp1 = extractvalue { i64, i1 } %tmp0, 1 11 %tmp2 = extractvalue { i64, i1 } %tmp0, 0 12 %tmp3 = select i1 %tmp1, i64 %compare, i64 %tmp2 13 ret i64 %tmp3 14 } 15 16 define i64 @cmpxchg_1(i64* %ptr, i64 %compare, i64 %new_value) { 17 ; CHECK-LABEL: @cmpxchg_1( 18 ; CHECK-NEXT: %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst 19 ; CHECK-NEXT: ret i64 %compare 20 ; 21 %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst 22 %tmp1 = extractvalue { i64, i1 } %tmp0, 1 23 %tmp2 = extractvalue { i64, i1 } %tmp0, 0 24 %tmp3 = select i1 %tmp1, i64 %tmp2, i64 %compare 25 ret i64 %tmp3 26 } 27 28 define i64 @cmpxchg_2(i64* %ptr, i64 %compare, i64 %new_value) { 29 ; CHECK-LABEL: @cmpxchg_2( 30 ; CHECK-NEXT: %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value acq_rel monotonic 31 ; CHECK-NEXT: ret i64 %compare 32 ; 33 %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value acq_rel monotonic 34 %tmp1 = extractvalue { i64, i1 } %tmp0, 1 35 %tmp2 = extractvalue { i64, i1 } %tmp0, 0 36 %tmp3 = select i1 %tmp1, i64 %compare, i64 %tmp2 37 %tmp4 = select i1 %tmp1, i64 %tmp3, i64 %compare 38 ret i64 %tmp4 39 } 40