diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index feeb23136eaa..90c3520c8323 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/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/llvm/test/Transforms/SCCP/atomic.ll b/llvm/test/Transforms/SCCP/atomic.ll new file mode 100644 index 000000000000..60d4896ec2b0 --- /dev/null +++ b/llvm/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 +}