object PostDominatorTree
- Alphabetic
- By Inheritance
- PostDominatorTree
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def apply(uniqueExitNode: Option[Int], isExitNode: (Int) => Boolean, additionalExitNodes: IntTrieSet, foreachExitNode: ((Int) => Unit) => Unit, foreachSuccessorOf: (Int) => ((Int) => Unit) => Unit, foreachPredecessorOf: (Int) => ((Int) => Unit) => Unit, maxNode: Int): PostDominatorTree
Computes the post dominator tree for the given control flow graph.
Computes the post dominator tree for the given control flow graph. (The reverse control flow graph will computed on demand by this method.) If necessary, an artificial start node will be created to ensure that we have a unique start node for the post dominator tree; if created the node will have the
id = (maxNodeId+1)
; additionally, all edges are automatically reversed.If this post-dominator tree is used to compute control-dependence information, the control-dependence information is generally non-termination insensitive; i.e., conceptually every loop is expected to eventually terminate. Hence, an instruction following the loop will not depend on the
if
related to evaluating the loop condition. However, non-handled exceptions (i.e., if we have multiple exit nodes), may destroy this illusion! For details see:A New Foundation for Control Dependence and Slicing for Modern Program Structures 2007, Journal Version appeared in ACM TOPLAS
- uniqueExitNode
true
if and only if the underlying CFG has a a unique exit node. (This property is independent of theadditionalExitNodes
property which is not a statement about the underlying CFG, but a directive how to compute the post-dominator tree.)- isExitNode
A function that returns
true
if the given node – in the underlying (control-flow) graph – is an exit node; that is the node has no successors.- foreachExitNode
A function f that takes a function g with an int parameter which identifies a node and which executes g for each exit node. Note that _all nodes_ except those belonging to those transitively reachable from a start node of an infinite loop have to be reachable from the exit nodes; otherwise the PostDominatorTree will be a forest and will be generally useless.
- maxNode
The largest id used by the underlying (control-flow) graph; required to assign the virtual start node of the pdt - if required - a unique id.
Computing the post dominator tree:
scala>//Graph: 0 -> 1->E; 1 -> 2->E scala>def isExitNode(i: Int) = i == 1 || i == 2 isExitNode: (i: Int)Boolean scala>def foreachExitNode(f: Int => Unit) = { f(1); f(2) } foreachExitNode: (f: Int => Unit)Unit scala>def foreachPredecessorOf(i: Int)(f: Int => Unit) = i match { | case 0 => | case 1 => f(0) | case 2 => f(1) |} foreachPredecessorOf: (i: Int)(f: Int => Unit)Unit scala>def foreachSuccessorOf(i: Int)(f: Int => Unit) = i match { | case 0 => f(1) | case 1 => f(2) | case 2 => |} foreachSuccessorOf: (i: Int)(f: Int => Unit)Unit scala>val pdt = org.opalj.graphs.PostDominatorTree.apply( | uniqueExitNode = None, | isExitNode, | org.opalj.collection.immutable.IntTrieSet.empty, | foreachExitNode, | foreachSuccessorOf, | foreachPredecessorOf, | 2 |) pdt: org.opalj.graphs.PostDominatorTree = org.opalj.graphs.PostDominatorTree@3a82ac80 scala>pdt.toDot() scala>org.opalj.io.writeAndOpen(pdt.toDot(i => true),"PDT",".gv")
Example: - final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native() @IntrinsicCandidate()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
Deprecated Value Members
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable]) @Deprecated
- Deprecated