Home / Function/ enterSSAImpl() — react Function Reference

enterSSAImpl() — react Function Reference

Architecture documentation for the enterSSAImpl() function in EnterSSA.ts from the react codebase.

Function typescript MIRInfrastructure HIR calls 11 called by 1

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);

Subdomains

Called By

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