summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarol Eidt <carol.eidt@microsoft.com>2017-09-18 08:40:25 -0700
committerGitHub <noreply@github.com>2017-09-18 08:40:25 -0700
commite1154bc588677f11f385bf60bd3aee38ba8115fb (patch)
treed4e75e60db2f1b7958a5595bb3cbfa128f43321f /src
parent481a04f7f493c8a73953ba898be3454a046f731f (diff)
parent35e694664e3a470d72109f3b847ce07f4e9d16f5 (diff)
downloadcoreclr-e1154bc588677f11f385bf60bd3aee38ba8115fb.tar.gz
coreclr-e1154bc588677f11f385bf60bd3aee38ba8115fb.tar.bz2
coreclr-e1154bc588677f11f385bf60bd3aee38ba8115fb.zip
Merge pull request #13878 from sdmaclea/PR-ARM64-LowerCompare-Cast-Const
[Arm64] LowerCompare Cast-Bool/UBYTE CMP immediate #0 to TST immediate
Diffstat (limited to 'src')
-rw-r--r--src/jit/lower.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp
index 65858ea227..2a126d3242 100644
--- a/src/jit/lower.cpp
+++ b/src/jit/lower.cpp
@@ -2412,7 +2412,9 @@ void Lowering::LowerCompare(GenTree* cmp)
op2->gtType = op1Type;
}
- else if (op1->OperIs(GT_CAST) && !op1->gtOverflow())
+ else
+#endif
+ if (op1->OperIs(GT_CAST) && !op1->gtOverflow())
{
GenTreeCast* cast = op1->AsCast();
var_types castToType = cast->CastToType();
@@ -2430,12 +2432,26 @@ void Lowering::LowerCompare(GenTree* cmp)
// situations. In particular this include CALL, sometimes the JIT unnecessarilly widens
// the result of bool returning calls.
//
+ bool removeCast =
+#ifdef _TARGET_ARM64_
+ (op2Value == 0) && cmp->OperIs(GT_EQ, GT_NE, GT_GT) &&
+#endif
+ (castOp->OperIs(GT_CALL, GT_LCL_VAR) || castOp->OperIsLogical() || IsContainableMemoryOp(castOp));
- if (castOp->OperIs(GT_CALL, GT_LCL_VAR) || castOp->OperIsLogical() || IsContainableMemoryOp(castOp))
+ if (removeCast)
{
assert(!castOp->gtOverflowEx()); // Must not be an overflow checking operation
+#ifdef _TARGET_ARM64_
+ bool cmpEq = cmp->OperIs(GT_EQ);
+
+ cmp->SetOperRaw(cmpEq ? GT_TEST_EQ : GT_TEST_NE);
+ op2->SetIconValue(0xff);
+ op2->gtType = castOp->gtType;
+#else
castOp->gtType = castToType;
+ op2->gtType = castToType;
+#endif
// If we have any contained memory ops on castOp, they must now not be contained.
if (castOp->OperIsLogical())
{
@@ -2451,15 +2467,12 @@ void Lowering::LowerCompare(GenTree* cmp)
}
}
cmp->gtOp.gtOp1 = castOp;
- op2->gtType = castToType;
BlockRange().Remove(cast);
}
}
}
- else
-#endif
- if (op1->OperIs(GT_AND) && cmp->OperIs(GT_EQ, GT_NE))
+ else if (op1->OperIs(GT_AND) && cmp->OperIs(GT_EQ, GT_NE))
{
//
// Transform ((x AND y) EQ|NE 0) into (x TEST_EQ|TEST_NE y) when possible.