11/**
22 * Provides classes and predicates for control-flow graph dominance.
33 */
4+
45import java
56private import semmle.code.java.ControlFlowGraph
67
7-
88/*
99 * Predicates for basic-block-level dominance.
1010 */
@@ -20,47 +20,47 @@ private predicate flowEntry(Stmt entry) {
2020}
2121
2222/** The successor relation for basic blocks. */
23- private predicate bbSucc ( BasicBlock pre , BasicBlock post ) {
24- post = pre .getABBSuccessor ( )
25- }
23+ private predicate bbSucc ( BasicBlock pre , BasicBlock post ) { post = pre .getABBSuccessor ( ) }
2624
2725/** The immediate dominance relation for basic blocks. */
28- cached predicate bbIDominates ( BasicBlock dom , BasicBlock node ) = idominance( flowEntry / 1 , bbSucc / 2 ) ( _, dom , node )
26+ cached
27+ predicate bbIDominates ( BasicBlock dom , BasicBlock node ) =
28+ idominance( flowEntry / 1 , bbSucc / 2 ) ( _, dom , node )
2929
3030/** Holds if the dominance relation is calculated for `bb`. */
3131predicate hasDominanceInformation ( BasicBlock bb ) {
3232 exists ( BasicBlock entry | flowEntry ( entry ) and bbSucc * ( entry , bb ) )
3333}
3434
3535/** Exit points for control-flow. */
36- private predicate flowExit ( Callable exit ) {
37- exists ( ControlFlowNode s | s .getASuccessor ( ) = exit )
38- }
36+ private predicate flowExit ( Callable exit ) { exists ( ControlFlowNode s | s .getASuccessor ( ) = exit ) }
3937
4038/** Exit points for basic-block control-flow. */
41- private predicate bbSink ( BasicBlock exit ) {
42- flowExit ( exit .getLastNode ( ) )
43- }
39+ private predicate bbSink ( BasicBlock exit ) { flowExit ( exit .getLastNode ( ) ) }
4440
4541/** Reversed `bbSucc`. */
46- private predicate bbPred ( BasicBlock post , BasicBlock pre ) {
47- post = pre .getABBSuccessor ( )
48- }
42+ private predicate bbPred ( BasicBlock post , BasicBlock pre ) { post = pre .getABBSuccessor ( ) }
4943
5044/** The immediate post-dominance relation on basic blocks. */
51- cached predicate bbIPostDominates ( BasicBlock dominator , BasicBlock node ) = idominance( bbSink / 1 , bbPred / 2 ) ( _, dominator , node )
45+ cached
46+ predicate bbIPostDominates ( BasicBlock dominator , BasicBlock node ) =
47+ idominance( bbSink / 1 , bbPred / 2 ) ( _, dominator , node )
5248
5349/** Holds if `dom` strictly dominates `node`. */
5450predicate bbStrictlyDominates ( BasicBlock dom , BasicBlock node ) { bbIDominates + ( dom , node ) }
5551
5652/** Holds if `dom` dominates `node`. (This is reflexive.) */
57- predicate bbDominates ( BasicBlock dom , BasicBlock node ) { bbStrictlyDominates ( dom , node ) or dom = node }
53+ predicate bbDominates ( BasicBlock dom , BasicBlock node ) {
54+ bbStrictlyDominates ( dom , node ) or dom = node
55+ }
5856
5957/** Holds if `dom` strictly post-dominates `node`. */
6058predicate bbStrictlyPostDominates ( BasicBlock dom , BasicBlock node ) { bbIPostDominates + ( dom , node ) }
6159
6260/** Holds if `dom` post-dominates `node`. (This is reflexive.) */
63- predicate bbPostDominates ( BasicBlock dom , BasicBlock node ) { bbStrictlyPostDominates ( dom , node ) or dom = node }
61+ predicate bbPostDominates ( BasicBlock dom , BasicBlock node ) {
62+ bbStrictlyPostDominates ( dom , node ) or dom = node
63+ }
6464
6565/**
6666 * The dominance frontier relation for basic blocks.
@@ -86,7 +86,8 @@ predicate dominanceFrontier(BasicBlock x, BasicBlock w) {
8686
8787/** Immediate dominance relation on control-flow graph nodes. */
8888predicate iDominates ( ControlFlowNode dominator , ControlFlowNode node ) {
89- exists ( BasicBlock bb , int i | dominator = bb .getNode ( i ) and node = bb .getNode ( i + 1 ) ) or
89+ exists ( BasicBlock bb , int i | dominator = bb .getNode ( i ) and node = bb .getNode ( i + 1 ) )
90+ or
9091 exists ( BasicBlock dom , BasicBlock bb |
9192 bbIDominates ( dom , bb ) and
9293 dominator = dom .getLastNode ( ) and
@@ -100,9 +101,7 @@ predicate strictlyDominates(ControlFlowNode dom, ControlFlowNode node) {
100101 // This predicate is gigantic, so it must be inlined.
101102 bbStrictlyDominates ( dom .getBasicBlock ( ) , node .getBasicBlock ( ) )
102103 or
103- exists ( BasicBlock b , int i , int j |
104- dom = b .getNode ( i ) and node = b .getNode ( j ) and i < j
105- )
104+ exists ( BasicBlock b , int i , int j | dom = b .getNode ( i ) and node = b .getNode ( j ) and i < j )
106105}
107106
108107/** Holds if `dom` dominates `node`. (This is reflexive.) */
@@ -111,9 +110,7 @@ predicate dominates(ControlFlowNode dom, ControlFlowNode node) {
111110 // This predicate is gigantic, so it must be inlined.
112111 bbStrictlyDominates ( dom .getBasicBlock ( ) , node .getBasicBlock ( ) )
113112 or
114- exists ( BasicBlock b , int i , int j |
115- dom = b .getNode ( i ) and node = b .getNode ( j ) and i <= j
116- )
113+ exists ( BasicBlock b , int i , int j | dom = b .getNode ( i ) and node = b .getNode ( j ) and i <= j )
117114}
118115
119116/** Holds if `dom` strictly post-dominates `node`. */
@@ -122,9 +119,7 @@ predicate strictlyPostDominates(ControlFlowNode dom, ControlFlowNode node) {
122119 // This predicate is gigantic, so it must be inlined.
123120 bbStrictlyPostDominates ( dom .getBasicBlock ( ) , node .getBasicBlock ( ) )
124121 or
125- exists ( BasicBlock b , int i , int j |
126- dom = b .getNode ( i ) and node = b .getNode ( j ) and i > j
127- )
122+ exists ( BasicBlock b , int i , int j | dom = b .getNode ( i ) and node = b .getNode ( j ) and i > j )
128123}
129124
130125/** Holds if `dom` post-dominates `node`. (This is reflexive.) */
@@ -133,7 +128,5 @@ predicate postDominates(ControlFlowNode dom, ControlFlowNode node) {
133128 // This predicate is gigantic, so it must be inlined.
134129 bbStrictlyPostDominates ( dom .getBasicBlock ( ) , node .getBasicBlock ( ) )
135130 or
136- exists ( BasicBlock b , int i , int j |
137- dom = b .getNode ( i ) and node = b .getNode ( j ) and i >= j
138- )
131+ exists ( BasicBlock b , int i , int j | dom = b .getNode ( i ) and node = b .getNode ( j ) and i >= j )
139132}
0 commit comments