From 134dd7eb26fc7988ae13559d276cbf337b4b9d27 Mon Sep 17 00:00:00 2001 From: Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> Date: Mon, 30 Jan 2023 11:46:36 -0500 Subject: Overhauled reverse-mode control flow handling (#2608) * Added switch-case support; fixed non-diff parameter transposition * Made region propagation much more robust. Partial loop unzip implementation * WIP: Added most loop handling code, and a test. Still untested * Added CFG Normalization pass + CFG Reversal Pass + Loop Unzipping + most loop transcription * Add single-iter-loop test. * proj files * removed comments * Update reverse-loop.slang * Removed out-of-date code * Disabled IR validation during constructSSA phase of normalizeCFG. constructSSA now reuses sharedBuilder * Moved normalizeCFG() call to prepareFuncForBackwardDiff() --- source/slang/slang-ir-ssa.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'source/slang/slang-ir-ssa.cpp') diff --git a/source/slang/slang-ir-ssa.cpp b/source/slang/slang-ir-ssa.cpp index 0bd5c6e9f..ee55a6546 100644 --- a/source/slang/slang-ir-ssa.cpp +++ b/source/slang/slang-ir-ssa.cpp @@ -84,7 +84,7 @@ struct ConstructSSAContext Dictionary> blockInfos; // IR building state to use during the operation - SharedIRBuilder sharedBuilder; + SharedIRBuilder* sharedBuilder; // Instructions to remove during cleanup List instsToRemove; @@ -1043,7 +1043,7 @@ static void breakCriticalEdges( for (auto edge : criticalEdges) { - context->sharedBuilder.insertBlockAlongEdge(edge); + context->sharedBuilder->insertBlockAlongEdge(edge); } } @@ -1205,7 +1205,8 @@ bool constructSSA(IRModule* module, IRGlobalValueWithCode* globalVal) ConstructSSAContext context; context.globalVal = globalVal; - context.sharedBuilder.init(module); + SharedIRBuilder sharedBuilder(module); + context.sharedBuilder = &sharedBuilder; context.builder.init(context.sharedBuilder); context.builder.setInsertInto(module); @@ -1213,6 +1214,22 @@ bool constructSSA(IRModule* module, IRGlobalValueWithCode* globalVal) return constructSSA(&context); } +// Construct SSA form for a global value with code and reuse +// an existing sharedBuilder +// +bool constructSSA(SharedIRBuilder* sharedBuilder, IRGlobalValueWithCode* globalVal) +{ + ConstructSSAContext context; + context.globalVal = globalVal; + + context.sharedBuilder = sharedBuilder; + + context.builder.init(sharedBuilder); + context.builder.setInsertInto(sharedBuilder->getModule()); + + return constructSSA(&context); +} + bool constructSSA(IRModule* module, IRInst* globalVal) { switch (globalVal->getOp()) -- cgit v1.2.3