Commit 047fba34 by Richard Sandiford Committed by Richard Sandiford

Fix over-widening handling of COND_EXPRs (PR 86749)

This PR is a wrong-code bug caused by the over-widening support.
The minimum input precisions for a COND_EXPR are supposed to apply
only to the "then" and "else" values, but here we were applying
them to the operands of a nested COND_EXPR comparison instead.

2018-08-01  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	PR tree-optimization/86749
	* tree-vect-patterns.c (vect_determine_min_output_precision_1):
	If the lhs is used in a COND_EXPR, check that it is being used
	as the "then" or "else" value.

gcc/testsuite/
	PR tree-optimization/86749
	* gcc.dg/vect/pr86749.c: New test.

From-SVN: r263213
parent 094db6be
2018-08-01 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/86749
* tree-vect-patterns.c (vect_determine_min_output_precision_1):
If the lhs is used in a COND_EXPR, check that it is being used
as the "then" or "else" value.
2018-08-01 Tom de Vries <tdevries@suse.de>
PR target/86800
......
2018-08-01 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/86749
* gcc.dg/vect/pr86749.c: New test.
2018-08-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/86661
......
/* { dg-additional-options "-O3" } */
#include "tree-vect.h"
short a, b, f, g;
int c = 4, d, e = -1L;
long h = 4;
int
main ()
{
check_vect ();
long i;
for (; d <= 55; d++)
{
g = c >= 2 ? 0 : b << c;
f = g - a;
i = (f ^ 9223372036854775807) < 0 ? f : h;
e &= i;
}
if (e != 4)
__builtin_abort ();
return 0;
}
......@@ -4399,6 +4399,14 @@ vect_determine_min_output_precision_1 (stmt_vec_info stmt_info, tree lhs)
stmt_vec_info use_stmt_info = vinfo->lookup_stmt (use_stmt);
if (!use_stmt_info || !use_stmt_info->min_input_precision)
return false;
/* The input precision recorded for COND_EXPRs applies only to the
"then" and "else" values. */
gassign *assign = dyn_cast <gassign *> (stmt_info->stmt);
if (assign
&& gimple_assign_rhs_code (assign) == COND_EXPR
&& use->use != gimple_assign_rhs2_ptr (assign)
&& use->use != gimple_assign_rhs3_ptr (assign))
return false;
precision = MAX (precision, use_stmt_info->min_input_precision);
}
......
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