]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Avoid conservative behavior in REE by allowing removal of redundant extends when...
authorTeresa Johnson <tejohnson@google.com>
Fri, 26 Oct 2012 17:19:35 +0000 (17:19 +0000)
committerTeresa Johnson <tejohnson@gcc.gnu.org>
Fri, 26 Oct 2012 17:19:35 +0000 (17:19 +0000)
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

gcc/ChangeLog
gcc/ree.c
gcc/testsuite/gcc.c-torture/execute/20111227-2.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/20111227-3.c [new file with mode: 0644]

index 768f530609c06bee7da832a49b466ace4ec16617..db8c3520563c71246ab63ac0a230917a03222ad7 100644 (file)
@@ -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
index 167efa3fe1dd242570c96f2b3c2f98278908217f..a2ede97b72e36a777fcf944a4724892a2d490e80 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -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)
              {
diff --git a/gcc/testsuite/gcc.c-torture/execute/20111227-2.c b/gcc/testsuite/gcc.c-torture/execute/20111227-2.c
new file mode 100644 (file)
index 0000000..692c947
--- /dev/null
@@ -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" } }  */
diff --git a/gcc/testsuite/gcc.c-torture/execute/20111227-3.c b/gcc/testsuite/gcc.c-torture/execute/20111227-3.c
new file mode 100644 (file)
index 0000000..d6726c4
--- /dev/null
@@ -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" } }  */