Skip to content
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d3b1cf0
[Wasm RyuJIT] Wasm control flow basics
AndyAyersMS Nov 4, 2025
ca2c9b4
fix release build
AndyAyersMS Nov 6, 2025
39e0bd3
fix llvm build
AndyAyersMS Nov 6, 2025
e8882ab
Fix typos
AndyAyersMS Nov 7, 2025
890548e
Fix more typos
AndyAyersMS Nov 7, 2025
e2f71b1
[Wasm RyuJIT] Implement Wasm DFS and Loop Finding
AndyAyersMS Nov 7, 2025
4c97a19
fixes
AndyAyersMS Nov 7, 2025
3b3a13d
first cut at integrating SCCs
AndyAyersMS Nov 10, 2025
be764e3
transform sccs pre-lower
AndyAyersMS Nov 11, 2025
39f4793
handle blocks only reachable by EH
AndyAyersMS Nov 12, 2025
f1e5dcc
format
AndyAyersMS Nov 12, 2025
bc53647
remove unreachable first
AndyAyersMS Nov 13, 2025
ff1d0ac
fix dump
AndyAyersMS Nov 13, 2025
587f012
merge main
AndyAyersMS Nov 14, 2025
9ec1465
fixup after merge
AndyAyersMS Nov 14, 2025
ab5c6f1
add fgwasm.h to wasm headers
AndyAyersMS Nov 14, 2025
80c3311
merge main
AndyAyersMS Nov 15, 2025
b2b865f
bail out if there are blocks only reachable by EH. Adjust the scc tra…
AndyAyersMS Nov 17, 2025
3846d86
introduce FgWasm class
AndyAyersMS Nov 17, 2025
e413382
Puzzled
AndyAyersMS Nov 17, 2025
488e148
give FgWasm some state
AndyAyersMS Nov 17, 2025
0c382da
no more recursive lambda
AndyAyersMS Nov 18, 2025
cf4e92d
start to encapsulate dfs
AndyAyersMS Nov 18, 2025
b25a32a
encapsulate dfs and traits
AndyAyersMS Nov 18, 2025
bd35fcf
Merge branch 'main' into WasmIrreducibleLoopTransformation
AndyAyersMS Nov 18, 2025
8f6d722
review feedback
AndyAyersMS Nov 19, 2025
ea15336
fix typos
AndyAyersMS Nov 19, 2025
8187895
rename method
AndyAyersMS Nov 19, 2025
e5b2631
add more eh ret types in places
AndyAyersMS Nov 19, 2025
bf0b3bb
disable by default
AndyAyersMS Nov 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions src/coreclr/jit/compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4940,6 +4940,17 @@ void Compiler::compCompile(void** methodCodePtr, uint32_t* methodCodeSize, JitFl
}
#endif

#ifdef DEBUG
// If we are going to simulate generating wasm control flow,
// transform any strongly connected components into reducible flow.
//
if (JitConfig.JitWasmControlFlow() > 0)
{
DoPhase(this, PHASE_DFS_BLOCKS_WASM, &Compiler::fgDfsBlocksAndRemove);
DoPhase(this, PHASE_WASM_TRANSFORM_SCCS, &Compiler::fgWasmTransformSccs);
}
#endif
Comment on lines +4943 to +4952
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it intentional this was placed before PHASE_ASYNC, even though it is eventually going to have to be after?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not intentional. It should be moved to just after the async transformation.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in #121973


