[llvm-dev] Instruction itineraries and fence/barrier instructions

Phil Tomson via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 22 12:48:51 PDT 2016


ok, we do have hasSideEffects set on the fence instruction. I wonder if we
should also set isBarrier ?

Phil

On Mon, Aug 22, 2016 at 12:17 PM, Matt Arsenault <arsenm2 at gmail.com> wrote:

>
> On Aug 22, 2016, at 11:54, Phil Tomson <phil.a.tomson at gmail.com> wrote:
>
>
>
> On Mon, Aug 22, 2016 at 11:40 AM, Matt Arsenault <arsenm2 at gmail.com>
> wrote:
>
>>
>> > On Aug 22, 2016, at 11:20, Phil Tomson via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>> >
>> > We improved our instruction itineraries and now we're seeing our
>> testcases for fence instructions break.
>> >
>> > For example, we have this testcase:
>> >
>> > @write_me = external global i32
>> > @read_me = external global i32
>> >
>> > ; Function Attrs: nounwind
>> > define i32 @xstg_intrinsic(i32 %foo) #0 {
>> > entry:
>> > ; CHECK: store        r0, r1, 0, 32
>> > ; CHECK-NEXT: fence 2
>> >   %foo.addr = alloca i32, align 4
>> >   store i32 %foo, i32* %foo.addr, align 4
>> >   %0 = load i32* %foo.addr, align 4
>> >   store volatile i32 %0, i32* @write_me, align 4
>> >   call void @llvm.xstg.memory.barrier(i32 2, i8 0)
>> >   %1 = load volatile i32* @read_me, align 4
>> >   ret i32 %1
>> > }
>> >
>> > Prior to adding our instruction itineraries the code generated was:
>> >
>> > xstg_intrinsic:                         # @xstg_intrinsic
>> > # BB#0:                                 # %entry
>> >     subI    r509, r509, 16, 64
>> >     store        r510, r509, 0, 64
>> >     bitop1        r510, r509, 0, OR, 64
>> >     store        r0, r510, 12, 32
>> >     movimm        r1, %hi(write_me), 64
>> >     movimmshf32    r1, r1, %lo(write_me)
>> >     store        r0, r1, 0, 32
>> >     fence 2
>> >     movimm        r0, %hi(read_me), 64
>> >     movimmshf32    r0, r0, %lo(read_me)
>> >     load        r1, r0, 0, 32
>> >     bitop1        r509, r510, 0, OR, 64
>> >     load        r510, r509, 0, 64
>> >     addI    r509, r509, 16, 64
>> >     jabs        r511
>> >
>> > Note the separation between the store prior to the fence and the code
>> that comes after.
>> >
>> > Now that we've got itineraries in place we see:
>> >
>> >     subI    r509, r509, 16, 64
>> >     store        r510, r509, 0, 64
>> >     bitop1        r510, r509, 0, OR, 64
>> >     movimm        r1, %hi(write_me), 64
>> >     store        r0, r510, 12, 32
>> >     movimmshf32    r1, r1, %lo(write_me)
>> >     movimm        r2, %hi(read_me), 64
>> >     store        r0, r1, 0, 32
>> >     movimmshf32    r2, r2, %lo(read_me)
>> >     fence 2
>> >     load        r1, r2, 0, 32
>> >     bitop1        r509, r510, 0, OR, 64
>> >     load        r510, r509, 0, 64
>> >     addI    r509, r509, 16, 64
>> >     jabs        r511
>> >
>> > the movimm which sets up the address for the load has been moved up
>> prior to the fence.
>> >
>> > Is there a way to indicate in the itinerary that position of the fence
>> should be fixed - no instruction reordering "through" the fence/barrier?
>> >
>> > Phil
>> > _______________________________________________
>> > LLVM Developers mailing list
>> > llvm-dev at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>> I don’t see a change relative to the memory instructions.
>
>
> True, we may be being a bit too skiddish about this... perhaps the
> solution is to change the testcase so that we can ensure that the relative
> order between the store and the fence has been preserved.
>
>
>> Do you mean you want this to avoid scheduling of any instruction around
>> any other? Does the instruction have isSideEffects set on it?
>
>
> Where can I find information about isSideEffects? Googling "LLVm
> isSideEffects" didnt' reveal anything that looked relevant.
>
>
> hasSideEffects. Look in Target.td / TargetInstrInfo.h. For a memory fence
> I think it should be sufficient to set mayLoad = 1, mayStore = 1 and not
> give the fence any memory operands
>
>
>
>> I think the fallback if that isn’t enough is to override
>> TargetInstrInfo::isSchedulingBoundary
>>
>>
> Thanks, I'll look at that in other targets.
>
> Phil
>
>> -Matt
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160822/e6aa2230/attachment.html>


More information about the llvm-dev mailing list