Skip to content

Commit 95d8f1b

Browse files
committed
Cleanup, tests pass
1 parent f3ab72c commit 95d8f1b

File tree

3 files changed

+934
-55
lines changed

3 files changed

+934
-55
lines changed

src/fsharp/IlxGen.fs

Lines changed: 35 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

49374940
and 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
51505144
and (|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
52105199
and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec: IlxClosureSpec, e, ilField: ILFieldSpec, e2, _m) =

src/fsharp/Optimizer.fs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2921,15 +2921,6 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety =
29212921
let env = Option.foldBack (BindInternalValToUnknown cenv) baseValOpt env
29222922
let env = BindTypeVarsToUnknown tps env
29232923
let env = List.foldBack (BindInternalValsToUnknown cenv) vsl env
2924-
2925-
let cenv =
2926-
match env.functionVal with
2927-
// If the lambda is compiler generated and we are in the reporing phase, allow lambda to be split.
2928-
// As an example, allows generated GetHashCode/Equals/CompareTo/etc methods to be split even if optimizations were off.
2929-
// This helps prevent stack overflows in IlxGen.fs.
2930-
| Some (v, _) when v.IsCompilerGenerated && cenv.settings.reportingPhase -> SetAbstractBigTargetsOn cenv
2931-
| _ -> cenv
2932-
29332924
let env = BindInternalValsToUnknown cenv (Option.toList baseValOpt) env
29342925
let bodyR, bodyinfo = OptimizeExpr cenv env body
29352926
let exprR = mkMemberLambdas m tps ctorThisValOpt baseValOpt vsl (bodyR, bodyty)

0 commit comments

Comments
 (0)