OSDN Git Service

2005-03-16 Dale Johannesen <dalej@apple.com>
authordalej <dalej@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Mar 2005 20:42:37 +0000 (20:42 +0000)
committerdalej <dalej@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Mar 2005 20:42:37 +0000 (20:42 +0000)
        * rtlanal.c (find_first_parameter_load):  Rewrite to
        return actual first param load or the call if none,
        instead of first in block, when not all loads exist.

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

gcc/ChangeLog
gcc/rtlanal.c

index 3978c1a..3af68fc 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-16 Dale Johannesen  <dalej@apple.com>
+
+       * rtlanal.c (find_first_parameter_load):  Rewrite to
+       return actual first param load or the call if none,
+       instead of first in block, when not all loads exist.
+
 2005-03-16  Roger Sayle  <roger@eyesopen.com>
 
        * optabs.c (expand_copysign_absneg): Make static.
index 79121d4..0686af8 100644 (file)
@@ -3159,12 +3159,15 @@ parms_set (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
 }
 
 /* Look backward for first parameter to be loaded.
+   Note that loads of all parameters will not necessarily be
+   found if CSE has eliminated some of them (e.g., an argument
+   to the outer function is passed down as a parameter).
    Do not skip BOUNDARY.  */
 rtx
 find_first_parameter_load (rtx call_insn, rtx boundary)
 {
   struct parms_set_data parm;
-  rtx p, before;
+  rtx p, before, first_set;
 
   /* Since different machines initialize their parameter registers
      in different orders, assume nothing.  Collect the set of all
@@ -3186,6 +3189,7 @@ find_first_parameter_load (rtx call_insn, rtx boundary)
        parm.nregs++;
       }
   before = call_insn;
+  first_set = call_insn;
 
   /* Search backward for the first set of a register in this set.  */
   while (parm.nregs && before != boundary)
@@ -3208,9 +3212,20 @@ find_first_parameter_load (rtx call_insn, rtx boundary)
        }
 
       if (INSN_P (before))
-       note_stores (PATTERN (before), parms_set, &parm);
+       {
+         int nregs_old = parm.nregs;
+         note_stores (PATTERN (before), parms_set, &parm);
+         /* If we found something that did not set a parameter reg,
+            we're done.  Do not keep going, as that might result
+            in hoisting an insn before the setting of a pseudo
+            that is used by the hoisted insn. */
+         if (nregs_old != parm.nregs)
+           first_set = before;
+         else
+           break;
+       }
     }
-  return before;
+  return first_set;
 }
 
 /* Return true if we should avoid inserting code between INSN and preceding