aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-10-23 12:41:49 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-10-23 12:41:49 +0000
commit82e8e335f917b9ce40801838c06f7945cf88da43 (patch)
treeeed4184c1fa462a64d4a722463477af5dab26a10 /gcc/tree-vect-loop.c
parentd9eabacb0483ac1f730112d551551c258365f02e (diff)
downloadgcc-82e8e335f917b9ce40801838c06f7945cf88da43.zip
gcc-82e8e335f917b9ce40801838c06f7945cf88da43.tar.gz
gcc-82e8e335f917b9ce40801838c06f7945cf88da43.tar.bz2
re PR tree-optimization/65930 (Reduction with sign-change not handled)
2019-10-23 Richard Biener <rguenther@suse.de> PR tree-optimization/65930 * tree-vect-loop.c (check_reduction_path): Allow conversions that only change the sign. (vectorizable_reduction): Relax latch def stmts we handle further. * gcc.dg/vect/vect-reduc-2char-big-array.c: Adjust. * gcc.dg/vect/vect-reduc-2char.c: Likewise. * gcc.dg/vect/vect-reduc-2short.c: Likewise. * gcc.dg/vect/vect-reduc-dot-s8b.c: Likewise. * gcc.dg/vect/vect-reduc-pattern-2c.c: Likewise. From-SVN: r277322
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index e22d2dd..b66f211 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -2695,7 +2695,11 @@ pop:
if (gimple_assign_rhs2 (use_stmt) == op)
neg = ! neg;
}
- if (*code == ERROR_MARK)
+ if (CONVERT_EXPR_CODE_P (use_code)
+ && tree_nop_conversion_p (TREE_TYPE (gimple_assign_lhs (use_stmt)),
+ TREE_TYPE (gimple_assign_rhs1 (use_stmt))))
+ ;
+ else if (*code == ERROR_MARK)
*code = use_code;
else if (use_code != *code)
{
@@ -5692,19 +5696,6 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node,
which is defined by the loop-header-phi. */
gassign *stmt = as_a <gassign *> (stmt_info->stmt);
- switch (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)))
- {
- case GIMPLE_BINARY_RHS:
- case GIMPLE_TERNARY_RHS:
- break;
-
- case GIMPLE_UNARY_RHS:
- case GIMPLE_SINGLE_RHS:
- return false;
-
- default:
- gcc_unreachable ();
- }
enum tree_code code = gimple_assign_rhs_code (stmt);
int op_type = TREE_CODE_LENGTH (code);