diff options
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 4 | ||||
-rw-r--r-- | test/Transforms/SCCP/atomic.ll | 9 |
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index feeb23136e..90c3520c83 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -494,7 +494,9 @@ private: void visitResumeInst (TerminatorInst &I) { /*returns void*/ } void visitUnreachableInst(TerminatorInst &I) { /*returns void*/ } void visitFenceInst (FenceInst &I) { /*returns void*/ } - void visitAtomicCmpXchgInst (AtomicCmpXchgInst &I) { markOverdefined(&I); } + void visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) { + markAnythingOverdefined(&I); + } void visitAtomicRMWInst (AtomicRMWInst &I) { markOverdefined(&I); } void visitAllocaInst (Instruction &I) { markOverdefined(&I); } void visitVAArgInst (Instruction &I) { markAnythingOverdefined(&I); } diff --git a/test/Transforms/SCCP/atomic.ll b/test/Transforms/SCCP/atomic.ll new file mode 100644 index 0000000000..60d4896ec2 --- /dev/null +++ b/test/Transforms/SCCP/atomic.ll @@ -0,0 +1,9 @@ +; RUN: opt < %s -sccp -S | FileCheck %s + +define i1 @test_cmpxchg(i32* %addr, i32 %desired, i32 %new) { +; CHECK-LABEL: @test_cmpxchg +; CHECK: cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst + %val = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst + %res = extractvalue { i32, i1 } %val, 1 + ret i1 %res +} |