summaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2001-01-18 13:14:34 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2001-01-18 13:14:34 +0000
commit216b2683e3fd1871973269dc54ef864003104389 (patch)
treea7cc3b76930fd2143f70721950dcf585e13f0528 /gcc/flow.c
parent79e62eba008601b3e6627ccbeb0a6516b3dc1fb7 (diff)
downloadgcc-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.c33
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)