From a290160f74ee53c0ffb51c7b3ac916d239c9556a Mon Sep 17 00:00:00 2001 From: Lena Djokic Date: Thu, 21 Sep 2017 13:50:52 +0200 Subject: MIPS32R2: Share address computation For array accesses the element address has the following structure: Address = CONST_OFFSET + base_addr + index << ELEM_SHIFT The address part (index << ELEM_SHIFT) can be shared across array accesses with the same data type and index. For example, in the following loop 5 accesses can share address computation: void foo(int[] a, int[] b, int[] c) { for (i...) { a[i] = a[i] + 5; b[i] = b[i] + c[i]; } } Test: test-art-host, test-art-target Change-Id: Id09fa782934aad4ee47669275e7e1a4d7d23b0fa --- compiler/optimizing/optimizing_compiler.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'compiler/optimizing/optimizing_compiler.cc') diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index 12185866cd..1e06ea86a2 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -27,6 +27,7 @@ #endif #ifdef ART_ENABLE_CODEGEN_mips +#include "instruction_simplifier_mips.h" #include "pc_relative_fixups_mips.h" #endif @@ -528,6 +529,8 @@ static HOptimization* BuildOptimization( #ifdef ART_ENABLE_CODEGEN_mips } else if (opt_name == mips::PcRelativeFixups::kPcRelativeFixupsMipsPassName) { return new (arena) mips::PcRelativeFixups(graph, codegen, stats); + } else if (opt_name == mips::InstructionSimplifierMips::kInstructionSimplifierMipsPassName) { + return new (arena) mips::InstructionSimplifierMips(graph, codegen, stats); #endif #ifdef ART_ENABLE_CODEGEN_x86 } else if (opt_name == x86::PcRelativeFixups::kPcRelativeFixupsX86PassName) { @@ -669,11 +672,14 @@ void OptimizingCompiler::RunArchOptimizations(InstructionSet instruction_set, #endif #ifdef ART_ENABLE_CODEGEN_mips case kMips: { + mips::InstructionSimplifierMips* simplifier = + new (arena) mips::InstructionSimplifierMips(graph, codegen, stats); SideEffectsAnalysis* side_effects = new (arena) SideEffectsAnalysis(graph); GVNOptimization* gvn = new (arena) GVNOptimization(graph, *side_effects, "GVN$after_arch"); mips::PcRelativeFixups* pc_relative_fixups = new (arena) mips::PcRelativeFixups(graph, codegen, stats); HOptimization* mips_optimizations[] = { + simplifier, side_effects, gvn, pc_relative_fixups, -- cgit v1.2.3-59-g8ed1b