mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
8256d5ca78
commit
ca3f371f12
|
|
@ -1,3 +1,10 @@
|
|||
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,44 @@
|
|||
/* 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" } } */
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
/* 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" } } */
|
||||
Loading…
Reference in New Issue