summaryrefslogtreecommitdiff
path: root/gcc/global.c
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1999-11-12 01:56:17 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1999-11-12 01:56:17 +0000
commit60f19080f650890fe870f6fd8aa0d34046de2d05 (patch)
tree73a33be2feee2041af76fe35e753200b87fe8870 /gcc/global.c
parent7078907f9887d1fc74fa0808b67f4d8ce6798863 (diff)
downloadgcc-60f19080f650890fe870f6fd8aa0d34046de2d05.tar.gz
* global.c (global_conflicts): Update comments.
(record_conflicts): No need to record conflicts between pseudos here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30492 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/global.c')
-rw-r--r--gcc/global.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/gcc/global.c b/gcc/global.c
index de3b57161e3..7e0074cbd63 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -673,7 +673,8 @@ global_conflicts ()
/* Initialize table of registers currently live
to the state at the beginning of this basic block.
- This also marks the conflicts among them.
+ This also marks the conflicts among hard registers
+ and any allocnos that are live.
For pseudo-regs, there is only one bit for each one
no matter how many hard regs it occupies.
@@ -702,9 +703,30 @@ global_conflicts ()
(a, PSEUDO_REGNO_MODE (i));
});
- /* Record that each allocno now live conflicts with each other
- allocno now live, and with each hard reg now live. */
+ /* Record that each allocno now live conflicts with each hard reg
+ now live.
+ It is not necessary to mark any conflicts between pseudos as
+ this point, even for pseudos which are live at the start of
+ the basic block.
+
+ Given two pseudos X and Y and any point in the CFG P.
+
+ On any path to point P where X and Y are live one of the
+ following conditions must be true:
+
+ 1. X is live at some instruction on the path that
+ evaluates Y.
+
+ 2. Y is live at some instruction on the path that
+ evaluates X.
+
+ 3. Either X or Y is not evaluted on the path to P
+ (ie it is used uninitialized) and thus the
+ conflict can be ignored.
+
+ In cases #1 and #2 the conflict will be recorded when we
+ scan the instruction that makes either X or Y become live. */
record_conflicts (block_start_allocnos, ax);
#ifdef STACK_REGS
@@ -1350,7 +1372,8 @@ record_one_conflict (regno)
}
/* Record all allocnos currently live as conflicting
- with each other and with all hard regs currently live.
+ with all hard regs currently live.
+
ALLOCNO_VEC is a vector of LEN allocnos, all allocnos that
are currently live. Their bits are also flagged in allocnos_live. */
@@ -1368,8 +1391,6 @@ record_conflicts (allocno_vec, len)
allocno = allocno_vec[len];
ialloc_prod = allocno * allocno_row_words;
IOR_HARD_REG_SET (hard_reg_conflicts[allocno], hard_regs_live);
- for (j = allocno_row_words - 1; j >= 0; j--)
- conflicts[ialloc_prod + j] |= allocnos_live[j];
}
}