diff options
author | 2024-09-03 14:43:45 +0300 | |
---|---|---|
committer | 2024-09-10 15:44:02 +0000 | |
commit | 39927bc359ccbe65371213c4559126b05dcfb117 (patch) | |
tree | cfa4f0cf9bdab1c314bb08f83178d02a65ffb881 /compiler/optimizing/instruction_simplifier_shared.cc | |
parent | e36cb730c4e87213f648c74ef095152124edfe5f (diff) |
riscv64: Add node Rol, fix InstructionBuilder
Add new IR node Rol (rotate left). This allows to generate 1 (one)
risc-v instruction from Integer(Long).rotateLeft intrinsic instead of 2
instructions (Ror+Neg).
Fix InstructionBuilder:
build Rol from rotateLeft instead of Ror+Neg.
Add unfolding of Rol node in InstructionSimplifier(Arm, Arm64 and X86
Int64 type) to Neg+Ror.
By compiling with dex2oat all the methods of applications below I got:
in Facebook 1 Ror+Neg pattern,
in Minecraft 5 Ror+Neg patterns.
Test: art/test/testrunner/testrunner.py --target --64 --ndebug --optimizing
Change-Id: Ic28610c6fab4f66386f2fbc0f7223ef2c0e644b6
Diffstat (limited to 'compiler/optimizing/instruction_simplifier_shared.cc')
-rw-r--r-- | compiler/optimizing/instruction_simplifier_shared.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/compiler/optimizing/instruction_simplifier_shared.cc b/compiler/optimizing/instruction_simplifier_shared.cc index b7d76da548..7f575c0348 100644 --- a/compiler/optimizing/instruction_simplifier_shared.cc +++ b/compiler/optimizing/instruction_simplifier_shared.cc @@ -316,4 +316,23 @@ bool TryReplaceSubSubWithSubAdd(HSub* last_sub) { } } +void UnfoldRotateLeft(HRol* rol) { + HBasicBlock* block = rol->GetBlock(); + HGraph* graph = block->GetGraph(); + ArenaAllocator* allocator = graph->GetAllocator(); + HRor* ror; + + if (rol->GetRight()->IsConstant()) { + int32_t value = rol->GetRight()->AsIntConstant()->GetValue(); + HIntConstant* negated = graph->GetIntConstant(-value); + ror = new (allocator) HRor(rol->GetType(), rol->GetLeft(), negated); + } else { + HNeg* neg = new (allocator) HNeg(DataType::Type::kInt32, rol->GetRight()); + block->InsertInstructionBefore(neg, rol); + ror = new (allocator) HRor(rol->GetType(), rol->GetLeft(), neg); + } + + block->ReplaceAndRemoveInstructionWith(rol, ror); +} + } // namespace art |