[PATCH] Review for hoisting and sinking of equivalent memory instruction (Instruction Merge Pass)

Gerolf Hoflehner ghoflehner at apple.com
Sun Jul 6 18:46:28 PDT 2014


Ok, I changed the pass name to MergedLoadStoreMotion. From all suggestions it seemed it should contain at least ‘LoadStore'.

Also followed up on all other suggestions, too. Please see below.

-Gerolf

-------------- next part --------------
A non-text attachment was scrubbed...
Name: mlsm.patch
Type: application/octet-stream
Size: 31805 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140706/61038af5/attachment.obj>
-------------- next part --------------




On Jun 24, 2014, at 7:20 AM, Chandler Carruth <chandlerc at gmail.com> wrote:

> My biggest concern is the name. I don't think "InstructionMerge" is a great name because it *only* handles loads and stores, and the CFG motion triggered isn't really clarified. For example, what is different between merging instructions and combining them? Why isn't this in instcombine? I assume that the answer is that merging isn't the critical piece, but the hoisting and sinking is. I think naming it along those lines would clarify things. LoadStoreMotion or something seems appropriate and highlights the similarity between LICM pointed out by others in the review.
> 
> ================
> Comment at: lib/Transforms/IPO/PassManagerBuilder.cpp:210
> @@ -209,2 +209,3 @@
> 
> +  MPM.add(createInstructionMergerPass()); // Merge load/stores in diamonds
>   if (OptLevel > 1)
> ----------------
> I wonder if this should be behind the O2 guard like GVN? It does seem to be in a similar class of transforms…
Agree. Done.
> 
> ================
> Comment at: lib/Transforms/Scalar/InstructionMerger.cpp:1
> @@ +1,2 @@
> +//===---                  InstructionMerger.cpp                         ---===//
> +//
> ----------------
> This doesn't match the header format of LLVM files…
Done
A job for clang-format? 
> 
> ================
> Comment at: lib/Transforms/Scalar/InstructionMerger.cpp:10
> @@ +9,3 @@
> +//
> +// This pass performs merges of loads and stores on both sides of
> +// a diamond (hammock). It iteratively hoists two loads to the same
> ----------------
> Maybe make this a \file comment for oxygen?
Done
> 
> ================
> Comment at: lib/Transforms/Scalar/InstructionMerger.cpp:30-34
> @@ +29,7 @@
> +//            if.then:                         if.else:
> +//               LOAD IT = [ADDR_L]              LOAD IE = [ADDR_L]
> +//               <USE IT>                        <USE IE>
> +//               <...>                           <...>
> +//               STORE XT = [ADDR_S]             STORE XE = [ADDR_S]
> +//               BR label %footer                BR label %footer
> +//                     \                         /
> ----------------
> I think it would be a lot nicer to actually use LLVM IR-style pseudo code here. The 'LOAD IT = ...' is particularly weird in LLVM.
Agree. Done.
> 
> ================
> Comment at: lib/Transforms/Scalar/InstructionMerger.cpp:62-79
> @@ +61,20 @@
> +//
> +//===----------------------- Code Reviews/Feedback ------------------------===//
> +//
> +// Where/How to find them:
> +//
> +// a) LLVM commit mailing list:  [PATCH] Review for hoisting and sinking of
> +// equivalent memory instruction (Instruction Merge Pass)
> +// b) Phabricator: http://reviews.llvm.org/D4096
> +//
> +// Open Suggestions:
> +// a) Integrate into GVN framework (see Dan Berlin's comments)
> +//    -- Requires significant advances of current framework.
> +// b) Generalize to regions other than diamonds and be more aggressive
> +//    merging memory operations (comments by Philip Reames).
> +//    -- I think this should be done on demand. Likely will require some
> +//       way to measure register pressure at the IR level perhaps in form
> +//       of a "pseudo-allocator".
> +//
> +//===----------------------------------------------------------------------===//
> +
> ----------------
> I don't think this really belongs in the code. It is way too transient to be useful. I would just have a TODO list for future work, or something similar. It needs to be phrased in a way that makes it clear that it is a persistently correct comment (until someone comes in and addresses / changes one of the specific issues).
Improved. Left review pointers. Added relevant TODOs.
> 
> ================
> Comment at: lib/Transforms/Scalar/InstructionMerger.cpp:170
> @@ +169,3 @@
> +
> +/// Remove instruction from parent and update memory dependence analysis.
> +void InstructionMerger::removeInstruction(Instruction *Inst) {
> ----------------
> Brief doxygen should probably be tagged as \brief.
Done.
> 
> (This applies throughout the file.)
> 
> ================
> Comment at: lib/Transforms/Scalar/InstructionMerger.cpp:542
> @@ +541,3 @@
> +}
> +/// runOnFunction - This is the main transformation entry point for a function.
> +bool InstructionMerger::runOnFunction(Function &F) {
> ----------------
> Skip the function name repetition.
Done.
> http://reviews.llvm.org/D4096
> 
> 



More information about the llvm-commits mailing list