<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 22, 2016 at 11:04 AM, Wei Mi 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: wmi<br>
Date: Fri Jul 22 13:04:25 2016<br>
New Revision: 276449<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=276449&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=276449&view=rev</a><br>
Log:<br>
[PM] Port BreakCriticalEdges to the new PM.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D22688" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22688</a><br>
<br>
Added:<br>
    llvm/trunk/include/llvm/Transforms/Utils/BreakCriticalEdges.h<br>
Modified:<br>
    llvm/trunk/lib/Passes/PassBuilder.cpp<br>
    llvm/trunk/lib/Passes/PassRegistry.def<br>
    llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp<br>
    llvm/trunk/test/Analysis/Dominators/2006-10-02-BreakCritEdges.ll<br>
    llvm/trunk/test/Analysis/Dominators/2007-01-14-BreakCritEdges.ll<br>
<br>
Added: llvm/trunk/include/llvm/Transforms/Utils/BreakCriticalEdges.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BreakCriticalEdges.h?rev=276449&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BreakCriticalEdges.h?rev=276449&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Utils/BreakCriticalEdges.h (added)<br>
+++ llvm/trunk/include/llvm/Transforms/Utils/BreakCriticalEdges.h Fri Jul 22 13:04:25 2016<br>
@@ -0,0 +1,29 @@<br>
+//===- BreakCriticalEdges.h - Critical Edge Elimination Pass --------------===//<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>
+// BreakCriticalEdges pass - Break all of the critical edges in the CFG by<br>
+// inserting a dummy basic block.  This pass may be "required" by passes that<br>
+// cannot deal with critical edges.  For this usage, the structure type is<br>
+// forward declared.  This pass obviously invalidates the CFG, but can update<br>
+// dominator trees.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef LLVM_TRANSFORMS_UTILS_BREAKCRITICALEDGES_H<br>
+#define LLVM_TRANSFORMS_UTILS_BREAKCRITICALEDGES_H<br>
+<br>
+#include "llvm/IR/Function.h"<br>
+#include "llvm/IR/PassManager.h"<br>
+<br>
+namespace llvm {<br>
+struct BreakCriticalEdgesPass : public PassInfoMixin<BreakCriticalEdgesPass> {<br>
+  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);<br>
+};<br>
+} // namespace llvm<br>
+#endif // LLVM_TRANSFORMS_UTILS_BREAKCRITICALEDGES_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=276449&r1=276448&r2=276449&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=276449&r1=276448&r2=276449&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)<br>
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Fri Jul 22 13:04:25 2016<br>
@@ -113,6 +113,7 @@<br>
 #include "llvm/Transforms/Scalar/Sink.h"<br>
 #include "llvm/Transforms/Scalar/TailRecursionElimination.h"<br>
 #include "llvm/Transforms/Utils/AddDiscriminators.h"<br>
+#include "llvm/Transforms/Utils/BreakCriticalEdges.h"<br>
 #include "llvm/Transforms/Utils/LCSSA.h"<br>
 #include "llvm/Transforms/Utils/LoopSimplify.h"<br>
 #include "llvm/Transforms/Utils/Mem2Reg.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=276449&r1=276448&r2=276449&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=276449&r1=276448&r2=276449&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassRegistry.def (original)<br>
+++ llvm/trunk/lib/Passes/PassRegistry.def Fri Jul 22 13:04:25 2016<br>
@@ -130,6 +130,7 @@ FUNCTION_PASS("adce", ADCEPass())<br>
 FUNCTION_PASS("add-discriminators", AddDiscriminatorsPass())<br>
 FUNCTION_PASS("alignment-from-assumptions", AlignmentFromAssumptionsPass())<br>
 FUNCTION_PASS("bdce", BDCEPass())<br>
+FUNCTION_PASS("break-crit-edges", BreakCriticalEdgesPass())<br>
 FUNCTION_PASS("consthoist", ConstantHoistingPass())<br>
 FUNCTION_PASS("correlated-propagation", CorrelatedValuePropagationPass())<br>
 FUNCTION_PASS("dce", DCEPass())<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp?rev=276449&r1=276448&r2=276449&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp?rev=276449&r1=276448&r2=276449&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/BreakCriticalEdges.cpp Fri Jul 22 13:04:25 2016<br>
