Skip to content

Commit e55a569

Browse files
authored
Use unsigned casts for array/Span indexers (#57970)
* Improve TP for Span_get_Item * Use unsigned casts for array length/index * Use unsigned cast for Span_get_Item
1 parent f1425cf commit e55a569

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/coreclr/jit/importer.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4150,7 +4150,7 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
41504150
GenTree* ptrToSpan = impPopStack().val;
41514151
GenTree* indexClone = nullptr;
41524152
GenTree* ptrToSpanClone = nullptr;
4153-
assert(varTypeIsIntegral(index));
4153+
assert(genActualType(index) == TYP_INT);
41544154
assert(ptrToSpan->TypeGet() == TYP_BYREF);
41554155

41564156
#if defined(DEBUG)
@@ -4177,13 +4177,29 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
41774177
GenTreeBoundsChk(GT_ARR_BOUNDS_CHECK, TYP_VOID, index, length, SCK_RNGCHK_FAIL);
41784178

41794179
// Element access
4180-
GenTree* indexIntPtr = impImplicitIorI4Cast(indexClone, TYP_I_IMPL);
4181-
GenTree* sizeofNode = gtNewIconNode(elemSize);
4182-
GenTree* mulNode = gtNewOperNode(GT_MUL, TYP_I_IMPL, indexIntPtr, sizeofNode);
4183-
CORINFO_FIELD_HANDLE ptrHnd = info.compCompHnd->getFieldInClass(clsHnd, 0);
4184-
const unsigned ptrOffset = info.compCompHnd->getFieldOffset(ptrHnd);
4185-
GenTree* data = gtNewFieldRef(TYP_BYREF, ptrHnd, ptrToSpanClone, ptrOffset);
4186-
GenTree* result = gtNewOperNode(GT_ADD, TYP_BYREF, data, mulNode);
4180+
index = indexClone;
4181+
4182+
#ifdef TARGET_64BIT
4183+
if (index->OperGet() == GT_CNS_INT)
4184+
{
4185+
index->gtType = TYP_I_IMPL;
4186+
}
4187+
else
4188+
{
4189+
index = gtNewCastNode(TYP_I_IMPL, index, true, TYP_I_IMPL);
4190+
}
4191+
#endif
4192+
4193+
if (elemSize != 1)
4194+
{
4195+
GenTree* sizeofNode = gtNewIconNode(elemSize);
4196+
index = gtNewOperNode(GT_MUL, TYP_I_IMPL, index, sizeofNode);
4197+
}
4198+
4199+
CORINFO_FIELD_HANDLE ptrHnd = info.compCompHnd->getFieldInClass(clsHnd, 0);
4200+
const unsigned ptrOffset = info.compCompHnd->getFieldOffset(ptrHnd);
4201+
GenTree* data = gtNewFieldRef(TYP_BYREF, ptrHnd, ptrToSpanClone, ptrOffset);
4202+
GenTree* result = gtNewOperNode(GT_ADD, TYP_BYREF, data, index);
41874203

41884204
// Prepare result
41894205
var_types resultType = JITtype2varType(sig->retType);

src/coreclr/jit/morph.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5685,7 +5685,7 @@ GenTree* Compiler::fgMorphArrayIndex(GenTree* tree)
56855685

56865686
if (bndsChkType != TYP_INT)
56875687
{
5688-
arrLen = gtNewCastNode(bndsChkType, arrLen, false, bndsChkType);
5688+
arrLen = gtNewCastNode(bndsChkType, arrLen, true, bndsChkType);
56895689
}
56905690

56915691
GenTreeBoundsChk* arrBndsChk = new (this, GT_ARR_BOUNDS_CHECK)
@@ -5714,7 +5714,7 @@ GenTree* Compiler::fgMorphArrayIndex(GenTree* tree)
57145714
}
57155715
else
57165716
{
5717-
index = gtNewCastNode(TYP_I_IMPL, index, false, TYP_I_IMPL);
5717+
index = gtNewCastNode(TYP_I_IMPL, index, true, TYP_I_IMPL);
57185718
}
57195719
}
57205720
#endif // TARGET_64BIT

0 commit comments

Comments
 (0)