diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2004-02-28 02:43:41 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2004-02-28 02:43:41 +0000 |
commit | a10016d3b08ca2318ff1ce9e35ac5d9e0124d965 (patch) | |
tree | a3651d71be1e792c213e1dac9cc5cad8c4992b1a | |
parent | 6bd5c787cc8d48e3e2eb992e0a8286704ab10ca9 (diff) | |
download | gcc-a10016d3b08ca2318ff1ce9e35ac5d9e0124d965.zip gcc-a10016d3b08ca2318ff1ce9e35ac5d9e0124d965.tar.gz gcc-a10016d3b08ca2318ff1ce9e35ac5d9e0124d965.tar.bz2 |
re PR rtl-optimization/7871 (ICE on legal code, global register variables problems)
PR optimization/7871
* flow.c (mark_set_1): Don't add LOG_LINKS for global registers
from or to call insns.
(propagate_one_insn): Interpret calls as setting global registers,
not merely clobbering them.
From-SVN: r78601
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/flow.c | 15 |
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5993005..879bbfc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,17 @@ +2004-02-27 Ian Lance Taylor <ian@wasabisystems.com> + + PR optimization/7871 + * flow.c (mark_set_1): Don't add LOG_LINKS for global registers + from or to call insns. + +2004-02-27 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR optimization/7871 + * flow.c (propagate_one_insn): Interpret calls as setting global + registers, not merely clobbering them. + 2004-02-27 Dale Johannesen <dalej@apple.com> + * config/darwin.c (machopic_output_possible_stub_label): Remove. config/darwin-protos.h: Ditto. config/darwin.h: Remove call to it. @@ -1772,8 +1772,9 @@ propagate_one_insn (struct propagate_block_info *pbi, rtx insn) current_function_return_rtx, (rtx *) 0))) { + enum rtx_code code = global_regs[i] ? SET : CLOBBER; /* We do not want REG_UNUSED notes for these registers. */ - mark_set_1 (pbi, CLOBBER, regno_reg_rtx[i], cond, insn, + mark_set_1 (pbi, code, regno_reg_rtx[i], cond, insn, pbi->flags & ~(PROP_DEATH_NOTES | PROP_REG_INFO)); } } @@ -2799,10 +2800,18 @@ mark_set_1 (struct propagate_block_info *pbi, enum rtx_code code, rtx reg, rtx c in ASM_OPERANDs. If these registers get replaced, we might wind up changing the semantics of the insn, even if reload can make what appear to be valid - assignments later. */ + assignments later. + + We don't build a LOG_LINK for global registers to + or from a function call. We don't want to let + combine think that it knows what is going on with + global registers. */ if (y && (BLOCK_NUM (y) == blocknum) && (regno_first >= FIRST_PSEUDO_REGISTER - || asm_noperands (PATTERN (y)) < 0)) + || (asm_noperands (PATTERN (y)) < 0 + && ! ((GET_CODE (insn) == CALL_INSN + || GET_CODE (y) == CALL_INSN) + && global_regs[regno_first])))) LOG_LINKS (y) = alloc_INSN_LIST (insn, LOG_LINKS (y)); } } |