From: Tim Northover Date: Tue, 1 Jul 2014 22:10:30 +0000 (+0000) Subject: X86: remove atomic instructions *after* we've iterated through them. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=334d8eebe5ef1e24764967d737a24945c980ac2c;p=platform%2Fupstream%2Fllvm.git X86: remove atomic instructions *after* we've iterated through them. Otherwise they get freed and the implicit "isa" tests following turn out badly (at least under sanitizers). Also corrects the ordering of unordered atomic stores. llvm-svn: 212136 --- diff --git a/llvm/lib/Target/X86/X86AtomicExpandPass.cpp b/llvm/lib/Target/X86/X86AtomicExpandPass.cpp index 2ba7609..1637b55 100644 --- a/llvm/lib/Target/X86/X86AtomicExpandPass.cpp +++ b/llvm/lib/Target/X86/X86AtomicExpandPass.cpp @@ -90,6 +90,9 @@ bool X86AtomicExpandPass::runOnFunction(Function &F) { MadeChange |= expandAtomicRMW(AI); if (StoreInst *SI = dyn_cast(Inst)) MadeChange |= expandAtomicStore(SI); + + assert(MadeChange && "Atomic inst not expanded when it should be?"); + Inst->eraseFromParent(); } return MadeChange; @@ -259,7 +262,6 @@ bool X86AtomicExpandPass::expandAtomicRMW(AtomicRMWInst *AI) { Builder.CreateCondBr(Success, ExitBB, LoopBB); AI->replaceAllUsesWith(NewLoaded); - AI->eraseFromParent(); return true; } @@ -268,10 +270,11 @@ bool X86AtomicExpandPass::expandAtomicStore(StoreInst *SI) { // An atomic store might need cmpxchg16b (or 8b on x86) to execute. Express // this in terms of the usual expansion to "atomicrmw xchg". IRBuilder<> Builder(SI); + AtomicOrdering Order = + SI->getOrdering() == Unordered ? Monotonic : SI->getOrdering(); AtomicRMWInst *AI = Builder.CreateAtomicRMW(AtomicRMWInst::Xchg, SI->getPointerOperand(), - SI->getValueOperand(), SI->getOrdering()); - SI->eraseFromParent(); + SI->getValueOperand(), Order); // Now we have an appropriate swap instruction, lower it as usual. if (shouldExpandAtomicRMW(AI))