From 9e251d6d41beae57d4f5d6a13f50e3d35b292541 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Mon, 14 Jul 2014 15:31:13 +0000 Subject: [PATCH] X86: remove temporary atomicrmw used during lowering. We construct a temporary "atomicrmw xchg" instruction when lowering atomic stores for widths that aren't supported natively. This isn't on the top-level worklist though, so it won't be removed automatically and we have to do it ourselves once that itself has been lowered. Thanks Saleem for pointing this out! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212948 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86AtomicExpandPass.cpp | 7 +++++-- test/CodeGen/X86/atomic128.ll | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/Target/X86/X86AtomicExpandPass.cpp b/lib/Target/X86/X86AtomicExpandPass.cpp index 1637b55b6d3..61eefbbf75b 100644 --- a/lib/Target/X86/X86AtomicExpandPass.cpp +++ b/lib/Target/X86/X86AtomicExpandPass.cpp @@ -277,8 +277,11 @@ bool X86AtomicExpandPass::expandAtomicStore(StoreInst *SI) { SI->getValueOperand(), Order); // Now we have an appropriate swap instruction, lower it as usual. - if (shouldExpandAtomicRMW(AI)) - return expandAtomicRMW(AI); + if (shouldExpandAtomicRMW(AI)) { + expandAtomicRMW(AI); + AI->eraseFromParent(); + return true; + } return AI; } diff --git a/test/CodeGen/X86/atomic128.ll b/test/CodeGen/X86/atomic128.ll index ddc53a53202..741d2904229 100644 --- a/test/CodeGen/X86/atomic128.ll +++ b/test/CodeGen/X86/atomic128.ll @@ -277,6 +277,7 @@ define void @atomic_store_seq_cst(i128* %p, i128 %in) { ; CHECK: lock ; CHECK: cmpxchg16b (%rdi) ; CHECK: jne [[LOOP]] +; CHECK-NOT: callq ___sync_lock_test_and_set_16 store atomic i128 %in, i128* %p seq_cst, align 16 ret void -- 2.34.1