re PR ipa/63569 (Wrong code with volatile and ICF)
authorMartin Liska <mliska@suse.cz>
Fri, 19 Dec 2014 12:40:50 +0000 (13:40 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 19 Dec 2014 12:40:50 +0000 (12:40 +0000)
Fix for PR ipa/63569.

PR ipa/63569
* gcc.dg/ipa/pr63569.c: New test.
PR ipa/63569
* ipa-icf-gimple.c (func_checker::compare_operand): Add missing
comparison for volatile flag.

From-SVN: r218949

gcc/ChangeLog
gcc/ipa-icf-gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr63569.c [new file with mode: 0644]

index d27e22e73659a885e04d3276baf7887cfb8e69ab..19b33e719cc4f041616e248380151eefb5de2cf5 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-19  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/63569
+       * ipa-icf-gimple.c (func_checker::compare_operand): Add missing
+       comparison for volatile flag.
+
 2014-12-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * doc/invoke.texi (ARM options): Remove mention of Advanced RISC
index ec0290a4013eace9b588a005154672a3330a31db..fa2c3534d8dc214ea425cfffdef21b297baea386 100644 (file)
@@ -230,6 +230,9 @@ func_checker::compare_operand (tree t1, tree t2)
   tree tt1 = TREE_TYPE (t1);
   tree tt2 = TREE_TYPE (t2);
 
+  if (TREE_THIS_VOLATILE (t1) != TREE_THIS_VOLATILE (t2))
+    return return_false_with_msg ("different operand volatility");
+
   if (!func_checker::compatible_types_p (tt1, tt2))
     return false;
 
index 35012180d2498d59930dff64f1fc0feb767fb0d0..5ba1eff2f2bc5ff802095d106d75ee94aa711d7b 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-19  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/63569
+       * gcc.dg/ipa/pr63569.c: New test.
+
 2014-12-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR preprocessor/63831
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63569.c b/gcc/testsuite/gcc.dg/ipa/pr63569.c
new file mode 100644 (file)
index 0000000..8bd5c1f
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-icf-details"  } */
+
+static int f(int t, int *a) __attribute__((noinline));
+
+static int g(int t, volatile int *a) __attribute__((noinline));
+static int g(int t, volatile int *a)
+{
+  int i;
+  int tt = 0;
+  for(i=0;i<t;i++)
+    tt += *a;
+  return tt;
+}
+static int f(int t, int *a)
+{
+  int i;
+  int tt = 0;
+  for(i=0;i<t;i++)
+    tt += *a;
+  return tt;
+}
+
+
+int h(int t, int *a)
+{
+  return f(t, a) + g(t, a);
+}
+
+/* { dg-final { scan-ipa-dump "different operand volatility" "icf"  } } */
+/* { dg-final { scan-ipa-dump "Equal symbols: 0" "icf"  } } */
+/* { dg-final { cleanup-ipa-dump "icf" } } */