[PATCH] D99926: [GVN] Introduce loop load PRE

Max Kazantsev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 5 22:57:07 PDT 2021


mkazantsev created this revision.
mkazantsev added reviewers: nikic, reames, nickdesaulniers, fhahn.
Herald added a subscriber: hiraditya.
mkazantsev requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This patch allows PRE of the following type of loads:

  preheader:
    br label %loop
  
  loop:
    br i1 ..., label %merge, label %clobber
  
  clobber:
    call foo() // Clobbers %p
    br label %merge
  
  merge:
    ...
    br i1 ..., label %loop, label %exit

Into

  preheader:
    %x0 = load %p
    br label %loop
  
  loop:
    %x.pre = phi(x0, x1)
    br i1 ..., label %merge, label %clobber
  
  clobber:
    call foo() // Clobbers %p
    %x1 = load %p
    br label %merge
  
  merge:
    ...
    br i1 ..., label %loop, label %exit

So instead of loading from %p on every iteration, we load only when the actual clobber happens.
The typical pattern which it is trying to address is: hot loop, with all code inlined and
provably having no side effects, and some side-effecting calls on cold path.

The worst overhead from it is, if we always take clobber block, we make 1 more load
overall (in preheader). It only matters if loop has very few iteration. If clobber block is not taken
at least once, the transform is neutral or profitable.

There are several improvements prospect open up:

- We can sometimes be smarter in loop-exiting blocks via split of critical edges;
- If we have block frequency info, we can handle multiple clobbers. The only obstacle now is that we don't know if their sum is colder than the header.


https://reviews.llvm.org/D99926

Files:
  llvm/lib/Transforms/Scalar/GVN.cpp
  llvm/test/Transforms/GVN/PRE/lpre-call-wrap.ll
  llvm/test/Transforms/GVN/PRE/pre-aliasning-path.ll
  llvm/test/Transforms/GVN/PRE/pre-loop-load.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99926.335410.patch
Type: text/x-patch
Size: 17326 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210406/3904b5df/attachment.bin>


More information about the llvm-commits mailing list