From e1a9d504a3fd8e2544b352224bc719d52c070ceb Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Fri, 13 Jun 2014 14:54:09 +0000 Subject: SCCP: update for cmpxchg returning { iN, i1 } now. I accidentally missed this one since its use looked OK locally. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210909 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SCCP.cpp | 4 +++- test/Transforms/SCCP/atomic.ll | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/SCCP/atomic.ll 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 +} -- cgit v1.2.3