This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC PATCH, i386]: Improve LIMIT_RELOAD_CLASSES [was: Reload/i386 patch for secondary memory vs subregs]


On Fri, Aug 3, 2012 at 10:37 PM, Uros Bizjak <ubizjak@gmail.com> wrote:

>> Without this, on the new testcase we hit the assert in
>> inline_secondary_memory_needed. The comment before the function states:
>>
>>   The macro can't work reliably when one of the CLASSES is class
>>   containing registers from multiple units (SSE, MMX, integer).  We
>>   avoid this by never combining those units in single alternative in
>>   the machine description. Ensure that this constraint holds to avoid
>>   unexpected surprises.
>>
>> So, this indicates that we shouldn't be using INT_SSE_REGS for a reload
>> class at all, and I expect that at the moment we don't. With the patch,
>> the new find_valid_class_1 discovers INT_SSE_REGS as the best class for
>> the register to hold the SYMBOL_REF, leading to the failed assert.

Actually. existing LIMIT_RELOAD_CLASS is way too simple to handle all
issues with mixed register sets. Looking at ix86_hard_regno_mode_ok,
we have problems with DI and SI mode, which can go int XMM and GENERAL
regs, and SF and DF mode, which can go into XMM, FLOAT and GENERAL
regs, depending on the availability of units.

Attached (RFC) patch handles this limitation by limiting multiple
register set modes to the "natural mode" register set, i.e. DI and SI
modes will always return GENERAL_REGS, DF and SF will return either
SSE_REGS, or FLOAT_REGS or GENERAL_REGS. Please note, that we don't
want to widen i.e. CREG or ADREG narrow classes to full GENERAL_REGS.

The patch also improves Q_REGS selection in the same way, and adds a
couple of missing registers to various register sets, so the macro
works as expected.

2012-08-04  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.h (LIMIT_RELOAD_CLASS): Return preferred
	single unit register class for classes that contain registers form
	multiple units.
	(REG_CLASS_CONTENTS): Add missing "frame" register to FLOAT_INT_REGS,
	INT_SSE_REGS and FLOAT_INT_SSE_REGS register classes.

Patch was bootstrapped on x86_64-pc-linux-gnu {,-m32}. Regression test
is in process.

Uros.

Attachment: p.diff.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]