@@ -2767,44 +2767,17 @@ struct GenTreeCall final : public GenTree
2767
2767
2768
2768
#define GTF_CALL_M_R2R_REL_INDIRECT 0x2000 // GT_CALL -- ready to run call is indirected through a relative address
2769
2769
2770
- bool IsUnmanaged () { return (gtFlags & GTF_CALL_UNMANAGED) != 0 ; }
2771
- bool NeedsNullCheck () { return (gtFlags & GTF_CALL_NULLCHECK) != 0 ; }
2772
- bool CallerPop () { return (gtFlags & GTF_CALL_POP_ARGS) != 0 ; }
2773
- bool IsVirtual () { return (gtFlags & GTF_CALL_VIRT_KIND_MASK) != GTF_CALL_NONVIRT; }
2774
- bool IsVirtualStub () { return (gtFlags & GTF_CALL_VIRT_KIND_MASK) == GTF_CALL_VIRT_STUB; }
2775
- bool IsVirtualVtable () { return (gtFlags & GTF_CALL_VIRT_KIND_MASK) == GTF_CALL_VIRT_VTABLE; }
2776
- bool IsInlineCandidate () { return (gtFlags & GTF_CALL_INLINE_CANDIDATE) != 0 ; }
2770
+ bool IsUnmanaged () const { return (gtFlags & GTF_CALL_UNMANAGED) != 0 ; }
2771
+ bool NeedsNullCheck () const { return (gtFlags & GTF_CALL_NULLCHECK) != 0 ; }
2772
+ bool CallerPop () const { return (gtFlags & GTF_CALL_POP_ARGS) != 0 ; }
2773
+ bool IsVirtual () const { return (gtFlags & GTF_CALL_VIRT_KIND_MASK) != GTF_CALL_NONVIRT; }
2774
+ bool IsVirtualStub () const { return (gtFlags & GTF_CALL_VIRT_KIND_MASK) == GTF_CALL_VIRT_STUB; }
2775
+ bool IsVirtualVtable () const { return (gtFlags & GTF_CALL_VIRT_KIND_MASK) == GTF_CALL_VIRT_VTABLE; }
2776
+ bool IsInlineCandidate () const { return (gtFlags & GTF_CALL_INLINE_CANDIDATE) != 0 ; }
2777
2777
2778
2778
#ifndef LEGACY_BACKEND
2779
- // Whether the method has non-standard args (i.e. passed in R10 or R11)
2780
- // See fgMorphArgs() to know the call types for which non-standard args are inserted.
2781
- bool HasNonStandardArgs () { return IsUnmanaged () || (gtCallType == CT_INDIRECT && (IsVirtualStub () || gtCallCookie)); }
2782
-
2783
- // Get the count of non-standard arg count
2784
- int GetNonStandardArgCount ()
2785
- {
2786
- if (IsUnmanaged ())
2787
- {
2788
- // R11 = PInvoke cookie param
2789
- return 1 ;
2790
- }
2791
- else if (gtCallType == CT_INDIRECT)
2792
- {
2793
- if (IsVirtualStub ())
2794
- {
2795
- // R11 = Virtual stub param
2796
- return 1 ;
2797
- }
2798
- else if (gtCallCookie != nullptr )
2799
- {
2800
- // R10 = PInvoke target param
2801
- // R11 = PInvoke cookie param
2802
- return 2 ;
2803
- }
2804
- }
2805
-
2806
- return 0 ;
2807
- }
2779
+ bool HasNonStandardAddedArgs (Compiler* compiler) const ;
2780
+ int GetNonStandardAddedArgCount (Compiler* compiler) const ;
2808
2781
#endif // !LEGACY_BACKEND
2809
2782
2810
2783
// Returns true if this call uses a retBuf argument and its calling convention
@@ -2830,7 +2803,7 @@ struct GenTreeCall final : public GenTree
2830
2803
// will make HasRetBufArg() return true, but will also force the
2831
2804
// use of register x8 to pass the RetBuf argument.
2832
2805
//
2833
- bool TreatAsHasRetBufArg (Compiler* compiler);
2806
+ bool TreatAsHasRetBufArg (Compiler* compiler) const ;
2834
2807
2835
2808
// -----------------------------------------------------------------------------------------
2836
2809
// HasMultiRegRetVal: whether the call node returns its value in multiple return registers.
@@ -2859,57 +2832,60 @@ struct GenTreeCall final : public GenTree
2859
2832
}
2860
2833
2861
2834
// Returns true if VM has flagged this method as CORINFO_FLG_PINVOKE.
2862
- bool IsPInvoke () { return (gtCallMoreFlags & GTF_CALL_M_PINVOKE) != 0 ; }
2835
+ bool IsPInvoke () const { return (gtCallMoreFlags & GTF_CALL_M_PINVOKE) != 0 ; }
2863
2836
2864
2837
// Note that the distinction of whether tail prefixed or an implicit tail call
2865
2838
// is maintained on a call node till fgMorphCall() after which it will be
2866
2839
// either a tail call (i.e. IsTailCall() is true) or a non-tail call.
2867
- bool IsTailPrefixedCall () { return (gtCallMoreFlags & GTF_CALL_M_EXPLICIT_TAILCALL) != 0 ; }
2840
+ bool IsTailPrefixedCall () const { return (gtCallMoreFlags & GTF_CALL_M_EXPLICIT_TAILCALL) != 0 ; }
2868
2841
2869
2842
// This method returning "true" implies that tail call flowgraph morhphing has
2870
2843
// performed final checks and committed to making a tail call.
2871
- bool IsTailCall () { return (gtCallMoreFlags & GTF_CALL_M_TAILCALL) != 0 ; }
2844
+ bool IsTailCall () const { return (gtCallMoreFlags & GTF_CALL_M_TAILCALL) != 0 ; }
2872
2845
2873
2846
// This method returning "true" implies that importer has performed tail call checks
2874
2847
// and providing a hint that this can be converted to a tail call.
2875
- bool CanTailCall () { return IsTailPrefixedCall () || IsImplicitTailCall (); }
2848
+ bool CanTailCall () const { return IsTailPrefixedCall () || IsImplicitTailCall (); }
2876
2849
2877
2850
#ifndef LEGACY_BACKEND
2878
- bool IsTailCallViaHelper () { return IsTailCall () && (gtCallMoreFlags & GTF_CALL_M_TAILCALL_VIA_HELPER); }
2851
+ bool IsTailCallViaHelper () const { return IsTailCall () && (gtCallMoreFlags & GTF_CALL_M_TAILCALL_VIA_HELPER); }
2879
2852
#else // LEGACY_BACKEND
2880
- bool IsTailCallViaHelper () { return true ; }
2853
+ bool IsTailCallViaHelper () const { return true ; }
2881
2854
#endif // LEGACY_BACKEND
2882
2855
2883
2856
#if FEATURE_FASTTAILCALL
2884
- bool IsFastTailCall () { return IsTailCall () && !(gtCallMoreFlags & GTF_CALL_M_TAILCALL_VIA_HELPER); }
2857
+ bool IsFastTailCall () const { return IsTailCall () && !(gtCallMoreFlags & GTF_CALL_M_TAILCALL_VIA_HELPER); }
2885
2858
#else // !FEATURE_FASTTAILCALL
2886
- bool IsFastTailCall () { return false ; }
2859
+ bool IsFastTailCall () const { return false ; }
2887
2860
#endif // !FEATURE_FASTTAILCALL
2888
2861
2889
2862
#if FEATURE_TAILCALL_OPT
2890
2863
// Returns true if this is marked for opportunistic tail calling.
2891
2864
// That is, can be tail called though not explicitly prefixed with "tail" prefix.
2892
- bool IsImplicitTailCall () { return (gtCallMoreFlags & GTF_CALL_M_IMPLICIT_TAILCALL) != 0 ; }
2893
- bool IsTailCallConvertibleToLoop () { return (gtCallMoreFlags & GTF_CALL_M_TAILCALL_TO_LOOP) != 0 ; }
2865
+ bool IsImplicitTailCall () const { return (gtCallMoreFlags & GTF_CALL_M_IMPLICIT_TAILCALL) != 0 ; }
2866
+ bool IsTailCallConvertibleToLoop () const { return (gtCallMoreFlags & GTF_CALL_M_TAILCALL_TO_LOOP) != 0 ; }
2894
2867
#else // !FEATURE_TAILCALL_OPT
2895
- bool IsImplicitTailCall () { return false ; }
2896
- bool IsTailCallConvertibleToLoop () { return false ; }
2868
+ bool IsImplicitTailCall () const { return false ; }
2869
+ bool IsTailCallConvertibleToLoop () const { return false ; }
2897
2870
#endif // !FEATURE_TAILCALL_OPT
2898
2871
2899
- bool IsSameThis () { return (gtCallMoreFlags & GTF_CALL_M_NONVIRT_SAME_THIS) != 0 ; }
2900
- bool IsDelegateInvoke (){ return (gtCallMoreFlags & GTF_CALL_M_DELEGATE_INV) != 0 ; }
2901
- bool IsVirtualStubRelativeIndir () { return (gtCallMoreFlags & GTF_CALL_M_VIRTSTUB_REL_INDIRECT) != 0 ; }
2872
+ bool IsSameThis () const { return (gtCallMoreFlags & GTF_CALL_M_NONVIRT_SAME_THIS) != 0 ; }
2873
+ bool IsDelegateInvoke () const { return (gtCallMoreFlags & GTF_CALL_M_DELEGATE_INV) != 0 ; }
2874
+ bool IsVirtualStubRelativeIndir () const { return (gtCallMoreFlags & GTF_CALL_M_VIRTSTUB_REL_INDIRECT) != 0 ; }
2875
+
2902
2876
#ifdef FEATURE_READYTORUN_COMPILER
2903
- bool IsR2RRelativeIndir () { return (gtCallMoreFlags & GTF_CALL_M_R2R_REL_INDIRECT) != 0 ; }
2904
- void setEntryPoint (CORINFO_CONST_LOOKUP entryPoint) {
2877
+ bool IsR2RRelativeIndir () const { return (gtCallMoreFlags & GTF_CALL_M_R2R_REL_INDIRECT) != 0 ; }
2878
+ void setEntryPoint (CORINFO_CONST_LOOKUP entryPoint)
2879
+ {
2905
2880
gtEntryPoint = entryPoint;
2906
2881
if (gtEntryPoint.accessType == IAT_PVALUE)
2907
2882
{
2908
2883
gtCallMoreFlags |= GTF_CALL_M_R2R_REL_INDIRECT;
2909
2884
}
2910
2885
}
2911
2886
#endif // FEATURE_READYTORUN_COMPILER
2912
- bool IsVarargs () { return (gtCallMoreFlags & GTF_CALL_M_VARARGS) != 0 ; }
2887
+
2888
+ bool IsVarargs () const { return (gtCallMoreFlags & GTF_CALL_M_VARARGS) != 0 ; }
2913
2889
2914
2890
unsigned short gtCallMoreFlags; // in addition to gtFlags
2915
2891
@@ -2951,6 +2927,18 @@ struct GenTreeCall final : public GenTree
2951
2927
// IL offset of the call wrt its parent method.
2952
2928
IL_OFFSET gtRawILOffset;
2953
2929
#endif // defined(DEBUG) || defined(INLINE_DATA)
2930
+
2931
+ bool IsHelperCall () const
2932
+ {
2933
+ return gtCallType == CT_HELPER;
2934
+ }
2935
+
2936
+ bool IsHelperCall (CORINFO_METHOD_HANDLE callMethHnd) const
2937
+ {
2938
+ return IsHelperCall () && (callMethHnd == gtCallMethHnd);
2939
+ }
2940
+
2941
+ bool IsHelperCall (Compiler* compiler, unsigned helper) const ;
2954
2942
2955
2943
GenTreeCall (var_types type) :
2956
2944
GenTree (GT_CALL, type)
0 commit comments