aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2004-02-28 02:43:41 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2004-02-28 02:43:41 +0000
commita10016d3b08ca2318ff1ce9e35ac5d9e0124d965 (patch)
treea3651d71be1e792c213e1dac9cc5cad8c4992b1a
parent6bd5c787cc8d48e3e2eb992e0a8286704ab10ca9 (diff)
downloadgcc-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/ChangeLog13
-rw-r--r--gcc/flow.c15
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.
diff --git a/gcc/flow.c b/gcc/flow.c
index acf375a..66dbf1c 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -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));
}
}