Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
fsharp
提交
e4a62fdb
F
fsharp
项目概览
dotNET Platform
/
fsharp
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
未验证
提交
e4a62fdb
编写于
9月 11, 2019
作者:
W
Will Smith
提交者:
GitHub
9月 11, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Minor cleanup, do not check assembly for string concat optimization (#7532)
上级
4e1c7556
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
29 addition
and
19 deletion
+29
-19
src/fsharp/Optimizer.fs
src/fsharp/Optimizer.fs
+29
-19
未找到文件。
src/fsharp/Optimizer.fs
浏览文件 @
e4a62fdb
...
...
@@ -1830,22 +1830,27 @@ let TryDetectQueryQuoteAndRun cenv (expr: Expr) =
//printfn "Not eliminating because no Run found"
None
let
IsILMethodRefDeclaringTypeSystemString
(
ilg
:
ILGlobals
)
(
mref
:
ILMethodRef
)
=
mref
.
DeclaringTypeRef
.
Scope
.
IsAssemblyRef
&&
mref
.
DeclaringTypeRef
.
Scope
.
AssemblyRef
.
Name
=
ilg
.
typ_String
.
TypeRef
.
Scope
.
AssemblyRef
.
Name
&&
mref
.
DeclaringTypeRef
.
BasicQualifiedName
=
ilg
.
typ_String
.
BasicQualifiedName
let
IsILMethodRefSystemStringConcatOverload
(
ilg
:
ILGlobals
)
(
mref
:
ILMethodRef
)
=
IsILMethodRefDeclaringTypeSystemString
ilg
mref
&&
let
IsILMethodRefSystemStringConcat
(
mref
:
ILMethodRef
)
=
mref
.
Name
=
"Concat"
&&
mref
.
ReturnType
.
BasicQualifiedName
=
ilg
.
typ_String
.
BasicQualifiedName
&&
mref
.
ArgCount
>=
2
&&
mref
.
ArgCount
<=
4
&&
mref
.
ArgTypes
|>
List
.
forall
(
fun
ilty
->
ilty
.
BasicQualifiedName
=
ilg
.
typ_String
.
BasicQualifiedName
)
let
IsILMethodRefSystemStringConcatArray
(
ilg
:
ILGlobals
)
(
mref
:
ILMethodRef
)
=
IsILMethodRefDeclaringTypeSystemString
ilg
mref
&&
mref
.
DeclaringTypeRef
.
Name
=
"System.String"
&&
(
mref
.
ReturnType
.
IsNominal
&&
mref
.
ReturnType
.
TypeRef
.
Name
=
"System.String"
)
&&
(
mref
.
ArgCount
>=
2
&&
mref
.
ArgCount
<=
4
&&
mref
.
ArgTypes
|>
List
.
forall
(
fun
ilTy
->
ilTy
.
IsNominal
&&
ilTy
.
TypeRef
.
Name
=
"System.String"
))
let
IsILMethodRefSystemStringConcatArray
(
mref
:
ILMethodRef
)
=
mref
.
Name
=
"Concat"
&&
mref
.
ReturnType
.
BasicQualifiedName
=
ilg
.
typ_String
.
BasicQualifiedName
&&
mref
.
ArgCount
=
1
&&
mref
.
ArgTypes
.
Head
.
BasicQualifiedName
=
"System.String[]"
mref
.
DeclaringTypeRef
.
Name
=
"System.String"
&&
(
mref
.
ReturnType
.
IsNominal
&&
mref
.
ReturnType
.
TypeRef
.
Name
=
"System.String"
)
&&
(
mref
.
ArgCount
=
1
&&
mref
.
ArgTypes
|>
List
.
forall
(
fun
ilTy
->
match
ilTy
with
|
ILType
.
Array
(
shape
,
ilTy
)
when
shape
=
ILArrayShape
.
SingleDimensional
&&
ilTy
.
IsNominal
&&
ilTy
.
TypeRef
.
Name
=
"System.String"
->
true
|
_
->
false
))
/// Optimize/analyze an expression
let
rec
OptimizeExpr
cenv
(
env
:
IncrementalOptimizationEnv
)
expr
=
...
...
@@ -1972,10 +1977,12 @@ and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) =
and
MakeOptimizedSystemStringConcatCall
cenv
env
m
args
=
let
rec
optimizeArg
argExpr
accArgs
=
match
argExpr
,
accArgs
with
|
Expr
.
Op
(
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
methRef
,
_,
_,
_),
_,
[
Expr
.
Op
(
TOp
.
Array
,
_,
args
,
_)
],
_),
_
when
IsILMethodRefSystemStringConcatArray
cenv
.
g
.
ilg
methRef
->
|
Expr
.
Op
(
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
[
Expr
.
Op
(
TOp
.
Array
,
_,
args
,
_)
],
_),
_
when
IsILMethodRefSystemStringConcatArray
mref
->
optimizeArgs
args
accArgs
|
Expr
.
Op
(
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
args
,
_),
_
when
IsILMethodRefSystemStringConcatOverload
cenv
.
g
.
ilg
mref
->
|
Expr
.
Op
(
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
args
,
_),
_
when
IsILMethodRefSystemStringConcat
mref
->
optimizeArgs
args
accArgs
// Optimize string constants, e.g. "1" + "2" will turn into "12"
...
...
@@ -2005,7 +2012,8 @@ and MakeOptimizedSystemStringConcatCall cenv env m args =
mkStaticCall_String_Concat_Array
cenv
.
g
m
arg
match
expr
with
|
Expr
.
Op
(
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
methRef
,
_,
_,
_)
as
op
,
tyargs
,
args
,
m
)
when
IsILMethodRefSystemStringConcatOverload
cenv
.
g
.
ilg
methRef
||
IsILMethodRefSystemStringConcatArray
cenv
.
g
.
ilg
methRef
->
|
Expr
.
Op
(
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_)
as
op
,
tyargs
,
args
,
m
)
when
IsILMethodRefSystemStringConcat
mref
||
IsILMethodRefSystemStringConcatArray
mref
->
OptimizeExprOpReductions
cenv
env
(
op
,
tyargs
,
args
,
m
)
|
_
->
OptimizeExpr
cenv
env
expr
...
...
@@ -2074,9 +2082,11 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) =
|
TOp
.
ILAsm
([],
[
ty
]),
_,
[
a
]
when
typeEquiv
cenv
.
g
(
tyOfExpr
cenv
.
g
a
)
ty
->
OptimizeExpr
cenv
env
a
// Optimize calls when concatenating strings, e.g. "1" + "2" + "3" + "4" .. etc.
|
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
[
Expr
.
Op
(
TOp
.
Array
,
_,
args
,
_)
]
when
IsILMethodRefSystemStringConcatArray
cenv
.
g
.
ilg
mref
->
|
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
[
Expr
.
Op
(
TOp
.
Array
,
_,
args
,
_)
]
when
IsILMethodRefSystemStringConcatArray
mref
->
MakeOptimizedSystemStringConcatCall
cenv
env
m
args
|
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
args
when
IsILMethodRefSystemStringConcatOverload
cenv
.
g
.
ilg
mref
->
|
TOp
.
ILCall
(_,
_,
_,
_,
_,
_,
_,
mref
,
_,
_,
_),
_,
args
when
IsILMethodRefSystemStringConcat
mref
->
MakeOptimizedSystemStringConcatCall
cenv
env
m
args
|
_
->
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录