<div dir="ltr">I think they are not MDString, but "bundle tags" that managed by  LLVMContextImpl::getOrInsertBundleTag.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 11, 2017 at 4:01 PM, Tian, Xinmin <span dir="ltr"><<a href="mailto:xinmin.tian@intel.com" target="_blank">xinmin.tian@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div class="m_8978059442086366456WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">And  “map”  and “firstprivate” … are represented as MDString, right?  Thanks.<u></u><u></u></span></p>
<p class="MsoNormal"><a name="m_8978059442086366456__MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></a></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Hongbin Zheng [mailto:<a href="mailto:etherzhhb@gmail.com" target="_blank">etherzhhb@gmail.com</a>]
<br>
<b>Sent:</b> Wednesday, January 11, 2017 3:58 PM</span></p><div><div class="h5"><br>
<b>To:</b> Tian, Xinmin <<a href="mailto:xinmin.tian@intel.com" target="_blank">xinmin.tian@intel.com</a>><br>
<b>Cc:</b> David Majnemer <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>>; Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>>; <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> Re: [llvm-dev] [RFC] IR-level Region Annotations<u></u><u></u></div></div><p></p><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">Yes, those are LLVM SSA values. "map" (m, n)  should be "map" (i32 m, i32 n) .<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Thanks<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Hongbin<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Wed, Jan 11, 2017 at 3:47 PM, Tian, Xinmin <<a href="mailto:xinmin.tian@intel.com" target="_blank">xinmin.tian@intel.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Interesting, this is similar to what we have.
</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">One more question, these stuff in the
<span style="background:yellow">yellow</span>, are they represented as LLVM VALUEs? In other words, does the LLVM  optimizer update them? ,E.g.  %m is re-named %m.1 in the loop,   is the “m” in the token @..... is updated as well?  In the RFC,  the “m” is argument
 of intrinsic call, all  use-def info are used by optimizer, and optimizer updates them during optimization as regular function arguments. I am trying understand if there is any difference between token scheme and intrinsic scheme in this regard.  </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal">tail call token @llvm.directive.scope.entry() [ "t<span style="font-size:9.5pt">arget teams distribute"(),  "parallel for", "simd" (), "shared<span style="background:yellow">" (i32
 *xp, i32 *yp),</span> "linear_iv" (),  <span style="background:yellow">"firstprivate" (i32 m, i32 n),</span> "map" (m, n)</span> ] ;<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><a name="m_8978059442086366456_m_-1813539830594578997__MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></a><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Hongbin Zheng [mailto:<a href="mailto:etherzhhb@gmail.com" target="_blank">etherzhhb@gmail.com</a>]
<br>
<b>Sent:</b> Wednesday, January 11, 2017 3:29 PM</span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><br>
<b>To:</b> Tian, Xinmin <<a href="mailto:xinmin.tian@intel.com" target="_blank">xinmin.tian@intel.com</a>><br>
<b>Cc:</b> David Majnemer <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>>; Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>>;
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> Re: [llvm-dev] [RFC] IR-level Region Annotations<u></u><u></u></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">I am not an OpenMP expert, so some annotation may be wrong:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">// CHECK: [[ENTRY:%[a-zA-Z0-9\.]+]] = tail call token @llvm.directive.scope.entry() [ "t<span style="font-size:9.5pt">arget teams distribute"(),  "parallel for", "simd" (), "shared"
 (i32 *xp, i32 *yp), "linear_iv" (),  "firstprivate" (i32 m, i32 n), "map" (m, n)</span> ] ; notice that I use <span style="font-size:9.5pt">"linear_iv" for linear induction variable, you may want to fix this</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">#pragma omp target teams distribute parallel for simd shared(xp, yp) linear(i) firstprivate(m, n) map(m, n)<br>
<span class="m_8978059442086366456m-1813539830594578997gmail-im">for (i=0; i<2*N; i++) { xp[i*m + j] = -1; yp[i*n +j] = -2; }</span></span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">// CHECK: tail call void @llvm.directive.scope.exit(<wbr>token [[ENTRY]])<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">// CHECK: [[ENTRY:%[a-zA-Z0-9\.]+]] = tail call token @llvm.directive.scope.entry() [ "<span style="font-size:9.5pt;color:#500050">prefetch</span>"(i32 *xp, i64 1, i64 20, i32 *yp,
 i64 0, i64 10) ]<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt;color:#500050">#pragma prefetch x:<span class="m_8978059442086366456m-1813539830594578997gmail-aqj">1:20</span> y:<span class="m_8978059442086366456m-1813539830594578997gmail-aqj">0:10</span><br>
