[LLVMdev] Machine LICM and cheap instructions?
Andrew Trick
atrick at apple.com
Fri Jan 9 11:47:05 PST 2015
> On Jan 8, 2015, at 3:12 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>
> ----- Original Message -----
>> From: "Quentin Colombet" <qcolombet at apple.com <mailto:qcolombet at apple.com>>
>> To: "Hal Finkel" <hfinkel at anl.gov <mailto:hfinkel at anl.gov>>
>> Cc: "Dev" <llvmdev at cs.uiuc.edu <mailto:llvmdev at cs.uiuc.edu>>
>> Sent: Thursday, January 8, 2015 5:06:24 PM
>> Subject: Re: [LLVMdev] Machine LICM and cheap instructions?
>>
>> Hi Hal,
>>
>> I haven’t looked at the implementation but could it be that we leave
>> room for expensive instructions to be hoisted?
>> The rational being that hoisting a cheap instruction will increase
>> the register pressure and then we may block expensive instruction
>> (assuming we use some kind of iterative algorithm).
>
> Interesting point. That cuts both ways, however, because hoisting a cheap instruction can then make an expensive instruction loop invariant. Perhaps we need two passes over the instructions to make a good decision here.
Yes, I think up to this point we’ve been heavily reliant on IR-level LICM to handle chains of computation.
It’s kind of hard for me to generalize what’s good/bad in MachineLICM without looking at concrete code for a particular architecture. Maybe the target hook should be more expressive.
-Andy
>
> Thanks,
> Hal
>
>>
>> Other than that, I would say that seem rather silly.
>>
>> Cheers,
>> Q.
>> On Jan 8, 2015, at 1:45 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>>
>>> Hi everyone,
>>>
>>> The MachineLICM pass has a heuristic such that, even in
>>> low-register-pressure situations, it will refuse to hoist "cheap"
>>> instructions out of loops. By default, when an itinerary is
>>> available, this means that all of the defined operands are
>>> available in at most 1 cycle. ARM overrides this, and provides
>>> this more-customized definition:
>>>
>>> bool ARMBaseInstrInfo::
>>> hasLowDefLatency(const InstrItineraryData *ItinData,
>>> const MachineInstr *DefMI, unsigned DefIdx) const {
>>> if (!ItinData || ItinData->isEmpty())
>>> return false;
>>>
>>> unsigned DDomain = DefMI->getDesc().TSFlags & ARMII::DomainMask;
>>> if (DDomain == ARMII::DomainGeneral) {
>>> unsigned DefClass = DefMI->getDesc().getSchedClass();
>>> int DefCycle = ItinData->getOperandCycle(DefClass, DefIdx);
>>> return (DefCycle != -1 && DefCycle <= 2);
>>> }
>>> return false;
>>> }
>>>
>>> So it won't hoist instructions that have defined operands ready in
>>> at most two cycles for general-domain instructions. Regardless, I
>>> don't understand the logic behind this heuristic.
>>> High-register-pressure situations are one thing, but why is it
>>> ever profitable in low-register-pressure situations not to hoist
>>> even "cheap" instructions out of loop bodies?
>>>
>>> Thanks again,
>>> Hal
>>>
>>> --
>>> Hal Finkel
>>> Assistant Computational Scientist
>>> Leadership Computing Facility
>>> Argonne National Laboratory
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150109/05becf66/attachment.html>
More information about the llvm-dev
mailing list