[llvm-dev] Is addrspace info available during instruction scheduling?

Phil Tomson via llvm-dev llvm-dev at lists.llvm.org
Tue Jun 14 10:08:44 PDT 2016


Ah, sorry, this was operator error on my part... I do now see different
address spaces using that method.

Thanks.

Phil

On Mon, Jun 13, 2016 at 7:52 PM, Phil Tomson <phil.a.tomson at gmail.com>
wrote:

>
>
> On Mon, Jun 13, 2016 at 12:14 PM, Matthias Braun <mbraun at apple.com> wrote:
>
>> You should be able to get the related MachineInstrs (SDNode->Instr). If
>> you have different instructions for different address spaces you can just
>> check the opcode, otherwise you can check if the instructions have
>> MachineMemOperands which contains additional information about the memory
>> access including the address space involved.
>>
>
> I tried the latter suggestion since we don't have different load
> instructions for different address spaces and noticed that all of the
> address spaces that get returned are 0 - even though the .ll file shows
> loads from different addressspaces like:
>
>  %0 = load i32 addrspace(4)* @answer, align 4
>   store i32 %0, i32* @xint, align 4
>   %1 = load i32 addrspace(2)* @seven, align 4
>   store i32 %1, i32* %bint, align 4
>   %2 = load i32 addrspace(3)* @two, align 4
>
> This is what I tried:
>
> unsigned
>     XTargetInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
>                                            const MachineInstr *MI,
>                                            unsigned *PredCost) const {
>
>    int Latency = XTargetGenInstrInfo::getInstrLatency(ItinData, MI,
> PredCost);
>
>       std::string type_str;
>       llvm::raw_string_ostream rso(type_str);
>       MI->print(rso);
>       if(PredCost) {
>       std::cout << "    PredCost: " << *PredCost << "\n";
>       }
>          MachineInstr::mmo_iterator MMOI;
>          for(MMOI = MI->memoperands_begin(); MMOI !=
> MI->memoperands_end(); ++MMOI) {
>            std::cout << "     AddressSpace:" << ((*MMOI)->getAddrSpace())
> << "\n";
>          }
>     return Latency;
> }
>
>
> Phil
>
>
>
>> - Matthias
>>
>> > On Jun 13, 2016, at 11:55 AM, Phil Tomson via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>> >
>> > We'd like to be able to vary the latency of our load instructions based
>> on what address space is being loaded from. I was thinking I could do this
>> by overriding getOperandLatency in our target, but I'm wondering if the
>> addrspace info is available when instructions are scheduled?
>> >
>> > For example, I have this in our llvm IR:
>> >
>> >   %0 = load i32 addrspace(4)* @answer, align 4
>> >   store i32 %0, i32* @xint, align 4
>> >   %1 = load i32 addrspace(2)* @seven, align 4
>> >   store i32 %1, i32* %bint, align 4
>> >   %2 = load i32 addrspace(3)* @two, align 4
>> >   store i32 %2, i32* %cint, align 4
>> >
>> > Loading from addrspace(4) or addrspace(3) should have a much higher
>> latency than loading from addrspace(2) or addrspace(1).  But is that
>> information available to the instruction scheduler in our overridden
>> getOperandLatency method?
>> >
>> > Phil
>> >
>> > _______________________________________________
>> > LLVM Developers mailing list
>> > llvm-dev at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160614/f6a94569/attachment.html>


More information about the llvm-dev mailing list