for (i=0; i<2*N; i++) { xp[i*m + j] = -1; yp[i*n +j] = -2; }</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">// CHECK: tail call void @llvm.directive.scope.exit(<wbr>token [[ENTRY]])<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Wed, Jan 11, 2017 at 3:19 PM, Tian, Xinmin <<a href="mailto:xinmin.tian@intel.com" target="_blank">xinmin.tian@intel.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Would you send us the LLVM IR for below example using token and OpBundle. So, we can understand better.
 Thanks. </span><u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">#pragma omp target teams distribute parallel for simd shared(xp, yp) linear(i) firstprivate(m, n) map(m, n)<br>
for (i=0; i<2*N; i++) { xp[i*m + j] = -1; yp[i*n +j] = -2; }<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal">#pragma prefetch x:1:20 y:0:10<br>
for (i=0; i<2*N; i++) { xp[i*m + j] = -1; yp[i*n +j] = -2; }<u></u><u></u></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Hongbin Zheng [mailto:<a href="mailto:etherzhhb@gmail.com" target="_blank">etherzhhb@gmail.com</a>]
<br>
<b>Sent:</b> Wednesday, January 11, 2017 3:09 PM<br>
<b>To:</b> Tian, Xinmin <<a href="mailto:xinmin.tian@intel.com" target="_blank">xinmin.tian@intel.com</a>><br>
<b>Cc:</b> David Majnemer <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>>; Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>>;
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a></span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><br>
<b>Subject:</b> Re: [llvm-dev] [RFC] IR-level Region Annotations<u></u><u></u></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">We are experimenting similar thing on SESE regions. We introduce an intrinsic to produce a token and another to consume the token. These two intrinsics mark the region, and we annotate
 extra information as OpBundle of the intrinsic that produce the token.<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Thanks<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Hongbin<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Wed, Jan 11, 2017 at 2:53 PM, Tian, Xinmin via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">David, one quick question, is there a way to preserve and associate a set of “properties, value info/attr
 ” to the given region using Token?  </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks,
