aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2015-12-17 21:29:30 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2015-12-17 21:29:30 +0000
commitaa3987819a5ab392bcb125efe84008e75f99bbfc (patch)
tree0d91f65213de20171768f41f75671dd6d5107467
parent94c40e19af4ca5fe57c990df7f7abec48f5aa3af (diff)
downloadgcc-aa3987819a5ab392bcb125efe84008e75f99bbfc.zip
gcc-aa3987819a5ab392bcb125efe84008e75f99bbfc.tar.gz
gcc-aa3987819a5ab392bcb125efe84008e75f99bbfc.tar.bz2
ipa-icf.c (sem_item_optimizer::merge): Don't pick 'main' as the source function.
gcc/ * ipa-icf.c (sem_item_optimizer::merge): Don't pick 'main' as the source function. gcc/testsuite/ * gcc.dg/ipa/ipa-icf-merge-1.c: New. From-SVN: r231787
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-icf.c12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipa-icf-merge-1.c27
4 files changed, 45 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 82a836d..a1f71bd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-17 Nathan Sidwell <nathan@acm.org>
+
+ * ipa-icf.c (sem_item_optimizer::merge): Don't pick 'main' as the
+ source function.
+
2015-12-17 Sebastian Pop <s.pop@samsung.com>
* Makefile.in: Replace ISL with isl.
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index 889a07d..4538677 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -3398,14 +3398,20 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count)
if (c->members.length () == 1)
continue;
- gcc_assert (c->members.length ());
-
sem_item *source = c->members[0];
- for (unsigned int j = 1; j < c->members.length (); j++)
+ if (MAIN_NAME_P (DECL_NAME (source->decl)))
+ /* If merge via wrappers, picking main as the target can be
+ problematic. */
+ source = c->members[1];
+
+ for (unsigned int j = 0; j < c->members.length (); j++)
{
sem_item *alias = c->members[j];
+ if (alias == source)
+ continue;
+
if (dump_file)
{
fprintf (dump_file, "Semantic equality hit:%s->%s\n",
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2cbde3b..d5ae299 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-12-17 Nathan Sidwell <nathan@acm.org>
+
+ * gcc.dg/ipa/ipa-icf-merge-1.c: New.
+
2015-12-17 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/diagnostic-range-bad-return.c: New test case.
diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-icf-merge-1.c b/gcc/testsuite/gcc.dg/ipa/ipa-icf-merge-1.c
new file mode 100644
index 0000000..06958a4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/ipa-icf-merge-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O2 -fdump-ipa-icf" } */
+
+/* Picking 'main' as a candiate target for equivalent functios is not a
+ good idea. */
+
+int baz (int);
+
+int foo ()
+{
+ return baz (baz (0));
+}
+
+
+int main ()
+{
+ return baz (baz (0));
+}
+
+/* Notice the two functions are the same. */
+/* { dg-final { scan-ipa-dump "Semantic equality hit:foo->main" "icf" } } */
+
+/* Make sure we don't tail call main. */
+/* { dg-final { scan-ipa-dump-not "= main \\(\\);" "icf" } } */
+
+/* Make sure we tail call foo. */
+/* { dg-final { scan-ipa-dump "= foo \\(\\);" "icf" } } */