Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
95d8f1b6
F
fsharp
项目概览
dotNET Platform
/
fsharp
11 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
fsharp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
95d8f1b6
编写于
10月 30, 2019
作者:
T
TIHan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Cleanup, tests pass
上级
f3ab72cc
变更
3
展开全部
隐藏空白更改
内联
并排
Showing
3 changed file
with
934 addition
and
55 deletion
+934
-55
src/fsharp/IlxGen.fs
src/fsharp/IlxGen.fs
+35
-46
src/fsharp/Optimizer.fs
src/fsharp/Optimizer.fs
+0
-9
tests/fsharp/Compiler/Stress/LargeExprTests.fs
tests/fsharp/Compiler/Stress/LargeExprTests.fs
+899
-0
未找到文件。
src/fsharp/IlxGen.fs
浏览文件 @
95d8f1b6
...
...
@@ -2663,19 +2663,23 @@ and GenLinearExpr cenv cgbuf eenv sp expr sequel canProcessSequencePoint (contf:
// Each branch-RHS (targets) may contribute to the stack, leaving it in the "stackAfterJoin" state, for the join point.
// Since code is branching and joining, the cgbuf stack is maintained manually.
let
targetQueue
=
GenDecisionTreeAndTargets
cenv
cgbuf
stackAtTargets
eenv
tree
targets
repeatSP
sequelOnBranches
let
rec
processTarget
(
targetQueue
:
Queue
<_>)
=
let
rec
popTargetQueue
()
=
if
targetQueue
.
Count
>
0
then
let
f
=
targetQueue
.
Dequeue
()
let
f
=
targetQueue
.
Dequeue
()
let
genTargetInfoOpt
=
f
()
match
genTargetInfoOpt
with
|
Some
(
eenvAtTarget
,
spExprAtTarget
,
exprAtTarget
,
sequelAtTarget
)
->
GenExpr
cenv
cgbuf
eenvAtTarget
spExprAtTarget
exprAtTarget
sequelAtTarget
|
_
->
()
processTarget
targetQueue
processTarget
targetQueue
GenAfterMatch
cenv
cgbuf
eenv
afterJoin
stackAfterJoin
sequelAfterJoin
contf
Fake
|
Some
(
eenvAtTarget
,
spExprAtTarget
,
exprAtTarget
,
sequelAtTarget
)
->
GenLinearExpr
cenv
cgbuf
eenvAtTarget
spExprAtTarget
exprAtTarget
sequelAtTarget
true
(
fun
Fake
->
popTargetQueue
()
)
|
_
->
popTargetQueue
()
else
GenAfterMatch
cenv
cgbuf
eenv
afterJoin
stackAfterJoin
sequelAfterJoin
contf
Fake
popTargetQueue
()
|
LinearOpExpr
(
TOp
.
UnionCase
c
,
tyargs
,
argsFront
,
argLast
,
m
)
->
if
canProcessSequencePoint
then
...
...
@@ -4879,9 +4883,9 @@ and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeat
let
rec
genRemaining
remaining
(
queue
:
Queue
<_>)
=
match
remaining
with
|
[]
->
None
|
(
KeyValue
(
targetIdx
,
(
targetInfo
,
_)))
::
rest
->
|
(
KeyValue
(
_
,
(
targetInfo
,
_)))
::
rest
->
queue
.
Enqueue
(
fun
()
->
genRemaining
rest
queue
)
Some
(
GenDecisionTreeTarget
cenv
cgbuf
stackAtTargets
targetI
dx
targetI
nfo
sequel
)
Some
(
GenDecisionTreeTarget
cenv
cgbuf
stackAtTargets
targetInfo
sequel
)
genRemaining
remaining
queue
...
...
@@ -4927,12 +4931,11 @@ and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree
CG
.
SetMarkToHere
cgbuf
endScope
GenDecisionTreeAndTargetsInner
cenv
cgbuf
None
stackAtTargets
eenv
rest
targets
repeatSP
targetInfos
sequel
|
TDSuccess
(_
es
,
_
targetIdx
)
->
[(
inplabOpt
,
eenv
,
tree
)]
//GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel
|
TDSuccess
_
->
[(
inplabOpt
,
eenv
,
tree
)]
|
TDSwitch
(
e
,
cases
,
dflt
,
m
)
->
GenDecisionTreeSwitch
cenv
cgbuf
inplabOpt
stackAtTargets
eenv
e
cases
dflt
m
targets
repeatSP
targetInfos
sequel
GenDecisionTreeSwitch
cenv
cgbuf
inplabOpt
stackAtTargets
eenv
e
cases
dflt
m
targets
repeatSP
sequel
and
GetTarget
(
targets
:_[])
n
=
if
n
>=
targets
.
Length
then
failwith
"GetTarget: target not found in decision tree"
...
...
@@ -4975,7 +4978,7 @@ and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx
// In debug mode push all decision tree targets to after the switching
let
isTargetPostponed
,
genTargetInfoOpt
=
if
cenv
.
opts
.
localOptimizationsAreOn
then
false
,
Some
(
GenDecisionTreeTarget
cenv
cgbuf
stackAtTargets
targetI
dx
targetI
nfo
sequel
)
false
,
Some
(
GenDecisionTreeTarget
cenv
cgbuf
stackAtTargets
targetInfo
sequel
)
else
CG
.
EmitInstr
cgbuf
(
pop
0
)
Push0
(
I_br
targetMarkBeforeBinds
.
CodeLabel
)
true
,
None
...
...
@@ -4983,13 +4986,7 @@ and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx
let
targetInfos
=
IntMap
.
add
targetIdx
(
targetInfo
,
isTargetPostponed
)
targetInfos
targetInfos
,
genTargetInfoOpt
//and GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel : unit =
// let targetInfos = targetInfos |> Seq.sortBy (fun (KeyValue(targetIdx, _)) -> targetIdx)
// for (KeyValue(targetIdx, (targetInfo, isTargetPostponed))) in targetInfos do
// if isTargetPostponed then
// GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel
and
GenDecisionTreeTarget
cenv
cgbuf
stackAtTargets
_
targetIdx
(
targetMarkBeforeBinds
,
targetMarkAfterBinds
,
eenvAtTarget
,
successExpr
,
spTarget
,
repeatSP
,
vs
,
binds
,
startScope
,
endScope
)
sequel
=
and
GenDecisionTreeTarget
cenv
cgbuf
stackAtTargets
(
targetMarkBeforeBinds
,
targetMarkAfterBinds
,
eenvAtTarget
,
successExpr
,
spTarget
,
repeatSP
,
vs
,
binds
,
startScope
,
endScope
)
sequel
=
CG
.
SetMarkToHere
cgbuf
targetMarkBeforeBinds
let
spExpr
=
(
match
spTarget
with
SequencePointAtTarget
->
SPAlways
|
SuppressSequencePointAtTarget
_
->
SPSuppress
)
...
...
@@ -5011,10 +5008,8 @@ and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBefore
CG
.
SetMarkToHere
cgbuf
targetMarkAfterBinds
CG
.
SetStack
cgbuf
stackAtTargets
(
eenvAtTarget
,
spExpr
,
successExpr
,
(
EndLocalScope
(
sequel
,
endScope
)))
//GenExpr cenv cgbuf eenvAtTarget spExpr successExpr (EndLocalScope(sequel, endScope))
and
GenDecisionTreeSwitch
cenv
cgbuf
inplabOpt
stackAtTargets
eenv
e
cases
defaultTargetOpt
switchm
targets
repeatSP
targetInfos
sequel
=
and
GenDecisionTreeSwitch
cenv
cgbuf
inplabOpt
stackAtTargets
eenv
e
cases
defaultTargetOpt
switchm
targets
repeatSP
sequel
=
let
g
=
cenv
.
g
let
m
=
e
.
Range
match
inplabOpt
with
None
->
()
|
Some
inplab
->
CG
.
SetMarkToHere
cgbuf
inplab
...
...
@@ -5024,7 +5019,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
// optimize a test against a boolean value, i.e. the all-important if-then-else
|
TCase
(
DecisionTreeTest
.
Const
(
Const
.
Bool
b
),
successTree
)
::
_
->
let
failureTree
=
(
match
defaultTargetOpt
with
None
->
cases
.
Tail
.
Head
.
CaseTree
|
Some
d
->
d
)
GenDecisionTreeTest
cenv
eenv
.
cloc
cgbuf
stackAtTargets
e
None
eenv
(
if
b
then
successTree
else
failureTree
)
(
if
b
then
failureTree
else
successTree
)
targets
repeatSP
targetInfo
s
sequel
GenDecisionTreeTest
cenv
eenv
.
cloc
cgbuf
e
None
eenv
(
if
b
then
successTree
else
failureTree
)
(
if
b
then
failureTree
else
successTree
)
target
s
sequel
// // Remove a single test for a union case . Union case tests are always exa
//| [ TCase(DecisionTreeTest.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) ->
...
...
@@ -5041,7 +5036,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
let
cuspec
=
GenUnionSpec
cenv
.
amap
m
eenv
.
tyenv
c
.
TyconRef
tyargs
let
idx
=
c
.
Index
let
avoidHelpers
=
entityRefInThisAssembly
g
.
compilingFslib
c
.
TyconRef
GenDecisionTreeTest
cenv
eenv
.
cloc
cgbuf
stackAtTargets
e
(
Some
(
pop
1
,
Push
[
g
.
ilg
.
typ_Bool
],
Choice1Of2
(
avoidHelpers
,
cuspec
,
idx
)))
eenv
successTree
failureTree
targets
repeatSP
targetInfo
s
sequel
GenDecisionTreeTest
cenv
eenv
.
cloc
cgbuf
e
(
Some
(
pop
1
,
Push
[
g
.
ilg
.
typ_Bool
],
Choice1Of2
(
avoidHelpers
,
cuspec
,
idx
)))
eenv
successTree
failureTree
target
s
sequel
|
_
->
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
BI_brtrue
|
_
->
failwith
"internal error: GenDecisionTreeSwitch"
CG
.
EmitInstr
cgbuf
(
pop
1
)
Push0
(
I_brcmp
(
bi
,
(
List
.
head
caseLabels
).
CodeLabel
))
GenDecisionTreeCases
c
env
cgbuf
stackAtTargets
eenv
targets
repeatSP
targetInfos
defaultTargetOpt
caseLabels
cases
sequel
GenDecisionTreeCases
c
gbuf
stackAtTargets
eenv
defaultTargetOpt
caseLabels
cases
|
DecisionTreeTest
.
ActivePatternCase
_
->
error
(
InternalError
(
"internal error in codegen: DecisionTreeTest.ActivePatternCase"
,
switchm
))
|
DecisionTreeTest
.
UnionCase
(
hdc
,
tyargs
)
->
...
...
@@ -5088,7 +5083,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
let
avoidHelpers
=
entityRefInThisAssembly
g
.
compilingFslib
hdc
.
TyconRef
EraseUnions
.
emitDataSwitch
g
.
ilg
(
UnionCodeGen
cgbuf
)
(
avoidHelpers
,
cuspec
,
dests
)
CG
.
EmitInstrs
cgbuf
(
pop
1
)
Push0
[
]
// push/pop to match the line above
GenDecisionTreeCases
c
env
cgbuf
stackAtTargets
eenv
targets
repeatSP
targetInfos
defaultTargetOpt
caseLabels
cases
sequel
GenDecisionTreeCases
c
gbuf
stackAtTargets
eenv
defaultTargetOpt
caseLabels
cases
|
DecisionTreeTest
.
Const
c
->
GenExpr
cenv
cgbuf
eenv
SPSuppress
e
Continue
...
...
@@ -5131,25 +5126,24 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau
CG
.
EmitInstr
cgbuf
(
pop
1
)
Push0
(
I_switch
destinationLabels
)
else
error
(
InternalError
(
"non-dense integer matches not implemented in codegen - these should have been removed by the pattern match compiler"
,
switchm
))
GenDecisionTreeCases
c
env
cgbuf
stackAtTargets
eenv
targets
repeatSP
targetInfos
defaultTargetOpt
caseLabels
cases
sequel
GenDecisionTreeCases
c
gbuf
stackAtTargets
eenv
defaultTargetOpt
caseLabels
cases
|
_
->
error
(
InternalError
(
"these matches should never be needed"
,
switchm
))
and
GenDecisionTreeCases
_
cenv
cgbuf
stackAtTargets
eenv
_
targets
_
repeatSP
_
targetInfos
defaultTargetOpt
caseLabels
cases
_
sequel
=
and
GenDecisionTreeCases
cgbuf
stackAtTargets
eenv
defaultTargetOpt
caseLabels
cases
=
assert
(
cgbuf
.
GetCurrentStack
()
=
stackAtTargets
)
// cgbuf stack should be unchanged over tests. [bug://1750].
let
targetInfo
s
=
let
decision
s
=
match
defaultTargetOpt
with
|
Some
defaultTarget
->
[(
None
,
eenv
,
defaultTarget
)]
//GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel
|
Some
defaultTarget
->
[(
None
,
eenv
,
defaultTarget
)]
|
None
->
[]
(
targetInfos
,
caseLabels
,
cases
)
|||>
List
.
fold2
(
fun
targetInfos
caseLabel
(
TCase
(_,
caseTree
))
->
targetInfos
@
[(
Some
caseLabel
,
eenv
,
caseTree
)])
//GenDecisionTreeAndTargetsInner cenv cgbuf (Some caseLabel) stackAtTargets eenv caseTree targets repeatSP targetInfos sequel)
(
decisions
,
caseLabels
,
cases
)
|||>
List
.
fold2
(
fun
decisions
caseLabel
(
TCase
(_,
caseTree
))
->
decisions
@
[(
Some
caseLabel
,
eenv
,
caseTree
)])
// Used for the peephole optimization below
and
(|
BoolExpr
|_|)
=
function
Expr
.
Const
(
Const
.
Bool
b1
,
_,
_)
->
Some
b1
|
_
->
None
and
GenDecisionTreeTest
cenv
cloc
cgbuf
_
stackAtTargets
e
tester
eenv
successTree
failureTree
targets
_
repeatSP
_
targetInfo
s
sequel
=
and
GenDecisionTreeTest
cenv
cloc
cgbuf
e
tester
eenv
successTree
failureTree
target
s
sequel
=
let
g
=
cenv
.
g
match
successTree
,
failureTree
with
...
...
@@ -5198,13 +5192,8 @@ and GenDecisionTreeTest cenv cloc cgbuf _stackAtTargets e tester eenv successTre
|
Choice2Of2
i
->
CG
.
EmitInstr
cgbuf
pops
pushes
i
CG
.
EmitInstr
cgbuf
(
pop
1
)
Push0
(
I_brcmp
(
BI_brfalse
,
failure
.
CodeLabel
))
[
(
None
,
eenv
,
successTree
)
(
Some
failure
,
eenv
,
failureTree
)
]
// let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv successTree targets repeatSP targetInfos sequel
// GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel
[
(
None
,
eenv
,
successTree
)
(
Some
failure
,
eenv
,
failureTree
)
]
/// Generate fixups for letrec bindings
and
GenLetRecFixup
cenv
cgbuf
eenv
(
ilxCloSpec
:
IlxClosureSpec
,
e
,
ilField
:
ILFieldSpec
,
e2
,
_
m
)
=
...
...
src/fsharp/Optimizer.fs
浏览文件 @
95d8f1b6
...
...
@@ -2921,15 +2921,6 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety =
let
env
=
Option
.
foldBack
(
BindInternalValToUnknown
cenv
)
baseValOpt
env
let
env
=
BindTypeVarsToUnknown
tps
env
let
env
=
List
.
foldBack
(
BindInternalValsToUnknown
cenv
)
vsl
env
let
cenv
=
match
env
.
functionVal
with
// If the lambda is compiler generated and we are in the reporing phase, allow lambda to be split.
// As an example, allows generated GetHashCode/Equals/CompareTo/etc methods to be split even if optimizations were off.
// This helps prevent stack overflows in IlxGen.fs.
|
Some
(
v
,
_)
when
v
.
IsCompilerGenerated
&&
cenv
.
settings
.
reportingPhase
->
SetAbstractBigTargetsOn
cenv
|
_
->
cenv
let
env
=
BindInternalValsToUnknown
cenv
(
Option
.
toList
baseValOpt
)
env
let
bodyR
,
bodyinfo
=
OptimizeExpr
cenv
env
body
let
exprR
=
mkMemberLambdas
m
tps
ctorThisValOpt
baseValOpt
vsl
(
bodyR
,
bodyty
)
...
...
tests/fsharp/Compiler/Stress/LargeExprTests.fs
浏览文件 @
95d8f1b6
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录