Commit 733441e2 by Richard Biener

re PR tree-optimization/87873 (ICE: verify_gimple failed (error: incompatible…

re PR tree-optimization/87873 (ICE: verify_gimple failed (error: incompatible types in PHI argument 0))

2018-11-05  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/87873
	* tree-ssa-loop-manip.h (split_loop_exit_edge): Add copy_constants_p
	argument.
	* tree-ssa-loop-manip.c (split_loop_exit_edge): Likewise.
	* tree-vect-loop.c (vect_transform_loop): When splitting the
	loop exit also create forwarder PHIs for constants.
	* tree-vect-loop-manip.c (slpeel_duplicate_current_defs_from_edges):
	Handle constant to_arg, add extra checking we match up the correct
	PHIs.

	* gcc.dg/pr87873.c: New testcase.

From-SVN: r265812
parent 546f678c
2018-11-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/87873
* tree-ssa-loop-manip.h (split_loop_exit_edge): Add copy_constants_p
argument.
* tree-ssa-loop-manip.c (split_loop_exit_edge): Likewise.
* tree-vect-loop.c (vect_transform_loop): When splitting the
loop exit also create forwarder PHIs for constants.
* tree-vect-loop-manip.c (slpeel_duplicate_current_defs_from_edges):
Handle constant to_arg, add extra checking we match up the correct
PHIs.
2018-11-05 Robin Dapp <rdapp@linux.ibm.com> 2018-11-05 Robin Dapp <rdapp@linux.ibm.com>
* config/s390/s390.md: QImode and HImode for load on condition. * config/s390/s390.md: QImode and HImode for load on condition.
2018-10-26 Robin Dapp <rdapp@linux.ibm.com> 2018-11-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/87873
* gcc.dg/pr87873.c: New testcase.
2018-11-05 Robin Dapp <rdapp@linux.ibm.com>
* gcc.target/s390/ifcvt-one-insn-bool.c: New test. * gcc.target/s390/ifcvt-one-insn-bool.c: New test.
* gcc.target/s390/ifcvt-one-insn-char.c: New test. * gcc.target/s390/ifcvt-one-insn-char.c: New test.
......
/* { dg-do compile } */
/* { dg-options "-O -ftree-loop-vectorize" } */
long k3;
int gs;
void
s2 (int aj)
{
while (aj < 1)
{
gs ^= 1;
k3 = (long) gs * 2;
if (k3 != 0)
k3 = 0;
++aj;
}
}
...@@ -773,10 +773,12 @@ verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop) ...@@ -773,10 +773,12 @@ verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop)
} }
/* Split loop exit edge EXIT. The things are a bit complicated by a need to /* Split loop exit edge EXIT. The things are a bit complicated by a need to
preserve the loop closed ssa form. The newly created block is returned. */ preserve the loop closed ssa form. If COPY_CONSTANTS_P is true then
forwarder PHIs are also created for constant arguments.
The newly created block is returned. */
basic_block basic_block
split_loop_exit_edge (edge exit) split_loop_exit_edge (edge exit, bool copy_constants_p)
{ {
basic_block dest = exit->dest; basic_block dest = exit->dest;
basic_block bb = split_edge (exit); basic_block bb = split_edge (exit);
...@@ -796,12 +798,13 @@ split_loop_exit_edge (edge exit) ...@@ -796,12 +798,13 @@ split_loop_exit_edge (edge exit)
/* If the argument of the PHI node is a constant, we do not need /* If the argument of the PHI node is a constant, we do not need
to keep it inside loop. */ to keep it inside loop. */
if (TREE_CODE (name) != SSA_NAME) if (TREE_CODE (name) != SSA_NAME
&& !copy_constants_p)
continue; continue;
/* Otherwise create an auxiliary phi node that will copy the value /* Otherwise create an auxiliary phi node that will copy the value
of the SSA name out of the loop. */ of the SSA name out of the loop. */
new_name = duplicate_ssa_name (name, NULL); new_name = duplicate_ssa_name (PHI_RESULT (phi), NULL);
new_phi = create_phi_node (new_name, bb); new_phi = create_phi_node (new_name, bb);
add_phi_arg (new_phi, name, exit, locus); add_phi_arg (new_phi, name, exit, locus);
SET_USE (op_p, new_name); SET_USE (op_p, new_name);
......
...@@ -37,7 +37,7 @@ checking_verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop = NULL) ...@@ -37,7 +37,7 @@ checking_verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop = NULL)
verify_loop_closed_ssa (verify_ssa_p, loop); verify_loop_closed_ssa (verify_ssa_p, loop);
} }
extern basic_block split_loop_exit_edge (edge); extern basic_block split_loop_exit_edge (edge, bool = false);
extern basic_block ip_end_pos (struct loop *); extern basic_block ip_end_pos (struct loop *);
extern basic_block ip_normal_pos (struct loop *); extern basic_block ip_normal_pos (struct loop *);
extern void standard_iv_increment_position (struct loop *, extern void standard_iv_increment_position (struct loop *,
......
...@@ -977,10 +977,15 @@ slpeel_duplicate_current_defs_from_edges (edge from, edge to) ...@@ -977,10 +977,15 @@ slpeel_duplicate_current_defs_from_edges (edge from, edge to)
} }
if (TREE_CODE (from_arg) != SSA_NAME) if (TREE_CODE (from_arg) != SSA_NAME)
gcc_assert (operand_equal_p (from_arg, to_arg, 0)); gcc_assert (operand_equal_p (from_arg, to_arg, 0));
else else if (TREE_CODE (to_arg) == SSA_NAME)
{ {
if (get_current_def (to_arg) == NULL_TREE) if (get_current_def (to_arg) == NULL_TREE)
set_current_def (to_arg, get_current_def (from_arg)); {
gcc_assert (types_compatible_p (TREE_TYPE (to_arg),
TREE_TYPE (get_current_def
(from_arg))));
set_current_def (to_arg, get_current_def (from_arg));
}
} }
gsi_next (&gsi_from); gsi_next (&gsi_from);
gsi_next (&gsi_to); gsi_next (&gsi_to);
......
...@@ -8196,7 +8196,7 @@ vect_transform_loop (loop_vec_info loop_vinfo) ...@@ -8196,7 +8196,7 @@ vect_transform_loop (loop_vec_info loop_vinfo)
edge e = single_exit (loop); edge e = single_exit (loop);
if (! single_pred_p (e->dest)) if (! single_pred_p (e->dest))
{ {
split_loop_exit_edge (e); split_loop_exit_edge (e, true);
if (dump_enabled_p ()) if (dump_enabled_p ())
dump_printf (MSG_NOTE, "split exit edge\n"); dump_printf (MSG_NOTE, "split exit edge\n");
} }
......
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