</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Xinmin  </span><u></u><u></u></p>
<p class="MsoNormal"><a name="m_8978059442086366456_m_-1813539830594578997_m_-83136527384436"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></a><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> llvm-dev [mailto:<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@<wbr>lists.llvm.org</a>]
<b>On Behalf Of </b>David Majnemer via llvm-dev<br>
<b>Sent:</b> Wednesday, January 11, 2017 2:18 PM<br>
<b>To:</b> Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>><br>
<b>Cc:</b> llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: [llvm-dev] [RFC] IR-level Region Annotations</span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">FWIW, we needed to maintain single entry-multiple exit regions for WinEH and we accomplished it via a different mechanism.<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">We had an instruction which produces a value of type Token (<a href="http://llvm.org/docs/LangRef.html#token-type" target="_blank">http://llvm.org/docs/LangRef.<wbr>html#token-type</a>)
 which let us establish the region and another instruction to exit the region by consuming it. The dominance rules allowed us to avoid situations where the compiler might trash the regions in weird ways and made sure that regions would be left unharmed.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">AFAIK, a similar approach using Token could work here. I think it would reduce the amount of stuff you'd need LLVM to maintain.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Wed, Jan 11, 2017 at 2:02 PM, Hal Finkel via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<p class="MsoNormal">A Proposal for adding an experimental IR-level region-annotation infrastructure<br>
==============================<wbr>==============================<wbr>================= <br>
Hal Finkel (ANL) and Xinmin Tian (Intel)<br>
<br>
This is a proposal for adding an experimental infrastructure to support<br>
annotating regions in LLVM IR, making use of intrinsics and metadata, and<br>
a generic analysis to allow transformations to easily make use of these<br>
annotated regions. This infrastructure is flexible enough to support<br>
representation of directives for parallelization, vectorization, and<br>
offloading of both loops and more-general code regions. Under this scheme,<br>
the conceptual distance between source-level directives and the region<br>
annotations need not be significant, making the incremental cost of<br>
supporting new directives and modifiers often small. It is not, however,<br>
specific to those use cases.<br>
<br>
Problem Statement<br>
=================<br>
There are a series of discussions on LLVM IR extensions for representing region<br>
and loop annotations for parallelism, and other user-guided transformations,<br>
among both industrial and academic members of the LLVM community. Increasing<br>
the quality of our OpenMP implementation is an important motivating use case,<br>
but certainly not the only one. For OpenMP in particular, we've discussed<br>
having an IR representation for years. Presently, all OpenMP pragmas are<br>
transformed directly into runtime-library calls in Clang, and outlining (i.e.<br>
extracting parallel regions into their own functions to be invoked by the<br>
runtime library) is done in Clang as well. Our implementation does not further<br>
optimize OpenMP constructs, and a lot of thought has been put into how we might<br>
improve this. For some optimizations, such as redundant barrier removal, we<br>
could use a TargetLibraryInfo-like mechanism to recognize frontend-generated<br>
runtime calls and proceed from there. Dealing with cases where we lose<br>
pointer-aliasing information, information on loop bounds, etc. we could improve<br>
by improving our inter-procedural-analysis capabilities. We should do that<br>
regardless. However, there are important cases where the underlying scheme we<br>
want to use to lower the various parallelism constructs, especially when<br>
targeting accelerators, changes depending on what is in the parallel region.<br>
In important cases where we can see everything (i.e. there aren't arbitrary<br>
external calls), code generation should proceed in a way that is very different<br>
from the general case. To have a sensible implementation, this must be done<br>
after inlining. When using LTO, this should be done during the link-time phase.<br>
As a result, we must move away from our purely-front-end based lowering scheme.<br>
The question is what to do instead, and how to do it in a way that is generally<br>
useful to the entire community.<br>
<br>
Designs previously discussed can be classified into four categories:<br>
<br>
(a) Add a large number of new kinds of LLVM metadata, and use them to annotate<br>
    each necessary instruction for parallelism, data attributes, etc.<br>
(b) Add several new LLVM instructions such as, for parallelism, fork, spawn,<br>
    join, barrier, etc.<br>
(c) Add a large number of LLVM intrinsics for directives and clauses, each<br>
    intrinsic representing a directive or a clause.<br>
(d) Add a small number of LLVM intrinsics for region or loop annotations,<br>
    represent the directive/clause names using metadata and the remaining<br>
    information using arguments.<br>
<br>
Here we're proposing (d), and below is a brief pros and cons analysis based on<br>
these discussions and our own experiences of supporting region/loop annotations<br>
in LLVM-based compilers. The table below shows a short summary of our analysis.<br>
<br>
Various commercial compilers (e.g. from Intel, IBM, Cray, PGI), and GCC [1,2],<br>
have IR-level representations for parallelism constructs. Based on experience<br>
from these previous developments, we'd like a solution for LLVM that maximizes<br>
optimization enablement while minimizing the maintenance costs and complexity<br>
increase experienced by the community as a whole.<br>
<br>
Representing the desired information in the LLVM IR is just the first step. The<br>
challenge is to maintain the desired semantics without blocking useful<br>
optimizations. With options (c) and (d), dependencies can be preserved mainly<br>
based on the use/def chain of the arguments of each intrinsic, and a manageable<br>
set LLVM analysis and transformations can be made aware of certain kinds of<br>
annotations in order to enable specific optimizations. In this regard,<br>
options (c) and (d) are close with respect to maintenance efforts. However,<br>
based on our experiences, option (d) is preferable because it is easier to<br>
extend to support new directives and clauses in the future without the need to<br>
add new intrinsics as required by option (c).<br>
<br>
Table 1. Pros/cons summary of LLVM IR experimental extension options<br>
<br>
--------+---------------------<wbr>-+----------------------------<wbr>------------------- <br>
Options |         Pros         | Cons<br>
--------+---------------------<wbr>-+----------------------------<wbr>------------------- <br>
(a)     | No need to add new   | LLVM passes do not always maintain metadata.<br>
        | instructions or      | Need to educate many passes (if not all) to<br>
        | new intrinsics       | understand and handle them.<br>
--------+---------------------<wbr>-+----------------------------<wbr>------------------- <br>
(b)     | Parallelism becomes  | Huge effort for extending all LLVM passes and<br>
        | first class citizen  | code generation to support new instructions.<br>
        |                      | A large set of information still needs to be<br>
        |                      | represented using other means.<br>
--------+---------------------<wbr>-+----------------------------<wbr>------------------- <br>
(c)     | Less impact on the   | A large number of intrinsics must be added.<br>
        | exist LLVM passes.   | Some of the optimizations need to be<br>
        | Fewer requirements   | educated to understand them.<br>
        | for passes to        |<br>
        | maintain metadata.   |<br>
--------+---------------------<wbr>-+----------------------------<wbr>------------------- <br>
(d)     | Minimal impact on    | Some of the optimizations need to be<br>
        | existing LLVM        | educated to understand them.<br>
        | optimizations passes.| No requirements for all passes to maintain<br>
        | directive and clause | large set of metadata with values.<br>
        | names use metadata   |<br>
        | strings.             |<br>
--------+---------------------<wbr>-+----------------------------<wbr>------------------- <br>
<br>
Regarding (a), LLVM already uses metadata for certain loop information (e.g.<br>
annotations directing loop transformations and assertions about loop-carried<br>
dependencies), but there is no natural or consistent way to extend this scheme<br>
to represent necessary data-movement or region information.<br>
<br>
<br>
New Intrinsics for Region and Value Annotations<br>
==============================<wbr>================<br>
The following new (experimental) intrinsics are proposed which allow:<br>
<br>
a) Annotating a code region marked with directives / pragmas,<br>
b) Annotating values associated with the region (or loops), that is, those<br>
   values associated with directives / pragmas.<br>
