(initialize_for_inline): Handle CONCAT when setting up parmdecl_map.
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 11 Dec 1993 13:33:22 +0000 (08:33 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 11 Dec 1993 13:33:22 +0000 (08:33 -0500)
(expand_inline_function): Make test for overlap of TARGET and args_vals[i]
more conservative.

From-SVN: r6207

gcc/integrate.c

index be439b9e9dcfe4079662f5e155d361b670be6601..fcba544145c0fd8bdab91d3cf9c3e1ae3f27ef12 100644 (file)
@@ -276,6 +276,17 @@ initialize_for_inline (fndecl, min_labelno, max_labelno, max_reg, copy)
 
       if (GET_CODE (p) == REG)
        parmdecl_map[REGNO (p)] = parms;
+      else if (GET_CODE (p) == CONCAT)
+       {
+         rtx preal = gen_realpart (GET_MODE (XEXP (p, 0)), p);
+         rtx pimag = gen_imagpart (GET_MODE (preal), p);
+
+         if (GET_CODE (preal) == REG)
+           parmdecl_map[REGNO (preal)] = parms;
+         if (GET_CODE (pimag) == REG)
+           parmdecl_map[REGNO (pimag)] = parms;
+       }
+
       /* This flag is cleared later
         if the function ever modifies the value of the parm.  */
       TREE_READONLY (parms) = 1;
@@ -1273,9 +1284,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
                 But if ARG_VALS[I] overlaps TARGET, these assumptions are
                 wrong, so put ARG_VALS[I] into a fresh register.  */
              || (target != 0
-                 && (GET_CODE (arg_vals[i]) == REG
-                     || GET_CODE (arg_vals[i]) == SUBREG
-                     || GET_CODE (arg_vals[i]) == MEM)
+                 && ! CONSTANT_P (arg_vals[i])
                  && reg_overlap_mentioned_p (arg_vals[i], target))
              /* ??? We must always copy a SUBREG into a REG, because it might
                 get substituted into an address, and not all ports correctly