Commit b9f71c51 by Richard Biener Committed by Richard Biener

re PR tree-optimization/92512 (ICE in gimple_op, at gimple.h:2436)

2019-11-15  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/92512
	* tree-vect-loop.c (check_reduction_path): Fix operand index
	computability check.  Add check for second use in COND_EXPRs.

	* gcc.dg/torture/pr92512.c: New testcase.

From-SVN: r278293
parent b6d53324
2019-11-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/92512
* tree-vect-loop.c (check_reduction_path): Fix operand index
computability check. Add check for second use in COND_EXPRs.
2019-11-15 Richard Sandiford <richard.sandiford@arm.com> 2019-11-15 Richard Sandiford <richard.sandiford@arm.com>
PR target/92515 PR target/92515
2019-11-15 Richard Biener <rguenther@suse.de> 2019-11-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/92512
* gcc.dg/torture/pr92512.c: New testcase.
2019-11-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/92324 PR tree-optimization/92324
* gcc.dg/vect/pr92324-4.c: New testcase. * gcc.dg/vect/pr92324-4.c: New testcase.
......
/* { dg-do compile } */
/* { dg-additional-options "-ftree-vectorize" } */
long int
nl (long int fy, int k3, int zr)
{
while (k3 < 1)
{
if (zr == 0)
fy = 0;
fy *= fy < zr;
++k3;
}
return fy;
}
...@@ -2813,9 +2813,11 @@ pop: ...@@ -2813,9 +2813,11 @@ pop:
/* The following make sure we can compute the operand index /* The following make sure we can compute the operand index
easily plus it mostly disallows chaining via COND_EXPR condition easily plus it mostly disallows chaining via COND_EXPR condition
operands. */ operands. */
|| (gimple_assign_rhs1 (use_stmt) != op || (gimple_assign_rhs1_ptr (use_stmt) != path[i].second->use
&& gimple_assign_rhs2 (use_stmt) != op && (gimple_num_ops (use_stmt) <= 2
&& gimple_assign_rhs3 (use_stmt) != op)) || gimple_assign_rhs2_ptr (use_stmt) != path[i].second->use)
&& (gimple_num_ops (use_stmt) <= 3
|| gimple_assign_rhs3_ptr (use_stmt) != path[i].second->use)))
{ {
fail = true; fail = true;
break; break;
...@@ -2828,7 +2830,18 @@ pop: ...@@ -2828,7 +2830,18 @@ pop:
FOR_EACH_IMM_USE_STMT (op_use_stmt, imm_iter, op) FOR_EACH_IMM_USE_STMT (op_use_stmt, imm_iter, op)
if (!is_gimple_debug (op_use_stmt) if (!is_gimple_debug (op_use_stmt)
&& flow_bb_inside_loop_p (loop, gimple_bb (op_use_stmt))) && flow_bb_inside_loop_p (loop, gimple_bb (op_use_stmt)))
cnt++; {
/* We want to allow x + x but not x < 1 ? x : 2. */
if (is_gimple_assign (op_use_stmt)
&& gimple_assign_rhs_code (op_use_stmt) == COND_EXPR)
{
use_operand_p use_p;
FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
cnt++;
}
else
cnt++;
}
if (cnt != 1) if (cnt != 1)
{ {
fail = true; fail = true;
......
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