@@ -2663,19 +2663,23 @@ and GenLinearExpr cenv cgbuf eenv sp expr sequel canProcessSequencePoint (contf:
26632663 // Each branch-RHS (targets) may contribute to the stack, leaving it in the "stackAfterJoin" state, for the join point.
26642664 // Since code is branching and joining, the cgbuf stack is maintained manually.
26652665 let targetQueue = GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches
2666- let rec processTarget ( targetQueue : Queue < _ >) =
2666+
2667+ let rec popTargetQueue () =
26672668 if targetQueue.Count > 0 then
2668- let f = targetQueue.Dequeue()
2669+ let f = targetQueue.Dequeue ()
26692670 let genTargetInfoOpt = f ()
26702671 match genTargetInfoOpt with
2671- | Some( eenvAtTarget, spExprAtTarget, exprAtTarget, sequelAtTarget) ->
2672- GenExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget
2673- | _ ->
2674- ()
2675- processTarget targetQueue
2676- processTarget targetQueue
2677- GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2678- contf Fake
2672+ | Some ( eenvAtTarget, spExprAtTarget, exprAtTarget, sequelAtTarget) ->
2673+ GenLinearExpr cenv cgbuf eenvAtTarget spExprAtTarget exprAtTarget sequelAtTarget true ( fun Fake ->
2674+ popTargetQueue ()
2675+ )
2676+ | _ ->
2677+ popTargetQueue ()
2678+ else
2679+ GenAfterMatch cenv cgbuf eenv afterJoin stackAfterJoin sequelAfterJoin
2680+ contf Fake
2681+
2682+ popTargetQueue ()
26792683
26802684 | LinearOpExpr ( TOp.UnionCase c, tyargs, argsFront, argLast, m) ->
26812685 if canProcessSequencePoint then
@@ -4879,9 +4883,9 @@ and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeat
48794883 let rec genRemaining remaining ( queue : Queue < _ >) =
48804884 match remaining with
48814885 | [] -> None
4882- | ( KeyValue( targetIdx , ( targetInfo, _))) :: rest ->
4886+ | ( KeyValue(_ , ( targetInfo, _))) :: rest ->
48834887 queue.Enqueue( fun () -> genRemaining rest queue)
4884- Some( GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel)
4888+ Some( GenDecisionTreeTarget cenv cgbuf stackAtTargets targetInfo sequel)
48854889
48864890 genRemaining remaining queue
48874891
@@ -4927,12 +4931,11 @@ and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree
49274931 CG.SetMarkToHere cgbuf endScope
49284932 GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv rest targets repeatSP targetInfos sequel
49294933
4930- | TDSuccess (_ es, _ targetIdx) ->
4931- [( inplabOpt, eenv, tree)]
4932- //GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel
4934+ | TDSuccess _ ->
4935+ [( inplabOpt, eenv, tree)]
49334936
49344937 | TDSwitch( e, cases, dflt, m) ->
4935- GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases dflt m targets repeatSP targetInfos sequel
4938+ GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases dflt m targets repeatSP sequel
49364939
49374940and GetTarget ( targets : _ []) n =
49384941 if n >= targets.Length then failwith " GetTarget: target not found in decision tree"
@@ -4975,21 +4978,15 @@ and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx
49754978 // In debug mode push all decision tree targets to after the switching
49764979 let isTargetPostponed , genTargetInfoOpt =
49774980 if cenv.opts.localOptimizationsAreOn then
4978- false , Some( GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel)
4981+ false , Some( GenDecisionTreeTarget cenv cgbuf stackAtTargets targetInfo sequel)
49794982 else
49804983 CG.EmitInstr cgbuf ( pop 0 ) Push0 ( I_ br targetMarkBeforeBinds.CodeLabel)
49814984 true , None
49824985
49834986 let targetInfos = IntMap.add targetIdx ( targetInfo, isTargetPostponed) targetInfos
49844987 targetInfos, genTargetInfoOpt
49854988
4986- //and GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel : unit =
4987- // let targetInfos = targetInfos |> Seq.sortBy (fun (KeyValue(targetIdx, _)) -> targetIdx)
4988- // for (KeyValue(targetIdx, (targetInfo, isTargetPostponed))) in targetInfos do
4989- // if isTargetPostponed then
4990- // GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel
4991-
4992- and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx ( targetMarkBeforeBinds , targetMarkAfterBinds , eenvAtTarget , successExpr , spTarget , repeatSP , vs , binds , startScope , endScope ) sequel =
4989+ and GenDecisionTreeTarget cenv cgbuf stackAtTargets ( targetMarkBeforeBinds , targetMarkAfterBinds , eenvAtTarget , successExpr , spTarget , repeatSP , vs , binds , startScope , endScope ) sequel =
49934990 CG.SetMarkToHere cgbuf targetMarkBeforeBinds
49944991 let spExpr = ( match spTarget with SequencePointAtTarget -> SPAlways | SuppressSequencePointAtTarget _ -> SPSuppress)
49954992
@@ -5011,10 +5008,8 @@ and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBefore
50115008 CG.SetMarkToHere cgbuf targetMarkAfterBinds
50125009 CG.SetStack cgbuf stackAtTargets
50135010 ( eenvAtTarget, spExpr, successExpr, ( EndLocalScope( sequel, endScope)))
5014- //GenExpr cenv cgbuf eenvAtTarget spExpr successExpr (EndLocalScope(sequel, endScope))
50155011
5016-
5017- and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel =
5012+ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP sequel =
50185013 let g = cenv.g
50195014 let m = e.Range
50205015 match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab
@@ -5024,7 +5019,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
50245019 // optimize a test against a boolean value, i.e. the all-important if-then-else
50255020 | TCase( DecisionTreeTest.Const( Const.Bool b), successTree) :: _ ->
50265021 let failureTree = ( match defaultTargetOpt with None -> cases.Tail.Head.CaseTree | Some d -> d)
5027- GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e None eenv ( if b then successTree else failureTree) ( if b then failureTree else successTree) targets repeatSP targetInfos sequel
5022+ GenDecisionTreeTest cenv eenv.cloc cgbuf e None eenv ( if b then successTree else failureTree) ( if b then failureTree else successTree) targets sequel
50285023
50295024 // // Remove a single test for a union case . Union case tests are always exa
50305025 //| [ TCase(DecisionTreeTest.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) ->
@@ -5041,7 +5036,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
50415036 let cuspec = GenUnionSpec cenv.amap m eenv.tyenv c.TyconRef tyargs
50425037 let idx = c.Index
50435038 let avoidHelpers = entityRefInThisAssembly g.compilingFslib c.TyconRef
5044- GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e ( Some ( pop 1 , Push [ g.ilg.typ_ Bool], Choice1Of2 ( avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel
5039+ GenDecisionTreeTest cenv eenv.cloc cgbuf e ( Some ( pop 1 , Push [ g.ilg.typ_ Bool], Choice1Of2 ( avoidHelpers, cuspec, idx))) eenv successTree failureTree targets sequel
50455040
50465041 | _ ->
50475042 let caseLabels = List.map ( fun _ -> CG.GenerateDelayMark cgbuf " switch_case" ) cases
@@ -5072,7 +5067,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
50725067 BI_ brtrue
50735068 | _ -> failwith " internal error: GenDecisionTreeSwitch"
50745069 CG.EmitInstr cgbuf ( pop 1 ) Push0 ( I_ brcmp ( bi, ( List.head caseLabels) .CodeLabel))
5075- GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel
5070+ GenDecisionTreeCases cgbuf stackAtTargets eenv defaultTargetOpt caseLabels cases
50765071
50775072 | DecisionTreeTest.ActivePatternCase _ -> error( InternalError( " internal error in codegen: DecisionTreeTest.ActivePatternCase" , switchm))
50785073 | DecisionTreeTest.UnionCase ( hdc, tyargs) ->
@@ -5088,7 +5083,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
50885083 let avoidHelpers = entityRefInThisAssembly g.compilingFslib hdc.TyconRef
50895084 EraseUnions.emitDataSwitch g.ilg ( UnionCodeGen cgbuf) ( avoidHelpers, cuspec, dests)
50905085 CG.EmitInstrs cgbuf ( pop 1 ) Push0 [ ] // push/pop to match the line above
5091- GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel
5086+ GenDecisionTreeCases cgbuf stackAtTargets eenv defaultTargetOpt caseLabels cases
50925087
50935088 | DecisionTreeTest.Const c ->
50945089 GenExpr cenv cgbuf eenv SPSuppress e Continue
@@ -5131,25 +5126,24 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
51315126 CG.EmitInstr cgbuf ( pop 1 ) Push0 ( I_ switch destinationLabels)
51325127 else
51335128 error( InternalError( " non-dense integer matches not implemented in codegen - these should have been removed by the pattern match compiler" , switchm))
5134- GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel
5129+ GenDecisionTreeCases cgbuf stackAtTargets eenv defaultTargetOpt caseLabels cases
51355130 | _ -> error( InternalError( " these matches should never be needed" , switchm))
51365131
5137- and GenDecisionTreeCases _cenv cgbuf stackAtTargets eenv _targets _repeatSP _targetInfos defaultTargetOpt caseLabels cases _sequel =
5132+ and GenDecisionTreeCases cgbuf stackAtTargets eenv defaultTargetOpt caseLabels cases =
51385133 assert ( cgbuf.GetCurrentStack() = stackAtTargets) // cgbuf stack should be unchanged over tests. [bug://1750].
51395134
5140- let targetInfos =
5135+ let decisions =
51415136 match defaultTargetOpt with
5142- | Some defaultTarget -> [( None, eenv, defaultTarget)] //GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel
5137+ | Some defaultTarget -> [( None, eenv, defaultTarget)]
51435138 | None -> []
51445139
5145- ( targetInfos, caseLabels, cases)
5146- |||> List.fold2 ( fun targetInfos caseLabel ( TCase ( _ , caseTree )) -> targetInfos @ [( Some caseLabel, eenv, caseTree)])
5147- //GenDecisionTreeAndTargetsInner cenv cgbuf (Some caseLabel) stackAtTargets eenv caseTree targets repeatSP targetInfos sequel)
5140+ ( decisions, caseLabels, cases)
5141+ |||> List.fold2 ( fun decisions caseLabel ( TCase ( _ , caseTree )) -> decisions @ [( Some caseLabel, eenv, caseTree)])
51485142
51495143// Used for the peephole optimization below
51505144and (| BoolExpr | _ |) = function Expr.Const ( Const.Bool b1, _, _) -> Some b1 | _ -> None
51515145
5152- and GenDecisionTreeTest cenv cloc cgbuf _stackAtTargets e tester eenv successTree failureTree targets _repeatSP _targetInfos sequel =
5146+ and GenDecisionTreeTest cenv cloc cgbuf e tester eenv successTree failureTree targets sequel =
51535147 let g = cenv.g
51545148 match successTree, failureTree with
51555149
@@ -5198,13 +5192,8 @@ and GenDecisionTreeTest cenv cloc cgbuf _stackAtTargets e tester eenv successTre
51985192 | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i
51995193 CG.EmitInstr cgbuf ( pop 1 ) Push0 ( I_ brcmp ( BI_ brfalse, failure.CodeLabel))
52005194
5201- [
5202- ( None, eenv, successTree)
5203- ( Some failure, eenv, failureTree)
5204- ]
5205- // let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv successTree targets repeatSP targetInfos sequel
5206-
5207- // GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel
5195+ [ ( None, eenv, successTree)
5196+ ( Some failure, eenv, failureTree) ]
52085197
52095198/// Generate fixups for letrec bindings
52105199and GenLetRecFixup cenv cgbuf eenv ( ilxCloSpec : IlxClosureSpec , e , ilField : ILFieldSpec , e2 , _m ) =
0 commit comments