mirror of git://gcc.gnu.org/git/gcc.git
re PR tree-optimization/46130 (ICE: SIGSEGV in walk_stmt_load_store_addr_ops (gimple.c:4894) with -O2 -fno-tree-dce)
PR tree-optimization/46130 * ipa-split.c (consider_split): If return_bb contains non-virtual PHIs other than for retval or if split_function would not adjust it, refuse to split. * gcc.dg/pr46130-1.c: New test. * gcc.dg/pr46130-2.c: New test. From-SVN: r169052
This commit is contained in:
parent
ddd268f2e9
commit
28fc44f389
|
@ -1,3 +1,10 @@
|
|||
2011-01-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/46130
|
||||
* ipa-split.c (consider_split): If return_bb contains non-virtual
|
||||
PHIs other than for retval or if split_function would not adjust it,
|
||||
refuse to split.
|
||||
|
||||
2011-01-20 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/47167
|
||||
|
|
|
@ -411,9 +411,6 @@ consider_split (struct split_point *current, bitmap non_ssa_vars,
|
|||
" Refused: split part has non-ssa uses\n");
|
||||
return;
|
||||
}
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, " Accepted!\n");
|
||||
|
||||
/* See if retval used by return bb is computed by header or split part.
|
||||
When it is computed by split part, we need to produce return statement
|
||||
in the split part and add code to header to pass it around.
|
||||
|
@ -451,6 +448,30 @@ consider_split (struct split_point *current, bitmap non_ssa_vars,
|
|||
else
|
||||
current->split_part_set_retval = true;
|
||||
|
||||
/* split_function fixes up at most one PHI non-virtual PHI node in return_bb,
|
||||
for the return value. If there are other PHIs, give up. */
|
||||
if (return_bb != EXIT_BLOCK_PTR)
|
||||
{
|
||||
gimple_stmt_iterator psi;
|
||||
|
||||
for (psi = gsi_start_phis (return_bb); !gsi_end_p (psi); gsi_next (&psi))
|
||||
if (is_gimple_reg (gimple_phi_result (gsi_stmt (psi)))
|
||||
&& !(retval
|
||||
&& current->split_part_set_retval
|
||||
&& TREE_CODE (retval) == SSA_NAME
|
||||
&& !DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))
|
||||
&& SSA_NAME_DEF_STMT (retval) == gsi_stmt (psi)))
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file,
|
||||
" Refused: return bb has extra PHIs\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, " Accepted!\n");
|
||||
|
||||
/* At the moment chose split point with lowest frequency and that leaves
|
||||
out smallest size of header.
|
||||
In future we might re-consider this heuristics. */
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2011-01-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/46130
|
||||
* gcc.dg/pr46130-1.c: New test.
|
||||
* gcc.dg/pr46130-2.c: New test.
|
||||
|
||||
2011-01-19 Dodji Seketeli <dodji@redhat.com>
|
||||
|
||||
PR c++/47291
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
/* PR tree-optimization/46130 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-tree-dce" } */
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
static void
|
||||
foo (va_list ap)
|
||||
{
|
||||
va_arg (ap, char *)[0];
|
||||
}
|
||||
|
||||
void
|
||||
bar (va_list ap)
|
||||
{
|
||||
foo (ap);
|
||||
}
|
||||
|
||||
void
|
||||
baz (va_list ap)
|
||||
{
|
||||
foo (ap);
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/* PR tree-optimization/46130 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-tree-dce" } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
static int foo (int x)
|
||||
{
|
||||
int z, w;
|
||||
if (x <= 1024)
|
||||
{
|
||||
z = 16;
|
||||
w = 17;
|
||||
}
|
||||
else
|
||||
{
|
||||
bar (bar (bar (bar (bar (bar (bar (bar (bar (16)))))))));
|
||||
if (x > 131072)
|
||||
w = 19;
|
||||
else
|
||||
w = 21;
|
||||
z = 32;
|
||||
}
|
||||
w = w + 121;
|
||||
return z;
|
||||
}
|
||||
|
||||
int
|
||||
baz (int x)
|
||||
{
|
||||
return foo (x + 6) + foo (x + 15) + foo (x + 24);
|
||||
}
|
Loading…
Reference in New Issue