<div dir="ltr">i have already seen usage of <span style="font-size:12.8px">__builtin_nontemporal_store but i want to automate identification of non temporal loads/stores. i think i need to go for a pass. is it possiblee to detect non temporal loops without polly? </span></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 20, 2018 at 11:26 PM, Simon Pilgrim <span dir="ltr"><<a href="mailto:llvm-dev@redking.me.uk" target="_blank">llvm-dev@redking.me.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF"><div><div class="h5">
    On 20/01/2018 18:16, hameeza ahmed wrote:<br>
    <blockquote type="cite">
      <div dir="ltr">Actually i am working on vector accelerator which
        will perform those instructions which are non temporal.
        <div><br>
        </div>
        <div>for instance if i have this loop</div>
        <div><br>
        </div>
        <div>for(i=0;i<2048;i++)</div>
        <div>a[i]=b[i]+c[i];</div>
        <div><br>
        </div>
        <div>currently it emits following IR;</div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>
          <div>  %0 = getelementptr inbounds [2048 x i32], [2048 x i32]*
            @b, i64 0, i64 %index<br>
          </div>
          <div>  %1 = bitcast i32* %0 to <16 x i32>*</div>
          <div>  %wide.load = load <16 x i32>, <16 x i32>*
            %1, align 16, !tbaa !1</div>
          <div>  %8 = getelementptr inbounds [2048 x i32], [2048 x i32]*
            @c, i64 0, i64 %index</div>
          <div>  %9 = bitcast i32* %8 to <16 x i32>*</div>
          <div>  %wide.load14 = load <16 x i32>, <16 x i32>*
            %9, align 16, !tbaa !1</div>
          <div>  %16 = add nsw <16 x i32> %wide.load14, %wide.load</div>
          <div>  %20 = getelementptr inbounds [2048 x i32], [2048 x
            i32]* @a, i64 0, i64 %index</div>
          <div>  %21 = bitcast i32* %20 to <16 x i32>*</div>
          <div>  store <16 x i32> %16, <16 x i32>* %21,
            align 16, !tbaa !1</div>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>However, i want it to emit following IR </div>
        <div><br>
        </div>
        <div>
          <div>  %0 = getelementptr inbounds [2048 x i32], [2048 x i32]*
            @b, i64 0, i64 %index<br>
          </div>
          <div>  %1 = bitcast i32* %0 to <16 x i32>*</div>
          <div>  %wide.load = load <16 x i32>, <16 x i32>*
            %1, align 16, !tbaa !1, !nontemporal !1</div>
          <div>  %8 = getelementptr inbounds [2048 x i32], [2048 x i32]*
            @c, i64 0, i64 %index</div>
          <div>  %9 = bitcast i32* %8 to <16 x i32>*</div>
          <div>  %wide.load14 = load <16 x i32>, <16 x i32>*
            %9, align 16, !tbaa !1, !nontemporal !1</div>
          <div>  %16 = add nsw <16 x i32> %wide.load14,
            %wide.load, !nontemporal !1</div>
          <div>  %20 = getelementptr inbounds [2048 x i32], [2048 x
            i32]* @a, i64 0, i64 %index</div>
          <div>  %21 = bitcast i32* %20 to <16 x i32>*</div>
          <div>  store <16 x i32> %16, <16 x i32>* %21,
            align 16, !tbaa !1, !nontemporal !1</div>
        </div>
        <div><br>
        </div>
        <div>so that i can offload load, add, store to accelerator
          hardware. is it possible here? do i need a separate pass to
          detect whether the loop has non temporal data or polly will
          help here? what do you say?</div>
      </div>
    </blockquote></div></div>
    From C/C++ you just need to use the
    __builtin_nontemporal_store/__<wbr>builtin_nontemporal_load builtins to
    tag the stores/loads with the nontemporal flag.<br>
    <br>
    <div>for(i=0;i<2048;i++) {<br>
    </div>
    <div>  __builtin_nontemporal_store( __builtin_nontemporal_load(b+<wbr>i)
      + __builtin_nontemporal_load(c + i), a + i );<br>
    </div>
    <div>}<br>
    </div>
    <br>
    There may be an attribute you can tag pointers with instead but I
    don't know off hand.<span class=""><br>
    <br>
    <blockquote type="cite">
      <div class="gmail_extra">On Sat, Jan 20, 2018 at 11:02 PM, Simon
        Pilgrim <span dir="ltr"><<a href="mailto:llvm-dev@redking.me.uk" target="_blank">llvm-dev@redking.me.uk</a>></span>
        wrote:<br>
        <div class="gmail_quote">
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div class="m_-9084880504328883834HOEnZb">
              <div class="m_-9084880504328883834h5">On 20/01/2018 17:44, hameeza ahmed via
                llvm-dev wrote:<br>
                <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                  Hello,<br>
                  <br>
                  My work deals with non-temporal loads and stores i
                  found non-temporal meta data in llvm documentation but
                  its not shown in IR.<br>
                  <br>
                  How to get non-temporal meta data?<br>
                </blockquote>
              </div>
            </div>
            llvm\test\CodeGen\X86\nontempo<wbr>ral-loads.ll shows how to
            create nt vector loads in IR - is that what you're after?<span class="m_-9084880504328883834HOEnZb"><font color="#888888"><br>
                <br>
                Simon.<br>
              </font></span></blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
  </span></div>

</blockquote></div><br></div>