re PR rtl-optimization/6759 (ice when compiling 32 bit sparc code)
authorJakub Jelinek <jakub@redhat.com>
Mon, 10 Jun 2002 22:07:45 +0000 (00:07 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 10 Jun 2002 22:07:45 +0000 (00:07 +0200)
PR optimization/6759
* cse.c (cse_insn): Fold src_eqv just once, store it folded back into
the REQ_EQUAL note.

* g++.dg/opt/cse1.C: New test.

From-SVN: r54469

gcc/ChangeLog
gcc/cse.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/cse1.C [new file with mode: 0644]

index f92ef9b762c598c328c22475fcc2d344671b1479..8b6464a33200733c2f3aedb00fa57ed68b37ddc6 100644 (file)
@@ -1,3 +1,9 @@
+2002-06-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR optimization/6759
+       * cse.c (cse_insn): Fold src_eqv just once, store it folded back into
+       the REQ_EQUAL note.
+
 2002-06-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/6660
index 0b91d99d44894406c2d46654ff0f17db642481fa..01a79d5c978bb50d9a62a7aefd1f9a7d543ab048 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -4915,7 +4915,10 @@ cse_insn (insn, libcall_insn)
       && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0
       && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
          || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
-    src_eqv = canon_reg (XEXP (tem, 0), NULL_RTX);
+    {
+      src_eqv = fold_rtx (canon_reg (XEXP (tem, 0), NULL_RTX), insn);
+      XEXP (tem, 0) = src_eqv;
+    }
 
   /* Canonicalize sources and addresses of destinations.
      We do this in a separate pass to avoid problems when a MATCH_DUP is
@@ -5019,7 +5022,6 @@ cse_insn (insn, libcall_insn)
            eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
          do_not_record = 0;
          hash_arg_in_memory = 0;
-         src_eqv = fold_rtx (src_eqv, insn);
          src_eqv_hash = HASH (src_eqv, eqvmode);
 
          /* Find the equivalence class for the equivalent expression.  */
index 1d8229c615e178e5a9a31913c09b405f3e7a8ec1..d2c3fbd9f54efcf4ab304cff16d4da306fe10eb2 100644 (file)
@@ -10,6 +10,8 @@
 
        * gcc.dg/20020527-1.c: New test.
 
+       * g++.dg/opt/cse1.C: New test.
+
 2002-06-07  Roger Sayle  <roger@eyesopen.com>
 
        * gcc.dg/20020607-2.c: New test case.
diff --git a/gcc/testsuite/g++.dg/opt/cse1.C b/gcc/testsuite/g++.dg/opt/cse1.C
new file mode 100644 (file)
index 0000000..be1ad5a
--- /dev/null
@@ -0,0 +1,12 @@
+// PR optimization/6759
+// This testcase ICEd on SPARC because folded REG_EQUAL
+// note was note stored back and fold_rtx left invalid rtx
+// in it.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+  long long a;
+  A (unsigned short d) : a (d) {}
+} x (65535);