summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-15 11:47:44 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-15 11:47:44 +0000
commit1c543545f83ca31df79487ba5698fe89029ee36c (patch)
tree7f625d6c00ba51bc474ba5e8d9355cf7d4f4512b
parent61d3674f00901a2f87afdceabb586b00c6684860 (diff)
downloadgcc-1c543545f83ca31df79487ba5698fe89029ee36c.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222123 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa-icf-gimple.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr65765.C45
4 files changed, 62 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 27ddea52396..f1a96f270b5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 09adce3d3ec..9efdea465c2 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -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");
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a007f32bb9a..1df85887f66 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..ff8dc33a1a4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr65765.C
@@ -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 ();
+}