diff --git a/src/coreclr/jit/codegenarmarch.cpp b/src/coreclr/jit/codegenarmarch.cpp index 4905aba6e4367..195253100bb49 100644 --- a/src/coreclr/jit/codegenarmarch.cpp +++ b/src/coreclr/jit/codegenarmarch.cpp @@ -1804,7 +1804,7 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) const regNumber tmpReg = node->GetSingleTempReg(); // Generate the bounds check if necessary. - if ((node->gtFlags & GTF_INX_RNGCHK) != 0) + if (node->IsBoundsChecked()) { GetEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, tmpReg, base->GetRegNum(), node->gtLenOffset); GetEmitter()->emitIns_R_R(INS_cmp, emitActualTypeSize(index->TypeGet()), index->GetRegNum(), tmpReg); diff --git a/src/coreclr/jit/codegenloongarch64.cpp b/src/coreclr/jit/codegenloongarch64.cpp index 474d109f7240e..15bb1210fe47b 100644 --- a/src/coreclr/jit/codegenloongarch64.cpp +++ b/src/coreclr/jit/codegenloongarch64.cpp @@ -6744,7 +6744,7 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) assert(index->isUsedFromReg()); // Generate the bounds check if necessary. - if ((node->gtFlags & GTF_INX_RNGCHK) != 0) + if (node->IsBoundsChecked()) { GetEmitter()->emitIns_R_R_I(INS_ld_w, EA_4BYTE, REG_R21, base->GetRegNum(), node->gtLenOffset); // if (index >= REG_R21) diff --git a/src/coreclr/jit/codegenxarch.cpp b/src/coreclr/jit/codegenxarch.cpp index 50da645363704..8428ff609da2c 100644 --- a/src/coreclr/jit/codegenxarch.cpp +++ b/src/coreclr/jit/codegenxarch.cpp @@ -4893,7 +4893,7 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) #endif // Generate the bounds check if necessary. - if ((node->gtFlags & GTF_INX_RNGCHK) != 0) + if (node->IsBoundsChecked()) { #ifdef TARGET_64BIT // The CLI Spec allows an array to be indexed by either an int32 or a native int. In the case that the index diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 3bc6250b1d5fa..8ef27a9e22cd8 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -945,6 +945,10 @@ bool Compiler::fgAddrCouldBeNull(GenTree* addr) { return false; } + else if (addr->OperIs(GT_INDEX_ADDR)) + { + return !addr->AsIndexAddr()->IsNotNull(); + } else if (addr->OperIs(GT_ARR_ADDR)) { return (addr->gtFlags & GTF_ARR_ADDR_NONNULL) == 0; diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h index f65e5d765bfe7..52993638bc632 100644 --- a/src/coreclr/jit/gentree.h +++ b/src/coreclr/jit/gentree.h @@ -6178,6 +6178,16 @@ struct GenTreeIndexAddr : public GenTreeOp { } #endif + + bool IsBoundsChecked() const + { + return (gtFlags & GTF_INX_RNGCHK) != 0; + } + + bool IsNotNull() const + { + return IsBoundsChecked(); + } }; // GenTreeArrAddr - GT_ARR_ADDR, carries information about the array type from morph to VN.