@@ -82,14 +82,12 @@ signature module InputSig<LocationSig Location> {
82
82
* Gets an `id` of `node`. This is used to order the predecessors of a join
83
83
* basic block.
84
84
*/
85
- bindingset [ node]
86
85
int idOfAstNode ( AstNode node ) ;
87
86
88
87
/**
89
88
* Gets an `id` of `scope`. This is used to order the predecessors of a join
90
89
* basic block.
91
90
*/
92
- bindingset [ scope]
93
91
int idOfCfgScope ( CfgScope scope ) ;
94
92
}
95
93
@@ -1008,6 +1006,41 @@ module MakeWithSplitting<
1008
1006
)
1009
1007
}
1010
1008
1009
+ private module JoinBlockPredecessors {
1010
+ predicate hasIdAndKind ( BasicBlocks:: JoinPredecessorBasicBlock jbp , int id , int kind ) {
1011
+ id = idOfCfgScope ( jbp .( BasicBlocks:: EntryBasicBlock ) .getScope ( ) ) and
1012
+ kind = 0
1013
+ or
1014
+ not jbp instanceof BasicBlocks:: EntryBasicBlock and
1015
+ id = idOfAstNode ( jbp .getFirstNode ( ) .( AstCfgNode ) .getAstNode ( ) ) and
1016
+ kind = 1
1017
+ }
1018
+
1019
+ string getSplitString ( BasicBlocks:: JoinPredecessorBasicBlock jbp ) {
1020
+ result = jbp .getFirstNode ( ) .( AstCfgNode ) .getSplitsString ( )
1021
+ or
1022
+ not exists ( jbp .getFirstNode ( ) .( AstCfgNode ) .getSplitsString ( ) ) and
1023
+ result = ""
1024
+ }
1025
+ }
1026
+
1027
+ /**
1028
+ * Gets the `i`th predecessor of join block `jb`, with respect to some
1029
+ * arbitrary order.
1030
+ */
1031
+ cached
1032
+ BasicBlocks:: JoinPredecessorBasicBlock getJoinBlockPredecessor (
1033
+ BasicBlocks:: JoinBasicBlock jb , int i
1034
+ ) {
1035
+ result =
1036
+ rank [ i + 1 ] ( BasicBlocks:: JoinPredecessorBasicBlock jbp , int id , int kind |
1037
+ jbp = jb .getAPredecessor ( ) and
1038
+ JoinBlockPredecessors:: hasIdAndKind ( jbp , id , kind )
1039
+ |
1040
+ jbp order by id , kind , JoinBlockPredecessors:: getSplitString ( jbp )
1041
+ )
1042
+ }
1043
+
1011
1044
cached
1012
1045
module Public {
1013
1046
/**
@@ -1570,15 +1603,13 @@ module MakeWithSplitting<
1570
1603
BasicBlock getASuccessor ( ) { result = super .getASuccessor ( ) }
1571
1604
1572
1605
/** Gets an immediate successor of this basic block of a given type, if any. */
1573
- BasicBlock getASuccessor ( SuccessorType t ) {
1574
- result .getFirstNode ( ) = this .getLastNode ( ) .getASuccessor ( t )
1575
- }
1606
+ BasicBlock getASuccessor ( SuccessorType t ) { result = super .getASuccessor ( t ) }
1576
1607
1577
1608
/** Gets an immediate predecessor of this basic block, if any. */
1578
- BasicBlock getAPredecessor ( ) { result . getASuccessor ( ) = this }
1609
+ BasicBlock getAPredecessor ( ) { result = super . getAPredecessor ( ) }
1579
1610
1580
1611
/** Gets an immediate predecessor of this basic block of a given type, if any. */
1581
- BasicBlock getAPredecessor ( SuccessorType t ) { result . getASuccessor ( t ) = this }
1612
+ BasicBlock getAPredecessor ( SuccessorType t ) { result = super . getAPredecessor ( t ) }
1582
1613
1583
1614
/**
1584
1615
* Holds if this basic block immediately dominates basic block `bb`.
@@ -1673,38 +1704,6 @@ module MakeWithSplitting<
1673
1704
ExitBasicBlock ( ) { this .getLastNode ( ) instanceof ExitNode }
1674
1705
}
1675
1706
1676
- private module JoinBlockPredecessors {
1677
- predicate hasIdAndKind ( JoinPredecessorBasicBlock jbp , int id , int kind ) {
1678
- id = idOfCfgScope ( jbp .( EntryBasicBlock ) .getScope ( ) ) and
1679
- kind = 0
1680
- or
1681
- not jbp instanceof EntryBasicBlock and
1682
- id = idOfAstNode ( jbp .getFirstNode ( ) .( AstCfgNode ) .getAstNode ( ) ) and
1683
- kind = 1
1684
- }
1685
-
1686
- string getSplitString ( JoinPredecessorBasicBlock jbp ) {
1687
- result = jbp .getFirstNode ( ) .( AstCfgNode ) .getSplitsString ( )
1688
- or
1689
- not exists ( jbp .getFirstNode ( ) .( AstCfgNode ) .getSplitsString ( ) ) and
1690
- result = ""
1691
- }
1692
- }
1693
-
1694
- /**
1695
- * Gets the `i`th predecessor of join block `jb`, with respect to some
1696
- * arbitrary order.
1697
- */
1698
- cached
1699
- JoinPredecessorBasicBlock getJoinBlockPredecessor ( JoinBasicBlock jb , int i ) {
1700
- result =
1701
- rank [ i + 1 ] ( JoinPredecessorBasicBlock jbp , int id , int kind |
1702
- jbp = jb .getAPredecessor ( ) and JoinBlockPredecessors:: hasIdAndKind ( jbp , id , kind )
1703
- |
1704
- jbp order by id , kind , JoinBlockPredecessors:: getSplitString ( jbp )
1705
- )
1706
- }
1707
-
1708
1707
/** A basic block with more than one predecessor. */
1709
1708
final class JoinBasicBlock extends BasicBlock {
1710
1709
JoinBasicBlock ( ) { this .getFirstNode ( ) .isJoin ( ) }
0 commit comments