> On Jun 6, 2018, at 11:53 AM, Eric Botcazou <ebotca...@adacore.com> wrote:
> 
>> That simplifies the patch, which now looks like this.  Ok for trunk?
>> 
>>      paul
>> 
>> gcc/ChangeLog:
>> 
>> 2018-06-05  Paul Koning  <n...@arrl.net>
>> 
>>      * compare-elim.c (try_merge_compare): Don't merge compare if
>>      address contains a side effect.
>>      * gcc.c-torture/compile/20180605-1.c: New test case.
> 
> The patch is OK, but its ChangeLog is not. :-)  It does not modify one 
> function but two (try_merge_compare and try_eliminate_compare).  I would 
> suggest using "diff -up" to generate patches with more context.

Yes, sorry.  I normally use the subversion internal diff which doesn't do this.

Here is a corrected version.  Ok with this change?

        paul

gcc/ChangeLog:

2018-06-06  Paul Koning  <n...@arrl.net>

        * compare-elim.c (try_merge_compare): Don't merge compare if
        address contains a side effect.
        (try_eliminate_compare): Likewise.
        * gcc.c-torture/compile/20180605-1.c: New test case.

Index: compare-elim.c
===================================================================
--- compare-elim.c      (revision 261207)
+++ compare-elim.c      (working copy)
@@ -690,6 +690,13 @@ try_merge_compare (struct comparison *cm
     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
   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: testsuite/gcc.c-torture/compile/20180605-1.c
===================================================================
--- testsuite/gcc.c-torture/compile/20180605-1.c        (nonexistent)
+++ testsuite/gcc.c-torture/compile/20180605-1.c        (working copy)
@@ -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;
+}

Reply via email to