Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Lower TEST(x, LSH(1, y)) to BT(x, y)
Browse files Browse the repository at this point in the history
  • Loading branch information
mikedn committed Aug 28, 2017
1 parent fa7a4a3 commit dc89ba4
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions src/jit/lower.cpp
Expand Up @@ -2535,6 +2535,46 @@ void Lowering::LowerCompare(GenTree* cmp)
}
}

if (cmp->OperIs(GT_TEST_EQ, GT_TEST_NE))
{
GenTree* lsh = cmp->gtGetOp2();
LIR::Use cmpUse;

if (lsh->OperIs(GT_LSH) && varTypeIsIntOrI(lsh->TypeGet()) && lsh->gtGetOp1()->IsIntegralConst(1) &&
BlockRange().TryGetUse(cmp, &cmpUse))
{
genTreeOps condition = cmp->OperIs(GT_TEST_NE) ? GT_LT : GT_GE;

cmp->SetOper(GT_BT);
cmp->gtFlags |= GTF_SET_FLAGS;
cmp->gtOp.gtOp2 = lsh->gtGetOp2();

BlockRange().Remove(lsh->gtGetOp1());
BlockRange().Remove(lsh);
lsh->gtGetOp2()->ClearContained();

GenTreeCC* cc;

if (cmpUse.User()->OperIs(GT_JTRUE))
{
cmpUse.User()->ChangeOper(GT_JCC);
cc = cmpUse.User()->AsCC();
cc->gtCondition = condition;
}
else
{
cc = new (comp, GT_SETCC) GenTreeCC(GT_SETCC, condition, TYP_INT);
BlockRange().InsertAfter(cmp, cc);
cmpUse.ReplaceWith(comp, cc);
}

cc->gtFlags |= GTF_USE_FLAGS | GTF_UNSIGNED;

ContainCheckBTx(cmp->AsOp());
return;
}
}

if (cmp->gtGetOp1()->TypeGet() == cmp->gtGetOp2()->TypeGet())
{
if (varTypeIsSmall(cmp->gtGetOp1()->TypeGet()) && varTypeIsUnsigned(cmp->gtGetOp1()->TypeGet()))
Expand Down

0 comments on commit dc89ba4

Please sign in to comment.