<div dir="ltr">Hi Roel,<div><br></div><div>You'd have to set LIBRARY_PATH to point to where <span style="font-size:12.8000001907349px">libtarget-nvptx.a lives. At this moment, we are not translating the -L commands for the target, they are considered to be meant for the host only. I should probably extend the documentation to explain this detail.</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">Thanks,</span></div><div><span style="font-size:12.8000001907349px">Samuel</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-06-09 9:32 GMT-04:00 Roel Jordans <span dir="ltr"><<a href="mailto:r.jordans@tue.nl" target="_blank">r.jordans@tue.nl</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Sergos and Samuel,<br>
<br>
Thanks for the links, I've got it mostly working now.<br>
<br>
I still have a problem with linking the code.  It seems that the clang driver doesn't pass its library search path to nvlink when linking the generated cuda code to the target library, resulting in it not correctly finding libtarget-nvptx.a.  Is there some flag or environment variable that I should set here?  Manually providing nvlink with a -L flag pointing to the appropriate path seems to work for the linking step.<br>
<br>
Cheers,<br>
 Roel<span class=""><br>
<br>
On 09/06/15 00:07, Samuel Antão wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
Hi Roel, Chris,<br>
<br>
This is a summary on how you can add support for a a different<br>
offloading device on top of what we have in github for OpenMP:<br>
<br>
a) Download and install lvm (<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_clang-2Domp_llvm-5Ftrunk&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=3ArCxsfNEUm-IdN_bMi6cTukTA10QnIyQiu1FwP5r9I&e=" target="_blank">https://github.com/clang-omp/llvm_trunk</a>),<br>
and clang (<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_clang-2Domp_clang-5Ftrunk&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=79kNep_kmIaYaqeMgsdr3EUcIvLEKt_wriRUUgUXrVg&e=" target="_blank">https://github.com/clang-omp/clang_trunk</a>) as usual<br>
<br>
b) install the official llvm OpenMP runtime library <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__openmp.llvm.org&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=bfXNXIC5XAbSqoVwhb9t0rnGxE2YZeuzzSTNpsl4Xjc&e=" target="_blank">openmp.llvm.org</a><br></span>
<<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__openmp.llvm.org&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=bfXNXIC5XAbSqoVwhb9t0rnGxE2YZeuzzSTNpsl4Xjc&e=" target="_blank">http://openmp.llvm.org</a>>. Clang will expect that to be present in your<div><div class="h5"><br>
library path in order to compile OpenMP code (even if you do not need<br>
any OpenMP feature other than offloading).<br>
<br>
c) Install <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_clang-2Domp_libomptarget&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=9OGDBiQoYXHxeQaNXCJ6d23NY-0yumXV9EysEC4lbwg&e=" target="_blank">https://github.com/clang-omp/libomptarget</a> (running ‘make'<br>
should do it). This library implements the API to control offloading. It<br>
also contains a set of plugins to some targets we are testing this with<br>
- x86_64, powerpc64 and NVPTX - in ./RTLs. You will need to implement a<br>
plug in for your target as well. The interface used for these plugins is<br>
detailed in the document proposed in<br>
<a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-April/084986.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-April/084986.html</a> .You<br>
can look at the existing plugins for a hint. In a nutshell you would<br>
have to implement code that allocates and moves data to your device,<br>
returns a table of entry points and global variables given a device<br>
library and launches execution of a given entry point with the provided<br>
list of arguments.<br>
<br>
d) The current implementation is expecting the device library to use ELF<br>
format. There is no reason for that other than the platforms we tested<br>
this with so far use ELF format. If your device does not use<br>
ELF __tgt_register_lib() (src/omptarget.cpp) would have to be extended<br>
to understand your desired format. Otherwise you may just update<br>
src/targets_info.cpp with your ELF ID and plugin name.<br>
<br>
e) Offloading is driven by clang, so it has to be aware of the required<br>
by yourr device. If your device toolchain is not implemented in clang<br>
you would have to do that in lib/Driver/ToolChains.cpp.<br>
<br>
f) Once everything is in place, you can compile your code by running<br>
something like “clang -fopenmp -omptargets=your-target-triple app.c”. If<br>
you do separate compilation you could see that two different files are<br>
generated for a given source file (the target file has the suffix<br>
tgt-your-target-triple).<br>
<br>
I should say that in general OpenMP requires a runtime library for the<br>
device as well, however if you do not use any OpenMP pragmas inside your<br>
target code you won’t need that.<br>
<br>
We started porting our code related with offloading currently in github<br>
to clang upstream. The driver support is currently under review in<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9888&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=QCtEeztr3ZftorZ9_NRzio4xKrfY1g7PqeguCaflYP4&e=" target="_blank">http://reviews.llvm.org/D9888</a>. We are about to send our first offloading<br>
codegen patches as well.<br>
<br>
I understand that what Chris is proposing is somewhat different that<br>
what we have in place, given that the transformations are intended to be<br>
in LLVM IR. However, the goal seems to be the same. Hope the summary<br>
above gives you some hints on whether your use cases can be accommodated.<br>
<br>
Feel free to ask any questions you may have.<br>
<br>
Thanks!<br>
<br>
Samuel<br>
<br>
<br>
<br>
2015-06-08 16:46 GMT-04:00 Sergey Ostanevich <<a href="mailto:sergos.gnu@gmail.com" target="_blank">sergos.gnu@gmail.com</a><br></div></div>
<mailto:<a href="mailto:sergos.gnu@gmail.com" target="_blank">sergos.gnu@gmail.com</a>>>:<span class=""><br>
<br>
    Roel,<br>