c) Providing information on LLVM IR transformations needed for the annotated<br>
   code regions (or loops).<br>
<br>
These can be used both by frontends and also by transformation passes (e.g.<br>
automated parallelization). The names used here are similar to those used by<br>
our internal prototype, but obviously we expect a community bikeshed<br>
discussion.<br>
<br>
def int_experimental_directive : Intrinsic<[], [llvm_metadata_ty],<br>
                                   [IntrArgMemOnly],<br>
"llvm.experimental.directive"><wbr>;<br>
<br>
def int_experimental_dir_qual : Intrinsic<[], [llvm_metadata_ty],<br>
[IntrArgMemOnly],<br>
"llvm.experimental.dir.qual">;<br>
<br>
def int_experimental_dir_qual_opnd : Intrinsic<[],<br>
[llvm_metadata_ty, llvm_any_ty],<br>
[IntrArgMemOnly],<br>
"llvm.experimental.dir.qual.<wbr>opnd">;<br>
<br>
def int_experimental_dir_qual_<wbr>opndlist : Intrinsic<<br>
                                        [],<br>
[llvm_metadata_ty, llvm_vararg_ty],<br>
[IntrArgMemOnly],<br>
"llvm.experimental.dir.qual.<wbr>opndlist">;<br>
<br>
Note that calls to these intrinsics might need to be annotated with the<br>
convergent attribute when they represent fork/join operations, barriers, and<br>
similar.<br>
<br>
Usage Examples<br>
==============<br>
<br>
This section shows a few examples using these experimental intrinsics.<br>
LLVM developers who will use these intrinsics can defined their own MDstring.<br>
All details of using these intrinsics on representing OpenMP 4.5 constructs are described in [1][3].<br>
<br>
<br>
Example I: An OpenMP combined construct<br>
<br>
#pragma omp target teams distribute parallel for simd<br>
  loop<br>
<br>
LLVM IR<br>
-------<br>
call void @llvm.experimental.directive(<wbr>metadata !0)<br>
call void @llvm.experimental.directive(<wbr>metadata !1)<br>
call void @llvm.experimental.directive(<wbr>metadata !2)<br>
call void @llvm.experimental.directive(<wbr>metadata !3)<br>
  loop<br>
call void @llvm.experimental.directive(<wbr>metadata !6)<br>
call void @llvm.experimental.directive(<wbr>metadata !5)<br>
call void @llvm.experimental.directive(<wbr>metadata !4)<br>
<br>
!0 = metadata !{metadata !DIR.OMP.TARGET}<br>
!1 = metadata !{metadata !DIR.OMP.TEAMS}<br>
!2 = metadata !{metadata !<a href="http://DIR.OMP.DISTRIBUTE.PARLOOP.SI" target="_blank">DIR.OMP.DISTRIBUTE.PARLOOP.SI</a><wbr>MD}<br>
<br>
!6 = metadata !{metadata !DIR.OMP.END.DISTRIBUTE.<wbr>PARLOOP.SIMD}<br>
!5 = metadata !{metadata !DIR.OMP.END.TEAMS}<br>
!4 = metadata !{metadata !DIR.OMP.END.TARGET}<br>
<br>
Example II: Assume x,y,z are int variables, and s is a non-POD variable.<br>
            Then, lastprivate(x,y,s,z) is represented as:<br>
