diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-11-12 01:56:17 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-11-12 01:56:17 +0000 |
commit | 60f19080f650890fe870f6fd8aa0d34046de2d05 (patch) | |
tree | 73a33be2feee2041af76fe35e753200b87fe8870 /gcc/global.c | |
parent | 7078907f9887d1fc74fa0808b67f4d8ce6798863 (diff) | |
download | gcc-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.c | 33 |
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]; } } |