Commit 7ec44c3d by Richard Biener Committed by Richard Biener

re PR tree-optimization/62238 (ICE with LTO on valid code on x86_64-linux-gnu in…

re PR tree-optimization/62238 (ICE with LTO on valid code on x86_64-linux-gnu in verify_ssa (in 64-bit mode))

2014-11-26  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/62238
	* tree-predcom.c (ref_at_iteration): Unshare the expression
	before gimplifying it.
	(prepare_initializers_chain): Discard unused seq.

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

From-SVN: r218074
parent 8592c207
2014-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/62238
* tree-predcom.c (ref_at_iteration): Unshare the expression
before gimplifying it.
(prepare_initializers_chain): Discard unused seq.
2014-11-25 Vladimir Makarov <vmakarov@redhat.com> 2014-11-25 Vladimir Makarov <vmakarov@redhat.com>
* ira-lives.c (process_bb_node_lives): Make code with conditional * ira-lives.c (process_bb_node_lives): Make code with conditional
2014-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/62238
* gcc.dg/torture/pr62238.c: New testcase.
2014-11-25 Andrew Pinski <apinski@cavium.com> 2014-11-25 Andrew Pinski <apinski@cavium.com>
* gcc.c-torture/execute/20141125-1.c: New testcase. * gcc.c-torture/execute/20141125-1.c: New testcase.
......
/* { dg-do run } */
int a[4], b, c, d;
int
fn1 (int p)
{
for (; d; d++)
{
unsigned int h;
for (h = 0; h < 3; h++)
{
if (a[c+c+h])
{
if (p)
break;
return 0;
}
b = 0;
}
}
return 0;
}
int
main ()
{
fn1 (0);
return 0;
}
...@@ -1402,8 +1402,8 @@ ref_at_iteration (data_reference_p dr, int iter, gimple_seq *stmts) ...@@ -1402,8 +1402,8 @@ ref_at_iteration (data_reference_p dr, int iter, gimple_seq *stmts)
off = size_binop (PLUS_EXPR, off, off = size_binop (PLUS_EXPR, off,
size_binop (MULT_EXPR, DR_STEP (dr), ssize_int (iter))); size_binop (MULT_EXPR, DR_STEP (dr), ssize_int (iter)));
tree addr = fold_build_pointer_plus (DR_BASE_ADDRESS (dr), off); tree addr = fold_build_pointer_plus (DR_BASE_ADDRESS (dr), off);
addr = force_gimple_operand_1 (addr, stmts, is_gimple_mem_ref_addr, addr = force_gimple_operand_1 (unshare_expr (addr), stmts,
NULL_TREE); is_gimple_mem_ref_addr, NULL_TREE);
tree alias_ptr = fold_convert (reference_alias_ptr_type (DR_REF (dr)), coff); tree alias_ptr = fold_convert (reference_alias_ptr_type (DR_REF (dr)), coff);
/* While data-ref analysis punts on bit offsets it still handles /* While data-ref analysis punts on bit offsets it still handles
bitfield accesses at byte boundaries. Cope with that. Note that bitfield accesses at byte boundaries. Cope with that. Note that
...@@ -2354,7 +2354,6 @@ prepare_initializers_chain (struct loop *loop, chain_p chain) ...@@ -2354,7 +2354,6 @@ prepare_initializers_chain (struct loop *loop, chain_p chain)
unsigned i, n = (chain->type == CT_INVARIANT) ? 1 : chain->length; unsigned i, n = (chain->type == CT_INVARIANT) ? 1 : chain->length;
struct data_reference *dr = get_chain_root (chain)->ref; struct data_reference *dr = get_chain_root (chain)->ref;
tree init; tree init;
gimple_seq stmts;
dref laref; dref laref;
edge entry = loop_preheader_edge (loop); edge entry = loop_preheader_edge (loop);
...@@ -2378,12 +2377,17 @@ prepare_initializers_chain (struct loop *loop, chain_p chain) ...@@ -2378,12 +2377,17 @@ prepare_initializers_chain (struct loop *loop, chain_p chain)
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
gimple_seq stmts = NULL;
if (chain->inits[i] != NULL_TREE) if (chain->inits[i] != NULL_TREE)
continue; continue;
init = ref_at_iteration (dr, (int) i - n, &stmts); init = ref_at_iteration (dr, (int) i - n, &stmts);
if (!chain->all_always_accessed && tree_could_trap_p (init)) if (!chain->all_always_accessed && tree_could_trap_p (init))
return false; {
gimple_seq_discard (stmts);
return false;
}
if (stmts) if (stmts)
gsi_insert_seq_on_edge_immediate (entry, stmts); gsi_insert_seq_on_edge_immediate (entry, stmts);
......
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