OSDN Git Service

PR optimization/6759
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Jun 2002 22:07:45 +0000 (22:07 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Jun 2002 22:07:45 +0000 (22:07 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54469 138bc75d-0d04-0410-961f-82ee72b054a4

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

index f92ef9b..8b6464a 100644 (file)
@@ -1,5 +1,11 @@
 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
        * c-decl.c (grokfield): Allow user defined types if they declare
        structs or unions for unnamed fields.
index 0b91d99..01a79d5 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 1d8229c..d2c3fbd 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);