[PATCH][RegAlloc] Make tryInstructionSplit less aggressive.
Quentin Colombet
qcolombet at apple.com
Thu Jan 2 14:52:50 PST 2014
Committed as r198369.
Thanks again Jakob!
-Quentin
On Dec 23, 2013, at 6:25 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> Thanks Jakob for the quick review!
>
> I'll integrate your suggestions and I'll commit after the break so that I am around in case something goes wrong.
>
> Thanks again.
>
> -Quentin
> On Dec 23, 2013, at 3:00 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk> wrote:
>
>>
>> On Dec 23, 2013, at 2:35 PM, Quentin Colombet <qcolombet at apple.com> wrote:
>>
>>> Hi Jakob,
>>>
>>> Here is the reworked patch.
>>>
>>> Now the MachineInstr API offers new methods to query the effect of the operand constraints on the register class of a virtual register or on a given register class.
>>> The new API is used in MachineRegisterInfo::recomputeRegClass as well as in RAGreedy::tryInstructionSplit.
>>
>> Thanks, Quentin.
>>
>> This is looking good.
>>
>> I think I would prefer to omit the MI::getLargest* functions. You will almost always be looking at multiple instructions, and I’m afraid it can get expensive to call getLargestLegalSuperClass() redundantly for all of them.
>>
>> The getRegClassConstraintEffect* functions look great.
>>
>> + const TargetRegisterClass *SuperRC = TRI->getLargestLegalSuperClass(CurRC);
>> + // Split around every non-copy instruction if this split will relax
>> + // the constraints on the virtual register.
>> + // Otherwise, splitting just inserts uncoalescable copies that do not help
>> + // the allocation.
>> for (unsigned i = 0; i != Uses.size(); ++i) {
>> if (const MachineInstr *MI = Indexes->getInstructionFromIndex(Uses[i]))
>> - if (MI->isFullCopy()) {
>> + if (MI->isFullCopy() ||
>> + SuperRC == MI->getLargestRegClassForVReg(VirtReg.reg, TII, TRI, MRI,
>> + /* ExploreBundle */ true)) {
>>
>> Here, I would just pass SuperRC to MI->getRegClassConstraintEffectForVReg() instead.
>>
>> Also, don’t compare the register classes by equality, but check that the returned register class actually has fewer allocatable registers. See for example GPR/rGPR on ARM. RegisterClassInfo::getNumAllocatableRegs() is very fast.
>>
>> + if (ExploreBundle && (isBundle() || isBundled())) {
>> + MachineBasicBlock::const_instr_iterator I = this;
>> + MachineBasicBlock::const_instr_iterator E = getParent()->instr_end();
>> + while (CurRC && ++I != E && I->isInsideBundle())
>> + // Accumulate the constraints through the instructions.
>> + CurRC = I->getRegClassConstraintEffectForVRegImpl(Reg, CurRC, TII, TRI);
>> + }
>>
>> See MIBundleOperands.
>>
>> Go ahead and commit with those changes.
>>
>> Thanks,
>> /jakob
>>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list