@@ -15,7 +15,7 @@<br>
 //<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-#include "llvm/Transforms/Scalar.h"<br>
+#include "llvm/Transforms/Utils/BreakCriticalEdges.h"<br>
 #include "llvm/ADT/SmallVector.h"<br>
 #include "llvm/ADT/Statistic.h"<br>
 #include "llvm/Analysis/AliasAnalysis.h"<br>
@@ -23,10 +23,10 @@<br>
 #include "llvm/Analysis/LoopInfo.h"<br>
 #include "llvm/IR/CFG.h"<br>
 #include "llvm/IR/Dominators.h"<br>
-#include "llvm/IR/Function.h"<br>
 #include "llvm/IR/Instructions.h"<br>
 #include "llvm/IR/Type.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
+#include "llvm/Transforms/Scalar.h"<br>
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"<br>
 using namespace llvm;<br>
<br>
@@ -72,6 +72,20 @@ FunctionPass *llvm::createBreakCriticalE<br>
   return new BreakCriticalEdges();<br>
 }<br>
<br>
+PreservedAnalyses BreakCriticalEdgesPass::run(Function &F,<br>
+                                              FunctionAnalysisManager &AM) {<br>
+  auto *DT = AM.getCachedResult<DominatorTreeAnalysis>(F);<br>
+  auto *LI = AM.getCachedResult<LoopAnalysis>(F);<br>
+  unsigned N = SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI));<br>
+  NumBroken += N;<br>
+  if (N == 0)<br>
+    return PreservedAnalyses::all();<br>
+  PreservedAnalyses PA;<br>
+  PA.preserve<DominatorTreeAnalysis>();<br>
+  PA.preserve<LoopAnalysis>();<br>
+  return PA;<br>
+}<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 //    Implementation of the external critical edge manipulation functions<br>
 //===----------------------------------------------------------------------===//<br>
<br>
Modified: llvm/trunk/test/Analysis/Dominators/2006-10-02-BreakCritEdges.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/Dominators/2006-10-02-BreakCritEdges.ll?rev=276449&r1=276448&r2=276449&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/Dominators/2006-10-02-BreakCritEdges.ll?rev=276449&r1=276448&r2=276449&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/Dominators/2006-10-02-BreakCritEdges.ll (original)<br>
+++ llvm/trunk/test/Analysis/Dominators/2006-10-02-BreakCritEdges.ll Fri Jul 22 13:04:25 2016<br>
@@ -1,4 +1,5 @@<br>
 ; RUN: opt < %s -domtree -break-crit-edges -analyze -domtree | FileCheck %s<br>
+; RUN: opt < %s -passes='require<domtree>,break-crit-edges,print<domtree>' -disable-output 2>&1| FileCheck %s<br>
 ; PR932<br>
<br>
 ; CHECK: [3] %brtrue {1,2}<br>
<br>
Modified: llvm/trunk/test/Analysis/Dominators/2007-01-14-BreakCritEdges.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/Dominators/2007-01-14-BreakCritEdges.ll?rev=276449&r1=276448&r2=276449&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/Dominators/2007-01-14-BreakCritEdges.ll?rev=276449&r1=276448&r2=276449&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/Dominators/2007-01-14-BreakCritEdges.ll (original)<br>
+++ llvm/trunk/test/Analysis/Dominators/2007-01-14-BreakCritEdges.ll Fri Jul 22 13:04:25 2016<br>
@@ -1,4 +1,5 @@<br>
 ; RUN: opt < %s -domtree -break-crit-edges -domtree -disable-output<br>
+; RUN: opt < %s -passes='require<domtree>,break-crit-edges,require<domtree>' -disable-output<br></blockquote><div><br></div><div>I don't think we need `require<domtree>` at the end of this pipeline.</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 ; PR1110<br>
<br>
        %struct.OggVorbis_File = type { i8*, i32, i64, i64, %struct.ogg_sync_state, i32, i64*, i64*, i32*, i64*, %struct.vorbis_info*, %struct.vorbis_comment*, i64, i32, i32, i32, double, double, %struct.ogg_stream_state, %struct.vorbis_dsp_state, %struct.vorbis_block, %struct.ov_callbacks }<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>