<br>
    You have to checkout and build llvm/clang as usual.<br>
    For runtime support you'll have to build the libomptarget and make a<br>
    plugin for your target. Samuel can help you some more.<br>
    As for the OpenMP examples I can recommend you the<br>
    <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__openmp.org_mp-2Ddocuments_OpenMP4.0.0.Examples.pdf&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=paMvmo0kZmzprmiWNYbqPqDOQmZQ0L8_dsW88vBfST0&e=" target="_blank">http://openmp.org/mp-documents/OpenMP4.0.0.Examples.pdf</a><br>
    look into the target constructs.<br>
<br>
    Sergos<br>
<br>
<br>
    On Mon, Jun 8, 2015 at 6:13 PM, Roel Jordans <<a href="mailto:r.jordans@tue.nl" target="_blank">r.jordans@tue.nl</a><br></span><div><div class="h5">
    <mailto:<a href="mailto:r.jordans@tue.nl" target="_blank">r.jordans@tue.nl</a>>> wrote:<br>
     > Hi Sergos,<br>
     ><br>
     > I'd like to try this on our hardware.  Is there some example code<br>
    that I<br>
     > could use to get started?<br>
     ><br>
     > Cheers,<br>
     >  Roel<br>
     ><br>
     ><br>
     > On 08/06/15 13:27, Sergey Ostanevich wrote:<br>
     >><br>
     >> Chirs,<br>
     >><br>
     >> Have you seen an offloading infrastructure design proposal at<br>
     >> <a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-April/084986.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-April/084986.html</a> ?<br>
     >> It relies on the long-standing OpenMP standard with recent<br>
    updates to<br>
     >> support the heterogenous computations.<br>
     >> Could you please review it and comment on how it fits to your needs?<br>
     >><br>
     >> It's not quite clear from your proposal what source language<br>
    standard<br>
     >> do you plat to support - you just metion that OpenCL will be one of<br>
     >> your backends, as far as I got it. What's your plan on sources -<br>
     >> C/C++/FORTRAN?<br>
     >> How would you control the offloading, data transfer, scheduling<br>
    and so<br>
     >> on? Whether it will be new language constructs, similar to<br>
    prallel_for<br>
     >> in Cilk Plus, or will it be pragma-based like in OpenMP or OpenACC?<br>
     >><br>
     >> The design I mentioned above has an operable implementation fon<br>
    NVIDIA<br>
     >> target at the<br>
     >><br>
     >> <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_clang-2Domp_llvm-5Ftrunk&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=3ArCxsfNEUm-IdN_bMi6cTukTA10QnIyQiu1FwP5r9I&e=" target="_blank">https://github.com/clang-omp/llvm_trunk</a><br>
     >> <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_clang-2Domp_clang-5Ftrunk&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=79kNep_kmIaYaqeMgsdr3EUcIvLEKt_wriRUUgUXrVg&e=" target="_blank">https://github.com/clang-omp/clang_trunk</a><br>
     >><br>
     >> with runtime implemented at<br>
     >><br>
     >> <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_clang-2Domp_libomptarget&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=9OGDBiQoYXHxeQaNXCJ6d23NY-0yumXV9EysEC4lbwg&e=" target="_blank">https://github.com/clang-omp/libomptarget</a><br>
     >><br>
     >> you're welcome to try it out, if you have an appropriate device.<br>
     >><br>
     >> Regards,<br>
     >> Sergos<br>
     >><br>
     >> On Sat, Jun 6, 2015 at 2:24 PM, Christos Margiolas<br></div></div><span class="">
     >> <<a href="mailto:chrmargiolas@gmail.com" target="_blank">chrmargiolas@gmail.com</a> <mailto:<a href="mailto:chrmargiolas@gmail.com" target="_blank">chrmargiolas@gmail.com</a>>> wrote:<br>
     >>><br>
     >>> Hello,<br>
     >>><br>
     >>> Thank you a lot for the feedback. I believe that the<br>
    heterogeneous engine<br>
     >>> should be strongly connected with parallelization and vectorization<br>
     >>> efforts.<br>
     >>> Most of the accelerators are parallel architectures where having<br>
     >>> efficient<br>
     >>> parallelization and vectorization can be critical for performance.<br>
     >>><br>
     >>> I am interested in these efforts and I hope that my code can<br>
    help you<br>
     >>> managing the offloading operations. Your LLVM instruction set<br>
    extensions<br>
     >>> may<br>
     >>> require some changes in the analysis code but I think is going<br>
    to be<br>
     >>> straightforward.<br>
     >>><br>
     >>> I am planning to push my code on phabricator in the next days.<br>
     >>><br>
     >>> thanks,<br>
     >>> Chris<br>
     >>><br>
     >>><br>
     >>> On Fri, Jun 5, 2015 at 3:45 AM, Adve, Vikram Sadanand<br></span>
     >>> <<a href="mailto:vadve@illinois.edu" target="_blank">vadve@illinois.edu</a> <mailto:<a href="mailto:vadve@illinois.edu" target="_blank">vadve@illinois.edu</a>>><div><div class="h5"><br>
     >>> wrote:<br>
     >>>><br>
     >>>><br>
     >>>> Christos,<br>
     >>>><br>
     >>>> We would be very interested in learning more about this.<br>
     >>>><br>
     >>>> In my group, we (Prakalp Srivastava, Maria Kotsifakou and I)<br>
    have been<br>
     >>>> working on LLVM extensions to make it easier to target a wide<br>
    range of<br>
     >>>> accelerators in a heterogeneous mobile device, such as Qualcomm's<br>
     >>>> Snapdragon<br>
     >>>> and other APUs.  Our approach has been to (a) add better<br>
    abstractions of<br>
     >>>> parallelism to the LLVM instruction set that can be mapped<br>
    down to a<br>
     >>>> wide<br>
     >>>> range of parallel hardware accelerators; and (b) to develop<br>
    optimizing<br>
     >>>> "back-end" translators to generate efficient code for the<br>
    accelerators<br>
     >>>> from<br>
     >>>> the extended IR.<br>
     >>>><br>
     >>>> So far, we have been targeting GPUs and vector hardware, but<br>
    semi-custom<br>
     >>>> (programmable) accelerators are our next goal.  We have<br>
    discussed DSPs<br>
     >>>> as a<br>
     >>>> valuable potential goal as well.<br>
     >>>><br>
     >>>> Judging from the brief information here, I'm guessing that our<br>
    projects<br>
     >>>> have been quite complementary.  We have not worked on the<br>
    extraction<br>
     >>>> passes,<br>
     >>>> scheduling, or other run-time components you mention and would<br>
    be happy<br>
     >>>> to<br>
     >>>> use an existing solution for those.  Our hope is that the IR<br>
    extensions<br>
     >>>> and<br>
     >>>> translators will give your schedulers greater flexibility to<br>
    retarget<br>
     >>>> the<br>
     >>>> extracted code components to different accelerators.<br>
     >>>><br>
     >>>> --Vikram S. Adve<br>
     >>>> Visiting Professor, School of Computer and Communication<br>
    Sciences, EPFL<br>
     >>>> Professor, Department of Computer Science<br>
     >>>> University of Illinois at Urbana-Champaign<br></div></div>
     >>>> <a href="mailto:vadve@illinois.edu" target="_blank">vadve@illinois.edu</a> <mailto:<a href="mailto:vadve@illinois.edu" target="_blank">vadve@illinois.edu</a>><span class=""><br>
     >>>> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=e9VKH-Jt_lf_uyiCmVtE2IlYYZhblKRU4OJ4syxQ3iw&s=uz5RSPXDXCZbYbMhTHRfD_CFdVdnuG_LXjQOPqbHsa0&e=" target="_blank">http://llvm.org</a><br>
     >>>><br>
     >>>><br>
     >>>><br>
     >>>><br>
     >>>> On Jun 5, 2015, at 3:18 AM, <a href="mailto:llvmdev-request@cs.uiuc.edu" target="_blank">llvmdev-request@cs.uiuc.edu</a><br></span><span class="">
    <mailto:<a href="mailto:llvmdev-request@cs.uiuc.edu" target="_blank">llvmdev-request@cs.uiuc.edu</a>> wrote:<br>
     >>>><br>
     >>>>> Date: Thu, 4 Jun 2015 17:35:25 -0700<br>
     >>>>> From: Christos Margiolas <<a href="mailto:chrmargiolas@gmail.com" target="_blank">chrmargiolas@gmail.com</a><br></span>
    <mailto:<a href="mailto:chrmargiolas@gmail.com" target="_blank">chrmargiolas@gmail.com</a>>><span class=""><br>
     >>>>> To: LLVM Developers Mailing List <<a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a><br></span>
    <mailto:<a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a>>><span class=""><br>
     >>>>> Subject: [LLVMdev] Supporting heterogeneous computing in llvm.<br>
     >>>>> Message-ID:<br>
     >>>>><br>
     >>>>><br>
    <<a href="mailto:CAC3KUCx0mpBrnrGjDVxQzxtBpnJXtw3herZ_E2pQoSqSyMNsKA@mail.gmail.com" target="_blank">CAC3KUCx0mpBrnrGjDVxQzxtBpnJXtw3herZ_E2pQoSqSyMNsKA@mail.gmail.com</a><br></span>
    <mailto:<a href="mailto:CAC3KUCx0mpBrnrGjDVxQzxtBpnJXtw3herZ_E2pQoSqSyMNsKA@mail.gmail.com" target="_blank">CAC3KUCx0mpBrnrGjDVxQzxtBpnJXtw3herZ_E2pQoSqSyMNsKA@mail.gmail.com</a>>><div><div class="h5"><br>
     >>>>> Content-Type: text/plain; charset="utf-8"<br>
     >>>>><br>
     >>>>> Hello All,<br>
     >>>>><br>
     >>>>> The last two months I have been working on the design and<br>
     >>>>> implementation<br>
     >>>>> of<br>
     >>>>> a heterogeneous execution engine for LLVM. I started this<br>
    project as an<br>
     >>>>> intern at the Qualcomm Innovation Center and I believe it can<br>
    be useful<br>
     >>>>> to<br>
     >>>>> different people and use cases. I am planning to share more<br>
    details and<br>
     >>>>> a<br>
     >>>>> set of patches in the next<br>
     >>>>> days. However, I would first like to see if there is an<br>
    interest for<br>
     >>>>> this.<br>
     >>>>><br>
     >>>>> The project is about providing compiler and runtime support<br>
    for the<br>
     >>>>> automatic and transparent offloading of loop or function<br>
    workloads to<br>
     >>>>> accelerators.<br>
     >>>>><br>
     >>>>> It is composed of the following:<br>
     >>>>> a) Compiler and Transformation Passes for extracting loops or<br>
    functions<br>
     >>>>> for<br>
     >>>>> offloading.<br>
     >>>>> b) A runtime library that handles scheduling, data sharing and<br>
     >>>>> coherency<br>
     >>>>> between the<br>
     >>>>> host and accelerator sides.<br>
     >>>>> c) A modular codebase and design. Adaptors specialize the code<br>
     >>>>> transformations for the target accelerators. Runtime plugins<br>
    manage the<br>
     >>>>> interaction with the different accelerator environments.<br>
     >>>>><br>
     >>>>> So far, this work so far supports the Qualcomm DSP<br>
    accelerator  but I<br>
     >>>>> am<br>
     >>>>> planning to extend it to support OpenCL accelerators. I have also<br>
     >>>>> developed<br>
     >>>>> a debug port where I can test the passes and the runtime without<br>
     >>>>> requiring<br>
     >>>>> an accelerator.<br>
     >>>>><br>
     >>>>><br>
     >>>>> The project is still in early R&D stage and I am looking<br>
    forward for<br>
     >>>>> feedback and to gauge  the interest level. I am willing to<br>
    continue<br>
     >>>>> working<br>
     >>>>> on this as an open source project and bring it to the right<br>
    shape so it<br>
     >>>>> can<br>
     >>>>> be merged with the LLVM tree.<br>
     >>>>><br>
     >>>>><br>
     >>>>> Regards,<br>
     >>>>> Chris<br>
     >>>>><br>
     >>>>> P.S. I intent to join the llvm social in Bay Area tonight and<br>
    I will be<br>
     >>>>> more than happy to talk about it.<br>
     >>>>> -------------- next part --------------<br>
     >>>>> An HTML attachment was scrubbed...<br>
     >>>>> URL:<br>
     >>>>><br>
     >>>>><br>
    <<a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/attachments/20150604/289e4438/attachment-0001.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvmdev/attachments/20150604/289e4438/attachment-0001.html</a>><br>
     >>>><br>
     >>>><br>
     >>>><br>
     >>>> _______________________________________________<br>
     >>>> LLVM Developers mailing list<br></div></div>
     >>>> <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <mailto:<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>><span class=""><br>
    <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
     >>>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
     >>><br>
     >>><br>
     >>><br>
     >>><br>
     >>> _______________________________________________<br>
     >>> LLVM Developers mailing list<br></span>
     >>> <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <mailto:<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>><span class=""><br>
    <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
     >>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
     >>><br>
     >> _______________________________________________<br>
     >> LLVM Developers mailing list<br></span>
     >> <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <mailto:<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>><span class=""><br>
    <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
     >> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
     >><br>
     > _______________________________________________<br>
     > LLVM Developers mailing list<br></span>
     > <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <mailto:<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>><br>
    <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
     > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br>
<br>
</blockquote>
</blockquote></div><br></div>