enterSSAImpl() — react Function Reference
Architecture documentation for the enterSSAImpl() function in EnterSSA.ts from the react codebase.
Entity Profile
Dependency Diagram
graph TD 8ec30eb2_4622_378f_f538_3070f7a38fae["enterSSAImpl()"] 1aa7ee2e_5f6c_b797_fe10_9a09d30a5e12["EnterSSA.ts"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|defined in| 1aa7ee2e_5f6c_b797_fe10_9a09d30a5e12 cc090a34_b3bf_6814_8207_d2908a40992a["enterSSA()"] cc090a34_b3bf_6814_8207_d2908a40992a -->|calls| 8ec30eb2_4622_378f_f538_3070f7a38fae 041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e 978204e9_69a1_fb3c_25d5_8786bc240205["startBlock()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 978204e9_69a1_fb3c_25d5_8786bc240205 1bda4538_293e_48ce_ea89_3160033e51b6["definePlace()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 1bda4538_293e_48ce_ea89_3160033e51b6 54e552b5_4821_f555_a702_7c29655eb512["mapInstructionOperands()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 54e552b5_4821_f555_a702_7c29655eb512 9038f078_e688_0fe0_26fd_2eb655330c6f["getPlace()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 9038f078_e688_0fe0_26fd_2eb655330c6f 4f38d1cb_5a1e_1f03_9dbd_2513b7bb5a80["mapInstructionLValues()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 4f38d1cb_5a1e_1f03_9dbd_2513b7bb5a80 4e2bd58f_f439_41c9_5de4_16f463bd64b7["defineFunction()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 4e2bd58f_f439_41c9_5de4_16f463bd64b7 1cc91427_b243_17f1_f757_5baf28229c77["enter()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 1cc91427_b243_17f1_f757_5baf28229c77 71641405_57a3_9311_7d44_d8f827acb5dd["mapTerminalOperands()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 71641405_57a3_9311_7d44_d8f827acb5dd d737cb4c_53f4_75b4_2d58_268e2f73fde4["eachTerminalSuccessor()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| d737cb4c_53f4_75b4_2d58_268e2f73fde4 6504c0db_f212_8c3b_f87a_9a785dbe810d["fixIncompletePhis()"] 8ec30eb2_4622_378f_f538_3070f7a38fae -->|calls| 6504c0db_f212_8c3b_f87a_9a785dbe810d style 8ec30eb2_4622_378f_f538_3070f7a38fae fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
compiler/packages/babel-plugin-react-compiler/src/SSA/EnterSSA.ts lines 245–329
function enterSSAImpl(
func: HIRFunction,
builder: SSABuilder,
rootEntry: BlockId,
): void {
const visitedBlocks: Set<BasicBlock> = new Set();
for (const [blockId, block] of func.body.blocks) {
CompilerError.invariant(!visitedBlocks.has(block), {
reason: `found a cycle! visiting bb${block.id} again`,
loc: GeneratedSource,
});
visitedBlocks.add(block);
builder.startBlock(block);
if (blockId === rootEntry) {
// NOTE: func.context should be empty for the root function
CompilerError.invariant(func.context.length === 0, {
reason: `Expected function context to be empty for outer function declarations`,
loc: func.loc,
});
func.params = func.params.map(param => {
if (param.kind === 'Identifier') {
return builder.definePlace(param);
} else {
return {
kind: 'Spread',
place: builder.definePlace(param.place),
};
}
});
}
for (const instr of block.instructions) {
mapInstructionOperands(instr, place => builder.getPlace(place));
mapInstructionLValues(instr, lvalue => builder.definePlace(lvalue));
if (
instr.value.kind === 'FunctionExpression' ||
instr.value.kind === 'ObjectMethod'
) {
const loweredFunc = instr.value.loweredFunc.func;
const entry = loweredFunc.body.blocks.get(loweredFunc.body.entry)!;
CompilerError.invariant(entry.preds.size === 0, {
reason:
'Expected function expression entry block to have zero predecessors',
loc: GeneratedSource,
});
entry.preds.add(blockId);
builder.defineFunction(loweredFunc);
builder.enter(() => {
loweredFunc.params = loweredFunc.params.map(param => {
if (param.kind === 'Identifier') {
return builder.definePlace(param);
} else {
return {
kind: 'Spread',
place: builder.definePlace(param.place),
};
}
});
enterSSAImpl(loweredFunc, builder, rootEntry);
});
entry.preds.clear();
}
}
mapTerminalOperands(block.terminal, place => builder.getPlace(place));
for (const outputId of eachTerminalSuccessor(block.terminal)) {
const output = func.body.blocks.get(outputId)!;
let count;
if (builder.unsealedPreds.has(output)) {
count = builder.unsealedPreds.get(output)! - 1;
} else {
count = output.preds.size - 1;
}
builder.unsealedPreds.set(output, count);
if (count === 0 && visitedBlocks.has(output)) {
builder.fixIncompletePhis(output);
Domain
Subdomains
Calls
Called By
Source
Frequently Asked Questions
What does enterSSAImpl() do?
enterSSAImpl() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/SSA/EnterSSA.ts.
Where is enterSSAImpl() defined?
enterSSAImpl() is defined in compiler/packages/babel-plugin-react-compiler/src/SSA/EnterSSA.ts at line 245.
What does enterSSAImpl() call?
enterSSAImpl() calls 11 function(s): defineFunction, definePlace, eachTerminalSuccessor, enter, fixIncompletePhis, getPlace, invariant, mapInstructionLValues, and 3 more.
What calls enterSSAImpl()?
enterSSAImpl() is called by 1 function(s): enterSSA.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free