From 149eb512673e34b1db9ae7f17dec63a7baf80eb9 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Wed, 23 Aug 2023 13:19:29 +0200 Subject: [PATCH] JIT: Remove TYP_BOOL --- src/coreclr/jit/assertionprop.cpp | 4 --- src/coreclr/jit/codegenxarch.cpp | 4 +-- src/coreclr/jit/compiler.h | 1 - src/coreclr/jit/ee_il_dll.hpp | 4 +-- src/coreclr/jit/gentree.cpp | 9 ++---- src/coreclr/jit/importer.cpp | 6 ++-- src/coreclr/jit/importervectorization.cpp | 4 +-- src/coreclr/jit/lclmorph.cpp | 7 ----- src/coreclr/jit/lclvars.cpp | 34 ----------------------- src/coreclr/jit/lower.cpp | 4 +-- src/coreclr/jit/lowerarmarch.cpp | 2 +- src/coreclr/jit/lowerxarch.cpp | 2 +- src/coreclr/jit/morph.cpp | 12 ++------ src/coreclr/jit/optimizebools.cpp | 15 +--------- src/coreclr/jit/optimizer.cpp | 2 -- src/coreclr/jit/rangecheck.cpp | 1 - src/coreclr/jit/typelist.h | 1 - src/coreclr/jit/utils.cpp | 4 --- src/coreclr/jit/utils.h | 1 - src/coreclr/jit/valuenum.cpp | 10 ------- src/coreclr/jit/vartype.h | 9 +++--- 21 files changed, 23 insertions(+), 113 deletions(-) diff --git a/src/coreclr/jit/assertionprop.cpp b/src/coreclr/jit/assertionprop.cpp index 2eed68d04f6d1..6c353a6a238ef 100644 --- a/src/coreclr/jit/assertionprop.cpp +++ b/src/coreclr/jit/assertionprop.cpp @@ -81,7 +81,6 @@ bool IntegralRange::Contains(int64_t value) const { switch (type) { - case TYP_BOOL: case TYP_UBYTE: case TYP_USHORT: return SymbolicIntegerValue::Zero; @@ -113,7 +112,6 @@ bool IntegralRange::Contains(int64_t value) const { case TYP_BYTE: return SymbolicIntegerValue::ByteMax; - case TYP_BOOL: case TYP_UBYTE: return SymbolicIntegerValue::UByteMax; case TYP_SHORT: @@ -890,7 +888,6 @@ ssize_t Compiler::optCastConstantSmall(ssize_t iconVal, var_types smallType) case TYP_USHORT: return uint16_t(iconVal); - case TYP_BOOL: case TYP_UBYTE: return uint8_t(iconVal); @@ -2708,7 +2705,6 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) unreached(); break; - case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: diff --git a/src/coreclr/jit/codegenxarch.cpp b/src/coreclr/jit/codegenxarch.cpp index 5847b40ffd32e..43a848cc17d1f 100644 --- a/src/coreclr/jit/codegenxarch.cpp +++ b/src/coreclr/jit/codegenxarch.cpp @@ -6735,7 +6735,7 @@ void CodeGen::genCompareFloat(GenTree* treeNode) if (((op1->gtGetContainedRegMask() | op2->gtGetContainedRegMask()) & targetRegMask) == 0) { instGen_Set_Reg_To_Zero(emitTypeSize(TYP_I_IMPL), targetReg); - targetType = TYP_BOOL; // just a tip for inst_SETCC that movzx is not needed + targetType = TYP_UBYTE; // just a tip for inst_SETCC that movzx is not needed } } GetEmitter()->emitInsBinary(ins, cmpAttr, op1, op2); @@ -6906,7 +6906,7 @@ void CodeGen::genCompareInt(GenTree* treeNode) if (((op1->gtGetContainedRegMask() | op2->gtGetContainedRegMask()) & targetRegMask) == 0) { instGen_Set_Reg_To_Zero(emitTypeSize(TYP_I_IMPL), targetReg); - targetType = TYP_BOOL; // just a tip for inst_SETCC that movzx is not needed + targetType = TYP_UBYTE; // just a tip for inst_SETCC that movzx is not needed } } diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index d45284fc463b5..9c253a51d17ab 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -558,7 +558,6 @@ class LclVarDsc unsigned char lvIsSplit : 1; // Set if the argument is splited. #endif // defined(TARGET_RISCV64) - unsigned char lvIsBoolean : 1; // set if variable is boolean unsigned char lvSingleDef : 1; // variable has a single def. Used to identify ref type locals that can get type // updates diff --git a/src/coreclr/jit/ee_il_dll.hpp b/src/coreclr/jit/ee_il_dll.hpp index 0f8191078918f..c3801d88292f5 100644 --- a/src/coreclr/jit/ee_il_dll.hpp +++ b/src/coreclr/jit/ee_il_dll.hpp @@ -174,7 +174,7 @@ inline var_types JITtype2varType(CorInfoType type) // see the definition of enum CorInfoType in file inc/corinfo.h TYP_UNDEF, // CORINFO_TYPE_UNDEF = 0x0, TYP_VOID, // CORINFO_TYPE_VOID = 0x1, - TYP_BOOL, // CORINFO_TYPE_BOOL = 0x2, + TYP_UBYTE, // CORINFO_TYPE_BOOL = 0x2, TYP_USHORT, // CORINFO_TYPE_CHAR = 0x3, TYP_BYTE, // CORINFO_TYPE_BYTE = 0x4, TYP_UBYTE, // CORINFO_TYPE_UBYTE = 0x5, @@ -235,7 +235,7 @@ inline var_types JitType2PreciseVarType(CorInfoType type) // see the definition of enum CorInfoType in file inc/corinfo.h TYP_UNDEF, // CORINFO_TYPE_UNDEF = 0x0, TYP_VOID, // CORINFO_TYPE_VOID = 0x1, - TYP_BOOL, // CORINFO_TYPE_BOOL = 0x2, + TYP_UBYTE, // CORINFO_TYPE_BOOL = 0x2, TYP_USHORT, // CORINFO_TYPE_CHAR = 0x3, TYP_BYTE, // CORINFO_TYPE_BYTE = 0x4, TYP_UBYTE, // CORINFO_TYPE_UBYTE = 0x5, diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index d02ce4714d8a2..452adc328d10b 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -7696,7 +7696,6 @@ GenTree* Compiler::gtNewGenericCon(var_types type, uint8_t* cnsVal) READ_VALUE(int8_t); return gtNewIconNode(val); } - case TYP_BOOL: case TYP_UBYTE: { READ_VALUE(uint8_t); @@ -7790,7 +7789,6 @@ GenTree* Compiler::gtNewConWithPattern(var_types type, uint8_t pattern) { switch (type) { - case TYP_BOOL: case TYP_UBYTE: return gtNewIconNode(pattern); case TYP_BYTE: @@ -14279,7 +14277,7 @@ GenTree* Compiler::gtFoldBoxNullable(GenTree* tree) static_assert_no_msg(OFFSETOF__CORINFO_NullableOfT__hasValue == 0); GenTree* srcAddr = call->gtArgs.GetArgByIndex(1)->GetNode(); - GenTree* hasValueNode = gtNewIndir(TYP_BOOL, srcAddr); + GenTree* hasValueNode = gtNewIndir(TYP_UBYTE, srcAddr); if (op == op1) { @@ -14849,7 +14847,6 @@ GenTree* Compiler::gtFoldExprConst(GenTree* tree) i1 = INT32(UINT16(i1)); goto CNS_INT; - case TYP_BOOL: case TYP_UBYTE: i1 = INT32(UINT8(i1)); goto CNS_INT; @@ -21333,7 +21330,7 @@ GenTree* Compiler::gtNewSimdCmpOpAllNode( genTreeOps op, var_types type, GenTree* op1, GenTree* op2, CorInfoType simdBaseJitType, unsigned simdSize) { assert(IsBaselineSimdIsaSupportedDebugOnly()); - assert(type == TYP_BOOL); + assert(type == TYP_UBYTE); var_types simdType = getSIMDTypeForSize(simdSize); assert(varTypeIsSIMD(simdType)); @@ -21472,7 +21469,7 @@ GenTree* Compiler::gtNewSimdCmpOpAnyNode( genTreeOps op, var_types type, GenTree* op1, GenTree* op2, CorInfoType simdBaseJitType, unsigned simdSize) { assert(IsBaselineSimdIsaSupportedDebugOnly()); - assert(type == TYP_BOOL); + assert(type == TYP_UBYTE); var_types simdType = getSIMDTypeForSize(simdSize); assert(varTypeIsSIMD(simdType)); diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 278f386b41045..995068c10aef6 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -685,9 +685,9 @@ bool Compiler::impCheckImplicitArgumentCoercion(var_types sigType, var_types nod return true; } - if (TypeIs(sigType, TYP_BOOL, TYP_UBYTE, TYP_BYTE, TYP_USHORT, TYP_SHORT, TYP_UINT, TYP_INT)) + if (TypeIs(sigType, TYP_UBYTE, TYP_BYTE, TYP_USHORT, TYP_SHORT, TYP_UINT, TYP_INT)) { - if (TypeIs(nodeType, TYP_BOOL, TYP_UBYTE, TYP_BYTE, TYP_USHORT, TYP_SHORT, TYP_UINT, TYP_INT, TYP_I_IMPL)) + if (TypeIs(nodeType, TYP_UBYTE, TYP_BYTE, TYP_USHORT, TYP_SHORT, TYP_UINT, TYP_INT, TYP_I_IMPL)) { return true; } @@ -2990,7 +2990,7 @@ int Compiler::impBoxPatternMatch(CORINFO_RESOLVED_TOKEN* pResolvedToken, objToBox = impGetNodeAddr(objToBox, CHECK_SPILL_ALL, &indirFlags); static_assert_no_msg(OFFSETOF__CORINFO_NullableOfT__hasValue == 0); - impPushOnStack(gtNewIndir(TYP_BOOL, objToBox), typeInfo(TYP_INT)); + impPushOnStack(gtNewIndir(TYP_UBYTE, objToBox), typeInfo(TYP_INT)); JITDUMP("\n Importing BOX; ISINST; BR_TRUE/FALSE as nullableVT.hasValue\n"); return 1 + sizeof(mdToken); diff --git a/src/coreclr/jit/importervectorization.cpp b/src/coreclr/jit/importervectorization.cpp index 0d89f45790661..89d6711252100 100644 --- a/src/coreclr/jit/importervectorization.cpp +++ b/src/coreclr/jit/importervectorization.cpp @@ -200,7 +200,7 @@ GenTree* Compiler::impExpandHalfConstEqualsSIMD( // Optimization: use a single load when byteLen equals simdSize. // For code simplicity we always create nodes for two vectors case. const bool useSingleVector = simdSize == byteLen; - return gtNewSimdCmpOpAllNode(GT_EQ, TYP_BOOL, useSingleVector ? xor1 : orr, gtNewZeroConNode(simdType), baseType, + return gtNewSimdCmpOpAllNode(GT_EQ, TYP_UBYTE, useSingleVector ? xor1 : orr, gtNewZeroConNode(simdType), baseType, simdSize); // Codegen example for byteLen=40 and OrdinalIgnoreCase mode with AVX: @@ -486,7 +486,7 @@ GenTree* Compiler::impExpandHalfConstEquals(GenTreeLclVarCommon* data, JITDUMP("unable to compose indirCmp\n"); return nullptr; } - assert(indirCmp->TypeIs(TYP_INT, TYP_BOOL)); + assert(indirCmp->TypeIs(TYP_INT, TYP_UBYTE)); GenTreeColon* lenCheckColon = gtNewColonNode(TYP_INT, indirCmp, gtNewFalse()); diff --git a/src/coreclr/jit/lclmorph.cpp b/src/coreclr/jit/lclmorph.cpp index 666e659e0ed28..11be8bdad550e 100644 --- a/src/coreclr/jit/lclmorph.cpp +++ b/src/coreclr/jit/lclmorph.cpp @@ -1144,13 +1144,6 @@ class LocalAddressVisitor final : public GenTreeVisitor return IndirTransform::LclVar; } - // Bool and ubyte are the same type. - if ((indir->TypeIs(TYP_BOOL) && (varDsc->TypeGet() == TYP_UBYTE)) || - (indir->TypeIs(TYP_UBYTE) && (varDsc->TypeGet() == TYP_BOOL))) - { - return IndirTransform::LclVar; - } - // For small stores we can ignore the signed/unsigned diff. if (isDef && (varTypeToSigned(indir) == varTypeToSigned(varDsc))) { diff --git a/src/coreclr/jit/lclvars.cpp b/src/coreclr/jit/lclvars.cpp index e7c9a49ea4825..e1a23da69d4a5 100644 --- a/src/coreclr/jit/lclvars.cpp +++ b/src/coreclr/jit/lclvars.cpp @@ -1501,11 +1501,6 @@ void Compiler::lvaInitVarDsc(LclVarDsc* varDsc, varDsc->lvType = type; } - if (type == TYP_BOOL) - { - varDsc->lvIsBoolean = true; - } - #ifdef DEBUG varDsc->SetStackOffset(BAD_STK_OFFS); #endif @@ -4078,7 +4073,6 @@ void Compiler::lvaMarkLclRefs(GenTree* tree, BasicBlock* block, Statement* stmt, { if (varDsc->IsAddressExposed()) { - varDsc->lvIsBoolean = false; varDsc->lvAllDefsAreNoGc = false; } @@ -4101,34 +4095,6 @@ void Compiler::lvaMarkLclRefs(GenTree* tree, BasicBlock* block, Statement* stmt, varDsc->lvAllDefsAreNoGc = false; } - if (value->gtType != TYP_BOOL) - { - // Is the value clearly a boolean one? - switch (value->gtOper) - { - case GT_CNS_INT: - if (value->AsIntCon()->gtIconVal == 0) - { - break; - } - if (value->AsIntCon()->gtIconVal == 1) - { - break; - } - - // Not 0 or 1, fall through .... - FALLTHROUGH; - default: - if (value->OperIsCompare()) - { - break; - } - - varDsc->lvIsBoolean = false; - break; - } - } - if (!varDsc->lvDisqualifySingleDefRegCandidate) // If this var is already disqualified, we can skip this { bool bbInALoop = (block->bbFlags & BBF_BACKWARD_JUMP) != 0; diff --git a/src/coreclr/jit/lower.cpp b/src/coreclr/jit/lower.cpp index 81df694f05e1f..960f6d9c2eb7c 100644 --- a/src/coreclr/jit/lower.cpp +++ b/src/coreclr/jit/lower.cpp @@ -1967,7 +1967,7 @@ GenTree* Lowering::LowerCallMemcmp(GenTreeCall* call) if (GenTree::OperIsCmpCompare(oper)) { assert(type == TYP_INT); - return comp->gtNewSimdCmpOpAllNode(oper, TYP_BOOL, op1, op2, CORINFO_TYPE_NATIVEUINT, + return comp->gtNewSimdCmpOpAllNode(oper, TYP_UBYTE, op1, op2, CORINFO_TYPE_NATIVEUINT, genTypeSize(op1)); } return comp->gtNewSimdBinOpNode(oper, op1->TypeGet(), op1, op2, CORINFO_TYPE_NATIVEUINT, @@ -3441,7 +3441,7 @@ GenTree* Lowering::OptimizeConstCompare(GenTree* cmp) var_types castToType = cast->CastToType(); GenTree* castOp = cast->gtGetOp1(); - if (((castToType == TYP_BOOL) || (castToType == TYP_UBYTE)) && FitsIn(op2Value)) + if ((castToType == TYP_UBYTE) && FitsIn(op2Value)) { // // Since we're going to remove the cast we need to be able to narrow the cast operand diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 86a5b2b1ab4cb..da721df43f681 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -1261,7 +1261,7 @@ GenTree* Lowering::LowerHWIntrinsicCmpOp(GenTreeHWIntrinsic* node, genTreeOps cm assert(varTypeIsSIMD(simdType)); assert(varTypeIsArithmetic(simdBaseType)); assert(simdSize != 0); - assert(node->gtType == TYP_BOOL); + assert(node->gtType == TYP_UBYTE); assert((cmpOp == GT_EQ) || (cmpOp == GT_NE)); // We have the following (with the appropriate simd size and where the intrinsic could be op_Inequality): diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp index eba7bdb93e20f..6f4f2da1500f7 100644 --- a/src/coreclr/jit/lowerxarch.cpp +++ b/src/coreclr/jit/lowerxarch.cpp @@ -1692,7 +1692,7 @@ GenTree* Lowering::LowerHWIntrinsicCmpOp(GenTreeHWIntrinsic* node, genTreeOps cm assert(varTypeIsSIMD(simdType)); assert(varTypeIsArithmetic(simdBaseType)); assert(simdSize != 0); - assert(node->gtType == TYP_BOOL); + assert(node->gtType == TYP_UBYTE); assert((cmpOp == GT_EQ) || (cmpOp == GT_NE)); // We have the following (with the appropriate simd size and where the intrinsic could be op_Inequality): diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index 20733c64cfee0..87d0912b66445 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -4655,20 +4655,12 @@ GenTree* Compiler::fgMorphLeafLocal(GenTreeLclVarCommon* lclNode) if (fgGlobalMorph && lclNode->OperIs(GT_LCL_VAR) && varDsc->lvNormalizeOnLoad() && /* TODO-ASG: delete this zero-diff quirk */ lclNode->CanCSE()) { - // TYP_BOOL quirk: previously, the code in optAssertionIsSubrange did not handle TYP_BOOL. - // Now it does, but this leads to some regressions because we lose the uniform VNs for trees - // that represent the "reduced" normalize-on-load locals, i. e. LCL_VAR(small type V00), created - // here with local assertions, and "expanded", i. e. CAST(small type <- LCL_VAR(int V00)). - // This is a pretty fundamental problem with how normalize-on-load locals appear to the optimizer. - // This quirk preserves the previous behavior. - // TODO-CQ: fix the VNs for normalize-on-load locals and remove this quirk. - var_types lclVarType = varDsc->TypeGet(); - bool isBoolQuirk = lclVarType == TYP_BOOL; + var_types lclVarType = varDsc->TypeGet(); // Assertion prop can tell us to omit adding a cast here. This is useful when the local is a small-typed // parameter that is passed in a register: in that case, the ABI specifies that the upper bits might be // invalid, but the assertion guarantees us that we have normalized when we wrote it. - if (optLocalAssertionProp && !isBoolQuirk && + if (optLocalAssertionProp && optAssertionIsSubrange(lclNode, IntegralRange::ForType(lclVarType), apFull) != NO_ASSERTION_INDEX) { // The previous assertion can guarantee us that if this node gets diff --git a/src/coreclr/jit/optimizebools.cpp b/src/coreclr/jit/optimizebools.cpp index 043d4acb476eb..2efbf40b6d535 100644 --- a/src/coreclr/jit/optimizebools.cpp +++ b/src/coreclr/jit/optimizebools.cpp @@ -1282,8 +1282,7 @@ GenTree* OptBoolsDsc::optIsBoolComp(OptTestInfo* pOptTest) ssize_t ival2 = opr2->AsIntCon()->gtIconVal; // Is the value a boolean? - // We can either have a boolean expression (marked GTF_BOOLEAN) or - // a local variable that is marked as being boolean (lvIsBoolean) + // We can either have a boolean expression (marked GTF_BOOLEAN) or a constant 0/1. if (opr1->gtFlags & GTF_BOOLEAN) { @@ -1293,18 +1292,6 @@ GenTree* OptBoolsDsc::optIsBoolComp(OptTestInfo* pOptTest) { pOptTest->isBool = true; } - else if (opr1->gtOper == GT_LCL_VAR) - { - // is it a boolean local variable? - - unsigned lclNum = opr1->AsLclVarCommon()->GetLclNum(); - noway_assert(lclNum < m_comp->lvaCount); - - if (m_comp->lvaTable[lclNum].lvIsBoolean) - { - pOptTest->isBool = true; - } - } // Was our comparison against the constant 1 (i.e. true) if (ival2 == 1) diff --git a/src/coreclr/jit/optimizer.cpp b/src/coreclr/jit/optimizer.cpp index 684f71b898f31..1df34104d4238 100644 --- a/src/coreclr/jit/optimizer.cpp +++ b/src/coreclr/jit/optimizer.cpp @@ -5734,7 +5734,6 @@ bool Compiler::optNarrowTree(GenTree* tree, var_types srct, var_types dstt, Valu case TYP_BYTE: lmask = 0x0000007F; break; - case TYP_BOOL: case TYP_UBYTE: lmask = 0x000000FF; break; @@ -5782,7 +5781,6 @@ bool Compiler::optNarrowTree(GenTree* tree, var_types srct, var_types dstt, Valu case TYP_BYTE: imask = 0x0000007F; break; - case TYP_BOOL: case TYP_UBYTE: imask = 0x000000FF; break; diff --git a/src/coreclr/jit/rangecheck.cpp b/src/coreclr/jit/rangecheck.cpp index 1d10709ec8580..faf0641451d4f 100644 --- a/src/coreclr/jit/rangecheck.cpp +++ b/src/coreclr/jit/rangecheck.cpp @@ -1110,7 +1110,6 @@ Range RangeCheck::GetRangeFromType(var_types type) { switch (type) { - case TYP_BOOL: case TYP_UBYTE: return Range(Limit(Limit::keConstant, 0), Limit(Limit::keConstant, BYTE_MAX)); case TYP_BYTE: diff --git a/src/coreclr/jit/typelist.h b/src/coreclr/jit/typelist.h index dad396b6f6335..8b8da6db011f5 100644 --- a/src/coreclr/jit/typelist.h +++ b/src/coreclr/jit/typelist.h @@ -37,7 +37,6 @@ tf ) DEF_TP(UNDEF ,"" , TYP_UNDEF, 0, 0, 0, 0, 0, VTR_INT, availableIntRegs, RBM_INT_CALLEE_SAVED, RBM_INT_CALLEE_TRASH, VTF_ANY) DEF_TP(VOID ,"void" , TYP_VOID, 0, 0, 0, 0, 0, VTR_INT, availableIntRegs, RBM_INT_CALLEE_SAVED, RBM_INT_CALLEE_TRASH, VTF_ANY) -DEF_TP(BOOL ,"bool" , TYP_INT, 1, 1, 4, 1, 1, VTR_INT, availableIntRegs, RBM_INT_CALLEE_SAVED, RBM_INT_CALLEE_TRASH, VTF_INT|VTF_UNS) DEF_TP(BYTE ,"byte" , TYP_INT, 1, 1, 4, 1, 1, VTR_INT, availableIntRegs, RBM_INT_CALLEE_SAVED, RBM_INT_CALLEE_TRASH, VTF_INT) DEF_TP(UBYTE ,"ubyte" , TYP_INT, 1, 1, 4, 1, 1, VTR_INT, availableIntRegs, RBM_INT_CALLEE_SAVED, RBM_INT_CALLEE_TRASH, VTF_INT|VTF_UNS) diff --git a/src/coreclr/jit/utils.cpp b/src/coreclr/jit/utils.cpp index 3ec8e71c159e4..245f84c7f6234 100644 --- a/src/coreclr/jit/utils.cpp +++ b/src/coreclr/jit/utils.cpp @@ -3855,7 +3855,6 @@ bool CastFromIntOverflows(int32_t fromValue, var_types toType, bool fromUnsigned { switch (toType) { - case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: @@ -3879,7 +3878,6 @@ bool CastFromLongOverflows(int64_t fromValue, var_types toType, bool fromUnsigne { switch (toType) { - case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: @@ -3994,7 +3992,6 @@ bool CastFromFloatOverflows(float fromValue, var_types toType) { case TYP_BYTE: return !(-129.0f < fromValue && fromValue < 128.0f); - case TYP_BOOL: case TYP_UBYTE: return !(-1.0f < fromValue && fromValue < 256.0f); case TYP_SHORT: @@ -4023,7 +4020,6 @@ bool CastFromDoubleOverflows(double fromValue, var_types toType) { case TYP_BYTE: return !(-129.0 < fromValue && fromValue < 128.0); - case TYP_BOOL: case TYP_UBYTE: return !(-1.0 < fromValue && fromValue < 256.0); case TYP_SHORT: diff --git a/src/coreclr/jit/utils.h b/src/coreclr/jit/utils.h index 77f74ba95cb31..ba044c7b9cc5d 100644 --- a/src/coreclr/jit/utils.h +++ b/src/coreclr/jit/utils.h @@ -1002,7 +1002,6 @@ bool FitsIn(var_types type, T value) { case TYP_BYTE: return FitsIn(value); - case TYP_BOOL: case TYP_UBYTE: return FitsIn(value); case TYP_SHORT: diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index 2ea2ee7845b8b..e2af30d056cdd 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -1885,7 +1885,6 @@ ValueNum ValueNumStore::VNForGenericCon(var_types typ, uint8_t* cnsVal) typ val = {}; \ memcpy(&val, cnsVal, sizeof(typ)); - case TYP_BOOL: case TYP_UBYTE: { READ_VALUE(uint8_t); @@ -2045,7 +2044,6 @@ ValueNum ValueNumStore::VNZeroForType(var_types typ) { switch (typ) { - case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: @@ -2116,7 +2114,6 @@ ValueNum ValueNumStore::VNOneForType(var_types typ) { switch (typ) { - case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: @@ -3862,7 +3859,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_BYTE: assert(typ == TYP_INT); return VNForIntCon(INT8(arg0Val)); - case TYP_BOOL: case TYP_UBYTE: assert(typ == TYP_INT); return VNForIntCon(UINT8(arg0Val)); @@ -3945,7 +3941,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_BYTE: assert(typ == TYP_INT); return VNForIntCon(INT8(arg0Val)); - case TYP_BOOL: case TYP_UBYTE: assert(typ == TYP_INT); return VNForIntCon(UINT8(arg0Val)); @@ -4002,7 +3997,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_BYTE: assert(typ == TYP_INT); return VNForIntCon(INT8(arg0Val)); - case TYP_BOOL: case TYP_UBYTE: assert(typ == TYP_INT); return VNForIntCon(UINT8(arg0Val)); @@ -4044,7 +4038,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_BYTE: assert(typ == TYP_INT); return VNForIntCon(INT8(arg0Val)); - case TYP_BOOL: case TYP_UBYTE: assert(typ == TYP_INT); return VNForIntCon(UINT8(arg0Val)); @@ -4153,7 +4146,6 @@ ValueNum ValueNumStore::EvalBitCastForConstantArgs(var_types dstType, ValueNum a switch (dstType) { - case TYP_BOOL: case TYP_UBYTE: memcpy(&int32, bytes, sizeof(int32)); return VNForIntCon(static_cast(int32)); @@ -8758,7 +8750,6 @@ void ValueNumStore::vnDump(Compiler* comp, ValueNum vn, bool isPtr) var_types vnt = TypeOfVN(vn); switch (vnt) { - case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: @@ -10355,7 +10346,6 @@ void Compiler::fgValueNumberTreeConst(GenTree* tree) case TYP_SHORT: case TYP_BYTE: case TYP_UBYTE: - case TYP_BOOL: if (tree->IsIconHandle()) { const GenTreeIntCon* cns = tree->AsIntCon(); diff --git a/src/coreclr/jit/vartype.h b/src/coreclr/jit/vartype.h index 3c38a3427ebd2..65a4c50de7886 100644 --- a/src/coreclr/jit/vartype.h +++ b/src/coreclr/jit/vartype.h @@ -126,7 +126,6 @@ inline var_types varTypeToSigned(T vt) { switch (type) { - case TYP_BOOL: case TYP_UBYTE: return TYP_BYTE; case TYP_USHORT: @@ -204,7 +203,7 @@ inline bool varTypeIsEnregisterable(T vt) template inline bool varTypeIsByte(T vt) { - return (TypeGet(vt) >= TYP_BOOL) && (TypeGet(vt) <= TYP_UBYTE); + return (TypeGet(vt) == TYP_BYTE) || (TypeGet(vt) == TYP_UBYTE); } template @@ -216,7 +215,7 @@ inline bool varTypeIsShort(T vt) template inline bool varTypeIsSmall(T vt) { - return (TypeGet(vt) >= TYP_BOOL) && (TypeGet(vt) <= TYP_USHORT); + return (TypeGet(vt) >= TYP_BYTE) && (TypeGet(vt) <= TYP_USHORT); } template @@ -238,13 +237,13 @@ inline bool varTypeIsIntOrI(T vt) template inline bool genActualTypeIsInt(T vt) { - return ((TypeGet(vt) >= TYP_BOOL) && (TypeGet(vt) <= TYP_UINT)); + return ((TypeGet(vt) >= TYP_BYTE) && (TypeGet(vt) <= TYP_UINT)); } template inline bool genActualTypeIsIntOrI(T vt) { - return ((TypeGet(vt) >= TYP_BOOL) && (TypeGet(vt) <= TYP_U_IMPL)); + return ((TypeGet(vt) >= TYP_BYTE) && (TypeGet(vt) <= TYP_U_IMPL)); } template