diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2001-01-18 13:14:34 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2001-01-18 08:14:34 -0500 |
commit | 90d036a050b8443c93a32fc31480e7afefad088f (patch) | |
tree | a7cc3b76930fd2143f70721950dcf585e13f0528 /gcc/flow.c | |
parent | 8eeb855e2b6b8cc1aea7df5dcd0e0856897668a2 (diff) | |
download | gcc-90d036a050b8443c93a32fc31480e7afefad088f.zip gcc-90d036a050b8443c93a32fc31480e7afefad088f.tar.gz gcc-90d036a050b8443c93a32fc31480e7afefad088f.tar.bz2 |
flow.c (mark_set_1, [...]): Now case; rework to allow entry to be EXPR_LIST.
* flow.c (mark_set_1, case PARALLEL): Now case; rework to allow
entry to be EXPR_LIST.
* rtlanal.c (reg_overlap_mentioned_p): Allow PARALLEL in SET to
be an EXPR_LIST (but not null, which other code doesn't allow).
(note_stores): Properly handle PARALLEL in SET.
Recursively call for top-level PARALLEL.
* sched-deps.c (sched_analyze_1): Handle EXPR_LIST in PARALLEL in SET.
* sched-rgn.c (check_live_1, update_live_1): Likewise.
From-SVN: r39118
Diffstat (limited to 'gcc/flow.c')
-rw-r--r-- | gcc/flow.c | 33 |
1 files changed, 20 insertions, 13 deletions
@@ -4651,23 +4651,30 @@ mark_set_1 (pbi, code, reg, cond, insn, flags) int not_dead = 0; int i; - /* Some targets place small structures in registers for - return values of functions. We have to detect this - case specially here to get correct flow information. */ - if (GET_CODE (reg) == PARALLEL - && GET_MODE (reg) == BLKmode) - { - for (i = XVECLEN (reg, 0) - 1; i >= 0; i--) - mark_set_1 (pbi, code, XVECEXP (reg, 0, i), cond, insn, flags); - return; - } - /* Modifying just one hardware register of a multi-reg value or just a byte field of a register does not mean the value from before this insn is now dead. Of course, if it was dead after it's unused now. */ switch (GET_CODE (reg)) { + case PARALLEL: + /* Some targets place small structures in registers for return values of + functions. We have to detect this case specially here to get correct + flow information. Note that each element might be either a REG + or an EXPR_LIST whose first operand is a REG. */ + if (GET_MODE (reg) != BLKmode) + abort (); + + for (i = XVECLEN (reg, 0) - 1; i >= 0; i--) + { + rtx elmt = XVECEXP (reg, 0, i); + + mark_set_1 (pbi, code, + GET_CODE (elmt) == EXPR_LIST ? XEXP (elmt, 0) : elmt, + cond, insn, flags); + } + return; + case ZERO_EXTRACT: case SIGN_EXTRACT: case STRICT_LOW_PART: @@ -5964,8 +5971,8 @@ mark_used_regs (pbi, x, cond, insn) testreg = XEXP (testreg, 0); } - /* If this is a store into a register, recursively scan the - value being stored. */ + /* If this is a store into a register or group of registers, + recursively scan the value being stored. */ if ((GET_CODE (testreg) == PARALLEL && GET_MODE (testreg) == BLKmode) |