re PR ipa/65765 (Compiling Firefox with GCC 5 leads to broken javascript engine on...
authorJakub Jelinek <jakub@redhat.com>
Wed, 15 Apr 2015 11:47:44 +0000 (13:47 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 15 Apr 2015 11:47:44 +0000 (13:47 +0200)
PR ipa/65765
* ipa-icf-gimple.c (func_checker::compare_bb): For GIMPLE_NOP
and GIMPLE_PREDICT use break instead of return true. For
GIMPLE_EH_DISPATCH, compare dispatch region.

* g++.dg/ipa/pr65765.C: New test.

From-SVN: r222123

gcc/ChangeLog
gcc/ipa-icf-gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr65765.C [new file with mode: 0644]

index 27ddea523969bfd94845099d7519ec4ba5babf09..f1a96f270b5d1354212881a3aef9b0f3838fd6db 100644 (file)
@@ -1,3 +1,10 @@
+2015-04-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR ipa/65765
+       * ipa-icf-gimple.c (func_checker::compare_bb): For GIMPLE_NOP
+       and GIMPLE_PREDICT use break instead of return true. For
+       GIMPLE_EH_DISPATCH, compare dispatch region.
+
 2015-04-14  Matthew Wahab  <matthew.wahab@arm.com>
 
        * doc/extend.texi (__sync Builtins): Simplify some text.  Update
index 09adce3d3ec02f62608672feee0498740e253a5a..9efdea465c292778a8249348c55a534f91590c9f 100644 (file)
@@ -706,7 +706,11 @@ func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2)
            return return_different_stmts (s1, s2, "GIMPLE_SWITCH");
          break;
        case GIMPLE_DEBUG:
+         break;
        case GIMPLE_EH_DISPATCH:
+         if (gimple_eh_dispatch_region (as_a <geh_dispatch *> (s1))
+             != gimple_eh_dispatch_region (as_a <geh_dispatch *> (s2)))
+           return return_different_stmts (s1, s2, "GIMPLE_EH_DISPATCH");
          break;
        case GIMPLE_RESX:
          if (!compare_gimple_resx (as_a <gresx *> (s1),
@@ -734,7 +738,7 @@ func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2)
          break;
        case GIMPLE_PREDICT:
        case GIMPLE_NOP:
-         return true;
+         break;
        default:
          return return_false_with_msg ("Unknown GIMPLE code reached");
        }
index a007f32bb9a3d00793ef295e25f89415a1e5c06f..1df85887f666f07ed1035799096025aa607db392 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR ipa/65765
+       * g++.dg/ipa/pr65765.C: New test.
+
 2015-04-15  Nick Clifton  <nickc@redhat.com>
 
        * gcc.target/rx/builtins.c: Disable RMPA test if string
diff --git a/gcc/testsuite/g++.dg/ipa/pr65765.C b/gcc/testsuite/g++.dg/ipa/pr65765.C
new file mode 100644 (file)
index 0000000..ff8dc33
--- /dev/null
@@ -0,0 +1,45 @@
+// PR ipa/65765
+// { dg-do run }
+// { dg-options "-O2" }
+
+int a, b, c, d, e;
+unsigned char h[] = { 1, 1 };
+
+__attribute__ ((cold)) int ModRM_Mode () { return a; }
+
+int
+ModRM_RM (int p1)
+{
+  return p1;
+}
+
+__attribute__ ((cold)) static bool ModRM_hasSIB (unsigned char p1)
+{
+  return ModRM_Mode () != 1 && ModRM_RM (p1);
+}
+
+__attribute__ ((cold)) static bool ModRM_hasRIP (unsigned char p1)
+{
+  return ModRM_Mode () && ModRM_RM (p1);
+}
+
+unsigned char *
+DisassembleHeapAccess (unsigned char *p1)
+{
+  b = *p1++;
+  if (ModRM_hasSIB (b))
+    c = *p1++;
+  int f = c, g = 0;
+  d = ModRM_hasRIP (g);
+  e = f == 0;
+  if (e)
+    p1 += sizeof 0;
+  return p1;
+}
+
+int
+main ()
+{
+  if (DisassembleHeapAccess (h) != h + 2)
+    __builtin_abort ();
+}