On 13-04-22 3:31 PM, Michael Meissner wrote:
On Mon, Apr 22, 2013 at 03:26:45PM -0400, Vladimir Makarov wrote:
On 13-04-22 12:35 AM, Alan Modra wrote:
On Fri, Apr 19, 2013 at 05:16:43PM -0400, Vladimir Makarov wrote:
I don't understand what this check means and what comments ??? means too.
A lo_sum mem is only valid if you know it won't be offset (or that
offsetting will never cross a 64k+32k boundary). If the access is
smaller than a word then the load or store can be done in one insn.
No offset required. If the access is a DFmode *and* you are loading
or storing a floating point reg, then the access is also done in one
insn. The ??? comment is referring to the fact that you don't know
for sure that the DFmode is in a floating point reg. It usually is,
but may be in two general purpose regs. Which then need an offset to
load/store the second reg.
Alan, thanks for the explanation. I'll search for another solution.
I'm suspecting secondary_reload needs more tuning for TF/TD modes.
I've fixed dealII crash and commited the patch into the branch as rev.
198169.
The dealII crash itself can be cured by treatment of lo_sum for LRA the
same way as for reload (please see code checking modes for addressing
more one word). But in this case a few tests fail which is cured in LRA
itself by trying to load address into pseudo using lo_sum.
The patch was successfully bootstrapped (--with-cpu=power7) and tested
on GCC testsuite.
2013-04-22 Vladimir Makarov <vmaka...@redhat.com>
* lra-constraints.c (process_address): Try to put lo_sum into
register.
* config/rs6000/rs6000.c (legitimate_lo_sum_address_p): Remove
lra_in_progress guard for addressing something bigger than word.
Index: ChangeLog
===================================================================
--- ChangeLog (revision 198101)
+++ ChangeLog (working copy)
@@ -1,3 +1,10 @@
+2013-04-22 Vladimir Makarov <vmaka...@redhat.com>
+
+ * lra-constraints.c (process_address): Try to put lo_sum into
+ register.
+ * config/rs6000/rs6000.c (legitimate_lo_sum_address_p): Remove
+ lra_in_progress guard for addressing something bigger than word.
+
2013-04-18 Vladimir Makarov <vmaka...@redhat.com>
* lra-constraints.c (check_and_process_move): Move code for move
Index: config/rs6000/rs6000.c
===================================================================
--- config/rs6000/rs6000.c (revision 198101)
+++ config/rs6000/rs6000.c (working copy)
@@ -5736,7 +5736,7 @@ legitimate_lo_sum_address_p (enum machin
return false;
if (GET_MODE_NUNITS (mode) != 1)
return false;
- if (! lra_in_progress && GET_MODE_SIZE (mode) > UNITS_PER_WORD
+ if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
&& !(/* ??? Assume floating point reg based on mode? */
TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
&& (mode == DFmode || mode == DDmode)))
Index: lra-constraints.c
===================================================================
--- lra-constraints.c (revision 198101)
+++ lra-constraints.c (working copy)
@@ -2504,8 +2504,21 @@ process_address (int nop, rtx *before, r
*ad.inner = gen_rtx_LO_SUM (Pmode, new_reg, addr);
if (! valid_address_p (ad.mode, *ad.outer, ad.as))
{
- *ad.inner = addr;
- code = -1;
+ /* Try to put lo_sum into register. */
+ insn = emit_insn (gen_rtx_SET
+ (VOIDmode, new_reg,
+ gen_rtx_LO_SUM (Pmode, new_reg, addr)));
+ code = recog_memoized (insn);
+ if (code >= 0)
+ {
+ *ad.inner = new_reg;
+ if (! valid_address_p (ad.mode, *ad.outer, ad.as))
+ {
+ *ad.inner = addr;
+ code = -1;
+ }
+ }
+
}
}
if (code < 0)