[PATCH] D78012: [MLIR] Fix dominance info method - properlyDominates
Uday Bondhugula via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 13 03:44:22 PDT 2020
bondhugula updated this revision to Diff 256955.
bondhugula added a comment.
Update comments.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D78012/new/
https://reviews.llvm.org/D78012
Files:
mlir/lib/Analysis/Dominance.cpp
mlir/test/IR/dominance.mlir
Index: mlir/test/IR/dominance.mlir
===================================================================
--- /dev/null
+++ mlir/test/IR/dominance.mlir
@@ -0,0 +1,38 @@
+// RUN: mlir-opt %s | FileCheck %s
+
+// Verify dominance related functions in "cyclic" cases.
+// CHECK-LABEL: func @dominance
+func @dominance(%n: i32, %p : i1) -> i32 {
+ %x = addi %n, %n : i32
+ return %x : i32
+
+ // Self loop.
+^bar:
+ %y = addi %z, %x : i32
+ // muli does dominate addi.
+ %z = muli %y, %y : i32
+ br ^bar
+
+ // abc and xyz cycle.
+^abc:
+ %a = addi %b, %x : i32
+ // muli does dominate addi.
+ %b = muli %a, %a : i32
+ br ^xyz
+
+^xyz:
+ br ^abc
+
+ // c1, c2, c3 are an SCC.
+^c1:
+ %u = addi %v, %x : i32
+ // muli does dominate addi.
+ %v = muli %u, %u : i32
+ cond_br %p, ^c2, ^c3
+
+^c2:
+ br ^c1
+
+^c3:
+ br ^c1
+}
Index: mlir/lib/Analysis/Dominance.cpp
===================================================================
--- mlir/lib/Analysis/Dominance.cpp
+++ mlir/lib/Analysis/Dominance.cpp
@@ -183,17 +183,29 @@
// DominanceInfo
//===----------------------------------------------------------------------===//
-/// Return true if operation A properly dominates operation B.
+/// Returns true if operation A properly dominates operation B.
bool DominanceInfo::properlyDominates(Operation *a, Operation *b) {
auto *aBlock = a->getBlock(), *bBlock = b->getBlock();
- // If a or b are not within a block, then a does not dominate b.
+ // If a or b are not within a block, then a does not properly dominate b.
if (!aBlock || !bBlock)
return false;
// If the blocks are the same, then check if b is before a in the block.
- if (aBlock == bBlock)
- return a->isBeforeInBlock(b);
+ if (aBlock == bBlock) {
+ if (a->isBeforeInBlock(b))
+ return true;
+
+ // Even if b is before a in their block, if aBlock dominates all
+ // predecessors of aBlock, a dominates b.
+
+ // Can't be equal for proper dominance.
+ if (a == b || aBlock->hasNoPredecessors())
+ return false;
+
+ return llvm::all_of(aBlock->getPredecessors(),
+ [&](Block *p) { return dominates(aBlock, p); });
+ }
// Traverse up b's hierarchy to check if b's block is contained in a's.
if (auto *bAncestor = aBlock->findAncestorOpInBlock(*b)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78012.256955.patch
Type: text/x-patch
Size: 2311 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200413/db9b1fc2/attachment.bin>
More information about the llvm-commits
mailing list