diff options
author | 2021-12-14 23:16:21 +0000 | |
---|---|---|
committer | 2023-07-12 11:02:57 +0000 | |
commit | 0b284aaa0f2b7c89591ac494e71af40adc8cf15d (patch) | |
tree | ba38e4ad5152bfaeeeb26e4185b7614c7f23e229 /compiler/optimizing/dead_code_elimination.cc | |
parent | 3bf7e912091f266a01c5a4fe09b082bea1c383f2 (diff) |
Support autovectorization of diamond loops.
This CL enables predicated autovectorization of loops with
control flow, currently only for simple diamond pattern ones:
header------------------+
| |
diamond_hif |
/ \ |
diamond_true diamond_false |
\ / |
back_edge |
| |
+---------------------+
Original author: Artem Serov <Artem.Serov@linaro.org>
Test: ./art/test.py --host --optimizing --jit
Test: ./art/test.py --target --optimizing --jit
Test: 661-checker-simd-cf-loops.
Test: target tests on arm64 with SVE (for details see
art/test/README.arm_fvp).
Change-Id: I8dbc266278b4ab074b831d6c224f02024030cc8a
Diffstat (limited to 'compiler/optimizing/dead_code_elimination.cc')
-rw-r--r-- | compiler/optimizing/dead_code_elimination.cc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc index cf49e39849..8e6b6db236 100644 --- a/compiler/optimizing/dead_code_elimination.cc +++ b/compiler/optimizing/dead_code_elimination.cc @@ -24,6 +24,7 @@ #include "base/scoped_arena_containers.h" #include "base/stl_util.h" #include "optimizing/nodes.h" +#include "optimizing/nodes_vector.h" #include "ssa_phi_elimination.h" namespace art HIDDEN { @@ -842,7 +843,8 @@ void HDeadCodeElimination::RemoveDeadInstructions() { void HDeadCodeElimination::UpdateGraphFlags() { bool has_monitor_operations = false; - bool has_simd = false; + bool has_traditional_simd = false; + bool has_predicated_simd = false; bool has_bounds_checks = false; bool has_always_throwing_invokes = false; @@ -852,7 +854,12 @@ void HDeadCodeElimination::UpdateGraphFlags() { if (instruction->IsMonitorOperation()) { has_monitor_operations = true; } else if (instruction->IsVecOperation()) { - has_simd = true; + HVecOperation* vec_instruction = instruction->AsVecOperation(); + if (vec_instruction->IsPredicated()) { + has_predicated_simd = true; + } else { + has_traditional_simd = true; + } } else if (instruction->IsBoundsCheck()) { has_bounds_checks = true; } else if (instruction->IsInvoke() && instruction->AsInvoke()->AlwaysThrows()) { @@ -862,7 +869,8 @@ void HDeadCodeElimination::UpdateGraphFlags() { } graph_->SetHasMonitorOperations(has_monitor_operations); - graph_->SetHasSIMD(has_simd); + graph_->SetHasTraditionalSIMD(has_traditional_simd); + graph_->SetHasPredicatedSIMD(has_predicated_simd); graph_->SetHasBoundsChecks(has_bounds_checks); graph_->SetHasAlwaysThrowingInvokes(has_always_throwing_invokes); } |