diff options
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/rtlanal.c | 27 |
2 files changed, 21 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0e69d5..84e96eb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-05-05 Richard Henderson <rth@cygnus.com> + + * rtlanal.c (reg_overlap_mentioned_p): Treat parallels in the + same way emit_group_load does. + 2000-05-05 Mark Elbrecht <snowball3@bigfoot.com> * toplev.c (output_file_directive): Use IS_DIR_SEPARATOR. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 2f9b376..8a3eb62 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -992,17 +992,22 @@ reg_overlap_mentioned_p (x, in) return reg_mentioned_p (x, in); case PARALLEL: - if (GET_MODE (x) == BLKmode) - { - register int i; - - /* If any register in here refers to it we return true. */ - for (i = XVECLEN (x, 0) - 1; i >= 0; i--) - if (reg_overlap_mentioned_p (SET_DEST (XVECEXP (x, 0, i)), in)) - return 1; - return 0; - } - break; + { + int i, n; + + /* Check for a NULL entry, used to indicate that the parameter goes + both on the stack and in registers. */ + if (XEXP (XVECEXP (x, 0, 0), 0)) + i = 0; + else + i = 1; + + /* If any register in here refers to it we return true. */ + for (n = XVECLEN (x, 0); i < n; ++i) + if (reg_overlap_mentioned_p (XEXP (XVECEXP (x, 0, i), 0), in)) + return 1; + return 0; + } default: break; |
