Commit 82e8e335 by Richard Biener Committed by Richard Biener

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
parent d9eabacb
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.
2019-10-23 Jakub Jelinek <jakub@redhat.com> 2019-10-23 Jakub Jelinek <jakub@redhat.com>
PR debug/90231 PR debug/90231
2019-10-23 Richard Biener <rguenther@suse.de>
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 <jakub@redhat.com> 2019-10-23 Jakub Jelinek <jakub@redhat.com>
* g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of * g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of
......
...@@ -62,4 +62,4 @@ int main (void) ...@@ -62,4 +62,4 @@ int main (void)
return 0; 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" } } */
...@@ -46,4 +46,4 @@ int main (void) ...@@ -46,4 +46,4 @@ int main (void)
return 0; 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" } } */
...@@ -45,4 +45,4 @@ int main (void) ...@@ -45,4 +45,4 @@ int main (void)
return 0; 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" } } */
...@@ -12,12 +12,6 @@ signed char Y[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))); ...@@ -12,12 +12,6 @@ signed char Y[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
/* char->short->short dot product. /* char->short->short dot product.
The dot-product pattern should be detected. 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 <kazu@codesourcery.com>
PR tree-optimization/25125
When the dot-product is detected, the loop should be vectorized on vect_sdot_qi When the dot-product is detected, the loop should be vectorized on vect_sdot_qi
targets (targets that support dot-product of signed char). targets (targets that support dot-product of signed char).
...@@ -60,5 +54,5 @@ int main (void) ...@@ -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_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 "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" } } */
...@@ -21,6 +21,8 @@ foo () ...@@ -21,6 +21,8 @@ foo ()
2005-12-26 Kazu Hirata <kazu@codesourcery.com> 2005-12-26 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/25125 PR tree-optimization/25125
but we still handle the reduction.
*/ */
for (i = 0; i < N; i++) for (i = 0; i < N; i++)
...@@ -43,5 +45,4 @@ main (void) ...@@ -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 "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" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
...@@ -2695,7 +2695,11 @@ pop: ...@@ -2695,7 +2695,11 @@ pop:
if (gimple_assign_rhs2 (use_stmt) == op) if (gimple_assign_rhs2 (use_stmt) == op)
neg = ! neg; 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; *code = use_code;
else if (use_code != *code) else if (use_code != *code)
{ {
...@@ -5692,19 +5696,6 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node, ...@@ -5692,19 +5696,6 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node,
which is defined by the loop-header-phi. */ which is defined by the loop-header-phi. */
gassign *stmt = as_a <gassign *> (stmt_info->stmt); 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); enum tree_code code = gimple_assign_rhs_code (stmt);
int op_type = TREE_CODE_LENGTH (code); int op_type = TREE_CODE_LENGTH (code);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment