diff options
| author | 2015-06-02 15:55:35 +0000 | |
|---|---|---|
| committer | 2015-06-02 15:55:35 +0000 | |
| commit | 122addc3962207badd364b00a75a58639e76b10c (patch) | |
| tree | a0fd9dfa459689fa2929a89310ebcd3a45607e5f /compiler/optimizing | |
| parent | 637be5cefe1462b8d0bd5e065bd64a10f01647ac (diff) | |
| parent | 012a072d06474404ff488d181eb3d4a504c5cbe7 (diff) | |
Merge "Revert "Revert "Revert "Bring ReferenceTypePropagation to HInvoke return types""""
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/builder.cc | 14 | ||||
| -rw-r--r-- | compiler/optimizing/reference_type_propagation.cc | 36 | ||||
| -rw-r--r-- | compiler/optimizing/reference_type_propagation.h | 4 |
3 files changed, 21 insertions, 33 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index f3f82417f7..f98029da03 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -723,16 +723,10 @@ bool HGraphBuilder::BuildInvoke(const Instruction& instruction, } } - invoke = new (arena_) HInvokeStaticOrDirect(arena_, - number_of_arguments, - return_type, - dex_pc, - target_method.dex_method_index, - is_recursive, - string_init_offset, - invoke_type, - optimized_invoke_type, - clinit_check_requirement); + invoke = new (arena_) HInvokeStaticOrDirect( + arena_, number_of_arguments, return_type, dex_pc, target_method.dex_method_index, + is_recursive, string_init_offset, invoke_type, optimized_invoke_type, + clinit_check_requirement); } size_t start_index = 0; diff --git a/compiler/optimizing/reference_type_propagation.cc b/compiler/optimizing/reference_type_propagation.cc index 615e019b3f..4f1f45769d 100644 --- a/compiler/optimizing/reference_type_propagation.cc +++ b/compiler/optimizing/reference_type_propagation.cc @@ -27,7 +27,7 @@ void ReferenceTypePropagation::Run() { // To properly propagate type info we need to visit in the dominator-based order. // Reverse post order guarantees a node's dominators are visited first. // We take advantage of this order in `VisitBasicBlock`. - for (HReversePostOrderIterator it(*GetGraph()); !it.Done(); it.Advance()) { + for (HReversePostOrderIterator it(*graph_); !it.Done(); it.Advance()) { VisitBasicBlock(it.Current()); } ProcessWorklist(); @@ -35,12 +35,23 @@ void ReferenceTypePropagation::Run() { void ReferenceTypePropagation::VisitBasicBlock(HBasicBlock* block) { // TODO: handle other instructions that give type info - // (array accesses) + // (Call/array accesses) // Initialize exact types first for faster convergence. for (HInstructionIterator it(block->GetInstructions()); !it.Done(); it.Advance()) { HInstruction* instr = it.Current(); - instr->Accept(this); + // TODO: Make ReferenceTypePropagation a visitor or create a new one. + if (instr->IsNewInstance()) { + VisitNewInstance(instr->AsNewInstance()); + } else if (instr->IsLoadClass()) { + VisitLoadClass(instr->AsLoadClass()); + } else if (instr->IsNewArray()) { + VisitNewArray(instr->AsNewArray()); + } else if (instr->IsInstanceFieldGet()) { + VisitInstanceFieldGet(instr->AsInstanceFieldGet()); + } else if (instr->IsStaticFieldGet()) { + VisitStaticFieldGet(instr->AsStaticFieldGet()); + } } // Handle Phis. @@ -85,7 +96,7 @@ void ReferenceTypePropagation::BoundTypeForIfNotNull(HBasicBlock* block) { HInstruction* user = it.Current()->GetUser(); if (notNullBlock->Dominates(user->GetBlock())) { if (bound_type == nullptr) { - bound_type = new (GetGraph()->GetArena()) HBoundType(obj, ReferenceTypeInfo::CreateTop(false)); + bound_type = new (graph_->GetArena()) HBoundType(obj, ReferenceTypeInfo::CreateTop(false)); notNullBlock->InsertInstructionBefore(bound_type, notNullBlock->GetFirstInstruction()); } user->ReplaceInput(bound_type, it.Current()->GetIndex()); @@ -134,7 +145,7 @@ void ReferenceTypePropagation::BoundTypeForIfInstanceOf(HBasicBlock* block) { ReferenceTypeInfo obj_rti = obj->GetReferenceTypeInfo(); ReferenceTypeInfo class_rti = load_class->GetLoadedClassRTI(); - bound_type = new (GetGraph()->GetArena()) HBoundType(obj, class_rti); + bound_type = new (graph_->GetArena()) HBoundType(obj, class_rti); // Narrow the type as much as possible. { @@ -284,21 +295,6 @@ bool ReferenceTypePropagation::UpdateReferenceTypeInfo(HInstruction* instr) { return !previous_rti.IsEqual(instr->GetReferenceTypeInfo()); } -void ReferenceTypePropagation::VisitInvoke(HInvoke* instr) { - if (instr->GetType() != Primitive::kPrimNot) { - return; - } - - ScopedObjectAccess soa(Thread::Current()); - ClassLinker* cl = Runtime::Current()->GetClassLinker(); - mirror::DexCache* dex_cache = cl->FindDexCache(instr->GetDexFile()); - ArtMethod* method = dex_cache->GetResolvedMethod( - instr->GetDexMethodIndex(), Runtime::Current()->GetClassLinker()->GetImagePointerSize()); - DCHECK(method != nullptr); - mirror::Class* klass = method->GetReturnType(); - SetClassAsTypeInfo(instr, klass); -} - void ReferenceTypePropagation::UpdateBoundType(HBoundType* instr) { ReferenceTypeInfo new_rti = instr->InputAt(0)->GetReferenceTypeInfo(); // Be sure that we don't go over the bounded type. diff --git a/compiler/optimizing/reference_type_propagation.h b/compiler/optimizing/reference_type_propagation.h index a2677a85d9..74e425fb3e 100644 --- a/compiler/optimizing/reference_type_propagation.h +++ b/compiler/optimizing/reference_type_propagation.h @@ -28,11 +28,10 @@ namespace art { /** * Propagates reference types to instructions. */ -class ReferenceTypePropagation : public HOptimization, public HGraphDelegateVisitor { +class ReferenceTypePropagation : public HOptimization { public: ReferenceTypePropagation(HGraph* graph, StackHandleScopeCollection* handles) : HOptimization(graph, true, kReferenceTypePropagationPassName), - HGraphDelegateVisitor(graph), handles_(handles), worklist_(graph->GetArena(), kDefaultWorklistSize) {} @@ -57,7 +56,6 @@ class ReferenceTypePropagation : public HOptimization, public HGraphDelegateVisi void UpdateReferenceTypeInfo(HInstruction* instr, uint16_t type_idx, const DexFile& dex_file); void VisitInstanceFieldGet(HInstanceFieldGet* instr); void VisitStaticFieldGet(HStaticFieldGet* instr); - void VisitInvoke(HInvoke* instr); void ProcessWorklist(); void AddToWorklist(HInstruction* instr); |