[llvm] r204434 - [Constant Hoisting] Lazily compute the idom and cache the result.
Eric Christopher
echristo at gmail.com
Mon Mar 31 16:51:03 PDT 2014
On Thu, Mar 20, 2014 at 11:04 PM, Juergen Ributzka <juergen at apple.com> wrote:
> Author: ributzka
> Date: Fri Mar 21 01:04:39 2014
> New Revision: 204434
>
> URL: http://llvm.org/viewvc/llvm-project?rev=204434&view=rev
> Log:
> [Constant Hoisting] Lazily compute the idom and cache the result.
>
Sounds nice, does it help in compile time?
-eric
> Related to <rdar://problem/16381500>
>
> Modified:
> llvm/trunk/lib/Transforms/Scalar/ConstantHoisting.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/ConstantHoisting.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ConstantHoisting.cpp?rev=204434&r1=204433&r2=204434&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/ConstantHoisting.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/ConstantHoisting.cpp Fri Mar 21 01:04:39 2014
> @@ -87,9 +87,10 @@ struct ConstantCandidate {
> struct RebasedConstantInfo {
> ConstantUseListType Uses;
> Constant *Offset;
> + mutable BasicBlock *IDom;
>
> RebasedConstantInfo(ConstantUseListType &&Uses, Constant *Offset)
> - : Uses(Uses), Offset(Offset) { }
> + : Uses(Uses), Offset(Offset), IDom(nullptr) { }
> };
>
> /// \brief A base constant and all its rebased constants.
> @@ -152,6 +153,17 @@ private:
> Entry = nullptr;
> }
>
> + /// \brief Find the common dominator of all uses and cache the result for
> + /// future lookup.
> + BasicBlock *getIDom(const RebasedConstantInfo &RCI) const {
> + if (RCI.IDom)
> + return RCI.IDom;
> + RCI.IDom = findIDomOfAllUses(RCI.Uses);
> + assert(RCI.IDom && "Invalid IDom.");
> + return RCI.IDom;
> + }
> +
> + BasicBlock *findIDomOfAllUses(const ConstantUseListType &Uses) const;
> Instruction *findMatInsertPt(Instruction *Inst, unsigned Idx = ~0U) const;
> Instruction *findConstantInsertionPoint(const ConstantInfo &ConstInfo) const;
> void collectConstantCandidates(Instruction *Inst, unsigned Idx,
> @@ -202,6 +214,32 @@ bool ConstantHoisting::runOnFunction(Fun
> return MadeChange;
> }
>
> +/// \brief Find nearest common dominator of all uses.
> +/// FIXME: Replace this with NearestCommonDominator once it is in common code.
> +BasicBlock *
> +ConstantHoisting::findIDomOfAllUses(const ConstantUseListType &Uses) const {
> + // Collect all basic blocks.
> + SmallPtrSet<BasicBlock *, 8> BBs;
> + for (auto const &U : Uses)
> + BBs.insert(findMatInsertPt(U.Inst, U.OpndIdx)->getParent());
> +
> + if (BBs.count(Entry))
> + return Entry;
> +
> + while (BBs.size() >= 2) {
> + BasicBlock *BB, *BB1, *BB2;
> + BB1 = *BBs.begin();
> + BB2 = *std::next(BBs.begin());
> + BB = DT->findNearestCommonDominator(BB1, BB2);
> + if (BB == Entry)
> + return Entry;
> + BBs.erase(BB1);
> + BBs.erase(BB2);
> + BBs.insert(BB);
> + }
> + assert((BBs.size() == 1) && "Expected only one element.");
> + return *BBs.begin();
> +}
>
> /// \brief Find the constant materialization insertion point.
> Instruction *ConstantHoisting::findMatInsertPt(Instruction *Inst,
> @@ -224,11 +262,12 @@ Instruction *ConstantHoisting::findMatIn
> Instruction *ConstantHoisting::
> findConstantInsertionPoint(const ConstantInfo &ConstInfo) const {
> assert(!ConstInfo.RebasedConstants.empty() && "Invalid constant info entry.");
> - // Collect all basic blocks.
> + // Collect all IDoms.
> SmallPtrSet<BasicBlock *, 8> BBs;
> for (auto const &RCI : ConstInfo.RebasedConstants)
> - for (auto const &U : RCI.Uses)
> - BBs.insert(U.Inst->getParent());
> + BBs.insert(getIDom(RCI));
> +
> + assert(!BBs.empty() && "No dominators!?");
>
> if (BBs.count(Entry))
> return &Entry->front();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list