BasicBlock: Replace entryBlock predicate with subclass.

This commit is contained in:
Anders Schack-Mulligen
2025-09-01 11:47:33 +02:00
parent e2eb6dbbf2
commit 09b2c5abf0
13 changed files with 54 additions and 29 deletions

View File

@@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig<Language::Location> {
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { isEntryBlock(this) }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
}
cached

View File

@@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig<Language::Location> {
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { isEntryBlock(this) }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
}
cached

View File

@@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig<Language::Location> {
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { isEntryBlock(this) }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
}
cached

View File

@@ -341,6 +341,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
private class BasicBlockAlias = BasicBlock;
private class EntryBasicBlockAlias = EntryBasicBlock;
module Cfg implements BB::CfgSig<Location> {
class ControlFlowNode = ControlFlow::Node;
@@ -348,9 +350,9 @@ module Cfg implements BB::CfgSig<Location> {
class BasicBlock = BasicBlockAlias;
class EntryBasicBlock = EntryBasicBlockAlias;
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
BasicBlocksImpl::dominatingEdge(bb1, bb2)
}
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
}

View File

@@ -167,9 +167,11 @@ module PreCfg implements BB::CfgSig<Location> {
class BasicBlock = PreBasicBlock;
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { entryBB(this) }
}
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
conditionBlockImmediatelyControls(bb1, bb2, _)
}
predicate entryBlock(BasicBlock bb) { entryBB(bb) }
}

View File

@@ -165,7 +165,7 @@ module Cfg implements BB::CfgSig<Location> {
class BasicBlock = BasicBlockAlias;
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) }
class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { }
predicate entryBlock(BasicBlock bb) { BbImpl::entryBlock(bb) }
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) }
}

View File

@@ -402,13 +402,15 @@ module Public {
predicate postDominates(BasicBlock bb) { this.(ReachableBasicBlock).postDominates(bb) }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { entryBB(this) }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
predicate entryBlock(BasicBlock bb) { entryBB(bb) }
}
}

View File

@@ -1295,12 +1295,14 @@ module Cfg implements BB::CfgSig<Location> {
}
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { this.getNode(0).isEntryNode() }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
predicate entryBlock(BasicBlock bb) { bb.getNode(0).isEntryNode() }
}

View File

@@ -300,6 +300,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
private class BasicBlockAlias = BasicBlock;
private class EntryBasicBlockAlias = EntryBasicBlock;
private class SuccessorTypeAlias = SuccessorType;
module Cfg implements BB::CfgSig<Location> {
@@ -309,9 +311,9 @@ module Cfg implements BB::CfgSig<Location> {
class BasicBlock = BasicBlockAlias;
class EntryBasicBlock = EntryBasicBlockAlias;
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
BasicBlocksImpl::dominatingEdge(bb1, bb2)
}
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
}

View File

@@ -25,7 +25,7 @@ module Cfg implements BB::CfgSig<Location> {
class BasicBlock = BasicBlocksImpl::BasicBlock;
predicate dominatingEdge = BasicBlocksImpl::dominatingEdge/2;
class EntryBasicBlock = BasicBlocksImpl::EntryBasicBlock;
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
predicate dominatingEdge = BasicBlocksImpl::dominatingEdge/2;
}

View File

@@ -150,6 +150,12 @@ signature module CfgSig<LocationSig Location> {
predicate postDominates(BasicBlock bb);
}
/**
* An entry basic block, that is, a basic block whose first node is
* an entry node.
*/
class EntryBasicBlock extends BasicBlock;
/**
* Holds if `bb1` has `bb2` as a direct successor and the edge between `bb1`
* and `bb2` is a dominating edge.
@@ -164,9 +170,6 @@ signature module CfgSig<LocationSig Location> {
* means that the edge `(bb1, bb2)` dominates `bb3`.
*/
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2);
/** Holds if `bb` is an entry basic block. */
predicate entryBlock(BasicBlock bb);
}
/**
@@ -365,6 +368,10 @@ module Make<LocationSig Location, InputSig<Location> Input> implements CfgSig<Lo
string toString() { result = this.getFirstNode().toString() }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { nodeIsDominanceEntry(this.getFirstNode()) }
}
/**
* Holds if `bb1` has `bb2` as a direct successor and the edge between `bb1`
* and `bb2` is a dominating edge.
@@ -401,9 +408,6 @@ module Make<LocationSig Location, InputSig<Location> Input> implements CfgSig<Lo
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
/** Holds if `bb` is an entry basic block. */
predicate entryBlock(BasicBlock bb) { nodeIsDominanceEntry(bb.getFirstNode()) }
cached
private module Cached {
private Node nodeGetAPredecessor(Node node, SuccessorType s) {
@@ -477,6 +481,9 @@ module Make<LocationSig Location, InputSig<Location> Input> implements CfgSig<Lo
bb2.getFirstNode() = nodeGetASuccessor(bb1.getLastNode(), t)
}
/** Holds if `bb` is an entry basic block. */
private predicate entryBlock(EntryBasicBlock bb) { any() }
/**
* Holds if the first node of basic block `succ` is a control flow
* successor of the last node of basic block `pred`.

View File

@@ -628,7 +628,7 @@ module Flow<
/** Holds if `cc` needs a definition at the entry of its callable scope. */
private predicate entryDef(CaptureContainer cc, BasicBlock bb, int i) {
exists(Callable c |
Cfg::entryBlock(bb) and
bb instanceof Cfg::EntryBasicBlock and
pragma[only_bind_out](bb.getEnclosingCallable()) = c and
i =
min(int j |

View File

@@ -116,6 +116,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
private class BasicBlockAlias = BasicBlock;
private class EntryBasicBlockAlias = EntryBasicBlock;
private class ControlFlowNodeAlias = ControlFlowNode;
private class SuccessorTypeAlias = SuccessorType;
@@ -127,9 +129,9 @@ module Cfg implements BB::CfgSig<Location> {
class BasicBlock = BasicBlockAlias;
class EntryBasicBlock = EntryBasicBlockAlias;
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
BasicBlocksImpl::dominatingEdge(bb1, bb2)
}
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
}