SSA: Remove the need for ExitBasicBlock in SSA.

This commit is contained in:
Anders Schack-Mulligen
2025-02-10 14:36:18 +01:00
parent 34edda6b9b
commit 0b5270979d
11 changed files with 6 additions and 36 deletions

View File

@@ -769,8 +769,4 @@ module InputSigCommon {
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) } BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) }
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock extends BasicBlock {
ExitBasicBlock() { this.getLastInstruction() instanceof ExitFunctionInstruction }
}
} }

View File

@@ -90,7 +90,7 @@ module PreSsa {
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock extends BasicBlock { private class ExitBasicBlock extends BasicBlock {
ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) } ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) }
} }

View File

@@ -55,8 +55,6 @@ module BaseSsa {
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock extends BasicBlock, ControlFlow::BasicBlocks::ExitBlock { }
class SourceVariable = PreSsa::SimpleLocalScopeVariable; class SourceVariable = PreSsa::SimpleLocalScopeVariable;
predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {

View File

@@ -17,8 +17,6 @@ private module SsaInput implements SsaImplCommon::InputSig<Location> {
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock extends BasicBlock, ControlFlow::BasicBlocks::ExitBlock { }
class SourceVariable = Ssa::SourceVariable; class SourceVariable = Ssa::SourceVariable;
/** /**

View File

@@ -240,8 +240,6 @@ module VariableCaptureConfig implements InputSig<js::DbLocation> {
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() } BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() }
predicate entryBlock(BasicBlock bb) { bb instanceof js::EntryBasicBlock } predicate entryBlock(BasicBlock bb) { bb instanceof js::EntryBasicBlock }
predicate exitBlock(BasicBlock bb) { bb.getLastNode() instanceof js::ControlFlowExitNode }
} }
module VariableCaptureOutput = Flow<js::DbLocation, VariableCaptureConfig>; module VariableCaptureOutput = Flow<js::DbLocation, VariableCaptureConfig>;

View File

@@ -14,10 +14,6 @@ module SsaConfig implements InputSig<js::DbLocation> {
class BasicBlock = js::BasicBlock; class BasicBlock = js::BasicBlock;
class ExitBasicBlock extends BasicBlock {
ExitBasicBlock() { this.isExitBlock() }
}
class SourceVariable extends LocalVariableOrThis { class SourceVariable extends LocalVariableOrThis {
SourceVariable() { not this.isCaptured() } SourceVariable() { not this.isCaptured() }
} }

View File

@@ -18,8 +18,6 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock extends BasicBlock, BasicBlocks::ExitBasicBlock { }
class SourceVariable = LocalVariable; class SourceVariable = LocalVariable;
/** /**

View File

@@ -47,8 +47,6 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock = BasicBlocks::ExitBasicBlock;
/** /**
* A variable amenable to SSA construction. * A variable amenable to SSA construction.
* *

View File

@@ -67,9 +67,6 @@ signature module InputSig<LocationSig Location> {
/** Holds if `bb` is a control-flow entry point. */ /** Holds if `bb` is a control-flow entry point. */
default predicate entryBlock(BasicBlock bb) { not exists(getImmediateBasicBlockDominator(bb)) } default predicate entryBlock(BasicBlock bb) { not exists(getImmediateBasicBlockDominator(bb)) }
/** Holds if `bb` is a control-flow exit point. */
default predicate exitBlock(BasicBlock bb) { not exists(getABasicBlockSuccessor(bb)) }
/** A variable that is captured in a closure. */ /** A variable that is captured in a closure. */
class CapturedVariable { class CapturedVariable {
/** Gets a textual representation of this variable. */ /** Gets a textual representation of this variable. */
@@ -699,10 +696,6 @@ module Flow<LocationSig Location, InputSig<Location> Input> implements OutputSig
result = Input::getABasicBlockSuccessor(bb) result = Input::getABasicBlockSuccessor(bb)
} }
class ExitBasicBlock extends BasicBlock {
ExitBasicBlock() { exitBlock(this) }
}
class SourceVariable = CaptureContainer; class SourceVariable = CaptureContainer;
predicate variableWrite(BasicBlock bb, int i, SourceVariable cc, boolean certain) { predicate variableWrite(BasicBlock bb, int i, SourceVariable cc, boolean certain) {

View File

@@ -60,12 +60,6 @@ signature module InputSig<LocationSig Location> {
/** Gets an immediate successor of basic block `bb`, if any. */ /** Gets an immediate successor of basic block `bb`, if any. */
BasicBlock getABasicBlockSuccessor(BasicBlock bb); BasicBlock getABasicBlockSuccessor(BasicBlock bb);
/**
* An exit basic block, that is, a basic block whose last node is
* an exit node.
*/
class ExitBasicBlock extends BasicBlock;
/** A variable that can be SSA converted. */ /** A variable that can be SSA converted. */
class SourceVariable { class SourceVariable {
/** Gets a textual representation of this variable. */ /** Gets a textual representation of this variable. */
@@ -855,6 +849,9 @@ module Make<LocationSig Location, InputSig<Location> Input> {
lastRefRedef(inp, _, _, def) lastRefRedef(inp, _, _, def)
} }
/** Holds if `bb` is a control-flow exit point. */
private predicate exitBlock(BasicBlock bb) { not exists(getABasicBlockSuccessor(bb)) }
/** /**
* NB: If this predicate is exposed, it should be cached. * NB: If this predicate is exposed, it should be cached.
* *
@@ -873,7 +870,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
lastSsaRefExt(def, _, bb, i) and lastSsaRefExt(def, _, bb, i) and
( (
// Can reach exit directly // Can reach exit directly
bb instanceof ExitBasicBlock exitBlock(bb)
or or
// Can reach a block using one or more steps, where `def` is no longer live // Can reach a block using one or more steps, where `def` is no longer live
varBlockReachesExitExt(def, bb) varBlockReachesExitExt(def, bb)
@@ -893,7 +890,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
lastSsaRef(def, _, bb, i) and lastSsaRef(def, _, bb, i) and
( (
// Can reach exit directly // Can reach exit directly
bb instanceof ExitBasicBlock exitBlock(bb)
or or
// Can reach a block using one or more steps, where `def` is no longer live // Can reach a block using one or more steps, where `def` is no longer live
varBlockReachesExit(def, bb) varBlockReachesExit(def, bb)

View File

@@ -21,8 +21,6 @@ module Ssa {
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
class ExitBasicBlock = BasicBlocks::ExitBasicBlock;
private newtype TSourceVariable = private newtype TSourceVariable =
TNormalSourceVariable(VarDecl v) or TNormalSourceVariable(VarDecl v) or
TKeyPathSourceVariable(EntryNode entry) { entry.getScope() instanceof KeyPathExpr } TKeyPathSourceVariable(EntryNode entry) { entry.getScope() instanceof KeyPathExpr }