(expand_inline_function): Don't fall down trying to
authorJason Merrill <merrill@gnu.org>
Sun, 31 Jul 1994 21:31:00 +0000 (21:31 +0000)
committerJason Merrill <merrill@gnu.org>
Sun, 31 Jul 1994 21:31:00 +0000 (21:31 +0000)
        pass things by invisible reference.

From-SVN: r7842

gcc/integrate.c

index 63b150d0e23764d56e9b5126ccfc49e2e7467229..26d766314a99d06bbe0d1555af693e7a4cb5fd75 100644 (file)
@@ -1235,6 +1235,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
       tree arg = convert (TREE_TYPE (formal), TREE_VALUE (actual));
       /* Mode of the variable used within the function.  */
       enum machine_mode mode = TYPE_MODE (TREE_TYPE (formal));
+      int invisiref = 0;
 
       /* Make sure this formal has some correspondence in the users code
        * before emitting any line notes for it.  */
@@ -1263,6 +1264,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
          store_expr (arg, stack_slot, 0);
 
          arg_vals[i] = XEXP (stack_slot, 0);
+         invisiref = 1;
        }
       else if (GET_CODE (loc) != MEM)
        {
@@ -1288,8 +1290,11 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
                 be two different pseudos, and `safe_from_p' will make all
                 sorts of smart assumptions about their not conflicting.
                 But if ARG_VALS[I] overlaps TARGET, these assumptions are
-                wrong, so put ARG_VALS[I] into a fresh register.  */
+                wrong, so put ARG_VALS[I] into a fresh register.
+                Don't worry about invisible references, since their stack
+                temps will never overlap the target.  */
              || (target != 0
+                 && ! invisiref
                  && (GET_CODE (arg_vals[i]) == REG
                      || GET_CODE (arg_vals[i]) == SUBREG
                      || GET_CODE (arg_vals[i]) == MEM)