Commit d80d5c38 by Bin Cheng Committed by Bin Cheng

re PR tree-optimization/82163 (ICE on valid code at -O3 on x86_64-linux-gnu: in…

re PR tree-optimization/82163 (ICE on valid code at -O3 on x86_64-linux-gnu: in check_loop_closed_ssa_use, at tree-ssa-loop-manip.c:707)

	PR tree-optimization/82163
	* tree-ssa-loop-manip.h (verify_loop_closed_ssa): New parameter.
	(checking_verify_loop_closed_ssa): New parameter.
	* tree-ssa-loop-manip.c (check_loop_closed_ssa_use): Delete.
	(check_loop_closed_ssa_stmt): Delete.
	(check_loop_closed_ssa_def, check_loop_closed_ssa_bb): New functions.
	(verify_loop_closed_ssa): Check loop closed ssa form for LOOP.
	(tree_transform_and_unroll_loop): Check loop closed ssa form only for
	changed loops.

	gcc/testsuite
	* gcc.dg/tree-ssa/pr82163.c: New test.

From-SVN: r253161
parent c02bffe3
2017-09-25 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/82163
* tree-ssa-loop-manip.h (verify_loop_closed_ssa): New parameter.
(checking_verify_loop_closed_ssa): New parameter.
* tree-ssa-loop-manip.c (check_loop_closed_ssa_use): Delete.
(check_loop_closed_ssa_stmt): Delete.
(check_loop_closed_ssa_def, check_loop_closed_ssa_bb): New functions.
(verify_loop_closed_ssa): Check loop closed ssa form for LOOP.
(tree_transform_and_unroll_loop): Check loop closed ssa form only for
changed loops.
2017-09-25 Pekka Jaaskelainen <pekka@parmance.com> 2017-09-25 Pekka Jaaskelainen <pekka@parmance.com>
* brig-builtins.def: Treat HSAIL barrier builtins as * brig-builtins.def: Treat HSAIL barrier builtins as
2017-09-25 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/82163
* gcc.dg/tree-ssa/pr82163.c: New test.
2017-09-25 Thomas Koenig <tkoenig@gcc.gnu.org> 2017-09-25 Thomas Koenig <tkoenig@gcc.gnu.org>
* gfortran.dg/do_subscript_1.f90: New test. * gfortran.dg/do_subscript_1.f90: New test.
......
/* { dg-do compile } */
/* { dg-options "-O3" } */
int a, b, c[4], d, e, f, g;
void h ()
{
for (; a; a++)
{
c[a + 3] = g;
if (b)
c[a] = f;
else
{
for (; d; d++)
c[d + 3] = c[d];
for (e = 1; e == 2; e++)
;
if (e)
break;
}
}
}
...@@ -690,48 +690,59 @@ rewrite_virtuals_into_loop_closed_ssa (struct loop *loop) ...@@ -690,48 +690,59 @@ rewrite_virtuals_into_loop_closed_ssa (struct loop *loop)
rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_VIRTUAL_USES, loop); rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_VIRTUAL_USES, loop);
} }
/* Check invariants of the loop closed ssa form for the USE in BB. */ /* Check invariants of the loop closed ssa form for the def in DEF_BB. */
static void static void
check_loop_closed_ssa_use (basic_block bb, tree use) check_loop_closed_ssa_def (basic_block def_bb, tree def)
{ {
gimple *def; use_operand_p use_p;
basic_block def_bb; imm_use_iterator iterator;
FOR_EACH_IMM_USE_FAST (use_p, iterator, def)
{
if (is_gimple_debug (USE_STMT (use_p)))
continue;
if (TREE_CODE (use) != SSA_NAME || virtual_operand_p (use)) basic_block use_bb = gimple_bb (USE_STMT (use_p));
return; if (is_a <gphi *> (USE_STMT (use_p)))
use_bb = EDGE_PRED (use_bb, PHI_ARG_INDEX_FROM_USE (use_p))->src;
def = SSA_NAME_DEF_STMT (use); gcc_assert (flow_bb_inside_loop_p (def_bb->loop_father, use_bb));
def_bb = gimple_bb (def); }
gcc_assert (!def_bb
|| flow_bb_inside_loop_p (def_bb->loop_father, bb));
} }
/* Checks invariants of loop closed ssa form in statement STMT in BB. */ /* Checks invariants of loop closed ssa form in BB. */
static void static void
check_loop_closed_ssa_stmt (basic_block bb, gimple *stmt) check_loop_closed_ssa_bb (basic_block bb)
{ {
ssa_op_iter iter; for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
tree var; gsi_next (&bsi))
{
gphi *phi = bsi.phi ();
if (is_gimple_debug (stmt)) if (!virtual_operand_p (PHI_RESULT (phi)))
return; check_loop_closed_ssa_def (bb, PHI_RESULT (phi));
}
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE) for (gimple_stmt_iterator bsi = gsi_start_nondebug_bb (bb); !gsi_end_p (bsi);
check_loop_closed_ssa_use (bb, var); gsi_next_nondebug (&bsi))
{
ssa_op_iter iter;
tree var;
gimple *stmt = gsi_stmt (bsi);
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
check_loop_closed_ssa_def (bb, var);
}
} }
/* Checks that invariants of the loop closed ssa form are preserved. /* Checks that invariants of the loop closed ssa form are preserved.
Call verify_ssa when VERIFY_SSA_P is true. */ Call verify_ssa when VERIFY_SSA_P is true. Note all loops are checked
if LOOP is NULL, otherwise, only LOOP is checked. */
DEBUG_FUNCTION void DEBUG_FUNCTION void
verify_loop_closed_ssa (bool verify_ssa_p) verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop)
{ {
basic_block bb;
edge e;
edge_iterator ei;
if (number_of_loops (cfun) <= 1) if (number_of_loops (cfun) <= 1)
return; return;
...@@ -740,20 +751,22 @@ verify_loop_closed_ssa (bool verify_ssa_p) ...@@ -740,20 +751,22 @@ verify_loop_closed_ssa (bool verify_ssa_p)
timevar_push (TV_VERIFY_LOOP_CLOSED); timevar_push (TV_VERIFY_LOOP_CLOSED);
FOR_EACH_BB_FN (bb, cfun) if (loop == NULL)
{ {
for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi); basic_block bb;
gsi_next (&bsi))
{
gphi *phi = bsi.phi ();
FOR_EACH_EDGE (e, ei, bb->preds)
check_loop_closed_ssa_use (e->src,
PHI_ARG_DEF_FROM_EDGE (phi, e));
}
for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi); FOR_EACH_BB_FN (bb, cfun)
gsi_next (&bsi)) if (bb->loop_father && bb->loop_father->num > 0)
check_loop_closed_ssa_stmt (bb, gsi_stmt (bsi)); check_loop_closed_ssa_bb (bb);
}
else
{
basic_block *bbs = get_loop_body (loop);
for (unsigned i = 0; i < loop->num_nodes; ++i)
check_loop_closed_ssa_bb (bbs[i]);
free (bbs);
} }
timevar_pop (TV_VERIFY_LOOP_CLOSED); timevar_pop (TV_VERIFY_LOOP_CLOSED);
...@@ -1405,7 +1418,8 @@ tree_transform_and_unroll_loop (struct loop *loop, unsigned factor, ...@@ -1405,7 +1418,8 @@ tree_transform_and_unroll_loop (struct loop *loop, unsigned factor,
checking_verify_flow_info (); checking_verify_flow_info ();
checking_verify_loop_structure (); checking_verify_loop_structure ();
checking_verify_loop_closed_ssa (true); checking_verify_loop_closed_ssa (true, loop);
checking_verify_loop_closed_ssa (true, new_loop);
} }
/* Wrapper over tree_transform_and_unroll_loop for case we do not /* Wrapper over tree_transform_and_unroll_loop for case we do not
......
...@@ -28,13 +28,13 @@ extern void rewrite_into_loop_closed_ssa_1 (bitmap, unsigned, int, ...@@ -28,13 +28,13 @@ extern void rewrite_into_loop_closed_ssa_1 (bitmap, unsigned, int,
struct loop *); struct loop *);
extern void rewrite_into_loop_closed_ssa (bitmap, unsigned); extern void rewrite_into_loop_closed_ssa (bitmap, unsigned);
extern void rewrite_virtuals_into_loop_closed_ssa (struct loop *); extern void rewrite_virtuals_into_loop_closed_ssa (struct loop *);
extern void verify_loop_closed_ssa (bool); extern void verify_loop_closed_ssa (bool, struct loop * = NULL);
static inline void static inline void
checking_verify_loop_closed_ssa (bool verify_ssa_p) checking_verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop = NULL)
{ {
if (flag_checking) if (flag_checking)
verify_loop_closed_ssa (verify_ssa_p); verify_loop_closed_ssa (verify_ssa_p, loop);
} }
extern basic_block split_loop_exit_edge (edge); extern basic_block split_loop_exit_edge (edge);
......
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