diff options
Diffstat (limited to 'compiler/optimizing/instruction_simplifier.cc')
| -rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index 46fad17b8f..0adb931158 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -45,6 +45,8 @@ class InstructionSimplifierVisitor : public HGraphVisitor { void VisitEqual(HEqual* equal) OVERRIDE; void VisitNotEqual(HNotEqual* equal) OVERRIDE; void VisitBooleanNot(HBooleanNot* bool_not) OVERRIDE; + void VisitInstanceFieldSet(HInstanceFieldSet* equal) OVERRIDE; + void VisitStaticFieldSet(HStaticFieldSet* equal) OVERRIDE; void VisitArraySet(HArraySet* equal) OVERRIDE; void VisitTypeConversion(HTypeConversion* instruction) OVERRIDE; void VisitNullCheck(HNullCheck* instruction) OVERRIDE; @@ -78,6 +80,8 @@ void InstructionSimplifier::Run() { } void InstructionSimplifierVisitor::Run() { + // Iterate in reverse post order to open up more simplifications to users + // of instructions that got simplified. for (HReversePostOrderIterator it(*GetGraph()); !it.Done();) { // The simplification of an instruction to another instruction may yield // possibilities for other simplifications. So although we perform a reverse @@ -199,6 +203,20 @@ void InstructionSimplifierVisitor::VisitInstanceOf(HInstanceOf* instruction) { } } +void InstructionSimplifierVisitor::VisitInstanceFieldSet(HInstanceFieldSet* instruction) { + if ((instruction->GetValue()->GetType() == Primitive::kPrimNot) + && !instruction->GetValue()->CanBeNull()) { + instruction->ClearValueCanBeNull(); + } +} + +void InstructionSimplifierVisitor::VisitStaticFieldSet(HStaticFieldSet* instruction) { + if ((instruction->GetValue()->GetType() == Primitive::kPrimNot) + && !instruction->GetValue()->CanBeNull()) { + instruction->ClearValueCanBeNull(); + } +} + void InstructionSimplifierVisitor::VisitSuspendCheck(HSuspendCheck* check) { HBasicBlock* block = check->GetBlock(); // Currently always keep the suspend check at entry. @@ -294,6 +312,10 @@ void InstructionSimplifierVisitor::VisitArraySet(HArraySet* instruction) { instruction->ClearNeedsTypeCheck(); } } + + if (!value->CanBeNull()) { + instruction->ClearValueCanBeNull(); + } } void InstructionSimplifierVisitor::VisitTypeConversion(HTypeConversion* instruction) { |