diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMParallelDSP.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMParallelDSP.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/llvm/lib/Target/ARM/ARMParallelDSP.cpp b/llvm/lib/Target/ARM/ARMParallelDSP.cpp index e2c9335db419..e750649ce86c 100644 --- a/llvm/lib/Target/ARM/ARMParallelDSP.cpp +++ b/llvm/lib/Target/ARM/ARMParallelDSP.cpp @@ -19,8 +19,9 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Analysis/AssumptionCache.h" +#include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/LoopAccessAnalysis.h" -#include "llvm/Analysis/OrderedBasicBlock.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicsARM.h" @@ -28,7 +29,6 @@ #include "llvm/IR/PatternMatch.h" #include "llvm/Pass.h" #include "llvm/PassRegistry.h" -#include "llvm/PassSupport.h" #include "llvm/Support/Debug.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" @@ -352,7 +352,6 @@ bool ARMParallelDSP::RecordMemoryOps(BasicBlock *BB) { SmallVector<Instruction*, 8> Writes; LoadPairs.clear(); WideLoads.clear(); - OrderedBasicBlock OrderedBB(BB); // Collect loads and instruction that may write to memory. For now we only // record loads which are simple, sign-extended and have a single user. @@ -384,7 +383,7 @@ bool ARMParallelDSP::RecordMemoryOps(BasicBlock *BB) { if (!isModOrRefSet(intersectModRef(AA->getModRefInfo(Write, ReadLoc), ModRefInfo::ModRef))) continue; - if (OrderedBB.dominates(Write, Read)) + if (Write->comesBefore(Read)) RAWDeps[Read].insert(Write); } } @@ -392,8 +391,9 @@ bool ARMParallelDSP::RecordMemoryOps(BasicBlock *BB) { // Check whether there's not a write between the two loads which would // prevent them from being safely merged. auto SafeToPair = [&](LoadInst *Base, LoadInst *Offset) { - LoadInst *Dominator = OrderedBB.dominates(Base, Offset) ? Base : Offset; - LoadInst *Dominated = OrderedBB.dominates(Base, Offset) ? Offset : Base; + bool BaseFirst = Base->comesBefore(Offset); + LoadInst *Dominator = BaseFirst ? Base : Offset; + LoadInst *Dominated = BaseFirst ? Offset : Base; if (RAWDeps.count(Dominated)) { InstSet &WritesBefore = RAWDeps[Dominated]; @@ -401,7 +401,7 @@ bool ARMParallelDSP::RecordMemoryOps(BasicBlock *BB) { for (auto Before : WritesBefore) { // We can't move the second load backward, past a write, to merge // with the first load. - if (OrderedBB.dominates(Dominator, Before)) + if (Dominator->comesBefore(Before)) return false; } } @@ -571,6 +571,10 @@ bool ARMParallelDSP::CreateParallelPairs(Reduction &R) { auto Ld2 = static_cast<LoadInst*>(PMul0->RHS); auto Ld3 = static_cast<LoadInst*>(PMul1->RHS); + // Check that each mul is operating on two different loads. + if (Ld0 == Ld2 || Ld1 == Ld3) + return false; + if (AreSequentialLoads(Ld0, Ld1, PMul0->VecLd)) { if (AreSequentialLoads(Ld2, Ld3, PMul1->VecLd)) { LLVM_DEBUG(dbgs() << "OK: found two pairs of parallel loads!\n"); @@ -705,12 +709,11 @@ void ARMParallelDSP::InsertParallelMACs(Reduction &R) { } // Roughly sort the mul pairs in their program order. - OrderedBasicBlock OrderedBB(R.getRoot()->getParent()); - llvm::sort(R.getMulPairs(), [&OrderedBB](auto &PairA, auto &PairB) { - const Instruction *A = PairA.first->Root; - const Instruction *B = PairB.first->Root; - return OrderedBB.dominates(A, B); - }); + llvm::sort(R.getMulPairs(), [](auto &PairA, auto &PairB) { + const Instruction *A = PairA.first->Root; + const Instruction *B = PairB.first->Root; + return A->comesBefore(B); + }); IntegerType *Ty = IntegerType::get(M->getContext(), 32); for (auto &Pair : R.getMulPairs()) { @@ -772,8 +775,7 @@ LoadInst* ARMParallelDSP::CreateWideLoad(MemInstList &Loads, const unsigned AddrSpace = DomLoad->getPointerAddressSpace(); Value *VecPtr = IRB.CreateBitCast(Base->getPointerOperand(), LoadTy->getPointerTo(AddrSpace)); - LoadInst *WideLoad = IRB.CreateAlignedLoad(LoadTy, VecPtr, - Base->getAlignment()); + LoadInst *WideLoad = IRB.CreateAlignedLoad(LoadTy, VecPtr, Base->getAlign()); // Make sure everything is in the correct order in the basic block. MoveBefore(Base->getPointerOperand(), VecPtr); |