OSDN Git Service

* struct-equiv.c (note_local_live): Handle hard regs with different
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Dec 2005 16:36:29 +0000 (16:36 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Dec 2005 16:36:29 +0000 (16:36 +0000)
hard_regno_nregs.

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

gcc/ChangeLog
gcc/struct-equiv.c

index 1051c70..62be162 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-14  J"orn Rennecke <joern.rennecke@st.com>
+
+       * struct-equiv.c (note_local_live): Handle hard regs with different
+       hard_regno_nregs.
+
 2005-12-14  Jeff Law  <law@redhat.com>
 
        * tree-ssa-ccp.c (fold_stmt_r): DATA argument is now a pointer
index fc563b6..0bee722 100644 (file)
@@ -309,10 +309,17 @@ struct_equiv_restore_checkpoint (struct struct_equiv_checkpoint *p,
 static int
 note_local_live (struct equiv_info *info, rtx x, rtx y, int rvalue)
 {
+  unsigned x_regno = REGNO (x);
+  unsigned y_regno = REGNO (y);
+  int x_nominal_nregs = (x_regno >= FIRST_PSEUDO_REGISTER
+                        ? 1 : hard_regno_nregs[x_regno][GET_MODE (x)]);
+  int y_nominal_nregs = (y_regno >= FIRST_PSEUDO_REGISTER
+                        ? 1 : hard_regno_nregs[y_regno][GET_MODE (y)]);
   int x_change = assign_reg_reg_set (info->x_local_live, x, rvalue);
   int y_change = assign_reg_reg_set (info->y_local_live, y, rvalue);
 
-  gcc_assert (x_change == y_change);
+  gcc_assert (x_nominal_nregs && y_nominal_nregs);
+  gcc_assert (x_change * y_nominal_nregs == y_change * x_nominal_nregs);
   if (y_change)
     {
       if (reload_completed)