[PATCH] D46829: [BreakCriticalEdges] Require DominatorTree when using the old pass manager

Mikael Holmén via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 14 05:25:51 PDT 2018


uabelho created this revision.
uabelho added a reviewer: eli.friedman.

BreakCriticalEdges tries to keep LoopInfo and DominatorTree updated if they
exist. However, since commit r321653 and r321805, to update LoopInfo we
must have a DominatorTree, or we will hit an assert.

To fix this without needing to do any major changes, BreakCriticalEdges
will now require DominatorTree to be able to do the LoopInfo update.

This solves PR37334.


https://reviews.llvm.org/D46829

Files:
  lib/Transforms/Utils/BreakCriticalEdges.cpp
  test/Transforms/Util/PR37334-break-crit-edges-require-dt.ll


Index: test/Transforms/Util/PR37334-break-crit-edges-require-dt.ll
===================================================================
--- /dev/null
+++ test/Transforms/Util/PR37334-break-crit-edges-require-dt.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -loop-sink -break-crit-edges -branch-prob -S | FileCheck %s
+
+; BreakCriticalEdges tries to update LI and DT if they are present. However,
+; updating LI actually needs a DT, so BreakCriticalEdges needs to require DT.
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @f1() {
+; CHECK-LABEL: @f1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]
+; CHECK:       for.cond:
+; CHECK-NEXT:    br i1 false, label [[FOR_BODY:%.*]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
+; CHECK:       for.cond.for.end_crit_edge:
+; CHECK-NEXT:    br label [[FOR_END:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    br i1 true, label [[FOR_ENDSPLIT:%.*]], label [[FOR_INC:%.*]]
+; CHECK:       for.inc:
+; CHECK-NEXT:    br label [[FOR_COND]]
+; CHECK:       for.endsplit:
+; CHECK-NEXT:    br label [[FOR_END]]
+; CHECK:       for.end:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc, %entry
+  br i1 undef, label %for.body, label %for.end
+
+for.body:                                         ; preds = %for.cond
+  br i1 undef, label %for.end, label %for.inc
+
+for.inc:                                          ; preds = %for.body
+  br label %for.cond
+
+for.end:                                          ; preds = %for.body, %for.cond
+  ret void
+}
Index: lib/Transforms/Utils/BreakCriticalEdges.cpp
===================================================================
--- lib/Transforms/Utils/BreakCriticalEdges.cpp
+++ lib/Transforms/Utils/BreakCriticalEdges.cpp
@@ -57,6 +57,8 @@
     }
 
     void getAnalysisUsage(AnalysisUsage &AU) const override {
+      // We need DominatorTree to be able to update LoopInfo.
+      AU.addRequired<DominatorTreeWrapperPass>();
       AU.addPreserved<DominatorTreeWrapperPass>();
       AU.addPreserved<LoopInfoWrapperPass>();
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46829.146582.patch
Type: text/x-patch
Size: 2194 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180514/2f27e292/attachment.bin>


More information about the llvm-commits mailing list