Skip to content

Commit f5d1499

Browse files
TIHanbaronfel
authored andcommitted
Minor cleanup, do not check assembly for string concat optimization (#7532)
1 parent 71b3830 commit f5d1499

File tree

1 file changed

+29
-19
lines changed

1 file changed

+29
-19
lines changed

src/fsharp/Optimizer.fs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1830,22 +1830,27 @@ let TryDetectQueryQuoteAndRun cenv (expr: Expr) =
18301830
//printfn "Not eliminating because no Run found"
18311831
None
18321832

1833-
let IsILMethodRefDeclaringTypeSystemString (ilg: ILGlobals) (mref: ILMethodRef) =
1834-
mref.DeclaringTypeRef.Scope.IsAssemblyRef &&
1835-
mref.DeclaringTypeRef.Scope.AssemblyRef.Name = ilg.typ_String.TypeRef.Scope.AssemblyRef.Name &&
1836-
mref.DeclaringTypeRef.BasicQualifiedName = ilg.typ_String.BasicQualifiedName
1837-
1838-
let IsILMethodRefSystemStringConcatOverload (ilg: ILGlobals) (mref: ILMethodRef) =
1839-
IsILMethodRefDeclaringTypeSystemString ilg mref &&
1833+
let IsILMethodRefSystemStringConcat (mref: ILMethodRef) =
18401834
mref.Name = "Concat" &&
1841-
mref.ReturnType.BasicQualifiedName = ilg.typ_String.BasicQualifiedName &&
1842-
mref.ArgCount >= 2 && mref.ArgCount <= 4 && mref.ArgTypes |> List.forall(fun ilty -> ilty.BasicQualifiedName = ilg.typ_String.BasicQualifiedName)
1843-
1844-
let IsILMethodRefSystemStringConcatArray (ilg: ILGlobals) (mref: ILMethodRef) =
1845-
IsILMethodRefDeclaringTypeSystemString ilg mref &&
1835+
mref.DeclaringTypeRef.Name = "System.String" &&
1836+
(mref.ReturnType.IsNominal && mref.ReturnType.TypeRef.Name = "System.String") &&
1837+
(mref.ArgCount >= 2 && mref.ArgCount <= 4 &&
1838+
mref.ArgTypes
1839+
|> List.forall (fun ilTy ->
1840+
ilTy.IsNominal && ilTy.TypeRef.Name = "System.String"))
1841+
1842+
let IsILMethodRefSystemStringConcatArray (mref: ILMethodRef) =
18461843
mref.Name = "Concat" &&
1847-
mref.ReturnType.BasicQualifiedName = ilg.typ_String.BasicQualifiedName &&
1848-
mref.ArgCount = 1 && mref.ArgTypes.Head.BasicQualifiedName = "System.String[]"
1844+
mref.DeclaringTypeRef.Name = "System.String" &&
1845+
(mref.ReturnType.IsNominal && mref.ReturnType.TypeRef.Name = "System.String") &&
1846+
(mref.ArgCount = 1 &&
1847+
mref.ArgTypes
1848+
|> List.forall (fun ilTy ->
1849+
match ilTy with
1850+
| ILType.Array (shape, ilTy) when shape = ILArrayShape.SingleDimensional &&
1851+
ilTy.IsNominal &&
1852+
ilTy.TypeRef.Name = "System.String" -> true
1853+
| _ -> false))
18491854

18501855
/// Optimize/analyze an expression
18511856
let rec OptimizeExpr cenv (env: IncrementalOptimizationEnv) expr =
@@ -1972,10 +1977,12 @@ and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) =
19721977
and MakeOptimizedSystemStringConcatCall cenv env m args =
19731978
let rec optimizeArg argExpr accArgs =
19741979
match argExpr, accArgs with
1975-
| Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ], _), _ when IsILMethodRefSystemStringConcatArray cenv.g.ilg methRef ->
1980+
| Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ], _), _
1981+
when IsILMethodRefSystemStringConcatArray mref ->
19761982
optimizeArgs args accArgs
19771983

1978-
| Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, args, _), _ when IsILMethodRefSystemStringConcatOverload cenv.g.ilg mref ->
1984+
| Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, args, _), _
1985+
when IsILMethodRefSystemStringConcat mref ->
19791986
optimizeArgs args accArgs
19801987

19811988
// Optimize string constants, e.g. "1" + "2" will turn into "12"
@@ -2005,7 +2012,8 @@ and MakeOptimizedSystemStringConcatCall cenv env m args =
20052012
mkStaticCall_String_Concat_Array cenv.g m arg
20062013

20072014
match expr with
2008-
| Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _) as op, tyargs, args, m) when IsILMethodRefSystemStringConcatOverload cenv.g.ilg methRef || IsILMethodRefSystemStringConcatArray cenv.g.ilg methRef ->
2015+
| Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _) as op, tyargs, args, m)
2016+
when IsILMethodRefSystemStringConcat mref || IsILMethodRefSystemStringConcatArray mref ->
20092017
OptimizeExprOpReductions cenv env (op, tyargs, args, m)
20102018
| _ ->
20112019
OptimizeExpr cenv env expr
@@ -2074,9 +2082,11 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) =
20742082
| TOp.ILAsm ([], [ty]), _, [a] when typeEquiv cenv.g (tyOfExpr cenv.g a) ty -> OptimizeExpr cenv env a
20752083

20762084
// Optimize calls when concatenating strings, e.g. "1" + "2" + "3" + "4" .. etc.
2077-
| TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ] when IsILMethodRefSystemStringConcatArray cenv.g.ilg mref ->
2085+
| TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ]
2086+
when IsILMethodRefSystemStringConcatArray mref ->
20782087
MakeOptimizedSystemStringConcatCall cenv env m args
2079-
| TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, args when IsILMethodRefSystemStringConcatOverload cenv.g.ilg mref ->
2088+
| TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), _, args
2089+
when IsILMethodRefSystemStringConcat mref ->
20802090
MakeOptimizedSystemStringConcatCall cenv env m args
20812091

20822092
| _ ->

0 commit comments

Comments
 (0)