From 8428bd376e660df2ffceee72f797d1cfc6c66433 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 12 Feb 2016 16:53:57 +0000 Subject: Optimizing: Remove unnecessary And before TypeConversion. For example `(byte) (x & 0xff)` doesn't need the `& 0xff`. Bug: 23965701 Change-Id: I5fc8419491aff2cdc7074451e74e873b5f582d41 --- compiler/optimizing/instruction_simplifier.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'compiler/optimizing/instruction_simplifier.cc') diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index 98f8009846..a48d06f3d0 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -830,6 +830,24 @@ void InstructionSimplifierVisitor::VisitTypeConversion(HTypeConversion* instruct return; } } + } else if (input->IsAnd() && + Primitive::IsIntegralType(result_type) && + input->HasOnlyOneNonEnvironmentUse()) { + DCHECK(Primitive::IsIntegralType(input_type)); + HAnd* input_and = input->AsAnd(); + HConstant* constant = input_and->GetConstantRight(); + if (constant != nullptr) { + int64_t value = Int64FromConstant(constant); + DCHECK_NE(value, -1); // "& -1" would have been optimized away in VisitAnd(). + size_t trailing_ones = CTZ(~static_cast(value)); + if (trailing_ones >= kBitsPerByte * Primitive::ComponentSize(result_type)) { + // The `HAnd` is useless, for example in `(byte) (x & 0xff)`, get rid of it. + input_and->ReplaceWith(input_and->GetLeastConstantLeft()); + input_and->GetBlock()->RemoveInstruction(input_and); + RecordSimplification(); + return; + } + } } } -- cgit v1.2.3-59-g8ed1b