diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-01-18 13:14:34 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-01-18 13:14:34 +0000 |
commit | 216b2683e3fd1871973269dc54ef864003104389 (patch) | |
tree | a7cc3b76930fd2143f70721950dcf585e13f0528 /gcc/flow.c | |
parent | 79e62eba008601b3e6627ccbeb0a6516b3dc1fb7 (diff) | |
download | gcc-216b2683e3fd1871973269dc54ef864003104389.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@39118 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/flow.c')
-rw-r--r-- | gcc/flow.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/gcc/flow.c b/gcc/flow.c index 4d0bdff92ed..aa37d05de56 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -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) |