summaryrefslogtreecommitdiff
path: root/compiler/optimizing/dead_code_elimination.cc
diff options
context:
space:
mode:
author Artem Serov <artem.serov@arm.com> 2021-12-14 23:16:21 +0000
committer Ulya Trofimovich <skvadrik@google.com> 2023-07-12 11:02:57 +0000
commit0b284aaa0f2b7c89591ac494e71af40adc8cf15d (patch)
treeba38e4ad5152bfaeeeb26e4185b7614c7f23e229 /compiler/optimizing/dead_code_elimination.cc
parent3bf7e912091f266a01c5a4fe09b082bea1c383f2 (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.cc14
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);
}