runtime: CQ: Don't force const arguments to temps.

Morph has a following todo: https://github.com/dotnet/runtime/blob/96019a4bccb8e31f4f13f701099550c9cf136e22/src/coreclr/jit/morph.cpp#L1343-L1346

so the code should look like:

GenTree* arg = prevArgTabEntry->GetNode();
GenTree* lclVarTree = nullptr;
 if (!arg ->OperIsConst() && !impIsAddressInLocal(arg , &lclVarTree))
{

}

In addition, there are other similar places, from a quick search:

  1. the one that is mentioned above;
  2. https://github.com/dotnet/runtime/blob/96019a4bccb8e31f4f13f701099550c9cf136e22/src/coreclr/jit/importer.cpp#L19398
  3. https://github.com/dotnet/runtime/blob/96019a4bccb8e31f4f13f701099550c9cf136e22/src/coreclr/jit/gentree.cpp#L2848
  4. https://github.com/dotnet/runtime/blob/96019a4bccb8e31f4f13f701099550c9cf136e22/src/coreclr/jit/gentree.h#L2184

I recommend creating a new helper Compiler::IsInvariant(GenTree* tree) with a proper function header. Then use it in appropriate places.

The fix should have jit-asm diffs before/after.

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 23 (23 by maintainers)

Most upvoted comments

Here’s the diff for all libraries:

Found 89 files with textual diffs.

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 33371454
Total bytes of diff: 33369057
Total bytes of delta: -2397 (-0.01% of base)
    diff is an improvement.


Top file regressions (bytes):
         210 : Microsoft.CodeAnalysis.dasm (0.03% of base)
          37 : Microsoft.CodeAnalysis.CSharp.dasm (0.00% of base)
          14 : System.Security.Cryptography.X509Certificates.dasm (0.01% of base)

Top file improvements (bytes):
       -1102 : Microsoft.CodeAnalysis.VisualBasic.dasm (-0.05% of base)
        -256 : System.Private.CoreLib.dasm (-0.01% of base)
        -182 : System.Data.Common.dasm (-0.02% of base)
        -148 : System.Collections.Immutable.dasm (-0.06% of base)
        -121 : System.Net.Security.dasm (-0.06% of base)
         -92 : System.Formats.Asn1.dasm (-0.14% of base)
         -90 : System.Security.Cryptography.Algorithms.dasm (-0.03% of base)
         -79 : System.Private.Xml.dasm (-0.00% of base)
         -66 : System.Net.Http.dasm (-0.01% of base)
         -52 : System.Net.HttpListener.dasm (-0.03% of base)
         -44 : System.Security.Cryptography.Cng.dasm (-0.03% of base)
         -41 : System.Runtime.Numerics.dasm (-0.06% of base)
         -33 : System.Net.Quic.dasm (-0.06% of base)
         -30 : System.IO.Pipes.dasm (-0.09% of base)
         -27 : System.Net.WebSockets.dasm (-0.06% of base)
         -26 : System.Security.Cryptography.Pkcs.dasm (-0.01% of base)
         -24 : System.Memory.dasm (-0.03% of base)
         -23 : System.Numerics.Tensors.dasm (-0.07% of base)
         -19 : System.Linq.Parallel.dasm (-0.00% of base)
         -18 : System.Linq.dasm (-0.01% of base)

52 total files with Code Size differences (49 improved, 3 regressed), 217 unchanged.

