diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index 5c2884cb29659e..1d7a3065c0d136 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -381,6 +381,42 @@ unsigned ValueNumStore::VNFuncArity(VNFunc vnf) return (s_vnfOpAttribs[vnf] & VNFOA_ArityMask) >> VNFOA_ArityShift; } +// static +bool ValueNumStore::VNFuncIsCommutative(VNFunc vnf) +{ + if (vnf < VNF_Boundary) + { + return GenTree::OperIsCommutative(static_cast(vnf)); + } + + switch (vnf) + { + case VNF_ADD_OVF: + case VNF_MUL_OVF: + case VNF_ADD_UN_OVF: + case VNF_MUL_UN_OVF: +#if defined(TARGET_RISCV64) + case VNF_MinInt: + case VNF_MaxInt: + case VNF_MinInt_UN: + case VNF_MaxInt_UN: +#endif + return true; + default: + break; + } + +#ifdef FEATURE_HW_INTRINSICS + if ((vnf >= VNF_HWI_FIRST) && (vnf <= VNF_HWI_LAST)) + { + NamedIntrinsic id = NamedIntrinsic((vnf - VNF_HWI_FIRST) + (NI_HW_INTRINSIC_START + 1)); + return HWIntrinsicInfo::IsCommutative(id); + } +#endif + + return false; +} + template <> bool ValueNumStore::IsOverflowIntDiv(int v0, int v1) { @@ -10588,29 +10624,27 @@ void ValueNumStore::vnDumpZeroObj(Compiler* comp, VNFuncApp* zeroObj) } /* static */ constexpr uint8_t ValueNumStore::GetOpAttribsForGenTree(genTreeOps oper, - bool commute, bool illegalAsVNFunc, GenTreeOperKind kind) { - return GetOpAttribsForArity(oper, kind) | (static_cast(commute) << VNFOA_CommutativeShift) | + return GetOpAttribsForArity(oper, kind) | (static_cast(illegalAsVNFunc) << VNFOA_IllegalGenTreeOpShift); } -/* static */ constexpr uint8_t ValueNumStore::GetOpAttribsForFunc(int arity, bool commute, bool knownNonNull) +/* static */ constexpr uint8_t ValueNumStore::GetOpAttribsForFunc(int arity, bool knownNonNull) { - return (static_cast(commute) << VNFOA_CommutativeShift) | - (static_cast(knownNonNull) << VNFOA_KnownNonNullShift) | + return (static_cast(knownNonNull) << VNFOA_KnownNonNullShift) | ((static_cast(arity & ~(arity >> 31)) << VNFOA_ArityShift) & VNFOA_ArityMask); } const uint8_t ValueNumStore::s_vnfOpAttribs[VNF_COUNT] = { #define GTNODE(en, st, cm, ivn, ok) \ - GetOpAttribsForGenTree(static_cast(GT_##en), cm, ivn, static_cast(ok)), + GetOpAttribsForGenTree(static_cast(GT_##en), ivn, static_cast(ok)), #include "gtlist.h" 0, // VNF_Boundary -#define ValueNumFuncDef(vnf, arity, commute, knownNonNull) GetOpAttribsForFunc(arity, commute, knownNonNull), +#define ValueNumFuncDef(vnf, arity, knownNonNull) GetOpAttribsForFunc(arity, knownNonNull), #include "valuenumfuncs.h" }; @@ -10654,20 +10688,13 @@ void ValueNumStore::ValidateValueNumStoreStatics() } arr[i] |= ((arity << VNFOA_ArityShift) & VNFOA_ArityMask); - - if (GenTree::OperIsCommutative(gtOper)) - { - arr[i] |= VNFOA_Commutative; - } } // I so wish this wasn't the best way to do this... int vnfNum = VNF_Boundary + 1; // The macro definition below will update this after using it. -#define ValueNumFuncDef(vnf, arity, commute, knownNonNull) \ - if (commute) \ - arr[vnfNum] |= VNFOA_Commutative; \ +#define ValueNumFuncDef(vnf, arity, knownNonNull) \ if (knownNonNull) \ arr[vnfNum] |= VNFOA_KnownNonNull; \ if (arity > 0) \ @@ -10682,20 +10709,6 @@ void ValueNumStore::ValidateValueNumStoreStatics() arr[vnfNum] &= ~VNFOA_ArityMask; /* clear old arity value */ \ arr[vnfNum] |= ((arity << VNFOA_ArityShift) & VNFOA_ArityMask) /* set the new arity value */ -#ifdef FEATURE_HW_INTRINSICS - - for (NamedIntrinsic id = (NamedIntrinsic)(NI_HW_INTRINSIC_START + 1); (id < NI_HW_INTRINSIC_END); - id = (NamedIntrinsic)(id + 1)) - { - if (HWIntrinsicInfo::IsCommutative(id)) - { - VNFunc func = VNFunc(VNF_HWI_FIRST + (id - NI_HW_INTRINSIC_START - 1)); - arr[func] |= VNFOA_Commutative; - } - } - -#endif // FEATURE_HW_INTRINSICS - #undef ValueNumFuncSetArity for (unsigned i = 0; i < ArrLen(genTreeOpsIllegalAsVNFunc); i++) @@ -10713,7 +10726,7 @@ void ValueNumStore::ValidateValueNumStoreStatics() #ifdef DEBUG // Define the name array. -#define ValueNumFuncDef(vnf, arity, commute, knownNonNull) #vnf, +#define ValueNumFuncDef(vnf, arity, knownNonNull) #vnf, const char* ValueNumStore::VNFuncNameArr[] = { #include "valuenumfuncs.h" diff --git a/src/coreclr/jit/valuenum.h b/src/coreclr/jit/valuenum.h index 8c75e17935a485..9743bb2275e504 100644 --- a/src/coreclr/jit/valuenum.h +++ b/src/coreclr/jit/valuenum.h @@ -169,7 +169,7 @@ enum VNFunc #define GTNODE(en, st, cm, ivn, ok) VNF_##en, #include "gtlist.h" VNF_Boundary = GT_COUNT, -#define ValueNumFuncDef(nm, arity, commute, knownNonNull) VNF_##nm, +#define ValueNumFuncDef(nm, arity, knownNonNull) VNF_##nm, #include "valuenumfuncs.h" VNF_COUNT }; @@ -295,23 +295,20 @@ class ValueNumStore enum VNFOpAttrib { VNFOA_IllegalGenTreeOp = 0x1, // corresponds to a genTreeOps value that is not a legal VN func. - VNFOA_Commutative = 0x2, // 1 iff the function is commutative. - VNFOA_Arity1 = 0x4, // Bits 2,3,4 encode the arity. - VNFOA_Arity2 = 0x8, // Bits 2,3,4 encode the arity. - VNFOA_Arity4 = 0x10, // Bits 2,3,4 encode the arity. - VNFOA_KnownNonNull = 0x20, // 1 iff the result is known to be non-null. + VNFOA_Arity1 = 0x2, // Bits 1,2,3 encode the arity. + VNFOA_Arity2 = 0x4, // Bits 1,2,3 encode the arity. + VNFOA_Arity4 = 0x8, // Bits 1,2,3 encode the arity. + VNFOA_KnownNonNull = 0x10, // 1 iff the result is known to be non-null. }; static const unsigned VNFOA_IllegalGenTreeOpShift = 0; - static const unsigned VNFOA_CommutativeShift = 1; - static const unsigned VNFOA_ArityShift = 2; + static const unsigned VNFOA_ArityShift = 1; static const unsigned VNFOA_ArityBits = 3; static const unsigned VNFOA_MaxArity = (1 << VNFOA_ArityBits) - 1; // Max arity we can represent. static const unsigned VNFOA_ArityMask = (VNFOA_Arity4 | VNFOA_Arity2 | VNFOA_Arity1); - static const unsigned VNFOA_KnownNonNullShift = 5; + static const unsigned VNFOA_KnownNonNullShift = 4; static_assert(unsigned(VNFOA_IllegalGenTreeOp) == (1 << VNFOA_IllegalGenTreeOpShift)); - static_assert(unsigned(VNFOA_Commutative) == (1 << VNFOA_CommutativeShift)); static_assert(unsigned(VNFOA_Arity1) == (1 << VNFOA_ArityShift)); static_assert(VNFOA_ArityMask == (VNFOA_MaxArity << VNFOA_ArityShift)); static_assert(unsigned(VNFOA_KnownNonNull) == (1 << VNFOA_KnownNonNullShift)); @@ -328,10 +325,9 @@ class ValueNumStore // Helpers and an array of length GT_COUNT, mapping genTreeOp values to their VNFOpAttrib. static constexpr uint8_t GetOpAttribsForArity(genTreeOps oper, GenTreeOperKind kind); static constexpr uint8_t GetOpAttribsForGenTree(genTreeOps oper, - bool commute, bool illegalAsVNFunc, GenTreeOperKind kind); - static constexpr uint8_t GetOpAttribsForFunc(int arity, bool commute, bool knownNonNull); + static constexpr uint8_t GetOpAttribsForFunc(int arity, bool knownNonNull); static const uint8_t s_vnfOpAttribs[]; // Returns "true" iff gtOper is a legal value number function. @@ -2314,12 +2310,6 @@ inline bool ValueNumStore::GenTreeOpIsLegalVNFunc(genTreeOps gtOper) return (s_vnfOpAttribs[gtOper] & VNFOA_IllegalGenTreeOp) == 0; } -// static -inline bool ValueNumStore::VNFuncIsCommutative(VNFunc vnf) -{ - return (s_vnfOpAttribs[vnf] & VNFOA_Commutative) != 0; -} - inline bool ValueNumStore::VNFuncIsComparison(VNFunc vnf) { if (vnf >= VNF_Boundary) diff --git a/src/coreclr/jit/valuenumfuncs.h b/src/coreclr/jit/valuenumfuncs.h index 1b78e12315f572..3a7ba4beca7af4 100644 --- a/src/coreclr/jit/valuenumfuncs.h +++ b/src/coreclr/jit/valuenumfuncs.h @@ -3,202 +3,202 @@ // Defines the functions understood by the value-numbering system. // ValueNumFuncDef(, , -// , ) +// ) // clang-format off -ValueNumFuncDef(MemOpaque, 1, false, false) // Args: 0: loop num -ValueNumFuncDef(MapSelect, 2, false, false) // Args: 0: map, 1: key. -ValueNumFuncDef(MapStore, 4, false, false) // Args: 0: map, 1: index (e. g. field handle), 2: value being stored, 3: loop num. -ValueNumFuncDef(MapPhysicalStore, 3, false, false) // Args: 0: map, 1: "physical selector": offset and size, 2: value being stored -ValueNumFuncDef(BitCast, 2, false, false) // Args: 0: VN of the arg, 1: VN of the target type -ValueNumFuncDef(ZeroObj, 1, false, false) // Args: 0: VN of the class handle. - -ValueNumFuncDef(PtrToLoc, 2, false, true) // Pointer (byref) to a local variable. Args: VN's of: 0: local's number, 1: offset. -ValueNumFuncDef(PtrToArrElem, 4, false, false) // Pointer (byref) to an array element. Args: 0: array elem type eq class var_types value, VN's of: 1: array, 2: index, 3: offset. -ValueNumFuncDef(PtrToStatic, 3, false, true) // Pointer (byref) to a static variable (or possibly a field thereof, if the static variable is a struct). +ValueNumFuncDef(MemOpaque, 1, false) // Args: 0: loop num +ValueNumFuncDef(MapSelect, 2, false) // Args: 0: map, 1: key. +ValueNumFuncDef(MapStore, 4, false) // Args: 0: map, 1: index (e. g. field handle), 2: value being stored, 3: loop num. +ValueNumFuncDef(MapPhysicalStore, 3, false) // Args: 0: map, 1: "physical selector": offset and size, 2: value being stored +ValueNumFuncDef(BitCast, 2, false) // Args: 0: VN of the arg, 1: VN of the target type +ValueNumFuncDef(ZeroObj, 1, false) // Args: 0: VN of the class handle. + +ValueNumFuncDef(PtrToLoc, 2, true) // Pointer (byref) to a local variable. Args: VN's of: 0: local's number, 1: offset. +ValueNumFuncDef(PtrToArrElem, 4, false) // Pointer (byref) to an array element. Args: 0: array elem type eq class var_types value, VN's of: 1: array, 2: index, 3: offset. +ValueNumFuncDef(PtrToStatic, 3, true) // Pointer (byref) to a static variable (or possibly a field thereof, if the static variable is a struct). // Args: 0: (VN of) the box's address if the static is "boxed", // 1: (VN of) the field sequence, // 2: (VN of) offset for the constituent struct fields -ValueNumFuncDef(MDArrLength, 2, false, false) // MD array len, Args: 0: array, 1: dimension -ValueNumFuncDef(MDArrLowerBound, 2, false, false) // MD array lower bound, Args: 0: array, 1: dimension +ValueNumFuncDef(MDArrLength, 2, false) // MD array len, Args: 0: array, 1: dimension +ValueNumFuncDef(MDArrLowerBound, 2, false) // MD array lower bound, Args: 0: array, 1: dimension -ValueNumFuncDef(InitVal, 1, false, false) // An input arg, or init val of a local Args: 0: a constant VN. +ValueNumFuncDef(InitVal, 1, false) // An input arg, or init val of a local Args: 0: a constant VN. -ValueNumFuncDef(Cast, 2, false, false) // VNF_Cast: Cast Operation changes the representations size and unsigned-ness. +ValueNumFuncDef(Cast, 2, false) // VNF_Cast: Cast Operation changes the representations size and unsigned-ness. // Args: 0: Source for the cast operation. // 1: Constant integer representing the operation . // Use VNForCastOper() to construct. -ValueNumFuncDef(CastOvf, 2, false, false) // Same as a VNF_Cast but also can throw an overflow exception. +ValueNumFuncDef(CastOvf, 2, false) // Same as a VNF_Cast but also can throw an overflow exception. -ValueNumFuncDef(CastClass, 2, false, false) // Args: 0: Handle of class being cast to, 1: object being cast. -ValueNumFuncDef(IsInstanceOf, 2, false, false) // Args: 0: Handle of class being queried, 1: object being queried. -ValueNumFuncDef(ReadyToRunCastClass, 2, false, false) // Args: 0: Helper stub address, 1: object being cast. -ValueNumFuncDef(ReadyToRunIsInstanceOf, 2, false, false) // Args: 0: Helper stub address, 1: object being queried. -ValueNumFuncDef(TypeHandleToRuntimeType, 1, false, false) // Args: 0: TypeHandle to translate -ValueNumFuncDef(TypeHandleToRuntimeTypeHandle, 1, false, false) // Args: 0: TypeHandle to translate +ValueNumFuncDef(CastClass, 2, false) // Args: 0: Handle of class being cast to, 1: object being cast. +ValueNumFuncDef(IsInstanceOf, 2, false) // Args: 0: Handle of class being queried, 1: object being queried. +ValueNumFuncDef(ReadyToRunCastClass, 2, false) // Args: 0: Helper stub address, 1: object being cast. +ValueNumFuncDef(ReadyToRunIsInstanceOf, 2, false) // Args: 0: Helper stub address, 1: object being queried. +ValueNumFuncDef(TypeHandleToRuntimeType, 1, false) // Args: 0: TypeHandle to translate +ValueNumFuncDef(TypeHandleToRuntimeTypeHandle, 1, false) // Args: 0: TypeHandle to translate -ValueNumFuncDef(LdElemA, 3, false, false) // Args: 0: array value; 1: index value; 2: type handle of element. +ValueNumFuncDef(LdElemA, 3, false) // Args: 0: array value; 1: index value; 2: type handle of element. -ValueNumFuncDef(ByrefExposedLoad, 3, false, false) // Args: 0: type handle/id, 1: pointer value; 2: ByrefExposed heap value +ValueNumFuncDef(ByrefExposedLoad, 3, false) // Args: 0: type handle/id, 1: pointer value; 2: ByrefExposed heap value -ValueNumFuncDef(GetRefanyVal, 2, false, false) // Args: 0: type handle; 1: typedref value. Returns the value (asserting that the type is right). +ValueNumFuncDef(GetRefanyVal, 2, false) // Args: 0: type handle; 1: typedref value. Returns the value (asserting that the type is right). -ValueNumFuncDef(GetClassFromMethodParam, 1, false, true) // Args: 0: method generic argument. -ValueNumFuncDef(GetSyncFromClassHandle, 1, false, true) // Args: 0: class handle. -ValueNumFuncDef(LoopCloneChoiceAddr, 0, false, true) +ValueNumFuncDef(GetClassFromMethodParam, 1, true) // Args: 0: method generic argument. +ValueNumFuncDef(GetSyncFromClassHandle, 1, true) // Args: 0: class handle. +ValueNumFuncDef(LoopCloneChoiceAddr, 0, true) // How we represent values of expressions with exceptional side effects: -ValueNumFuncDef(ValWithExc, 2, false, false) // Args: 0: value number from normal execution; 1: VN for set of possible exceptions. -ValueNumFuncDef(ExcSetCons, 2, false, false) // Args: 0: exception; 1: exception set (including EmptyExcSet). Invariant: "car"s are always in ascending order. +ValueNumFuncDef(ValWithExc, 2, false) // Args: 0: value number from normal execution; 1: VN for set of possible exceptions. +ValueNumFuncDef(ExcSetCons, 2, false) // Args: 0: exception; 1: exception set (including EmptyExcSet). Invariant: "car"s are always in ascending order. // Various functions that are used to indicate that exceptions may occur // Currently when the execution is always thrown, the value VNForVoid() is used as Arg0 by OverflowExc and DivideByZeroExc // -ValueNumFuncDef(NullPtrExc, 1, false, false) // Null pointer exception check. Args: 0: address value, throws when it is null -ValueNumFuncDef(ArithmeticExc, 2, false, false) // Arithmetic exception check, ckfinite and integer division overflow, Args: 0: expression value, -ValueNumFuncDef(OverflowExc, 1, false, false) // Integer overflow check. used for checked add,sub and mul Args: 0: expression value, throws when it overflows -ValueNumFuncDef(ConvOverflowExc, 2, false, false) // Cast conversion overflow check. Args: 0: input value; 1: var_types of the target type +ValueNumFuncDef(NullPtrExc, 1, false) // Null pointer exception check. Args: 0: address value, throws when it is null +ValueNumFuncDef(ArithmeticExc, 2, false) // Arithmetic exception check, ckfinite and integer division overflow, Args: 0: expression value, +ValueNumFuncDef(OverflowExc, 1, false) // Integer overflow check. used for checked add,sub and mul Args: 0: expression value, throws when it overflows +ValueNumFuncDef(ConvOverflowExc, 2, false) // Cast conversion overflow check. Args: 0: input value; 1: var_types of the target type // - (shifted left one bit; low bit encode whether source is unsigned.) -ValueNumFuncDef(DivideByZeroExc, 1, false, false) // Division by zero check. Args: 0: divisor value, throws when it is zero -ValueNumFuncDef(IndexOutOfRangeExc, 2, false, false) // Array bounds check, Args: 0: array length; 1: index value, throws when the bounds check fails. -ValueNumFuncDef(InvalidCastExc, 2, false, false) // CastClass check, Args: 0: ref value being cast; 1: handle of type being cast to -ValueNumFuncDef(R2RInvalidCastExc, 2, false, false) // CastClass check, Args: 0: ref value being cast; 1: entry point of R2R cast helper -ValueNumFuncDef(NewArrOverflowExc, 1, false, false) // Raises Integer overflow when Arg 0 is negative -ValueNumFuncDef(DynamicClassInitExc, 1, false, false) // Represents exceptions thrown by static constructor for class. Args: 0: VN of DynamicStaticsInfo -ValueNumFuncDef(ThreadClassInitExc, 1, false, false) // Represents exceptions thrown by static constructor for class. Args: 0: VN of ThreadStaticsInfo -ValueNumFuncDef(R2RClassInitExc, 1, false, false) // Represents exceptions thrown by static constructor for class. Args: 0: VN of R2R entry point -ValueNumFuncDef(ClassInitGenericExc, 2, false, false)// Represents exceptions thrown by static constructor for class. Args: 0: VN of class handle -ValueNumFuncDef(HelperOpaqueExc, 1, false, false) // Represents opaque exceptions could be thrown by a JIT helper. +ValueNumFuncDef(DivideByZeroExc, 1, false) // Division by zero check. Args: 0: divisor value, throws when it is zero +ValueNumFuncDef(IndexOutOfRangeExc, 2, false) // Array bounds check, Args: 0: array length; 1: index value, throws when the bounds check fails. +ValueNumFuncDef(InvalidCastExc, 2, false) // CastClass check, Args: 0: ref value being cast; 1: handle of type being cast to +ValueNumFuncDef(R2RInvalidCastExc, 2, false) // CastClass check, Args: 0: ref value being cast; 1: entry point of R2R cast helper +ValueNumFuncDef(NewArrOverflowExc, 1, false) // Raises Integer overflow when Arg 0 is negative +ValueNumFuncDef(DynamicClassInitExc, 1, false) // Represents exceptions thrown by static constructor for class. Args: 0: VN of DynamicStaticsInfo +ValueNumFuncDef(ThreadClassInitExc, 1, false) // Represents exceptions thrown by static constructor for class. Args: 0: VN of ThreadStaticsInfo +ValueNumFuncDef(R2RClassInitExc, 1, false) // Represents exceptions thrown by static constructor for class. Args: 0: VN of R2R entry point +ValueNumFuncDef(ClassInitGenericExc, 2, false)// Represents exceptions thrown by static constructor for class. Args: 0: VN of class handle +ValueNumFuncDef(HelperOpaqueExc, 1, false) // Represents opaque exceptions could be thrown by a JIT helper. // Args: 0: Input to helper that uniquely determines exceptions thrown. -ValueNumFuncDef(Abs, 1, false, false) -ValueNumFuncDef(Acos, 1, false, false) -ValueNumFuncDef(Acosh, 1, false, false) -ValueNumFuncDef(Asin, 1, false, false) -ValueNumFuncDef(Asinh, 1, false, false) -ValueNumFuncDef(Atan, 1, false, false) -ValueNumFuncDef(Atanh, 1, false, false) -ValueNumFuncDef(Atan2, 2, false, false) -ValueNumFuncDef(Cbrt, 1, false, false) -ValueNumFuncDef(Ceiling, 1, false, false) -ValueNumFuncDef(Cos, 1, false, false) -ValueNumFuncDef(Cosh, 1, false, false) -ValueNumFuncDef(Exp, 1, false, false) -ValueNumFuncDef(Floor, 1, false, false) -ValueNumFuncDef(ILogB, 1, false, false) -ValueNumFuncDef(Log, 1, false, false) -ValueNumFuncDef(Log2, 1, false, false) -ValueNumFuncDef(Log10, 1, false, false) -ValueNumFuncDef(Max, 2, false, false) -ValueNumFuncDef(MaxMagnitude, 2, false, false) -ValueNumFuncDef(MaxMagnitudeNumber, 2, false, false) -ValueNumFuncDef(MaxNumber, 2, false, false) -ValueNumFuncDef(Min, 2, false, false) -ValueNumFuncDef(MinMagnitude, 2, false, false) -ValueNumFuncDef(MinMagnitudeNumber, 2, false, false) -ValueNumFuncDef(MinNumber, 2, false, false) -ValueNumFuncDef(Pow, 2, false, false) -ValueNumFuncDef(RoundDouble, 1, false, false) -ValueNumFuncDef(RoundInt32, 1, false, false) -ValueNumFuncDef(RoundSingle, 1, false, false) -ValueNumFuncDef(Sin, 1, false, false) -ValueNumFuncDef(Sinh, 1, false, false) -ValueNumFuncDef(Sqrt, 1, false, false) -ValueNumFuncDef(Tan, 1, false, false) -ValueNumFuncDef(Tanh, 1, false, false) -ValueNumFuncDef(Truncate, 1, false, false) - -ValueNumFuncDef(LeadingZeroCount, 1, false, false) -ValueNumFuncDef(TrailingZeroCount, 1, false, false) -ValueNumFuncDef(PopCount, 1, false, false) - -ValueNumFuncDef(ManagedThreadId, 0, false, false) - -ValueNumFuncDef(ObjGetType, 1, false, true) -ValueNumFuncDef(GetGcstaticBase, 1, false, true) -ValueNumFuncDef(GetNongcstaticBase, 1, false, true) -ValueNumFuncDef(GetdynamicGcstaticBase, 1, false, true) -ValueNumFuncDef(GetdynamicNongcstaticBase, 1, false, true) -ValueNumFuncDef(GetdynamicGcstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetdynamicNongcstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(ReadyToRunStaticBaseGC, 1, false, true) -ValueNumFuncDef(ReadyToRunStaticBaseNonGC, 1, false, true) -ValueNumFuncDef(ReadyToRunStaticBaseThread, 1, false, true) -ValueNumFuncDef(ReadyToRunStaticBaseThreadNoctor, 1, false, true) -ValueNumFuncDef(ReadyToRunStaticBaseThreadNonGC, 1, false, true) -ValueNumFuncDef(ReadyToRunGenericStaticBase, 2, false, true) -ValueNumFuncDef(GetpinnedGcstaticBase, 1, false, true) -ValueNumFuncDef(GetpinnedNongcstaticBase, 1, false, true) -ValueNumFuncDef(GetpinnedGcstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetpinnedNongcstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetGcthreadstaticBase, 1, false, true) -ValueNumFuncDef(GetNongcthreadstaticBase, 1, false, true) -ValueNumFuncDef(GetGcthreadstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetNongcthreadstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetdynamicGcthreadstaticBase, 1, false, true) -ValueNumFuncDef(GetdynamicNongcthreadstaticBase, 1, false, true) -ValueNumFuncDef(GetdynamicGcthreadstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetdynamicGcthreadstaticBaseNoctorOptimized, 1, false, true) -ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctor, 1, false, true) -ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctorOptimized, 1, false, true) -ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctorOptimized2, 1, false, true) -ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctorOptimized2NoJitOpt, 1, false, true) - -ValueNumFuncDef(RuntimeHandleMethod, 2, false, true) -ValueNumFuncDef(RuntimeHandleClass, 2, false, true) -ValueNumFuncDef(ReadyToRunGenericHandle, 2, false, true) - -ValueNumFuncDef(GetStaticAddrTLS, 1, false, true) - -ValueNumFuncDef(VirtualFuncPtr, 3, false, true) -ValueNumFuncDef(GVMLookupForSlot, 2, false, true) -ValueNumFuncDef(ReadyToRunVirtualFuncPtr, 2, false, true) - -ValueNumFuncDef(JitNew, 2, false, true) -ValueNumFuncDef(JitNewArr, 3, false, true) -ValueNumFuncDef(JitNewLclArr, 3, false, true) -ValueNumFuncDef(JitNewMdArr, 4, false, true) -ValueNumFuncDef(JitReadyToRunNew, 2, false, true) -ValueNumFuncDef(JitReadyToRunNewArr, 3, false, true) -ValueNumFuncDef(JitReadyToRunNewLclArr, 3, false, true) -ValueNumFuncDef(Box, 3, false, true) -ValueNumFuncDef(BoxNullable, 3, false, false) - -ValueNumFuncDef(InvariantLoad, 1, false, false) // Args: 0: (VN of) the address. -ValueNumFuncDef(InvariantNonNullLoad, 1, false, true) // Args: 0: (VN of) the address. -ValueNumFuncDef(Unbox, 2, false, false) -ValueNumFuncDef(Unbox_TypeTest, 2, false, false) - -ValueNumFuncDef(LT_UN, 2, false, false) // unsigned or unordered comparisons -ValueNumFuncDef(LE_UN, 2, false, false) -ValueNumFuncDef(GE_UN, 2, false, false) -ValueNumFuncDef(GT_UN, 2, false, false) - -ValueNumFuncDef(ADD_OVF, 2, true, false) // overflow checking operations -ValueNumFuncDef(SUB_OVF, 2, false, false) -ValueNumFuncDef(MUL_OVF, 2, true, false) - -ValueNumFuncDef(ADD_UN_OVF, 2, true, false) // unsigned overflow checking operations -ValueNumFuncDef(SUB_UN_OVF, 2, false, false) -ValueNumFuncDef(MUL_UN_OVF, 2, true, false) +ValueNumFuncDef(Abs, 1, false) +ValueNumFuncDef(Acos, 1, false) +ValueNumFuncDef(Acosh, 1, false) +ValueNumFuncDef(Asin, 1, false) +ValueNumFuncDef(Asinh, 1, false) +ValueNumFuncDef(Atan, 1, false) +ValueNumFuncDef(Atanh, 1, false) +ValueNumFuncDef(Atan2, 2, false) +ValueNumFuncDef(Cbrt, 1, false) +ValueNumFuncDef(Ceiling, 1, false) +ValueNumFuncDef(Cos, 1, false) +ValueNumFuncDef(Cosh, 1, false) +ValueNumFuncDef(Exp, 1, false) +ValueNumFuncDef(Floor, 1, false) +ValueNumFuncDef(ILogB, 1, false) +ValueNumFuncDef(Log, 1, false) +ValueNumFuncDef(Log2, 1, false) +ValueNumFuncDef(Log10, 1, false) +ValueNumFuncDef(Max, 2, false) +ValueNumFuncDef(MaxMagnitude, 2, false) +ValueNumFuncDef(MaxMagnitudeNumber, 2, false) +ValueNumFuncDef(MaxNumber, 2, false) +ValueNumFuncDef(Min, 2, false) +ValueNumFuncDef(MinMagnitude, 2, false) +ValueNumFuncDef(MinMagnitudeNumber, 2, false) +ValueNumFuncDef(MinNumber, 2, false) +ValueNumFuncDef(Pow, 2, false) +ValueNumFuncDef(RoundDouble, 1, false) +ValueNumFuncDef(RoundInt32, 1, false) +ValueNumFuncDef(RoundSingle, 1, false) +ValueNumFuncDef(Sin, 1, false) +ValueNumFuncDef(Sinh, 1, false) +ValueNumFuncDef(Sqrt, 1, false) +ValueNumFuncDef(Tan, 1, false) +ValueNumFuncDef(Tanh, 1, false) +ValueNumFuncDef(Truncate, 1, false) + +ValueNumFuncDef(LeadingZeroCount, 1, false) +ValueNumFuncDef(TrailingZeroCount, 1, false) +ValueNumFuncDef(PopCount, 1, false) + +ValueNumFuncDef(ManagedThreadId, 0, false) + +ValueNumFuncDef(ObjGetType, 1, true) +ValueNumFuncDef(GetGcstaticBase, 1, true) +ValueNumFuncDef(GetNongcstaticBase, 1, true) +ValueNumFuncDef(GetdynamicGcstaticBase, 1, true) +ValueNumFuncDef(GetdynamicNongcstaticBase, 1, true) +ValueNumFuncDef(GetdynamicGcstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetdynamicNongcstaticBaseNoctor, 1, true) +ValueNumFuncDef(ReadyToRunStaticBaseGC, 1, true) +ValueNumFuncDef(ReadyToRunStaticBaseNonGC, 1, true) +ValueNumFuncDef(ReadyToRunStaticBaseThread, 1, true) +ValueNumFuncDef(ReadyToRunStaticBaseThreadNoctor, 1, true) +ValueNumFuncDef(ReadyToRunStaticBaseThreadNonGC, 1, true) +ValueNumFuncDef(ReadyToRunGenericStaticBase, 2, true) +ValueNumFuncDef(GetpinnedGcstaticBase, 1, true) +ValueNumFuncDef(GetpinnedNongcstaticBase, 1, true) +ValueNumFuncDef(GetpinnedGcstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetpinnedNongcstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetGcthreadstaticBase, 1, true) +ValueNumFuncDef(GetNongcthreadstaticBase, 1, true) +ValueNumFuncDef(GetGcthreadstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetNongcthreadstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetdynamicGcthreadstaticBase, 1, true) +ValueNumFuncDef(GetdynamicNongcthreadstaticBase, 1, true) +ValueNumFuncDef(GetdynamicGcthreadstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetdynamicGcthreadstaticBaseNoctorOptimized, 1, true) +ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctor, 1, true) +ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctorOptimized, 1, true) +ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctorOptimized2, 1, true) +ValueNumFuncDef(GetdynamicNongcthreadstaticBaseNoctorOptimized2NoJitOpt, 1, true) + +ValueNumFuncDef(RuntimeHandleMethod, 2, true) +ValueNumFuncDef(RuntimeHandleClass, 2, true) +ValueNumFuncDef(ReadyToRunGenericHandle, 2, true) + +ValueNumFuncDef(GetStaticAddrTLS, 1, true) + +ValueNumFuncDef(VirtualFuncPtr, 3, true) +ValueNumFuncDef(GVMLookupForSlot, 2, true) +ValueNumFuncDef(ReadyToRunVirtualFuncPtr, 2, true) + +ValueNumFuncDef(JitNew, 2, true) +ValueNumFuncDef(JitNewArr, 3, true) +ValueNumFuncDef(JitNewLclArr, 3, true) +ValueNumFuncDef(JitNewMdArr, 4, true) +ValueNumFuncDef(JitReadyToRunNew, 2, true) +ValueNumFuncDef(JitReadyToRunNewArr, 3, true) +ValueNumFuncDef(JitReadyToRunNewLclArr, 3, true) +ValueNumFuncDef(Box, 3, true) +ValueNumFuncDef(BoxNullable, 3, false) + +ValueNumFuncDef(InvariantLoad, 1, false) // Args: 0: (VN of) the address. +ValueNumFuncDef(InvariantNonNullLoad, 1, true) // Args: 0: (VN of) the address. +ValueNumFuncDef(Unbox, 2, false) +ValueNumFuncDef(Unbox_TypeTest, 2, false) + +ValueNumFuncDef(LT_UN, 2, false) // unsigned or unordered comparisons +ValueNumFuncDef(LE_UN, 2, false) +ValueNumFuncDef(GE_UN, 2, false) +ValueNumFuncDef(GT_UN, 2, false) + +ValueNumFuncDef(ADD_OVF, 2, false) // overflow checking operations +ValueNumFuncDef(SUB_OVF, 2, false) +ValueNumFuncDef(MUL_OVF, 2, false) + +ValueNumFuncDef(ADD_UN_OVF, 2, false) // unsigned overflow checking operations +ValueNumFuncDef(SUB_UN_OVF, 2, false) +ValueNumFuncDef(MUL_UN_OVF, 2, false) #ifdef FEATURE_SIMD -ValueNumFuncDef(SimdType, 2, false, false) // A value number function to compose a SIMD type +ValueNumFuncDef(SimdType, 2, false) // A value number function to compose a SIMD type #endif // In VN all HW intrinsics encode an extra arg for the base type (except when // they are variadic), hence the +1 to the arg count below here. #if defined(TARGET_XARCH) #define HARDWARE_INTRINSIC(isa, name, size, argCount, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, category, flag) \ -ValueNumFuncDef(HWI_##isa##_##name, ((argCount == -1) ? -1 : (argCount + 1)), ((flag) & HW_Flag_Commutative) >> 0, false) // All of the HARDWARE_INTRINSICS for x86/x64 +ValueNumFuncDef(HWI_##isa##_##name, ((argCount == -1) ? -1 : (argCount + 1)), false) // All of the HARDWARE_INTRINSICS for x86/x64 #include "hwintrinsiclistxarch.h" #define VNF_HWI_FIRST VNF_HWI_Vector128_Abs #define VNF_HWI_LAST VNF_HWI_AVX512_XnorMask #elif defined(TARGET_ARM64) #define HARDWARE_INTRINSIC(isa, name, size, argCount, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, category, flag) \ -ValueNumFuncDef(HWI_##isa##_##name, ((argCount == -1) ? -1 : (argCount + 1)), ((flag) & HW_Flag_Commutative) >> 0, false) // All of the HARDWARE_INTRINSICS for arm64 +ValueNumFuncDef(HWI_##isa##_##name, ((argCount == -1) ? -1 : (argCount + 1)), false) // All of the HARDWARE_INTRINSICS for arm64 #include "hwintrinsiclistarm64.h" #define VNF_HWI_FIRST VNF_HWI_Vector64_Abs #define VNF_HWI_LAST VNF_HWI_Sve_ReverseElement_Predicates @@ -211,10 +211,10 @@ ValueNumFuncDef(HWI_##isa##_##name, ((argCount == -1) ? -1 : (argCount + 1)), (( #elif defined (TARGET_RISCV64) // Signed/Unsigned integer min/max intrinsics - ValueNumFuncDef(MinInt, 2, true, false) - ValueNumFuncDef(MaxInt, 2, true, false) - ValueNumFuncDef(MinInt_UN, 2, true, false) - ValueNumFuncDef(MaxInt_UN, 2, true, false) + ValueNumFuncDef(MinInt, 2, false) + ValueNumFuncDef(MaxInt, 2, false) + ValueNumFuncDef(MinInt_UN, 2, false) + ValueNumFuncDef(MaxInt_UN, 2, false) #elif defined(TARGET_WASM) // No hardware intrinsics on WASM yet.