From c78dd2959d7be7d4da653bfe60343b68f025f2e9 Mon Sep 17 00:00:00 2001 From: Kaz Kojima Date: Wed, 20 Jun 2007 05:52:05 +0000 Subject: [PATCH] re PR rtl-optimization/28011 ([SH] g++ generates wrong code, if '-fno-exceptions' and '-O' options are specified) PR rtl-optimization/28011 Backport from mainline. * reload.c (push_reload): Set dont_share if IN appears in OUT also when IN is a PLUS rtx. (reg_overlap_mentioned_for_reload_p): Return true if X and IN are same PLUS rtx. From-SVN: r125872 --- gcc/ChangeLog | 9 +++++++++ gcc/reload.c | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcb24e146c55..3ce3bc9b7566 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-06-20 Kaz Kojima + + PR rtl-optimization/28011 + Backport from mainline. + * reload.c (push_reload): Set dont_share if IN appears in OUT + also when IN is a PLUS rtx. + (reg_overlap_mentioned_for_reload_p): Return true if X and IN + are same PLUS rtx. + 2007-06-19 Jakub Jelinek PR tree-optimization/32353 diff --git a/gcc/reload.c b/gcc/reload.c index d775259d6c1f..eea9cc738a18 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -1210,7 +1210,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, /* If IN appears in OUT, we can't share any input-only reload for IN. */ if (in != 0 && out != 0 && MEM_P (out) - && (REG_P (in) || MEM_P (in)) + && (REG_P (in) || MEM_P (in) || GET_CODE (in) == PLUS) && reg_overlap_mentioned_for_reload_p (in, XEXP (out, 0))) dont_share = 1; @@ -6464,7 +6464,8 @@ reg_overlap_mentioned_for_reload_p (rtx x, rtx in) if (REG_P (in)) return 0; else if (GET_CODE (in) == PLUS) - return (reg_overlap_mentioned_for_reload_p (x, XEXP (in, 0)) + return (rtx_equal_p (x, in) + || reg_overlap_mentioned_for_reload_p (x, XEXP (in, 0)) || reg_overlap_mentioned_for_reload_p (x, XEXP (in, 1))); else return (reg_overlap_mentioned_for_reload_p (XEXP (x, 0), in) || reg_overlap_mentioned_for_reload_p (XEXP (x, 1), in)); -- 2.47.2