[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] postreload: Fix up postreload combine [PR93402]

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 10:25:17 GMT 2020


https://gcc.gnu.org/g:32667e04c7153d97d09d81c1af073d400f0c719a

commit 32667e04c7153d97d09d81c1af073d400f0c719a
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Jan 23 20:08:22 2020 +0100

    postreload: Fix up postreload combine [PR93402]
    
    The following testcase is miscompiled, because the postreload pass changes:
    -(insn 14 13 23 2 (parallel [
    -            (set (reg:DI 1 dx [94])
    -                (plus:DI (reg:DI 1 dx [95])
    -                    (reg:DI 5 di [92])))
    -            (clobber (reg:CC 17 flags))
    -        ]) "pr93402.c":8:30 186 {*adddi_1}
    -     (expr_list:REG_EQUAL (plus:DI (reg:DI 5 di [92])
    -            (const_int 111111111111 [0x19debd01c7]))
    -        (nil)))
    -(insn 23 14 25 2 (set (reg:SI 0 ax)
    +(insn 23 13 25 2 (set (reg:SI 0 ax)
             (const_int 0 [0])) "pr93402.c":10:1 67 {*movsi_internal}
          (nil))
     (insn 25 23 26 2 (use (reg:SI 0 ax)) "pr93402.c":10:1 -1
          (nil))
    -(insn 26 25 35 2 (use (reg:DI 1 dx)) "pr93402.c":10:1 -1
    +(insn 26 25 35 2 (use (plus:DI (reg:DI 1 dx [95])
    +            (reg:DI 5 di [92]))) "pr93402.c":10:1 -1
          (nil))
    A USE insn is not a normal insn and verify_changes called from
    apply_change_group is happy about any changes into it.
    The following patch avoids this optimization if we were to change
    the USE operand (this routine only changes a reg into (plus reg reg2)).
    
    2020-01-23  Jakub Jelinek  <jakub@redhat.com>
    
            PR rtl-optimization/93402
            * postreload.c (reload_combine_recognize_pattern): Don't try to adjust
            USE insns.
    
            * gcc.c-torture/execute/pr93402.c: New test.

Diff:
---
 gcc/ChangeLog                                 |  6 ++++++
 gcc/postreload.c                              |  4 ++++
 gcc/testsuite/ChangeLog                       |  5 +++++
 gcc/testsuite/gcc.c-torture/execute/pr93402.c | 21 +++++++++++++++++++++
 4 files changed, 36 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 840668d9657..f2f77b7cdbc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-01-23  Jakub Jelinek  <jakub@redhat.com>
+
+	PR rtl-optimization/93402
+	* postreload.c (reload_combine_recognize_pattern): Don't try to adjust
+	USE insns.
+
 2020-01-23  Dragan Mladjenovic  <dmladjenovic@wavecomp.com>
 
 	* config.in: Regenerated.
diff --git a/gcc/postreload.c b/gcc/postreload.c
index b0683269086..7cd5c7fc55f 100644
--- a/gcc/postreload.c
+++ b/gcc/postreload.c
@@ -1078,6 +1078,10 @@ reload_combine_recognize_pattern (rtx_insn *insn)
       struct reg_use *use = reg_state[regno].reg_use + i;
       if (GET_MODE (*use->usep) != mode)
 	return false;
+      /* Don't try to adjust (use (REGX)).  */
+      if (GET_CODE (PATTERN (use->insn)) == USE
+	  && &XEXP (PATTERN (use->insn), 0) == use->usep)
+	return false;
     }
 
   /* Look for (set (REGX) (CONST_INT))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 93fb3be2bb0..05b239ff4be 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-23  Jakub Jelinek  <jakub@redhat.com>
+
+	PR rtl-optimization/93402
+	* gcc.c-torture/execute/pr93402.c: New test.
+
 2020-01-23  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/92804
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr93402.c b/gcc/testsuite/gcc.c-torture/execute/pr93402.c
new file mode 100644
index 00000000000..6487797d0aa
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr93402.c
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/93402 */
+
+struct S { unsigned int a; unsigned long long b; };
+
+__attribute__((noipa)) struct S
+foo (unsigned long long x)
+{
+  struct S ret;
+  ret.a = 0;
+  ret.b = x * 11111111111ULL + 111111111111ULL;
+  return ret;
+}
+
+int
+main ()
+{
+  struct S a = foo (1);
+  if (a.a != 0 || a.b != 122222222222ULL)
+    __builtin_abort ();
+  return 0;
+}


More information about the Gcc-cvs mailing list