From ac6ac4cb6c567726b5ea8c823906a4ab6c8c089a Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Tue, 13 Mar 2018 15:52:43 -0700 Subject: [PATCH] Add bogus conditional branch before stlx --- lib/CodeGen/CodeGenPrepare.cpp | 65 ++++++++++++---------------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index 1837ba2bd5d..f4ff3787e63 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -710,11 +710,11 @@ Instruction* findFirstStoreCondBranchInst(LoadInst* LI, Vector* ChainedBB) { BBI++; while (true) { for (; BBI != BE; BBI++) { - auto* Inst = dyn_cast(&*BBI); - if (Inst == nullptr) { - continue; - } - if (Inst->getOpcode() == Instruction::Store) { + Instruction* Inst = &*BBI; + IntrinsicInst* II = dyn_cast(&*BBI); + if (II && II->getIntrinsicID() == Intrinsic::aarch64_stlxr) { + return II; + } else if (Inst->getOpcode() == Instruction::Store) { return Inst; } else if (Inst->getOpcode() == Instruction::Br) { auto* BrInst = dyn_cast(Inst); @@ -759,35 +759,6 @@ Instruction* findLastLoadNext(Instruction* FromInst, Instruction* ToInst) { return LastLoad; } -// XXX-comment: Returns whether the code has been changed. -bool taintMonotonicLoads(const SmallVector& MonotonicLoadInsts) { - bool Changed = false; - for (auto* LI : MonotonicLoadInsts) { - SmallVector ChainedBB; - auto* FirstInst = findFirstStoreCondBranchInst(LI, &ChainedBB); - if (FirstInst == nullptr) { - // We don't seem to be able to taint a following store/conditional branch - // instruction. Simply make it acquire. - DEBUG(dbgs() << "[RelaxedLoad]: Transformed to acquire load\n" - << *LI << "\n"); - LI->setOrdering(Acquire); - Changed = true; - continue; - } - // Taint 'FirstInst', which could be a store or a condition branch - // instruction. - if (FirstInst->getOpcode() == Instruction::Store) { - Changed |= taintStoreAddress(dyn_cast(FirstInst), LI); - } else if (FirstInst->getOpcode() == Instruction::Br) { - Changed |= taintConditionalBranch(dyn_cast(FirstInst), LI); - } else { - assert(false && "findFirstStoreCondBranchInst() should return a " - "store/condition branch instruction"); - } - } - return Changed; -} - // Inserts a fake conditional branch right after the instruction 'SplitInst', // and the branch condition is 'Condition'. 'SplitInst' will be placed in the // newly created block. @@ -984,18 +955,28 @@ bool AddFakeConditionalBranchAfterMonotonicLoads( continue; } } else { - dbgs() << "FirstInst=" << *FirstInst << "\n"; - assert(false && "findFirstStoreCondBranchInst() should return a " - "store/condition branch instruction"); + IntrinsicInst* II = dyn_cast(FirstInst); + if (!II || II->getIntrinsicID() != Intrinsic::aarch64_stlxr) { + dbgs() << "FirstInst=" << *FirstInst << "\n"; + assert(false && "findFirstStoreCondBranchInst() should return a " + "store/condition branch instruction"); + } } } // We really need to process the relaxed load now. - StoreInst* SI = nullptr;; - if (FirstInst && (SI = dyn_cast(FirstInst))) { + StoreInst* SI = nullptr; + IntrinsicInst* II = nullptr; + if (FirstInst) { + SI = dyn_cast(FirstInst); + II = dyn_cast(FirstInst); + } + if (FirstInst && + (SI || (II && II->getIntrinsicID() == Intrinsic::aarch64_stlxr))) { // For immediately coming stores, taint the address of the store. - if (SI->getParent() == LI->getParent() || DT->dominates(LI, SI)) { - TaintRelaxedLoads(LI, SI); + if (FirstInst->getParent() == LI->getParent() || + DT->dominates(LI, FirstInst)) { + TaintRelaxedLoads(LI, FirstInst); Changed = true; } else { auto* Inst = @@ -1004,7 +985,7 @@ bool AddFakeConditionalBranchAfterMonotonicLoads( LI->setOrdering(Acquire); Changed = true; } else { - TaintRelaxedLoads(Inst, SI); + TaintRelaxedLoads(Inst, FirstInst); Changed = true; } } -- 2.34.1