summaryrefslogtreecommitdiff
path: root/compiler/optimizing/instruction_simplifier.h
diff options
context:
space:
mode:
authorEvgeny Astigeevich <evgeny.astigeevich@linaro.org>2020-06-12 10:51:43 +0100
committerNicolas Geoffray <ngeoffray@google.com>2020-06-17 08:00:58 +0000
commit6587d9110bd7f836e43db16f3f676da996218aef (patch)
tree437d06a8e60fd70aaafaf2b167dfe636a303c68a /compiler/optimizing/instruction_simplifier.h
parent1912a5c7b9400009e361b0db52da77cc78f1cd77 (diff)
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
Diffstat (limited to 'compiler/optimizing/instruction_simplifier.h')
-rw-r--r--compiler/optimizing/instruction_simplifier.h9
1 files changed, 7 insertions, 2 deletions
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);
};