mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
fa52fc8d71
If a select instruction tests the returned flag of a cmpxchg instruction and selects between the returned value of the cmpxchg instruction and its compare operand, the result of the select will always be equal to its false value. Differential Revision: https://reviews.llvm.org/D39383 llvm-svn: 316994
40 lines
1.5 KiB
LLVM
40 lines
1.5 KiB
LLVM
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
|
|
define i64 @cmpxchg_0(i64* %ptr, i64 %compare, i64 %new_value) {
|
|
; CHECK-LABEL: @cmpxchg_0(
|
|
; CHECK-NEXT: %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
|
|
; CHECK-NEXT: %tmp2 = extractvalue { i64, i1 } %tmp0, 0
|
|
; CHECK-NEXT: ret i64 %tmp2
|
|
;
|
|
%tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
|
|
%tmp1 = extractvalue { i64, i1 } %tmp0, 1
|
|
%tmp2 = extractvalue { i64, i1 } %tmp0, 0
|
|
%tmp3 = select i1 %tmp1, i64 %compare, i64 %tmp2
|
|
ret i64 %tmp3
|
|
}
|
|
|
|
define i64 @cmpxchg_1(i64* %ptr, i64 %compare, i64 %new_value) {
|
|
; CHECK-LABEL: @cmpxchg_1(
|
|
; CHECK-NEXT: %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
|
|
; CHECK-NEXT: ret i64 %compare
|
|
;
|
|
%tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
|
|
%tmp1 = extractvalue { i64, i1 } %tmp0, 1
|
|
%tmp2 = extractvalue { i64, i1 } %tmp0, 0
|
|
%tmp3 = select i1 %tmp1, i64 %tmp2, i64 %compare
|
|
ret i64 %tmp3
|
|
}
|
|
|
|
define i64 @cmpxchg_2(i64* %ptr, i64 %compare, i64 %new_value) {
|
|
; CHECK-LABEL: @cmpxchg_2(
|
|
; CHECK-NEXT: %tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value acq_rel monotonic
|
|
; CHECK-NEXT: ret i64 %compare
|
|
;
|
|
%tmp0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value acq_rel monotonic
|
|
%tmp1 = extractvalue { i64, i1 } %tmp0, 1
|
|
%tmp2 = extractvalue { i64, i1 } %tmp0, 0
|
|
%tmp3 = select i1 %tmp1, i64 %compare, i64 %tmp2
|
|
%tmp4 = select i1 %tmp1, i64 %tmp3, i64 %compare
|
|
ret i64 %tmp4
|
|
}
|