Laurel Implementor Guide

4.3. Pass Dependency Graph🔗

The ordering constraints between passes, derived from the declarations above rather than written by hand. Each edge names the shape that ties the two passes together, and whether the later pass cannot handle that shape, and which pass removed it (removes → unsupported).

Dependency edges (A → B means A must run before B). Every edge is derived from the passes' declared node kinds:

  • CheckOverrideRefinementLiftInstanceProcedures

    • via Pseudo.needsOverrideRules (removes → unsupported)

  • LiftInstanceProceduresEliminateValueInReturns

    • via CompositeType.instanceProcedures.cons (removes → unsupported)

  • EliminateValueInReturnsEliminateExceptions

    • via StmtExpr.Return.value.some (removes → unsupported)

  • LiftInstanceProceduresYieldElim

    • via StmtExpr.InstanceCall (removes → unsupported)

  • MonomorphizeCompositesHeapParameterization

    • via CompositeType.typeArgs.cons (removes → unsupported)

  • ConstrainedTypeElimHeapParameterization

    • via TypeDefinition.Constrained (removes → unsupported)

  • EliminateExceptionsHeapParameterization

    • via StmtExpr.Throw (removes → unsupported), StmtExpr.Try (removes → unsupported)

  • EliminateValueInReturnsHeapParameterization

    • via StmtExpr.Return.value.some (removes → unsupported)

  • HeapParameterizationTypeHierarchyTransform

    • via Pseudo.implicitHeap (removes → unsupported)

  • HeapParameterizationModifiesClausesTransform

    • via Pseudo.implicitHeap (removes → unsupported)

  • LiftInstanceProceduresGlobalParameterization

    • via CompositeType.instanceProcedures.cons (removes → unsupported)

  • EliminateValueInReturnsGlobalParameterization

    • via StmtExpr.Return.value.some (removes → unsupported)

  • EliminateExceptionsGlobalParameterization

    • via Procedure.throwsType.some (removes → unsupported)

  • InferHoleTypesEliminateDeterministicHoles

    • via StmtExpr.Hole.type.none (removes → unsupported)

  • EliminateExceptionsEliminateReturnStatements

    • via StmtExpr.Try.finally?.some (removes → unsupported)

  • EliminateReturnStatementsContracts

    • via StmtExpr.Return (removes → unsupported)

  • GlobalParameterizationContracts

    • via Program.staticFields.cons (removes → unsupported)

  • UniqueOverloadNamesContracts

    • via Pseudo.overload (removes → unsupported)

  • UniqueOverloadNamesTransparency

    • via Pseudo.overload (removes → unsupported)

  • TransparencyFunctionalRewritePass

    • via Pseudo.laurelProgram (removes → unsupported)

  • DesugarShortCircuitLiftImperativeExpressions

    • via Pseudo.imperativeShortCircuit (removes → unsupported)

  • EliminateIncrDecrAndCompoundAssignInlineLocalVariables

    • via StmtExpr.IncrDecr (removes → unsupported)

  • EliminateDoWhileLaurelToCoreSchema

    • via StmtExpr.While.postTest.true (removes → unsupported)

  • EliminateIncrDecrAndCompoundAssignLaurelToCoreSchema

    • via StmtExpr.IncrDecr (removes → unsupported), StmtExpr.CompoundAssign (removes → unsupported)

  • HeapParameterizationLaurelToCoreSchema

    • via StmtExpr.Var.var.Field (removes → unsupported), StmtExpr.PureFieldUpdate (removes → unsupported), StmtExpr.Old.label?.some (removes → unsupported)

  • TypeHierarchyTransformLaurelToCoreSchema

    • via StmtExpr.IsType (removes → unsupported), StmtExpr.AsType (removes → unsupported), StmtExpr.New (removes → unsupported)

  • PushOldInwardLaurelToCoreSchema

    • via Pseudo.oldExpr (removes → unsupported)

  • EliminateExceptionsLaurelToCoreSchema

    • via StmtExpr.Throw (removes → unsupported), StmtExpr.Try (removes → unsupported)

  • YieldElimLaurelToCoreSchema

    • via StmtExpr.Yield (removes → unsupported)

  • CoroutineElaborationLaurelToCoreSchema

    • via StmtExpr.Resume (removes → unsupported), StmtExpr.HasNext (removes → unsupported)

  • EliminateDeterministicHolesLaurelToCoreSchema

    • via StmtExpr.Hole.deterministic.true (removes → unsupported)

  • MonomorphizeCompositesLaurelToCoreSchema

    • via CompositeType.typeArgs.cons (removes → unsupported)

  • LiftImperativeExpressionsLaurelToCoreSchema

    • via Pseudo.statementExpression (removes → unsupported)

  • OrderingLaurelToCoreSchema

    • via Pseudo.unorderedDeclarations (removes → unsupported)

  • InlineLocalVariablesLaurelToCoreSchema

    • via Pseudo.letExpr (removes → unsupported)

  • LiftInstanceProceduresLaurelToCoreSchema

    • via StmtExpr.InstanceCall (removes → unsupported), CompositeType.instanceProcedures.cons (removes → unsupported), StmtExpr.This (removes → unsupported)

