[PATCH] D23021: GVN-hoist: compute DFS numbers once

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 1 10:38:36 PDT 2016


If you guarantee you are only inserting at end of block, LGTM

On Mon, Aug 1, 2016 at 10:17 AM, Sebastian Pop <sebpop at gmail.com> wrote:

> sebpop created this revision.
> sebpop added a reviewer: dberlin.
> sebpop added a subscriber: llvm-commits.
>
> With this patch we compute the DFS numbers of instructions only once and
> update them during the code generation when an instruction gets hoisted.
> Passes check and test-suite on x86_64-linux.
>
> https://reviews.llvm.org/D23021
>
> Files:
>   llvm/lib/Transforms/Scalar/GVNHoist.cpp
>
> Index: llvm/lib/Transforms/Scalar/GVNHoist.cpp
> ===================================================================
> --- llvm/lib/Transforms/Scalar/GVNHoist.cpp
> +++ llvm/lib/Transforms/Scalar/GVNHoist.cpp
> @@ -72,8 +72,16 @@
>      //
>      // assert(A != B);
>
> -    unsigned ADFS = DFSNumber.lookup(A);
> -    unsigned BDFS = DFSNumber.lookup(B);
> +    const BasicBlock *BA = A->getParent();
> +    const BasicBlock *BB = B->getParent();
> +    unsigned ADFS, BDFS;
> +    if (BA == BB) {
> +      ADFS = DFSNumber.lookup(A);
> +      BDFS = DFSNumber.lookup(B);
> +    } else {
> +      ADFS = DFSNumber.lookup(BA);
> +      BDFS = DFSNumber.lookup(BB);
> +    }
>      assert (ADFS && BDFS);
>      return ADFS < BDFS;
>    }
> @@ -195,15 +203,17 @@
>      bool Res = false;
>      MemorySSA M(F, AA, DT);
>      MSSA = &M;
> +    // Perform DFS Numbering of instructions.
> +    unsigned BBI = 0;
> +    for (const BasicBlock *BB : depth_first(&F.getEntryBlock())) {
> +      DFSNumber[BB] = ++BBI;
> +      unsigned I = 0;
> +      for (auto &Inst: *BB)
> +        DFSNumber[&Inst] = ++I;
> +    }
>
>      // FIXME: use lazy evaluation of VN to avoid the fix-point
> computation.
>      while (1) {
> -      // Perform DFS Numbering of instructions.
> -      unsigned I = 0;
> -      for (const BasicBlock *BB : depth_first(&F.getEntryBlock()))
> -        for (auto &Inst: *BB)
> -          DFSNumber.insert({&Inst, ++I});
> -
>        auto HoistStat = hoistExpressions(F);
>        if (HoistStat.first + HoistStat.second == 0)
>          return Res;
> @@ -215,9 +225,6 @@
>          VN.clear();
>
>        Res = true;
> -
> -      // DFS numbers change when instructions are hoisted: clear and
> recompute.
> -      DFSNumber.clear();
>      }
>
>      return Res;
> @@ -741,7 +748,10 @@
>            continue;
>
>          // Move the instruction at the end of HoistPt.
> -        Repl->moveBefore(HoistPt->getTerminator());
> +        Instruction *Last = HoistPt->getTerminator();
> +        Repl->moveBefore(Last);
> +
> +        DFSNumber[Repl] = DFSNumber[Last]++;
>        }
>
>        MemoryAccess *NewMemAcc = nullptr;
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160801/09dbdcdf/attachment.html>


More information about the llvm-commits mailing list