From 82e8e335f917b9ce40801838c06f7945cf88da43 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 23 Oct 2019 12:41:49 +0000 Subject: [PATCH] re PR tree-optimization/65930 (Reduction with sign-change not handled) 2019-10-23 Richard Biener 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 9 +++++++++ .../gcc.dg/vect/vect-reduc-2char-big-array.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-reduc-2char.c | 2 +- gcc/testsuite/gcc.dg/vect/vect-reduc-2short.c | 2 +- .../gcc.dg/vect/vect-reduc-dot-s8b.c | 8 +------- .../gcc.dg/vect/vect-reduc-pattern-2c.c | 5 +++-- gcc/tree-vect-loop.c | 19 +++++-------------- 8 files changed, 28 insertions(+), 26 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23a7d18b3cd..508207dfc51 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-10-23 Richard Biener + + 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. + 2019-10-23 Jakub Jelinek PR debug/90231 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 790ffe4bf6d..a9c44136a2c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2019-10-23 Richard Biener + + PR tree-optimization/65930 + * 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. + 2019-10-23 Jakub Jelinek * g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-2char-big-array.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-2char-big-array.c index e246ae7f3c6..c40f8625b84 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-reduc-2char-big-array.c +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-2char-big-array.c @@ -62,4 +62,4 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-2char.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-2char.c index 5f0551ee372..dd3045502f1 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-reduc-2char.c +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-2char.c @@ -46,4 +46,4 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-2short.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-2short.c index 02c2bee8612..1a2d8d04f4e 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-reduc-2short.c +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-2short.c @@ -45,4 +45,4 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c index b036ad5b0b4..c0ee5dc01c5 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c @@ -12,12 +12,6 @@ signed char Y[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))); /* char->short->short dot product. The dot-product pattern should be detected. - The reduction is currently not vectorized becaus of the signed->unsigned->signed - casts, since this patch: - - 2005-12-26 Kazu Hirata - - PR tree-optimization/25125 When the dot-product is detected, the loop should be vectorized on vect_sdot_qi targets (targets that support dot-product of signed char). @@ -60,5 +54,5 @@ int main (void) /* { dg-final { scan-tree-dump-times "vect_recog_dot_prod_pattern: detected" 1 "vect" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 1 "vect" } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c index 8190622d5d7..71df5741e16 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c @@ -21,6 +21,8 @@ foo () 2005-12-26 Kazu Hirata PR tree-optimization/25125 + + but we still handle the reduction. */ for (i = 0; i < N; i++) @@ -43,5 +45,4 @@ main (void) } /* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index e22d2dd7abb..b66f211c350 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 (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); -- 2.30.2