From 6587d9110bd7f836e43db16f3f676da996218aef Mon Sep 17 00:00:00 2001 From: Evgeny Astigeevich Date: Fri, 12 Jun 2020 10:51:43 +0100 Subject: ART: Simplify HRem to reuse existing HDiv A pattern seen in libcore and SPECjvm2008 workloads is a pair of HRem/HDiv having the same dividend and divisor. The code generator processes them separately and generates duplicated instructions calculating HDiv. This CL adds detection of such a pattern to the instruction simplifier. This optimization affects HInductionVarAnalysis and HLoopOptimization preventing some loop optimizations. To avoid this the instruction simplifier has the loop_friendly mode which means not to optimize HRems if they are in a loop. A microbenchmark run on Pixel 3 shows the following improvements: | little cores | big cores arm32 Int32 | +21% | +40% arm32 Int64 | +46% | +44% arm64 Int32 | +27% | +14% arm64 Int64 | +33% | +27% Test: 411-checker-instruct-simplifier-hrem Test: test.py --host --optimizing --jit --gtest --interpreter Test: test.py --target --optimizing --jit --interpreter Test: run-gtests.sh Change-Id: I376a1bd299d7fe10acad46771236edd5f85dfe56 --- compiler/optimizing/instruction_simplifier.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'compiler/optimizing/instruction_simplifier.h') diff --git a/compiler/optimizing/instruction_simplifier.h b/compiler/optimizing/instruction_simplifier.h index 982a24a6f0..feea771096 100644 --- a/compiler/optimizing/instruction_simplifier.h +++ b/compiler/optimizing/instruction_simplifier.h @@ -40,9 +40,11 @@ class InstructionSimplifier : public HOptimization { InstructionSimplifier(HGraph* graph, CodeGenerator* codegen, OptimizingCompilerStats* stats = nullptr, - const char* name = kInstructionSimplifierPassName) + const char* name = kInstructionSimplifierPassName, + bool use_all_optimizations = false) : HOptimization(graph, name, stats), - codegen_(codegen) {} + codegen_(codegen), + use_all_optimizations_(use_all_optimizations) {} static constexpr const char* kInstructionSimplifierPassName = "instruction_simplifier"; @@ -51,6 +53,9 @@ class InstructionSimplifier : public HOptimization { private: CodeGenerator* codegen_; + // Use all optimizations without restrictions. + bool use_all_optimizations_; + DISALLOW_COPY_AND_ASSIGN(InstructionSimplifier); }; -- cgit v1.2.3-59-g8ed1b