From 7b61c8d4e5b9c9c4344cadef156e5c9a7ca9bd09 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 15 Sep 2020 21:45:58 -0400 Subject: [PATCH 1/4] emit test for bounds checks against 0 --- src/coreclr/src/jit/codegenxarch.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/coreclr/src/jit/codegenxarch.cpp b/src/coreclr/src/jit/codegenxarch.cpp index de1c481a838ac1..7c171fabe6359f 100644 --- a/src/coreclr/src/jit/codegenxarch.cpp +++ b/src/coreclr/src/jit/codegenxarch.cpp @@ -3696,11 +3696,19 @@ void CodeGen::genRangeCheck(GenTree* oper) GenTree * src1, *src2; emitJumpKind jmpKind; + instruction cmpKind; genConsumeRegs(arrIndex); genConsumeRegs(arrLen); - if (arrIndex->isContainedIntOrIImmed()) + if (arrIndex->IsIntegralConst(0) && arrLen->isUsedFromReg()) + { + src1 = arrLen; + src2 = arrLen; + jmpKind = EJ_je; + cmpKind = INS_test; + } + else if (arrIndex->isContainedIntOrIImmed()) { // arrIndex is a contained constant. In this case // we will generate one of the following @@ -3713,6 +3721,7 @@ void CodeGen::genRangeCheck(GenTree* oper) src1 = arrLen; src2 = arrIndex; jmpKind = EJ_jbe; + cmpKind = INS_cmp; } else { @@ -3721,7 +3730,7 @@ void CodeGen::genRangeCheck(GenTree* oper) // cmp [mem], immed (if arrLen is a constant) // cmp [mem], reg (if arrLen is in a reg) // cmp reg, immed (if arrIndex is in a reg) - // cmp reg1, reg2 (if arraIndex is in reg1) + // cmp reg1, reg2 (if arrIndex is in reg1) // cmp reg, [mem] (if arrLen is a memory op) // // That is only one of arrIndex or arrLen can be a memory op. @@ -3730,6 +3739,7 @@ void CodeGen::genRangeCheck(GenTree* oper) src1 = arrIndex; src2 = arrLen; jmpKind = EJ_jae; + cmpKind = INS_cmp; } var_types bndsChkType = src2->TypeGet(); @@ -3741,7 +3751,7 @@ void CodeGen::genRangeCheck(GenTree* oper) assert(emitTypeSize(bndsChkType) >= emitTypeSize(src1->TypeGet())); #endif // DEBUG - GetEmitter()->emitInsBinary(INS_cmp, emitTypeSize(bndsChkType), src1, src2); + GetEmitter()->emitInsBinary(cmpKind, emitTypeSize(bndsChkType), src1, src2); genJumpToThrowHlpBlk(jmpKind, bndsChk->gtThrowKind, bndsChk->gtIndRngFailBB); } From 2755758ffde3979889b19535dc90e5f72137bf78 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 15 Sep 2020 22:37:34 -0400 Subject: [PATCH 2/4] formatting --- src/coreclr/src/jit/codegenxarch.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/coreclr/src/jit/codegenxarch.cpp b/src/coreclr/src/jit/codegenxarch.cpp index 7c171fabe6359f..64331e73a55d8d 100644 --- a/src/coreclr/src/jit/codegenxarch.cpp +++ b/src/coreclr/src/jit/codegenxarch.cpp @@ -3696,15 +3696,19 @@ void CodeGen::genRangeCheck(GenTree* oper) GenTree * src1, *src2; emitJumpKind jmpKind; - instruction cmpKind; + instruction cmpKind; genConsumeRegs(arrIndex); genConsumeRegs(arrLen); if (arrIndex->IsIntegralConst(0) && arrLen->isUsedFromReg()) { - src1 = arrLen; - src2 = arrLen; + // arrIndex is 0 and arrLen is in a reg. In this case + // we can generate + // test reg, reg + // since arrLen is non-negative + src1 = arrLen; + src2 = arrLen; jmpKind = EJ_je; cmpKind = INS_test; } From 2c620e833d1a8d63f70499fd20e5e1df5dff34d5 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Wed, 16 Sep 2020 13:12:31 -0400 Subject: [PATCH 3/4] remove dead code --- src/coreclr/src/jit/codegenxarch.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/coreclr/src/jit/codegenxarch.cpp b/src/coreclr/src/jit/codegenxarch.cpp index 64331e73a55d8d..08f957b2fd936c 100644 --- a/src/coreclr/src/jit/codegenxarch.cpp +++ b/src/coreclr/src/jit/codegenxarch.cpp @@ -3691,8 +3691,6 @@ void CodeGen::genRangeCheck(GenTree* oper) GenTree* arrIndex = bndsChk->gtIndex; GenTree* arrLen = bndsChk->gtArrLen; - GenTree* arrRef = nullptr; - int lenOffset = 0; GenTree * src1, *src2; emitJumpKind jmpKind; From 04e615385764cb14a95be006d63817ebe26a8821 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Wed, 16 Sep 2020 13:13:12 -0400 Subject: [PATCH 4/4] formatting --- src/coreclr/src/jit/codegenxarch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/src/jit/codegenxarch.cpp b/src/coreclr/src/jit/codegenxarch.cpp index 08f957b2fd936c..c3f9143eca1e93 100644 --- a/src/coreclr/src/jit/codegenxarch.cpp +++ b/src/coreclr/src/jit/codegenxarch.cpp @@ -3689,8 +3689,8 @@ void CodeGen::genRangeCheck(GenTree* oper) noway_assert(oper->OperIsBoundsCheck()); GenTreeBoundsChk* bndsChk = oper->AsBoundsChk(); - GenTree* arrIndex = bndsChk->gtIndex; - GenTree* arrLen = bndsChk->gtArrLen; + GenTree* arrIndex = bndsChk->gtIndex; + GenTree* arrLen = bndsChk->gtArrLen; GenTree * src1, *src2; emitJumpKind jmpKind;