Pipeline execution order (→ X: must run before X; ← X: must run after X):

1. CoroutineElaboration → LaurelToCoreSchema
2. CheckOverrideRefinement → LiftInstanceProcedures
3. LiftInstanceProcedures → EliminateValueInReturns → YieldElim → GlobalParameterization → LaurelToCoreSchema ← CheckOverrideRefinement
4. TypeAliasElim
5. MonomorphizeComposites → HeapParameterization → LaurelToCoreSchema
6. EliminateDoWhile → LaurelToCoreSchema
7. EliminateIncrDecrAndCompoundAssign → InlineLocalVariables → LaurelToCoreSchema
8. ConstrainedTypeElim → HeapParameterization
9. EliminateValueInReturns → EliminateExceptions → HeapParameterization → GlobalParameterization ← LiftInstanceProcedures
10. EliminateExceptions → HeapParameterization → GlobalParameterization → EliminateReturnStatements → LaurelToCoreSchema ← EliminateValueInReturns
11. YieldElim → LaurelToCoreSchema ← LiftInstanceProcedures
12. HeapParameterization → TypeHierarchyTransform → ModifiesClausesTransform → LaurelToCoreSchema ← MonomorphizeComposites ← ConstrainedTypeElim ← EliminateExceptions ← EliminateValueInReturns
13. TypeHierarchyTransform → LaurelToCoreSchema ← HeapParameterization
14. ModifiesClausesTransform ← HeapParameterization
15. GlobalParameterization → Contracts ← LiftInstanceProcedures ← EliminateValueInReturns ← EliminateExceptions
16. UniqueOverloadNames → Contracts → Transparency
17. PushOldInward → LaurelToCoreSchema
18. InferHoleTypes → EliminateDeterministicHoles
19. EliminateDeterministicHoles → LaurelToCoreSchema ← InferHoleTypes
20. DesugarShortCircuit → LiftImperativeExpressions
21. EliminateReturnStatements → Contracts ← EliminateExceptions
22. LoopInvariantWellFormedness
23. Contracts ← EliminateReturnStatements ← GlobalParameterization ← UniqueOverloadNames
24. Transparency → FunctionalRewritePass ← UniqueOverloadNames
25. FunctionalRewritePass ← Transparency
26. LiftImperativeExpressions → LaurelToCoreSchema ← DesugarShortCircuit
27. InlineLocalVariables → LaurelToCoreSchema ← EliminateIncrDecrAndCompoundAssign
28. Ordering → LaurelToCoreSchema
29. LaurelToCoreSchema ← EliminateDoWhile ← EliminateIncrDecrAndCompoundAssign ← HeapParameterization ← TypeHierarchyTransform ← PushOldInward ← EliminateExceptions ← YieldElim ← CoroutineElaboration ← EliminateDeterministicHoles ← MonomorphizeComposites ← LiftImperativeExpressions ← Ordering ← InlineLocalVariables ← LiftInstanceProcedures