<div dir="ltr"><div>Forgot to add list.</div><div><br></div><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Ryan Taylor</b> <span dir="ltr"><<a href="mailto:ryta1203@gmail.com">ryta1203@gmail.com</a>></span><br>Date: Mon, Aug 22, 2016 at 3:17 PM<br>Subject: Re: [llvm-dev] Instruction itineraries and fence/barrier instructions<br>To: Phil Tomson <<a href="mailto:phil.a.tomson@gmail.com">phil.a.tomson@gmail.com</a>><br><br><br><div dir="ltr"><div>hasSideEffects is a property in tablegen for the instructions <a href="https://llvm.org/svn/llvm-project/llvm/trunk/include/llvm/Target/Target.td" target="_blank">https://llvm.org/svn/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Target/Target.td</a></div><div><br></div><div>Opts check this flag to see if it's ok to opt that instruction, for example, DCE. That instruction might set some register control flag that isn't modeled by the compiler (for example), hence needing hasSideEffects set so that DCE does not remove it.</div><div><br></div><div>I hope I understood your question correctly. I would definitely try setting hasSideEffects on the fence instruction, hope that works.</div><div><br></div><div>It might also be worth it to look at other targets and how they implement their barriers/fences.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>-Ryan</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 22, 2016 at 2:54 PM, Phil Tomson via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Mon, Aug 22, 2016 at 11:40 AM, Matt Arsenault <span dir="ltr"><<a href="mailto:arsenm2@gmail.com" target="_blank">arsenm2@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><br>
> On Aug 22, 2016, at 11:20, Phil Tomson via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> We improved our instruction itineraries and now we're seeing our testcases for fence instructions break.<br>
><br>
> For example, we have this testcase:<br>
><br>
> @write_me = external global i32<br>
> @read_me = external global i32<br>
><br>
> ; Function Attrs: nounwind<br>
> define i32 @xstg_intrinsic(i32 %foo) #0 {<br>
> entry:<br>
> ; CHECK: store        r0, r1, 0, 32<br>
> ; CHECK-NEXT: fence 2<br>
>   %foo.addr = alloca i32, align 4<br>
>   store i32 %foo, i32* %foo.addr, align 4<br>
>   %0 = load i32* %foo.addr, align 4<br>
>   store volatile i32 %0, i32* @write_me, align 4<br>
>   call void @llvm.xstg.memory.barrier(i32 2, i8 0)<br>
>   %1 = load volatile i32* @read_me, align 4<br>
>   ret i32 %1<br>
> }<br>
><br>
> Prior to adding our instruction itineraries the code generated was:<br>
><br>
> xstg_intrinsic:                         # @xstg_intrinsic<br>
> # BB#0:                                 # %entry<br>
>     subI    r509, r509, 16, 64<br>
>     store        r510, r509, 0, 64<br>
>     bitop1        r510, r509, 0, OR, 64<br>
>     store        r0, r510, 12, 32<br>
>     movimm        r1, %hi(write_me), 64<br>
>     movimmshf32    r1, r1, %lo(write_me)<br>
>     store        r0, r1, 0, 32<br>
>     fence 2<br>
>     movimm        r0, %hi(read_me), 64<br>
>     movimmshf32    r0, r0, %lo(read_me)<br>
>     load        r1, r0, 0, 32<br>
>     bitop1        r509, r510, 0, OR, 64<br>
>     load        r510, r509, 0, 64<br>
>     addI    r509, r509, 16, 64<br>
>     jabs        r511<br>
><br>
> Note the separation between the store prior to the fence and the code that comes after.<br>
><br>
> Now that we've got itineraries in place we see:<br>
><br>
>     subI    r509, r509, 16, 64<br>
>     store        r510, r509, 0, 64<br>
>     bitop1        r510, r509, 0, OR, 64<br>
>     movimm        r1, %hi(write_me), 64<br>
>     store        r0, r510, 12, 32<br>
>     movimmshf32    r1, r1, %lo(write_me)<br>
>     movimm        r2, %hi(read_me), 64<br>
>     store        r0, r1, 0, 32<br>
>     movimmshf32    r2, r2, %lo(read_me)<br>
>     fence 2<br>
>     load        r1, r2, 0, 32<br>
>     bitop1        r509, r510, 0, OR, 64<br>
>     load        r510, r509, 0, 64<br>
>     addI    r509, r509, 16, 64<br>
>     jabs        r511<br>
><br>
> the movimm which sets up the address for the load has been moved up prior to the fence.<br>
><br>
> Is there a way to indicate in the itinerary that position of the fence should be fixed - no instruction reordering "through" the fence/barrier?<br>
><br>
> Phil<br>
</div></div>> ______________________________<wbr>_________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank" rel="noreferrer">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br>
<br>
I don’t see a change relative to the memory instructions. </blockquote><div><br></div></div></div><div>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.<br> <br></div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Do you mean you want this to avoid scheduling of any instruction around any other? Does the instruction have isSideEffects set on it?</blockquote><div><br></div></span><div>Where can I find information about isSideEffects? Googling "LLVm isSideEffects" didnt' reveal anything that looked relevant.<br> <br></div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> I think the fallback if that isn’t enough is to override TargetInstrInfo::isSchedulingB<wbr>oundary<br>
<span><font color="#888888"><br></font></span></blockquote><div><br></div></span><div>Thanks, I'll look at that in other targets.<br><br></div><div>Phil <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span><font color="#888888">
-Matt</font></span></blockquote></div><br></div></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank" rel="noreferrer">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>
</div></div></div><br></div>