diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index c1e38633fc..fa2f6bb1dd 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -176,8 +176,8 @@ bool InstructionSimplifierVisitor::TryDeMorganNegationFactoring(HBinaryOperation // We can apply De Morgan's laws if both inputs are Not's and are only used // by `op`. - if (left->IsNot() && - right->IsNot() && + if (((left->IsNot() && right->IsNot()) || + (left->IsBooleanNot() && right->IsBooleanNot())) && left->HasOnlyOneNonEnvironmentUse() && right->HasOnlyOneNonEnvironmentUse()) { // Replace code looking like @@ -187,8 +187,8 @@ bool InstructionSimplifierVisitor::TryDeMorganNegationFactoring(HBinaryOperation // with // OR or, a, b (respectively AND) // NOT dest, or - HInstruction* src_left = left->AsNot()->GetInput(); - HInstruction* src_right = right->AsNot()->GetInput(); + HInstruction* src_left = left->InputAt(0); + HInstruction* src_right = right->InputAt(0); uint32_t dex_pc = op->GetDexPc(); // Remove the negations on the inputs. @@ -204,7 +204,12 @@ bool InstructionSimplifierVisitor::TryDeMorganNegationFactoring(HBinaryOperation } else { hbin = new (GetGraph()->GetArena()) HAnd(type, src_left, src_right, dex_pc); } - HNot* hnot = new (GetGraph()->GetArena()) HNot(type, hbin, dex_pc); + HInstruction* hnot; + if (left->IsBooleanNot()) { + hnot = new (GetGraph()->GetArena()) HBooleanNot(hbin, dex_pc); + } else { + hnot = new (GetGraph()->GetArena()) HNot(type, hbin, dex_pc); + } op->GetBlock()->InsertInstructionBefore(hbin, op); op->GetBlock()->ReplaceAndRemoveInstructionWith(op, hnot); @@ -1308,8 +1313,8 @@ void InstructionSimplifierVisitor::VisitXor(HXor* instruction) { HInstruction* left = instruction->GetLeft(); HInstruction* right = instruction->GetRight(); - if (left->IsNot() && - right->IsNot() && + if (((left->IsNot() && right->IsNot()) || + (left->IsBooleanNot() && right->IsBooleanNot())) && left->HasOnlyOneNonEnvironmentUse() && right->HasOnlyOneNonEnvironmentUse()) { // Replace code looking like @@ -1318,8 +1323,8 @@ void InstructionSimplifierVisitor::VisitXor(HXor* instruction) { // XOR dst, nota, notb // with // XOR dst, a, b - instruction->ReplaceInput(left->AsNot()->GetInput(), 0); - instruction->ReplaceInput(right->AsNot()->GetInput(), 1); + instruction->ReplaceInput(left->InputAt(0), 0); + instruction->ReplaceInput(right->InputAt(0), 1); left->GetBlock()->RemoveInstruction(left); right->GetBlock()->RemoveInstruction(right); RecordSimplification(); |