Commit ca3f371f by Teresa Johnson Committed by Teresa Johnson

Avoid conservative behavior in REE by allowing removal of redundant extends when...

Avoid conservative behavior in REE by allowing removal of redundant extends
when the def feeds another extend with a different mode. This works because
in merge_def_and_ext only calls combine_set_extension if the candidate for
removal has a wider mode than the def extend's mode, otherwise the def extend
mode is preserved. In combine_set_extension the def is modified to use the
wider candidate's mode.

2012-10-26  Teresa Johnson  <tejohnson@google.com>

	* ree.c (add_removable_extension): Remove unnecessary
	mode check with other extension.
	* testsuite/gcc.c-torture/execute/20111227-2.c: New test.
	* testsuite/gcc.c-torture/execute/20111227-3.c: Ditto.

From-SVN: r192850
parent 8256d5ca
2012-10-26 Teresa Johnson <tejohnson@google.com>
* ree.c (add_removable_extension): Remove unnecessary
mode check with other extension.
* testsuite/gcc.c-torture/execute/20111227-2.c: New test.
* testsuite/gcc.c-torture/execute/20111227-3.c: Ditto.
2012-10-26 Jan Hubicka <jh@suse.cz>
* ipa-inline-transform.c (inline_call): Only account size changes
......@@ -803,7 +803,7 @@ add_removable_extension (const_rtx expr, rtx insn,
for (def = defs; def; def = def->next)
if ((idx = def_map[INSN_UID(DF_REF_INSN (def->ref))])
&& (cand = &VEC_index (ext_cand, *insn_list, idx - 1))
&& (cand->code != code || cand->mode != mode))
&& cand->code != code)
{
if (dump_file)
{
......
/* Testcase derived from 20111227-1.c to ensure that REE is combining
redundant zero extends with zero extend to wider mode. */
/* { dg-options "-fdump-rtl-ree -O" } */
extern void abort (void);
unsigned short s;
unsigned int i;
unsigned long l;
unsigned char v = -1;
void __attribute__((noinline,noclone))
bar (int t)
{
if (t == 2 && s != 0xff)
abort ();
if (t == 1 && i != 0xff)
abort ();
if (t == 0 && l != 0xff)
abort ();
}
void __attribute__((noinline,noclone))
foo (unsigned char *a, int t)
{
unsigned char r = v;
if (t == 2)
s = (unsigned short) r;
else if (t == 1)
i = (unsigned int) r;
else if (t == 0)
l = (unsigned long) r;
bar (t);
}
int main(void)
{
foo (&v, 0);
foo (&v, 1);
foo (&v, 2);
return 0;
}
/* { dg-final { scan-rtl-dump "Elimination opportunities = 3 realized = 3" "ree" } } */
/* { dg-final { cleanup-rtl-dump "ree" } } */
/* Testcase derived from 20111227-1.c to ensure that REE is combining
redundant sign extends with sign extend to wider mode. */
/* { dg-options "-fdump-rtl-ree -O" } */
extern void abort (void);
signed short s;
signed int i;
signed long l;
signed char v = -1;
void __attribute__((noinline,noclone))
bar (int t)
{
if (t == 2 && s != -1)
abort ();
if (t == 1 && i != -1)
abort ();
if (t == 0 && l != -1)
abort ();
}
void __attribute__((noinline,noclone))
foo (signed char *a, int t)
{
signed char r = v;
if (t == 2)
s = (signed short) r;
else if (t == 1)
i = (signed int) r;
else if (t == 0)
l = (signed long) r;
bar (t);
}
int main(void)
{
foo (&v, 0);
foo (&v, 1);
foo (&v, 2);
return 0;
}
/* { dg-final { scan-rtl-dump "Elimination opportunities = 3 realized = 3" "ree" } } */
/* { dg-final { cleanup-rtl-dump "ree" } } */
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