Top method regressions (bytes):
         144 ( 6.31% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - AbstractFlowPass`1:VisitBinaryOperator(BoundBinaryOperator):BoundNode:this (2 methods)
          98 (30.63% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - BoundFieldAccess:Update(BoundExpression,FieldSymbol,bool,bool,SymbolsInProgress`1,TypeSymbol):BoundFieldAccess:this
          97 ( 8.47% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - TypeBinder:LookupTypeOrNamespaceSyntax(LookupResult,TypeSyntax,Binder,DiagnosticBag,byref,bool,bool,bool,bool)
          92 ( 4.51% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Parser:ParseNextQueryOperator():QueryClauseSyntax:this
          82 ( 3.27% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - OverloadResolution:OperatorInvocationOverloadResolution(ArrayBuilder`1,BoundExpression,BoundExpression,Binder,bool,bool,byref):OverloadResolutionResult
          79 ( 5.45% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:BindUsingBlock(UsingBlockSyntax,DiagnosticBag):BoundStatement:this
          78 ( 1.46% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - SourceMemberMethodSymbol:BindSingleHandlesClause(HandlesClauseItemSyntax,Binder,DiagnosticBag,ArrayBuilder`1,ArrayBuilder`1,ArrayBuilder`1,byref):HandledEvent:this
          77 ( 3.02% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:BindAnonymousObjectCreation(AnonymousObjectCreationExpressionSyntax,DiagnosticBag):BoundExpression:this
          76 ( 5.18% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:BindEventAssignment(AssignmentExpressionSyntax,BoundEventAccess,BoundExpression,int,DiagnosticBag):BoundExpression:this
          76 ( 2.89% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:BindCollectionRangeVariable(CollectionRangeVariableSyntax,bool,HashSet`1,DiagnosticBag):BoundQueryableSource:this
          72 ( 5.39% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - SourceNamedTypeSymbol:ValidateImplementedInterfaces(SyntaxList`1,HashSet`1,ConsList`1,Binder,DiagnosticBag):this
          71 ( 1.72% of base) : Microsoft.CodeAnalysis.CSharp.dasm - MethodBodySynthesizer:ConstructFieldLikeEventAccessorBody_Regular(SourceEventSymbol,bool,CSharpCompilation,DiagnosticBag):BoundBlock
          65 ( 2.42% of base) : Microsoft.CodeAnalysis.dasm - SyntaxDiffer:GetSimilarity(SyntaxNodeOrToken,SyntaxNodeOrToken):int:this
          63 ( 9.74% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LanguageParser:ParseCompilationUnitCore():CompilationUnitSyntax:this
          63 ( 5.87% of base) : Microsoft.CodeAnalysis.CSharp.dasm - SyntaxFactory:ClassDeclaration(SyntaxList`1,SyntaxTokenList,SyntaxToken,SyntaxToken,TypeParameterListSyntax,BaseListSyntax,SyntaxList`1,SyntaxToken,SyntaxList`1,SyntaxToken,SyntaxToken):ClassDeclarationSyntax
          62 ( 4.88% of base) : Microsoft.CodeAnalysis.CSharp.dasm - ForEachLoopBinder:PerformForEachPatternOverloadResolution(TypeSymbol,ArrayBuilder`1,bool,DiagnosticBag):MethodSymbol:this
          62 ( 6.70% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LocalRewriter:MakeConversion(CSharpSyntaxNode,BoundExpression,Conversion,TypeSymbol,bool,bool,ConstantValue):BoundExpression:this
          61 ( 3.05% of base) : Microsoft.CodeAnalysis.CSharp.dasm - SourceNamedTypeSymbol:MakeDeclaredBases(ConsList`1,DiagnosticBag):Tuple`2:this
          60 ( 2.11% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LanguageParser:ParseVariableDeclarator(TypeSyntax,int,bool,bool):VariableDeclaratorSyntax:this
          58 ( 2.33% of base) : Microsoft.CodeAnalysis.CSharp.dasm - ConstraintsHelper:ResolveBounds(TypeParameterSymbol,AssemblySymbol,ConsList`1,ImmutableArray`1,bool,CSharpCompilation,ArrayBuilder`1,byref):TypeParameterBounds

Top method improvements (bytes):
        -231 (-6.21% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:BindQuery(QueryExpressionSyntax,DiagnosticBag):BoundExpression:this
        -195 (-6.76% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Parser:ParseGenericParameters():TypeParameterListSyntax:this
        -189 (-8.03% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:BuildDelegateRelaxationLambda(VisualBasicSyntaxNode,MethodSymbol,BoundMethodGroup,int,bool,bool,DiagnosticBag):BoundLambda:this
        -163 (-11.46% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:ResolveDefaultMethodGroup(BoundMethodGroup,AnalyzedArguments,bool,byref,bool,bool):MethodGroupResolution:this
        -157 (-3.23% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:ReportOverloadResolutionFailureAndProduceBoundNode(VisualBasicSyntaxNode,int,ArrayBuilder`1,ImmutableArray`1,TypeSymbol,ImmutableArray`1,ImmutableArray`1,DiagnosticBag,VisualBasicSyntaxNode,BoundMethodOrPropertyGroup,Symbol,bool,BoundTypeExpression,Symbol,Location):BoundExpression:this
        -130 (-13.66% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Parser:ParseCompilationUnitCore():CompilationUnitSyntax:this
        -124 (-7.12% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - AbstractFlowPass`1:Scan():bool:this (3 methods)
        -107 (-4.82% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:CreateUserDefinedConversion(CSharpSyntaxNode,BoundExpression,Conversion,bool,TypeSymbol,DiagnosticBag):BoundExpression:this
         -99 (-10.82% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:CreateBadCall(CSharpSyntaxNode,String,BoundExpression,ImmutableArray`1,ubyte,ImmutableArray`1,AnalyzedArguments,bool,bool):BoundCall:this
         -98 (-13.39% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:BuildDelegateRelaxationLambda(VisualBasicSyntaxNode,VisualBasicSyntaxNode,BoundExpression,MethodSymbol,BoundTypeArguments,int,MethodSymbol,int,bool,bool,DiagnosticBag,byref):BoundLambda:this
         -85 (-3.86% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - LocalRewriter:RewriteIfStatement(VisualBasicSyntaxNode,VisualBasicSyntaxNode,BoundExpression,BoundStatement,BoundStatement,bool,ImmutableArray`1):BoundStatement:this
         -84 (-3.71% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - AnonymousTypeToStringMethodSymbol:GetBoundMethodBody(DiagnosticBag,byref):BoundBlock:this
         -79 (-3.07% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:BindUnaryOperator(UnaryExpressionSyntax,DiagnosticBag):BoundExpression:this
         -78 (-6.14% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LocalRewriter:RewriteForStatement(CSharpSyntaxNode,ImmutableArray`1,BoundStatement,BoundExpression,CSharpSyntaxNode,TextSpan,BoundStatement,BoundStatement,GeneratedLabelSymbol,GeneratedLabelSymbol,bool):BoundStatement:this
         -71 (-1.21% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - AbstractFlowPass`1:VisitTryStatement(BoundTryStatement):BoundNode:this (3 methods)
         -69 (-6.07% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - LocalRewriter:MakeBinaryExpression(VisualBasicSyntaxNode,int,BoundExpression,BoundExpression,bool,TypeSymbol):BoundExpression:this
         -68 (-6.42% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - SourceNamedTypeSymbol:MakeAcyclicInterfaces(DiagnosticBag):ImmutableArray`1:this
         -68 (-2.86% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Parser:ParseFromControlVars():SeparatedSyntaxList`1:this
         -66 (-5.89% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:ValidateMethodForDelegateInvoke(BoundAddressOfOperator,CandidateAnalysisResult,MethodSymbol,bool,bool,DiagnosticBag):KeyValuePair`2
         -62 (-2.60% of base) : Microsoft.CodeAnalysis.CSharp.dasm - <Microsoft-Cci-ITypeDefinition-GetExplicitImplementationOverrides>d__31:MoveNext():bool:this

Top method regressions (percentages):
          23 (37.70% of base) : Microsoft.CodeAnalysis.dasm - PeWriter:ComputeSizeOfWin32Resources(int):int:this
          98 (30.63% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - BoundFieldAccess:Update(BoundExpression,FieldSymbol,bool,bool,SymbolsInProgress`1,TypeSymbol):BoundFieldAccess:this
          11 (18.97% of base) : Microsoft.CodeAnalysis.dasm - DiagnosticWithInfo:get_Descriptor():DiagnosticDescriptor:this
          10 (17.54% of base) : Microsoft.CodeAnalysis.dasm - DiagnosticWithInfo:get_Id():String:this
          10 (15.62% of base) : Microsoft.CodeAnalysis.dasm - DiagnosticWithInfo:get_Category():String:this
          16 (12.60% of base) : Microsoft.CodeAnalysis.CSharp.dasm - DataFlowsInWalker:ResetState(LocalState):LocalState:this
          29 (11.15% of base) : Microsoft.CodeAnalysis.dasm - ILBuilder:WriteOpCode(BlobBuilder,ushort)
          34 (10.97% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - BoundUnaryOperator:Update(int,BoundExpression,bool,ConstantValue,TypeSymbol):BoundUnaryOperator:this
          16 (10.53% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - DataFlowsInWalker:ResetState(LocalState):LocalState:this
          19 (10.50% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LanguageParser:IsInitializerMember():bool:this
          18 (10.40% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LanguageParser:ParseAliasQualifiedName(int):NameSyntax:this
          18 (10.23% of base) : Microsoft.CodeAnalysis.CSharp.dasm - DirectiveParser:ParseLogicalNot():ExpressionSyntax:this
          18 ( 9.89% of base) : Microsoft.CodeAnalysis.CSharp.dasm - DirectiveParser:ParseLogicalAnd():ExpressionSyntax:this
          63 ( 9.74% of base) : Microsoft.CodeAnalysis.CSharp.dasm - LanguageParser:ParseCompilationUnitCore():CompilationUnitSyntax:this
          52 ( 9.54% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundIndexerAccess:Update(BoundExpression,PropertySymbol,ImmutableArray`1,ImmutableArray`1,ImmutableArray`1,bool,ImmutableArray`1,TypeSymbol):BoundIndexerAccess:this
           2 ( 9.52% of base) : System.Private.CoreLib.dasm - Variant:.ctor(float):this
          38 ( 9.48% of base) : Microsoft.CodeAnalysis.CSharp.dasm - ConversionsBase:HasUnboxingTypeParameterConversion(TypeSymbol,TypeSymbol,byref):bool:this
          45 ( 9.41% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - MemberLookup:LookupImmediate(LookupResult,NamespaceSymbol,String,int,int,Binder,byref)
          31 ( 9.06% of base) : Microsoft.CodeAnalysis.CSharp.dasm - PreciseAbstractFlowPass`1:VisitQueryClause(BoundQueryClause):BoundNode:this (2 methods)
          14 ( 9.03% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:IsCrefAccessible(Symbol):bool:this

Top method improvements (percentages):
         -57 (-19.13% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundBinaryOperator:.ctor(CSharpSyntaxNode,int,BoundExpression,BoundExpression,ConstantValue,MethodSymbol,ubyte,ImmutableArray`1,TypeSymbol,bool):this
         -44 (-15.88% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundMethodGroup:.ctor(CSharpSyntaxNode,ImmutableArray`1,String,ImmutableArray`1,Symbol,DiagnosticInfo,int,BoundExpression,ubyte,bool):this
         -38 (-15.38% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundBinaryOperator:.ctor(CSharpSyntaxNode,int,BoundExpression,BoundExpression,ConstantValue,MethodSymbol,ubyte,TypeSymbol,bool):this
         -37 (-14.86% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundConditionalOperator:.ctor(CSharpSyntaxNode,BoundExpression,BoundExpression,BoundExpression,ConstantValue,TypeSymbol,bool):this
         -53 (-13.66% of base) : Microsoft.CodeAnalysis.CSharp.dasm - ContextAwareSyntax:ArrayCreationExpression(SyntaxToken,ArrayTypeSyntax,InitializerExpressionSyntax):ArrayCreationExpressionSyntax:this
        -130 (-13.66% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Parser:ParseCompilationUnitCore():CompilationUnitSyntax:this
         -98 (-13.39% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - Binder:BuildDelegateRelaxationLambda(VisualBasicSyntaxNode,VisualBasicSyntaxNode,BoundExpression,MethodSymbol,BoundTypeArguments,int,MethodSymbol,int,bool,bool,DiagnosticBag,byref):BoundLambda:this
         -56 (-12.53% of base) : Microsoft.CodeAnalysis.CSharp.dasm - StackOptimizerPass1:IsNestedLocalOfCompoundOperator(LocalSymbol,BoundSequence):bool:this
         -23 (-12.23% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - BoundLambda:.ctor(VisualBasicSyntaxNode,LambdaSymbol,BoundBlock,ImmutableArray`1,LambdaBodyBinder,int,int,bool):this
         -27 (-12.00% of base) : Microsoft.CodeAnalysis.CSharp.dasm - ContextAwareSyntax:ElseClause(SyntaxToken,StatementSyntax):ElseClauseSyntax:this
         -27 (-12.00% of base) : Microsoft.CodeAnalysis.CSharp.dasm - ContextAwareSyntax:FinallyClause(SyntaxToken,BlockSyntax):FinallyClauseSyntax:this
         -22 (-11.64% of base) : Microsoft.CodeAnalysis.CSharp.dasm - CSharpCompilation:get_EnableEnumArrayBlockInitialization():bool:this
        -163 (-11.46% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:ResolveDefaultMethodGroup(BoundMethodGroup,AnalyzedArguments,bool,byref,bool,bool):MethodGroupResolution:this
         -34 (-10.93% of base) : System.Private.CoreLib.dasm - CustomAttribute:GetCustomAttributes(RuntimeModule,int,int,RuntimeType):ref
         -99 (-10.82% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:CreateBadCall(CSharpSyntaxNode,String,BoundExpression,ImmutableArray`1,ubyte,ImmutableArray`1,AnalyzedArguments,bool,bool):BoundCall:this
         -21 (-10.61% of base) : Microsoft.CodeAnalysis.VisualBasic.dasm - LambdaRewriter:InLoopOrLambda(SyntaxNode,SyntaxNode):bool:this
         -40 (-10.50% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundForEachStatement:.ctor(CSharpSyntaxNode,ForEachEnumeratorInfo,Conversion,BoundTypeExpression,LocalSymbol,BoundExpression,BoundStatement,bool,GeneratedLabelSymbol,GeneratedLabelSymbol,bool):this
         -50 (-10.44% of base) : Microsoft.CodeAnalysis.CSharp.dasm - Binder:MakeQueryClause(CSharpSyntaxNode,BoundExpression,RangeVariableSymbol,BoundExpression,BoundExpression,BoundExpression):BoundQueryClause:this
         -37 (-10.42% of base) : Microsoft.CodeAnalysis.dasm - AbstractSyntaxNavigator:TryGetLastTokenForStructuredTrivia(SyntaxTrivia,Func`2,Func`2,byref):bool:this
         -26 (-10.36% of base) : Microsoft.CodeAnalysis.CSharp.dasm - BoundCatchBlock:.ctor(CSharpSyntaxNode,LocalSymbol,BoundExpression,TypeSymbol,BoundExpression,BoundBlock,bool,bool):this

1354 total methods with Code Size differences (772 improved, 582 regressed), 199348 unchanged.

--------------------------------------------------------------------------------