<br>
LLVM IR<br>
-------<br>
call void @llvm.experimental.dir.qual.<wbr>opndlist(<br>
                metadata !1, %x, %y, metadata !2, %a, %ctor, %dtor, %z)<br>
<br>
!1 = metadata !{metadata !QUAL.OMP.PRIVATE}<br>
!2 = metadata !{metadata !QUAL.OPND.NONPOD}<br>
<br>
Example III: A prefetch pragma example<br>
<br>
// issue vprefetch1 for xp with a distance of 20 vectorized iterations ahead<br>
// issue vprefetch0 for yp with a distance of 10 vectorized iterations ahead<br>
#pragma prefetch x:1:20 y:0:10<br>
for (i=0; i<2*N; i++) { xp[i*m + j] = -1; yp[i*n +j] = -2; }<br>
<br>
LLVM IR<br>
-------<br>
call void @llvm.experimental.directive(<wbr>metadata !0)<br>
call void @llvm.experimental.dir.qual.<wbr>opnslist(metadata !1, %xp, 1, 20,<br>
                                               metadata !1, %yp, 0, 10)<br>
  loop<br>
call void @llvm.experimental.directive(<wbr>metadata !3)<br>
<br>
References<br>
==========<br>
<br>
[1] LLVM Framework and IR extensions for Parallelization, SIMD Vectorization<br>
    and Offloading Support. SC'2016 LLVM-HPC3 Workshop. (Xinmin Tian <a href="http://et.al" target="_blank">
et.al</a>.)<br>
    Saltlake City, Utah.<br>
<br>
[2] Extending LoopVectorizer towards supporting OpenMP4.5 SIMD and outer loop<br>
    auto-vectorization. (Hideki Saito, <a href="http://et.al" target="_blank">et.al</a>.) LLVM Developers' Meeting 2016,<br>
    San Jose.<br>
<br>
[3] Intrinsics, Metadata, and Attributes: The Story continues! (Hal Finkel)<br>
    LLVM Developers' Meeting, 2016. San Jose<br>
<br>
[4] LLVM Intrinsic Function and Metadata String Interface for Directive (or<br>
    Pragmas) Representation. Specification Draft v0.9, Intel Corporation, 2016.<br>
<br>
<br>
Acknowledgements<br>
================<br>
We would like to thank Chandler Carruth (Google), Johannes Doerfert (Saarland<br>
Univ.), Yaoqing Gao (HuaWei), Michael Wong (Codeplay), Ettore Tiotto,<br>
Carlo Bertolli, Bardia Mahjour (IBM), and all other LLVM-HPC IR Extensions WG<br>
members for their constructive feedback on the LLVM framework and IR extension<br>
proposal.<br>
<br>
Proposed Implementation<br>
=======================<br>
<br>
Two sets of patches of supporting these experimental intrinsics and demonstrate<br>
the usage are ready for community review.<br>
<br>
a) Clang patches that support core OpenMP pragmas using this approach.<br>
b) W-Region framework patches: CFG restructuring to form single-entry-<br>
   single-exit work region (W-Region) based on annotations, Demand-driven<br>
   intrinsic parsing, and WRegionInfo collection and analysis passes,<br>
   Dump functions of WRegionInfo.<br>
<br>
On top of this functionality, we will provide the transformation patches for<br>
core OpenMP constructs (e.g. start with "#pragma omp parallel for" loop for<br>
lowering and outlining, and "#pragma omp simd" to hook it up with<br>
LoopVectorize.cpp). We have internal implementations for many constructs now.<br>
We will break this functionality up to create a series of patches for<br>
community review.<span style="color:#888888"><br>
<br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">--
</span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">Hal Finkel</span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">Lead, Compiler Technology and Programming Languages</span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">Leadership Computing Facility</span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">Argonne National Laboratory</span><br>
<br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">______________________________<wbr>_________________</span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb">LLVM Developers mailing list</span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb"><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a></span><br>
<span class="m_8978059442086366456m-1813539830594578997m-8313652738443632671m-8280419114786676376hoenzb"><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a></span></span><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><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">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div></div></div>
</div>

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