// rationalize trees
Rationalizer rat(this); // PHASE_RATIONALIZE
rat.Run();
Expand Down Expand Up @@ -4982,6 +4993,16 @@ void Compiler::compCompile(void** methodCodePtr, uint32_t* methodCodeSize, JitFl

FinalizeEH();

#ifdef DEBUG
// Optionally, simulate generating wasm control flow
// (eventually this will become part of the wasm target)
//
if (JitConfig.JitWasmControlFlow() > 0)
{
DoPhase(this, PHASE_WASM_CONTROL_FLOW, &Compiler::fgWasmControlFlow);
}
#endif

// We can not add any new tracked variables after this point.
lvaTrackedFixed = true;

Expand Down Expand Up @@ -5016,16 +5037,6 @@ void Compiler::compCompile(void** methodCodePtr, uint32_t* methodCodeSize, JitFl
DoPhase(this, PHASE_ALIGN_LOOPS, &Compiler::placeLoopAlignInstructions);
#endif

#ifdef DEBUG
// Optionally, simulate generating wasm control flow
// (eventually this will become part of the wasm target)
//
if (JitConfig.JitWasmControlFlow() > 0)
{
DoPhase(this, PHASE_WASM_CONTROL_FLOW, &Compiler::fgWasmControlFlow);
}
#endif

// The common phase checks and dumps are no longer relevant past this point.
//
activePhaseChecks = PhaseChecks::CHECK_NONE;
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -2764,6 +2764,7 @@ class Compiler
bool bbInHandlerRegions(unsigned regionIndex, BasicBlock* blk);
bool bbInCatchHandlerRegions(BasicBlock* tryBlk, BasicBlock* hndBlk);
unsigned short bbFindInnermostCommonTryRegion(BasicBlock* bbOne, BasicBlock* bbTwo);
unsigned short bbFindInnermostCommonTryRegion(unsigned tryIndex, BasicBlock* bbTwo);

unsigned short bbFindInnermostTryRegionContainingHandlerRegion(unsigned handlerIndex);
unsigned short bbFindInnermostHandlerRegionContainingTryRegion(unsigned tryIndex);
Expand Down Expand Up @@ -6250,6 +6251,7 @@ class Compiler

FlowGraphDfsTree* fgWasmDfs();
PhaseStatus fgWasmControlFlow();
PhaseStatus fgWasmTransformSccs();

// method that returns if you should split here
typedef bool(fgSplitPredicate)(GenTree* tree, GenTree* parent, fgWalkData* data);
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/jit/compmemkind.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ CompMemKindMacro(MaskConversionOpt)
CompMemKindMacro(TryRegionClone)
CompMemKindMacro(Async)
CompMemKindMacro(RangeCheckCloning)
CompMemKindMacro(WasmSccTransform)
CompMemKindMacro(WasmCfgLowering)
//clang-format on

Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/compphases.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ CompPhaseNameMacro(PHASE_RATIONALIZE, "Rationalize IR",
CompPhaseNameMacro(PHASE_REPAIR_PROFILE_POST_MORPH, "Repair profile post-morph", false, -1, false)
CompPhaseNameMacro(PHASE_REPAIR_PROFILE_PRE_LAYOUT, "Repair profile pre-layout", false, -1, false)

CompPhaseNameMacro(PHASE_DFS_BLOCKS_WASM, "Wasm remove unreachable blocks", false, -1, false)
CompPhaseNameMacro(PHASE_WASM_TRANSFORM_SCCS, "Wasm transform sccs", false, -1, false)
CompPhaseNameMacro(PHASE_WASM_CONTROL_FLOW, "Wasm control flow", false, -1, false)

CompPhaseNameMacro(PHASE_ASYNC, "Transform async", false, -1, true)
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/jit/fgbasic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4932,15 +4932,15 @@ BasicBlock* Compiler::fgSplitBlockAtBeginning(BasicBlock* curr)
// Returns a new block, that is a successor of 'curr' and which branches unconditionally to 'succ'
//
// Assumptions:
// 'curr' must have a bbKind of BBJ_COND, BBJ_ALWAYS, or BBJ_SWITCH
// 'curr' must have a bbKind of BBJ_COND, BBJ_ALWAYS, BBJ_SWITCH, or BBJ_CALLFINALLYRET
//
// Notes:
// The returned block is empty.
// Can be invoked before pred lists are built.

BasicBlock* Compiler::fgSplitEdge(BasicBlock* curr, BasicBlock* succ)
{
assert(curr->KindIs(BBJ_COND, BBJ_SWITCH, BBJ_ALWAYS));
assert(curr->KindIs(BBJ_COND, BBJ_SWITCH, BBJ_ALWAYS, BBJ_CALLFINALLYRET));
assert(fgPredsComputed);
assert(fgGetPredForBlock(succ, curr) != nullptr);

Expand Down
Loading
Loading