<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>