<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 3, 2016 at 3:02 PM, Justin Bogner via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: bogner<br>
Date: Tue May  3 17:02:31 2016<br>
New Revision: 268452<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=268452&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=268452&view=rev</a><br>
Log:<br>
PM: Port LoopRotation to the new loop pass manager<br>
<br>
Added:<br>
    llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h<br>
Modified:<br>
    llvm/trunk/include/llvm/InitializePasses.h<br>
    llvm/trunk/lib/Passes/PassBuilder.cpp<br>
    llvm/trunk/lib/Passes/PassRegistry.def<br>
    llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp<br>
    llvm/trunk/lib/Transforms/Scalar/Scalar.cpp<br>
    llvm/trunk/test/Transforms/LoopRotate/basic.ll<br>
<br>
Modified: llvm/trunk/include/llvm/InitializePasses.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=268452&r1=268451&r2=268452&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=268452&r1=268451&r2=268452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/InitializePasses.h (original)<br>
+++ llvm/trunk/include/llvm/InitializePasses.h Tue May  3 17:02:31 2016<br>
@@ -178,7 +178,7 @@ void initializeLoopExtractorPass(PassReg<br>
 void initializeLoopInfoWrapperPassPass(PassRegistry&);<br>
 void initializeLoopInterchangePass(PassRegistry &);<br>
 void initializeLoopInstSimplifyPass(PassRegistry&);<br>
-void initializeLoopRotatePass(PassRegistry&);<br>
+void initializeLoopRotateLegacyPassPass(PassRegistry&);<br>
 void initializeLoopSimplifyPass(PassRegistry&);<br>
 void initializeLoopSimplifyCFGLegacyPassPass(PassRegistry&);<br>
 void initializeLoopStrengthReducePass(PassRegistry&);<br>
<br>
Added: llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h?rev=268452&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h?rev=268452&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h (added)<br>
+++ llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h Tue May  3 17:02:31 2016<br>
@@ -0,0 +1,32 @@<br>
+//===- LoopRotation.h - Loop Rotation -------------------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This file provides the interface for the Loop Rotation pass.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef LLVM_TRANSFORMS_SCALAR_LOOPROTATION_H<br>
+#define LLVM_TRANSFORMS_SCALAR_LOOPROTATION_H<br>
+<br>
+#include "llvm/Analysis/LoopInfo.h"<br>
+#include "llvm/IR/PassManager.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+/// A simple loop rotation transformation.<br>
+class LoopRotatePass : public PassInfoMixin<LoopRotatePass> {<br>
+  unsigned MaxHeaderSize;<br>
+public:<br>
+  LoopRotatePass();<br>
+  LoopRotatePass(unsigned MaxHeaderSize) : MaxHeaderSize(MaxHeaderSize) {}<br>
+  PreservedAnalyses run(Loop &L, AnalysisManager<Loop> &AM);<br>
+};<br>
+}<br>
+<br>
+#endif // LLVM_TRANSFORMS_SCALAR_LOOPROTATION_H<br>
<br>
Modified: llvm/trunk/lib/Passes/PassBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=268452&r1=268451&r2=268452&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=268452&r1=268451&r2=268452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)<br>
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Tue May  3 17:02:31 2016<br>
@@ -57,6 +57,7 @@<br>
 #include "llvm/Transforms/Scalar/ADCE.h"<br>
 #include "llvm/Transforms/Scalar/DCE.h"<br>
 #include "llvm/Transforms/Scalar/EarlyCSE.h"<br>
+#include "llvm/Transforms/Scalar/LoopRotation.h"<br>
 #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h"<br>
 #include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"<br>
 #include "llvm/Transforms/Scalar/GVN.h"<br>
