PR rtl-optimization/20249
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Mar 2005 09:23:47 +0000 (09:23 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Mar 2005 09:23:47 +0000 (09:23 +0000)
* cse.c (insert_regs): Do not record equivalence of registers in
different modes.

* gcc.dg/20050325-1.c: New test.

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

gcc/ChangeLog
gcc/cse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20050325-1.c [new file with mode: 0644]

index 8fc5365..3f3252f 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-25  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR rtl-optimization/20249
+       * cse.c (insert_regs): Do not record equivalence of registers in
+       different modes.
+
 2005-03-24  Kazu Hirata  <kazu@cs.umass.edu>
 
        * emit-rtl.c (reverse_comparison): Remove.
index fd5e21a..4d6f76d 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -1234,7 +1234,24 @@ insert_regs (rtx x, struct table_elt *classp, int modified)
              if (REG_P (classp->exp)
                  && GET_MODE (classp->exp) == GET_MODE (x))
                {
-                 make_regs_eqv (regno, REGNO (classp->exp));
+                 unsigned c_regno = REGNO (classp->exp);
+
+                 gcc_assert (REGNO_QTY_VALID_P (c_regno));
+
+                 /* Suppose that 5 is hard reg and 100 and 101 are
+                    pseudos.  Consider
+
+                    (set (reg:si 100) (reg:si 5))
+                    (set (reg:si 5) (reg:si 100))
+                    (set (reg:di 101) (reg:di 5))
+
+                    We would now set REG_QTY (101) = REG_QTY (5), but the
+                    entry for 5 is in SImode.  When we use this later in
+                    copy propagation, we get the register in wrong mode.  */
+                 if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
+                   continue;
+
+                 make_regs_eqv (regno, c_regno);
                  return 1;
                }
 
index 65f355a..ce9e623 100644 (file)
@@ -1,3 +1,8 @@
+2005-03-25  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR rtl-optimization/20249
+       * gcc.dg/20050325-1.c: New test.
+
 2005-03-25  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR libfortran/15332
diff --git a/gcc/testsuite/gcc.dg/20050325-1.c b/gcc/testsuite/gcc.dg/20050325-1.c
new file mode 100644 (file)
index 0000000..524f9d1
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR 20249 */
+
+/* { dg-do compile } */
+/* dg-options "-O2 -fprofile-arcs" } */
+
+extern int *g (int x, void* y);
+extern void fg (long long x, int y);
+
+static void
+ff (int y, long long z)
+{
+  fg (z, 1);
+}
+
+void
+f ()
+{
+  g (42, ff);
+}