compare-elim.c (try_merge_compare): Don't merge compare if address contains a side...
authorPaul Koning <ni1d@arrl.net>
Thu, 7 Jun 2018 17:55:05 +0000 (13:55 -0400)
committerPaul Koning <pkoning@gcc.gnu.org>
Thu, 7 Jun 2018 17:55:05 +0000 (13:55 -0400)
2018-06-07  Paul Koning  <ni1d@arrl.net>

gcc/

* compare-elim.c (try_merge_compare): Don't merge compare if
address contains a side effect.
(try_eliminate_compare): Likewise.

gcc/testsuite/

* gcc.c-torture/compile/20180605-1.c: New test.

From-SVN: r261287

gcc/ChangeLog
gcc/compare-elim.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20180605-1.c [new file with mode: 0644]

index 81eec65e43dd0df2fc5c5096e876aa0eddfdd688..ee56a211d5906e97fb48feaef5ad33bfc9ed12ee 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-07  Paul Koning  <ni1d@arrl.net>
+
+       * compare-elim.c (try_merge_compare): Don't merge compare if
+       address contains a side effect.
+       (try_eliminate_compare): Likewise.
+
 2018-06-07  Olga Makhotina  <olga.makhotina@intel.com>
 
        * config.gcc: Support "tremont".
index 16576c4447344080be6e63f0db57b3c8c4bc3258..50bbaa84b6dfbbf30e1ba654592e2139f5a249cf 100644 (file)
@@ -690,6 +690,13 @@ try_merge_compare (struct comparison *cmp)
     return false;
 
   rtx src = SET_SRC (set);
+
+  /* If the source uses addressing modes with side effects, we can't
+     do the merge because we'd end up with a PARALLEL that has two
+     instances of that side effect in it.  */
+  if (side_effects_p (src))
+    return false;
+
   rtx flags = maybe_select_cc_mode (cmp, src, CONST0_RTX (GET_MODE (src)));
   if (!flags)
     {
@@ -809,6 +816,12 @@ try_eliminate_compare (struct comparison *cmp)
   else
     return false;
 
+  /* If the source uses addressing modes with side effects, we can't
+     do the merge because we'd end up with a PARALLEL that has two
+     instances of that side effect in it.  */
+  if (side_effects_p (cmp_src))
+    return false;
+
   /* Determine if we ought to use a different CC_MODE here.  */
   flags = maybe_select_cc_mode (cmp, cmp_src, in_b);
   if (flags == NULL)
index f26dd5b2f580cd93d7f9cacafac8c495df5800d1..272cb03f80c7fe93378c8aa0ef41c531fc92624c 100644 (file)
@@ -1,3 +1,7 @@
+2018-06-07  Paul Koning  <ni1d@arrl.net>
+
+       * gcc.c-torture/compile/20180605-1.c: New test.
+
 2018-06-07  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/86045
diff --git a/gcc/testsuite/gcc.c-torture/compile/20180605-1.c b/gcc/testsuite/gcc.c-torture/compile/20180605-1.c
new file mode 100644 (file)
index 0000000..915dafd
--- /dev/null
@@ -0,0 +1,9 @@
+void f (int *p, int n)
+{
+    int j = 0, k;
+    
+    for (int i = 0; i < n; i++)
+        if ((k = *p++) > 0)
+            j += k;
+    return j;
+}