@@ -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
18511856let rec OptimizeExpr cenv ( env : IncrementalOptimizationEnv ) expr =
@@ -1972,10 +1977,12 @@ and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) =
19721977and 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