diff options
Diffstat (limited to 'compiler/optimizing/code_generator_utils.cc')
-rw-r--r-- | compiler/optimizing/code_generator_utils.cc | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/compiler/optimizing/code_generator_utils.cc b/compiler/optimizing/code_generator_utils.cc index 9da520161f..c19eda4aaa 100644 --- a/compiler/optimizing/code_generator_utils.cc +++ b/compiler/optimizing/code_generator_utils.cc @@ -100,15 +100,17 @@ bool IsBooleanValueOrMaterializedCondition(HInstruction* cond_input) { return !cond_input->IsCondition() || !cond_input->IsEmittedAtUseSite(); } -bool HasNonNegativeResultOrMinInt(HInstruction* instruction) { - // 1. The instruction itself has always a non-negative result or the min value of - // the integral type if the instruction has the integral type. - // 2. TODO: The instruction can be an expression which uses an induction variable. - // Induction variable often start from 0 and are only increased. Such an - // expression might be always non-negative. - return instruction->IsAbs() || - IsInt64Value(instruction, DataType::MinValueOfIntegralType(instruction->GetType())) || - IsGEZero(instruction); + +bool HasNonNegativeInputAt(HInstruction* instr, size_t i) { + HInstruction* input = instr->InputAt(i); + return IsGEZero(input); +} + +bool HasNonNegativeOrMinIntInputAt(HInstruction* instr, size_t i) { + HInstruction* input = instr->InputAt(i); + return input->IsAbs() || + IsInt64Value(input, DataType::MinValueOfIntegralType(input->GetType())) || + HasNonNegativeInputAt(instr, i); } } // namespace art |