diff options
| author | 2015-11-20 15:45:47 +0000 | |
|---|---|---|
| committer | 2015-11-20 15:45:47 +0000 | |
| commit | d8841c279fc350f1ae85887e2190b508956896a0 (patch) | |
| tree | 420b802e0e8e8e02e6bea03808ef8f7aa7850719 /compiler/optimizing | |
| parent | 6221a7024f97f0e91904b58280278883f4aae98b (diff) | |
| parent | 60c4c6ad2b892bb00a6016a147b1cc089ba6bcb5 (diff) | |
Merge "Opt compiler: More strength reduction for multiplications."
am: 60c4c6ad2b
* commit '60c4c6ad2b892bb00a6016a147b1cc089ba6bcb5':
Opt compiler: More strength reduction for multiplications.
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index b97dc1a511..9ad2dd1c8e 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -796,6 +796,34 @@ void InstructionSimplifierVisitor::VisitMul(HMul* instruction) { HShl* shl = new(allocator) HShl(type, input_other, shift); block->ReplaceAndRemoveInstructionWith(instruction, shl); RecordSimplification(); + } else if (IsPowerOfTwo(factor - 1)) { + // Transform code looking like + // MUL dst, src, (2^n + 1) + // into + // SHL tmp, src, n + // ADD dst, src, tmp + HShl* shl = new (allocator) HShl(type, + input_other, + GetGraph()->GetIntConstant(WhichPowerOf2(factor - 1))); + HAdd* add = new (allocator) HAdd(type, input_other, shl); + + block->InsertInstructionBefore(shl, instruction); + block->ReplaceAndRemoveInstructionWith(instruction, add); + RecordSimplification(); + } else if (IsPowerOfTwo(factor + 1)) { + // Transform code looking like + // MUL dst, src, (2^n - 1) + // into + // SHL tmp, src, n + // SUB dst, tmp, src + HShl* shl = new (allocator) HShl(type, + input_other, + GetGraph()->GetIntConstant(WhichPowerOf2(factor + 1))); + HSub* sub = new (allocator) HSub(type, shl, input_other); + + block->InsertInstructionBefore(shl, instruction); + block->ReplaceAndRemoveInstructionWith(instruction, sub); + RecordSimplification(); } } } |