[llvm] r291697 - NewGVN: Refactor performCongruenceFinding and split out congruence class moving

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 11 12:36:42 PST 2017


On Wed, Jan 11, 2017 at 12:22 PM, Daniel Berlin via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: dannyb
> Date: Wed Jan 11 14:22:05 2017
> New Revision: 291697
>
> URL: http://llvm.org/viewvc/llvm-project?rev=291697&view=rev
> Log:
> NewGVN: Refactor performCongruenceFinding and split out congruence class moving
>

Much better now, yay =)

> Modified:
>     llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp?rev=291697&r1=291696&r2=291697&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp Wed Jan 11 14:22:05 2017
> @@ -198,7 +198,7 @@ class NewGVN : public FunctionPass {
>    ExpressionClassMap ExpressionToClass;
>
>    // Which values have changed as a result of leader changes.
> -  SmallPtrSet<Value *, 8> ChangedValues;
> +  SmallPtrSet<Value *, 8> LeaderChanges;
>
>    // Reachability info.
>    using BlockEdge = BasicBlockEdge;
> @@ -317,7 +317,8 @@ private:
>    template <class T>
>    Value *lookupOperandLeader(Value *, const User *, const T &) const;
>    void performCongruenceFinding(Value *, const Expression *);
> -
> +  void moveValueToNewCongruenceClass(Value *, CongruenceClass *,
> +                                     CongruenceClass *);
>    // Reachability handling.
>    void updateReachableEdge(BasicBlock *, BasicBlock *);
>    void processOutgoingEdges(TerminatorInst *, BasicBlock *);
> @@ -1044,7 +1045,40 @@ void NewGVN::markLeaderChangeTouched(Con
>    for (auto M : CC->Members) {
>      if (auto *I = dyn_cast<Instruction>(M))
>        TouchedInstructions.set(InstrDFS[I]);
> -    ChangedValues.insert(M);
> +    LeaderChanges.insert(M);
> +  }
> +}
> +
> +// Move a value, currently in OldClass, to be part of NewClass
> +// Update OldClass for the move (including changing leaders, etc)

Nitpick: comments ending with dots, I think.

> +void NewGVN::moveValueToNewCongruenceClass(Value *V, CongruenceClass *OldClass,
> +                                           CongruenceClass *NewClass) {
> +  DEBUG(dbgs() << "New congruence class for " << V << " is " << NewClass->ID
> +               << "\n");
> +  OldClass->Members.erase(V);
> +  NewClass->Members.insert(V);
> +  if (isa<StoreInst>(V)) {
> +    --OldClass->StoreCount;
> +    assert(OldClass->StoreCount >= 0);
> +    ++NewClass->StoreCount;
> +    assert(NewClass->StoreCount >= 0);
> +  }
> +
> +  ValueToClass[V] = NewClass;
> +  // See if we destroyed the class or need to swap leaders.
> +  if (OldClass->Members.empty() && OldClass != InitialClass) {
> +    if (OldClass->DefiningExpr) {
> +      OldClass->Dead = true;
> +      DEBUG(dbgs() << "Erasing expression " << OldClass->DefiningExpr
> +                   << " from table\n");
> +      ExpressionToClass.erase(OldClass->DefiningExpr);
> +    }
> +  } else if (OldClass->RepLeader == V) {
> +    // When the leader changes, the value numbering of
> +    // everything may change due to symbolization changes, so we need to
> +    // reprocess.

This looks funny. clang-format bug or something?

> +    OldClass->RepLeader = *(OldClass->Members.begin());
> +    markLeaderChangeTouched(OldClass);
>    }
>  }
>
> @@ -1101,33 +1135,15 @@ void NewGVN::performCongruenceFinding(Va
>        assert(!EClass->Dead && "We accidentally looked up a dead class");
>      }
>    }
> -  bool WasInChanged = ChangedValues.erase(V);
> -  if (VClass != EClass || WasInChanged) {
> +  bool ClassChanged = VClass != EClass;
> +  bool LeaderChanged = LeaderChanges.erase(V);

I particularly like the fact these checks are now named variables
(improve readability a lot IMHO).

> +  if (ClassChanged || LeaderChanged) {
>      DEBUG(dbgs() << "Found class " << EClass->ID << " for expression " << E
>                   << "\n");
>
> -    if (VClass != EClass) {
> -      DEBUG(dbgs() << "New congruence class for " << V << " is " << EClass->ID
> -                   << "\n");
> -
> -      VClass->Members.erase(V);
> -      EClass->Members.insert(V);
> -      ValueToClass[V] = EClass;
> -      // See if we destroyed the class or need to swap leaders.
> -      if (VClass->Members.empty() && VClass != InitialClass) {
> -        if (VClass->DefiningExpr) {
> -          VClass->Dead = true;
> -          DEBUG(dbgs() << "Erasing expression " << *E << " from table\n");
> -          ExpressionToClass.erase(VClass->DefiningExpr);
> -        }
> -      } else if (VClass->RepLeader == V) {
> -        // When the leader changes, the value numbering of
> -        // everything may change due to symbolization changes, so we need to
> -        // reprocess.
> -        VClass->RepLeader = *(VClass->Members.begin());
> -        markLeaderChangeTouched(VClass);
> -      }
> -    }
> +    if (ClassChanged)
> +
> +      moveValueToNewCongruenceClass(V, VClass, EClass);
>
Newline intended?

-- 
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare


More information about the llvm-commits mailing list