<br>
Modified: llvm/trunk/lib/Passes/PassRegistry.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=268452&r1=268451&r2=268452&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=268452&r1=268451&r2=268452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassRegistry.def (original)<br>
+++ llvm/trunk/lib/Passes/PassRegistry.def Tue May  3 17:02:31 2016<br>
@@ -134,6 +134,7 @@ LOOP_ANALYSIS("no-op-loop", NoOpLoopAnal<br>
 #define LOOP_PASS(NAME, CREATE_PASS)<br>
 #endif<br>
 LOOP_PASS("invalidate<all>", InvalidateAllAnalysesPass())<br>
+LOOP_PASS("rotate", LoopRotatePass())<br>
 LOOP_PASS("no-op-loop", NoOpLoopPass())<br>
 LOOP_PASS("print", PrintLoopPass(dbgs()))<br>
 LOOP_PASS("simplify-cfg", LoopSimplifyCFGPass())<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=268452&r1=268451&r2=268452&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=268452&r1=268451&r2=268452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp Tue May  3 17:02:31 2016<br>
@@ -11,7 +11,7 @@<br>
 //<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-#include "llvm/Transforms/Scalar.h"<br>
+#include "llvm/Transforms/Scalar/LoopRotation.h"<br>
 #include "llvm/ADT/Statistic.h"<br>
 #include "llvm/Analysis/AliasAnalysis.h"<br>
 #include "llvm/Analysis/BasicAliasAnalysis.h"<br>
@@ -20,6 +20,7 @@<br>
 #include "llvm/Analysis/InstructionSimplify.h"<br>
 #include "llvm/Analysis/GlobalsModRef.h"<br>
 #include "llvm/Analysis/LoopPass.h"<br>
+#include "llvm/Analysis/LoopPassManager.h"<br>
 #include "llvm/Analysis/ScalarEvolution.h"<br>
 #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"<br>
 #include "llvm/Analysis/TargetTransformInfo.h"<br>
@@ -32,6 +33,7 @@<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/Debug.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
+#include "llvm/Transforms/Scalar.h"<br>
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"<br>
 #include "llvm/Transforms/Utils/Local.h"<br>
 #include "llvm/Transforms/Utils/LoopUtils.h"<br>
@@ -562,15 +564,36 @@ static bool iterativelyRotateLoop(Loop *<br>
   return MadeChange;<br>
 }<br>
<br>
+LoopRotatePass::LoopRotatePass() : MaxHeaderSize(DefaultRotationThreshold) {}<br>
+<br>
+PreservedAnalyses LoopRotatePass::run(Loop &L, AnalysisManager<Loop> &AM) {<br>
+  auto &FAM = AM.getResult<FunctionAnalysisManagerLoopProxy>(L).getManager();<br>
+  Function *F = L.getHeader()->getParent();<br>
+<br>
+  auto *LI = FAM.getCachedResult<LoopAnalysis>(*F);<br>
+  const auto *TTI = FAM.getCachedResult<TargetIRAnalysis>(*F);<br>
+  auto *AC = FAM.getCachedResult<AssumptionAnalysis>(*F);<br>
+  assert((LI && TTI && AC) && "Analyses for loop rotation not available");<br>
+<br>
+  // Optional analyses.<br>
+  auto *DT = FAM.getCachedResult<DominatorTreeAnalysis>(*F);<br>
+  auto *SE = FAM.getCachedResult<ScalarEvolutionAnalysis>(*F);<br>
+<br>
+  bool Changed = iterativelyRotateLoop(&L, MaxHeaderSize, LI, TTI, AC, DT, SE);<br>
+  if (!Changed)<br>
+    return PreservedAnalyses::all();<br>
+  return getLoopPassPreservedAnalyses();<br>
+}<br>
+<br>
 namespace {<br>
<br>
-class LoopRotate : public LoopPass {<br>
+class LoopRotateLegacyPass : public LoopPass {<br>
   unsigned MaxHeaderSize;<br>
<br>
 public:<br>
   static char ID; // Pass ID, replacement for typeid<br>
-  LoopRotate(int SpecifiedMaxHeaderSize = -1) : LoopPass(ID) {<br>
-    initializeLoopRotatePass(*PassRegistry::getPassRegistry());<br>
+  LoopRotateLegacyPass(int SpecifiedMaxHeaderSize = -1) : LoopPass(ID) {<br>
+    initializeLoopRotateLegacyPassPass(*PassRegistry::getPassRegistry());<br>
     if (SpecifiedMaxHeaderSize == -1)<br>
       MaxHeaderSize = DefaultRotationThreshold;<br>
     else<br>
@@ -602,13 +625,15 @@ public:<br>
 };<br>
 }<br>
<br>
-char LoopRotate::ID = 0;<br>
-INITIALIZE_PASS_BEGIN(LoopRotate, "loop-rotate", "Rotate Loops", false, false)<br>
+char LoopRotateLegacyPass::ID = 0;<br>
+INITIALIZE_PASS_BEGIN(LoopRotateLegacyPass, "loop-rotate", "Rotate Loops",<br>
+                      false, false)<br>
 INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)<br>
 INITIALIZE_PASS_DEPENDENCY(LoopPass)<br>
 INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)<br>
-INITIALIZE_PASS_END(LoopRotate, "loop-rotate", "Rotate Loops", false, false)<br>
+INITIALIZE_PASS_END(LoopRotateLegacyPass, "loop-rotate", "Rotate Loops",<br>
+                    false, false)<br>
<br>
 Pass *llvm::createLoopRotatePass(int MaxHeaderSize) {<br>
-  return new LoopRotate(MaxHeaderSize);<br>
+  return new LoopRotateLegacyPass(MaxHeaderSize);<br>
 }<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/Scalar.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=268452&r1=268451&r2=268452&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=268452&r1=268451&r2=268452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/Scalar.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/Scalar.cpp Tue May  3 17:02:31 2016<br>
@@ -53,7 +53,7 @@ void llvm::initializeScalarOpts(PassRegi<br>
   initializeLoopAccessAnalysisPass(Registry);<br>
   initializeLoopInstSimplifyPass(Registry);<br>
   initializeLoopInterchangePass(Registry);<br>
-  initializeLoopRotatePass(Registry);<br>
+  initializeLoopRotateLegacyPassPass(Registry);<br>
   initializeLoopStrengthReducePass(Registry);<br>
   initializeLoopRerollPass(Registry);<br>
   initializeLoopUnrollPass(Registry);<br>
<br>
Modified: llvm/trunk/test/Transforms/LoopRotate/basic.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopRotate/basic.ll?rev=268452&r1=268451&r2=268452&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopRotate/basic.ll?rev=268452&r1=268451&r2=268452&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/LoopRotate/basic.ll (original)<br>
+++ llvm/trunk/test/Transforms/LoopRotate/basic.ll Tue May  3 17:02:31 2016<br>
@@ -1,4 +1,6 @@<br>
 ; RUN: opt -S -loop-rotate < %s | FileCheck %s<br>
+; RUN: opt -S -passes='require<loops>,require<targetir>,require<assumptions>,loop(rotate)' < %s | FileCheck %s<br></blockquote><div><br></div><div>Sorry if this is a stupid question, but why do we need to explicitly "require" the passes when the loop-rotate already declares the dependency? (I feel like there's some part of the bigger picture that I'm missing here)</div><div><br></div><div>-- Sean Silva</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"<br>
 target triple = "x86_64-apple-darwin10.0.0"<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>