[llvm-dev] Specify special cases of delay slots in the back end

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Thu Feb 9 15:42:44 PST 2017

On 02/09/2017 04:46 PM, Alex Susu via llvm-dev wrote:
>   Hello.
>     Hal, thank you for the information.
>     I managed to get inspired from PPCHazardRecognizers.cpp. So I 
> created my very simple [Target]HazardRecognizers.cpp pass that is also 
> derived from ScoreboardHazardRecognizer. My class only implements the 
> method getHazardType(), which checks if, as stated in my first email, 
> for example, I have a store instruction that is storing the value 
> updated by the instruction immediately above, which is NOT ok, since 
> for my processor this is a data hazard and in this case I have to 
> insert a NOP in between by making getHazardType() to:
>       return NoopHazard; // this basically emits noop
>     However, to my surprise, my very simple post-RA scheduler (using 
> my class derived from ScoreboardHazardRecognizer) is cycling FOREVER 
> after this return NoopHazard, by calling getHazardType() again and 
> again for this SAME store instruction I found in the first place with 
> the data hazard problem. So, llc is no longer finishing - I have to 
> stop the process because of this strange behavior.
>     I was expecting after the first call to getHazardType() with the 
> respective store instruction (and return NoopHazard) that the 
> scheduler would move forward to the other instructions in the 
> DAG/basic-block.

It should emit a nop if all available instructions return NoopHazard.

>     Do you have an idea what can I do to fix this problem?

I'm not sure. I recall running into a situation like this years ago, but 
I don't recall now how I resolved it. Are you correctly handling the 
Stalls argument to getHazardType?


>   Thank you very much,
>     Alex
> On 2/3/2017 10:25 PM, Hal Finkel wrote:
>> Hi Alex,
>> You can program a post-RA scheduler which will return NoopHazard in 
>> the appropriate
>> circumstances. You can look at the PowerPC target (e.g.
>> lib/Target/PowerPC/PPCHazardRecognizers.cpp) as an example.
>>  -Hal
>> On 02/02/2017 05:03 PM, Alex Susu via llvm-dev wrote:
>>>   Hello.
>>>     I see there is little information on specifying instructions 
>>> with delay slots.
>>>     So could you please tell me how can I insert NOPs (BEFORE or 
>>> after an instruction)
>>> or how to make an aware instruction scheduler in order to avoid 
>>> miscalculations due to
>>> the delay slot effect?
>>>     More exactly, I have the following constraints on my (SIMD) 
>>> processor:
>>>       - certain stores or loads, must be executed 1 cycle after the 
>>> instruction
>>> generating their input operands ends. For example, if I have:
>>>          R1 = R2 + R3
>>>          LS[R10] = R1 // this will not produce the correct result 
>>> because it does not
>>> see the updated value of R1 from the previous instruction
>>>        To make this code execute correctly we need to insert a NOP:
>>>          R1 = R2 + R3
>>>          NOP // or other instruction to fill the delay slot
>>>          LS[R10] = R1
>>>       - a compare instruction requires to add a NOP after it, before 
>>> the predicated
>>> block (something like a conditional JMP instruction) starts.
>>>   Thank you,
>>>     Alex
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

More information about the llvm-dev mailing list