diff options
author | Tamar Christina <tamar.christina@arm.com> | 2021-01-11 09:56:44 +0000 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2021-01-11 09:56:44 +0000 |
commit | 39666d2b8858361b4921fe0ae87bba90a62d9b9a (patch) | |
tree | bc3823327c4070c29743b67cc771421ab89ea2b6 | |
parent | 9a6c37e6ae520534993ef76dd45d016c8c86db21 (diff) | |
download | gcc-39666d2b8858361b4921fe0ae87bba90a62d9b9a.zip gcc-39666d2b8858361b4921fe0ae87bba90a62d9b9a.tar.gz gcc-39666d2b8858361b4921fe0ae87bba90a62d9b9a.tar.bz2 |
slp: fix is_linear_load_p to prevent multiple answers
This fixes an issue where is_linear_load_p could return the incorrect
permutation kind because it is singe pass.
This arranges the candidates in such a way that there won't be any ambiguity so
that the function can still be linear but give correct values.
gcc/ChangeLog:
* tree-vect-slp-patterns.c (is_linear_load_p): Fix ambiguity.
-rw-r--r-- | gcc/tree-vect-slp-patterns.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/gcc/tree-vect-slp-patterns.c b/gcc/tree-vect-slp-patterns.c index 9b8ba41..e30cea1 100644 --- a/gcc/tree-vect-slp-patterns.c +++ b/gcc/tree-vect-slp-patterns.c @@ -140,32 +140,32 @@ is_linear_load_p (load_permutation_t loads) unsigned load, i; complex_perm_kinds_t candidates[4] - = { PERM_EVENODD - , PERM_ODDEVEN - , PERM_ODDODD + = { PERM_ODDODD , PERM_EVENEVEN + , PERM_EVENODD + , PERM_ODDEVEN }; int valid_patterns = 4; - FOR_EACH_VEC_ELT_FROM (loads, i, load, 1) + FOR_EACH_VEC_ELT (loads, i, load) { - if (candidates[0] != PERM_UNKNOWN && load != i) + if (candidates[0] != PERM_UNKNOWN && load != 1) { candidates[0] = PERM_UNKNOWN; valid_patterns--; } - if (candidates[1] != PERM_UNKNOWN - && load != (i % 2 == 0 ? i + 1 : i - 1)) + if (candidates[1] != PERM_UNKNOWN && load != 0) { candidates[1] = PERM_UNKNOWN; valid_patterns--; } - if (candidates[2] != PERM_UNKNOWN && load != 1) + if (candidates[2] != PERM_UNKNOWN && load != i) { candidates[2] = PERM_UNKNOWN; valid_patterns--; } - if (candidates[3] != PERM_UNKNOWN && load != 0) + if (candidates[3] != PERM_UNKNOWN + && load != (i % 2 == 0 ? i + 1 : i - 1)) { candidates[3] = PERM_UNKNOWN; valid_patterns--; |