Message ID | 54AFAEFD.6060707@mentor.com |
---|---|
State | New |
Headers | show |
On Fri, Jan 09, 2015 at 11:35:41AM +0100, Tom de Vries wrote: > 2015-01-09 Tom de Vries <tom@codesourcery.com> > > PR rtl-optimization/64539 > * regcprop.c (copyprop_hardreg_forward_1): Handle clobbers in > CALL_INSN_FUNCTION_USAGE. To avoid the duplication, wouldn't it be better to add static void kill_clobbered_values (rtx_insn *insn, struct value_data *vd) { note_stores (PATTERN (insn), kill_clobbered_value, vd); if (CALL_P (insn)) { rtx exp; for (exp = CALL_INSN_FUNCTION_USAGE (insn); exp; exp = XEXP (exp, 1)) { rtx x = XEXP (exp, 0); if (GET_CODE (x) == CLOBBER) kill_value (SET_DEST (x), vd); } } } function (with appropriate function comment) and use it in both places? Otherwise LGTM. Jakub
2015-01-09 Tom de Vries <tom@codesourcery.com> PR rtl-optimization/64539 * regcprop.c (copyprop_hardreg_forward_1): Handle clobbers in CALL_INSN_FUNCTION_USAGE. --- gcc/regcprop.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gcc/regcprop.c b/gcc/regcprop.c index 8c4f564..b42a4b7 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -801,6 +801,18 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) I wouldn't think this were true for regular insns, but scan_rtx treats them like that... */ note_stores (PATTERN (insn), kill_clobbered_value, vd); + if (CALL_P (insn)) + { + rtx exp; + for (exp = CALL_INSN_FUNCTION_USAGE (insn); + exp; + exp = XEXP (exp, 1)) + { + rtx x = XEXP (exp, 0); + if (GET_CODE (x) == CLOBBER) + kill_value (SET_DEST (x), vd); + } + } /* Kill all auto-incremented values. */ /* ??? REG_INC is useless, since stack pushes aren't done that way. */ -- 1.9.1