Commit 2e0642cd by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/47337 (Wrong RTL dce of calls)

	PR rtl-optimization/47337
	* dce.c (check_argument_store): New function.
	(find_call_stack_args): Ignore debug insns.  Use check_argument_store.

	* gcc.c-torture/execute/pr47337.c: New test.

From-SVN: r168997
parent 46e7483c
2011-01-19 Jakub Jelinek <jakub@redhat.com> 2011-01-19 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/47337
* dce.c (check_argument_store): New function.
(find_call_stack_args): Ignore debug insns. Use check_argument_store.
PR tree-optimization/47290 PR tree-optimization/47290
* tree-eh.c (infinite_empty_loop_p): New function. * tree-eh.c (infinite_empty_loop_p): New function.
(cleanup_empty_eh): Use it. (cleanup_empty_eh): Use it.
......
/* RTL dead code elimination. /* RTL dead code elimination.
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -220,6 +220,26 @@ mark_nonreg_stores (rtx body, rtx insn, bool fast) ...@@ -220,6 +220,26 @@ mark_nonreg_stores (rtx body, rtx insn, bool fast)
} }
/* Return true if store to MEM, starting OFF bytes from stack pointer,
is a call argument store, and clear corresponding bits from SP_BYTES
bitmap if it is. */
static bool
check_argument_store (rtx mem, HOST_WIDE_INT off, HOST_WIDE_INT min_sp_off,
HOST_WIDE_INT max_sp_off, bitmap sp_bytes)
{
HOST_WIDE_INT byte;
for (byte = off; byte < off + GET_MODE_SIZE (GET_MODE (mem)); byte++)
{
if (byte < min_sp_off
|| byte >= max_sp_off
|| !bitmap_clear_bit (sp_bytes, byte - min_sp_off))
return false;
}
return true;
}
/* Try to find all stack stores of CALL_INSN arguments if /* Try to find all stack stores of CALL_INSN arguments if
ACCUMULATE_OUTGOING_ARGS. If all stack stores have been found ACCUMULATE_OUTGOING_ARGS. If all stack stores have been found
and it is therefore safe to eliminate the call, return true, and it is therefore safe to eliminate the call, return true,
...@@ -364,7 +384,7 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast, ...@@ -364,7 +384,7 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast,
for (insn = PREV_INSN (call_insn); insn; insn = prev_insn) for (insn = PREV_INSN (call_insn); insn; insn = prev_insn)
{ {
rtx set, mem, addr; rtx set, mem, addr;
HOST_WIDE_INT off, byte; HOST_WIDE_INT off;
if (insn == BB_HEAD (BLOCK_FOR_INSN (call_insn))) if (insn == BB_HEAD (BLOCK_FOR_INSN (call_insn)))
prev_insn = NULL_RTX; prev_insn = NULL_RTX;
...@@ -374,7 +394,7 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast, ...@@ -374,7 +394,7 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast,
if (CALL_P (insn)) if (CALL_P (insn))
break; break;
if (!INSN_P (insn)) if (!NONDEBUG_INSN_P (insn))
continue; continue;
set = single_set (insn); set = single_set (insn);
...@@ -433,17 +453,11 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast, ...@@ -433,17 +453,11 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast,
break; break;
} }
if (GET_MODE_SIZE (GET_MODE (mem)) == 0) if (GET_MODE_SIZE (GET_MODE (mem)) == 0
|| !check_argument_store (mem, off, min_sp_off,
max_sp_off, sp_bytes))
break; break;
for (byte = off; byte < off + GET_MODE_SIZE (GET_MODE (mem)); byte++)
{
if (byte < min_sp_off
|| byte >= max_sp_off
|| !bitmap_clear_bit (sp_bytes, byte - min_sp_off))
break;
}
if (!deletable_insn_p (insn, fast, NULL)) if (!deletable_insn_p (insn, fast, NULL))
break; break;
......
2011-01-19 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/47337
* gcc.c-torture/execute/pr47337.c: New test.
2011-01-19 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 2011-01-19 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
PR testsuite/45342 PR testsuite/45342
......
/* PR rtl-optimization/47337 */
static unsigned int a[256], b = 0;
static char c = 0;
static int d = 0, *f = &d;
static long long e = 0;
static short
foo (long long x, long long y)
{
return x / y;
}
static char
bar (char x, char y)
{
return x - y;
}
static int
baz (int x, int y)
{
*f = (y != (short) (y * 3));
for (c = 0; c < 2; c++)
{
lab:
if (d)
{
if (e)
e = 1;
else
return x;
}
else
{
d = 1;
goto lab;
}
f = &d;
}
return x;
}
static void
fnx (unsigned long long x, int y)
{
if (!y)
{
b = a[b & 1];
b = a[b & 1];
b = a[(b ^ (x & 1)) & 1];
b = a[(b ^ (x & 1)) & 1];
}
}
char *volatile w = "2";
int
main ()
{
int h = 0;
unsigned int k = 0;
int l[8];
int i, j;
if (__builtin_strcmp (w, "1") == 0)
h = 1;
for (i = 0; i < 256; i++)
{
for (j = 8; j > 0; j--)
k = 1;
a[i] = k;
}
for (i = 0; i < 8; i++)
l[i] = 0;
d = bar (c, c);
d = baz (c, 1 | foo (l[0], 10));
fnx (d, h);
fnx (e, h);
if (d != 0)
__builtin_abort ();
return 0;
}
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