[PATCH] D28921: [PM] Port LoopSink to the new pass manager.

Davide Italiano via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 19 14:54:41 PST 2017


davide requested changes to this revision.
davide added a comment.
This revision now requires changes to proceed.

The logic mostly looks fine (RPO walk etc..). Some minor comments, and I'm a little bit confused by the fact you don't pass `SCEV` to this pass anymore. See comments inline.



================
Comment at: lib/Transforms/Scalar/LoopSink.cpp:311-326
+
+  // We want to do a postorder walk over the loops. Since loops are a tree this
+  // is equivalent to a reversed preorder walk and preorder is easy to compute
+  // without recursion.
+  // FIXME: We do this in several places, we should factor it into a helper.
+  SmallVector<Loop *, 4> PreOrderLoops, PreOrderWorklist;
+  for (Loop *RootL : LI) {
----------------
This pattern is actually proliferating. How hard is to make this an helper before this patch goes in? (and replace the other uses)


================
Comment at: lib/Transforms/Scalar/LoopSink.cpp:331-332
+    Loop &L = *PreOrderLoops.pop_back_val();
+    Changed |= sinkLoopInvariantInstructions(L, AA, LI, DT, BFI,
+                                             /*ScalarEvolution*/ nullptr);
+  } while (!PreOrderLoops.empty());
----------------
The old PM actually passes SCEV to `sinkLoopInvariantInstruction`. Here you don't, what are the consequences?


================
Comment at: lib/Transforms/Scalar/LoopSink.cpp:340-345
+  // TODO: What we really want to do here is preserve an AA category, but that
+  // concept doesn't exist yet.
+  PA.preserve<AAManager>();
+  PA.preserve<BasicAA>();
+  PA.preserve<GlobalsAA>();
+  PA.preserve<SCEVAA>();
----------------
As far as I can see the old pass doesn't preserve AA passes.
I'm fine with this going in but maybe can be separated?


================
Comment at: lib/Transforms/Scalar/LoopSink.cpp:370-371
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesCFG();
     AU.addRequired<BlockFrequencyInfoWrapperPass>();
     getLoopAnalysisUsage(AU);
----------------
Ugh, this seems wrong (not your fault of course). The transform seems to ask for AA and LoopInfo but doesn't quite list them as required.


https://reviews.llvm.org/D28921





More information about the llvm-commits mailing list