]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/70484 (Wrong optimization with aliasing and access via char)
authorRichard Biener <rguenther@suse.de>
Mon, 4 Apr 2016 09:30:16 +0000 (09:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 4 Apr 2016 09:30:16 +0000 (09:30 +0000)
2016-04-04  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/70484
* rtl.h (canon_output_dependence): Declare.
* alias.c (canon_output_dependence): New function.
* dse.c (record_store): Use canon_output_dependence rather
than canon_true_dependence.

* gcc.dg/torture/pr70484.c: New testcase.

From-SVN: r234709

gcc/ChangeLog
gcc/alias.c
gcc/dse.c
gcc/rtl.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr70484.c [new file with mode: 0644]

index 61515258626485a098f08320dee14926fcf744bd..83f3454a0eec1c5d5203378ca33da56aae82c125 100644 (file)
@@ -1,3 +1,11 @@
+2016-04-04  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/70484
+       * rtl.h (canon_output_dependence): Declare.
+       * alias.c (canon_output_dependence): New function.
+       * dse.c (record_store): Use canon_output_dependence rather
+       than canon_true_dependence.
+
 2016-03-30  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/68881
index 753e1aff0b1628ffc151c355a14f22ccbee9fd17..a0e25dcce06c4f64fa69ff030a42e319b5270890 100644 (file)
@@ -3057,6 +3057,20 @@ output_dependence (const_rtx mem, const_rtx x)
                             /*mem_canonicalized=*/false,
                             /*x_canonicalized*/false, /*writep=*/true);
 }
+
+/* Likewise, but we already have a canonicalized MEM, and X_ADDR for X.
+   Also, consider X in X_MODE (which might be from an enclosing
+   STRICT_LOW_PART / ZERO_EXTRACT).
+   If MEM_CANONICALIZED is true, MEM is canonicalized.  */
+
+int
+canon_output_dependence (const_rtx mem, bool mem_canonicalized,
+                        const_rtx x, machine_mode x_mode, rtx x_addr)
+{
+  return write_dependence_p (mem, x, x_mode, x_addr,
+                            mem_canonicalized, /*x_canonicalized=*/true,
+                            /*writep=*/true);
+}
 \f
 
 
index eef564454aaf330c2628bb9a1ae1435015d43a46..b8da9268d34dfd05bc4f4927394ad90167124c26 100644 (file)
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -1609,10 +1609,9 @@ record_store (rtx body, bb_info_t bb_info)
           the value of store_info.  If it is, set the rhs to NULL to
           keep it from being used to remove a load.  */
        {
-         if (canon_true_dependence (s_info->mem,
-                                    GET_MODE (s_info->mem),
-                                    s_info->mem_addr,
-                                    mem, mem_addr))
+         if (canon_output_dependence (s_info->mem, true,
+                                      mem, GET_MODE (mem),
+                                      mem_addr))
            {
              s_info->rhs = NULL;
              s_info->const_rhs = NULL;
index 7f0bfa443a02e2ec3c7848162fac9bcbb6bc1163..79916ad844a2e9b3a0563d14f7447ceec62b7c51 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3652,6 +3652,8 @@ extern int anti_dependence (const_rtx, const_rtx);
 extern int canon_anti_dependence (const_rtx, bool,
                                  const_rtx, machine_mode, rtx);
 extern int output_dependence (const_rtx, const_rtx);
+extern int canon_output_dependence (const_rtx, bool,
+                                   const_rtx, machine_mode, rtx);
 extern int may_alias_p (const_rtx, const_rtx);
 extern void init_alias_target (void);
 extern void init_alias_analysis (void);
index a8bd7110827845abe8de06121e1ed67bf559b501..43bad0faaa21337d82cd75e044e6f8fdfcad8eec 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-04  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/70484
+       * gcc.dg/torture/pr70484.c: New testcase.
+
 2016-04-04  Marek Polacek  <polacek@redhat.com>
 
        PR c/70307
diff --git a/gcc/testsuite/gcc.dg/torture/pr70484.c b/gcc/testsuite/gcc.dg/torture/pr70484.c
new file mode 100644 (file)
index 0000000..7604c65
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+int __attribute__((noinline,noclone))
+f(int *pi, long *pl)
+{
+  *pi = 1;
+  *pl = 0;
+  return *(char *)pi;
+}
+
+int main()
+{
+  union { long l; int i; } a;
+  if (f (&a.i, &a.l) != 0)
+    abort ();
+  return 0;
+}