[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