<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">On trunk it looks like Penryn is back to normal, Haswell has improved, but is still not back to the pre-r207940 levels (the results aren’t totally consistent, but I’d say it still likes like a ~30% regression).<div><br></div><div>Louis</div><div><br><div><div>On May 8, 2014, at 10:20 AM, Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">----- Original Message -----<br><blockquote type="cite">From: "Louis Gerbarg" <<a href="mailto:lgg@apple.com">lgg@apple.com</a>><br>To: "Hal Finkel" <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>><br>Cc: "llvm-commits" <<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a>>, "Benjamin Kramer" <<a href="mailto:benny.kra@gmail.com">benny.kra@gmail.com</a>><br>Sent: Thursday, May 8, 2014 12:18:07 PM<br>Subject: Re: [llvm] r207940 - LoopUnroll: If we're doing partial unrolling, use the PartialThreshold to limit<br>unrolling.<br><br>That is what I got out of "clang -S -emit-llvm -O3 -mllvm<br>-x86-partial-unrolling-threshold=0 -mllvm<br>-x86-partial-max-branches=0 Bubblesort.c”<br><br><br>If you want me to prep it some other way I can. The source is part of<br>the test-suite if you would prefer to look at it yourself:<br><a href="http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Stanford/Bubblesort.c?revision=6132&view=markup">http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Stanford/Bubblesort.c?revision=6132&view=markup</a><br><br></blockquote><br>Hrmm... okay; I'll look at it.<br><br>In the mean time, is current trunk doing the right thing for this now?<br><br>-Hal<br><br><blockquote type="cite"><br><br>Louis<br><br><br><br><br><br>On May 8, 2014, at 2:03 AM, Hal Finkel < <a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a> > wrote:<br><br><br><br>Louis,<br><br>Thanks! I don't think this is the un-unrolled version, however.<br>Running the unroller shows:<br><br>Loop Unroll: F[Bubble] Loop %<br>Loop Size = 40<br>Too large to fully unroll with count: 8 because size: 320>150<br>could not unroll partially<br>Loop Unroll: F[Bubble] Loop %<br>Loop Size = 49<br>Too large to fully unroll with count: 8 because size: 392>150<br>could not unroll partially<br><br>Could you please double-check?<br><br>-Hal<br><br>----- Original Message -----<br><br><br>From: "Louis Gerbarg" < <a href="mailto:lgg@apple.com">lgg@apple.com</a> ><br>To: "Hal J. Finkel" < <a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a> ><br>Cc: "llvm-commits" < <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a> >, "Benjamin Kramer" <<br><a href="mailto:benny.kra@gmail.com">benny.kra@gmail.com</a> ><br>Sent: Wednesday, May 7, 2014 6:08:51 PM<br>Subject: Re: [llvm] r207940 - LoopUnroll: If we're doing partial<br>unrolling, use the PartialThreshold to limit<br>unrolling.<br><br><br>Per IRC, here is the ll file of the un-unrolled Bubblesort.<br>Experimentally on Haswell I see us return to approximately our<br>original performance at a micro-op threshold of 44 (and around a<br>15-20% regression between that and 43). This testing is all on my<br>desktop which is not necessarily quiescent and the test is somewhat<br>short so I am not sure if there might a bit of tail coming of on for<br>the last couple percentage points.<br><br><br>Numbers were obtained as follows:<br><br>../bad/bin/opt -O3 -x86-partial-unrolling-threshold=43<br>-x86-partial-max-branches=40000 -S < Bubblesort.ll >> BS43.ll<br><br>../bad/bin/opt -O3 -x86-partial-unrolling-threshold=44<br>-x86-partial-max-branches=40000 -S < Bubblesort.ll >> BS44.ll<br><br><br>Louis<br><br><br><br><br><br><br><br><br>On May 6, 2014, at 10:03 AM, Louis Gerbarg < <a href="mailto:lgg@apple.com">lgg@apple.com</a> > wrote:<br><br><br><br><br><br>On May 6, 2014, at 9:41 AM, Hal Finkel < <a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a> > wrote:<br><br><br>----- Original Message -----<br><br><br>From: "Louis Gerbarg" < <a href="mailto:lgg@apple.com">lgg@apple.com</a> ><br>To: "Hal Finkel" < <a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a> ><br>Cc: "llvm-commits" < <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a> >, "Benjamin Kramer" <<br><a href="mailto:benny.kra@gmail.com">benny.kra@gmail.com</a> ><br>Sent: Tuesday, May 6, 2014 11:27:44 AM<br>Subject: Re: [llvm] r207940 - LoopUnroll: If we're doing partial<br>unrolling, use the PartialThreshold to limit<br>unrolling.<br><br><br><br><br>On May 6, 2014, at 12:26 AM, Hal Finkel < <a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a> > wrote:<br><br><br>----- Original Message -----<br><br><br>From: "Louis Gerbarg" < <a href="mailto:lgg@apple.com">lgg@apple.com</a> ><br>To: "Benjamin Kramer" < <a href="mailto:benny.kra@gmail.com">benny.kra@gmail.com</a> ><br>Cc: "llvm-commits" < <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a> ><br>Sent: Monday, May 5, 2014 9:21:32 PM<br>Subject: Re: [llvm] r207940 - LoopUnroll: If we're doing partial<br>unrolling, use the PartialThreshold to limit<br>unrolling.<br><br>I am seeing what appears to be significant regressions on some of the<br>nightly tests from this patch. For example the following benches all<br>show 50-100% slowdowns when I apply the patch:<br><br>SingleSource/Benchmarks/Stanford/Bubblesort<br>SingleSource/Benchmarks/Polybench/linear-algebra/solvers/dynprog/dynprog<br>MultiSource/Benchmarks/FreeBench/neural/neural<br><br>To be clear, on what system is that?<br><br><br>I’ve confirmed the regressions personally on Haswell. Looking at our<br>buildbots it also appears to be occurring on Sandybridge and Penryn<br>(though with some variation, the bubblesort regression is ~100% on<br>Haswell, it is 120% on Penryn).<br><br><br><br><br><br>Generally speaking, if you use -mllvm<br>-x86-partial-unrolling-threshold=N as you increase the value of N<br>does that improve things for you? The current values for the<br>unrolling were taken from the optimization manual (and I'm guessing<br>is some value like 28 for your system; see<br>X86TTI::getUnrollingPreferences in<br>lib/Target/X86/X86TargetTransformInfo.cpp), but was not actually<br>tuned experimentally. Perhaps this could use some improvement.<br><br><br><br><br>No. In fact, the regressed numbers are all stable and appear to occur<br>at any value of -x86-partial-unrolling-threshold. I also see the<br>regressions even without r207940 if I pass<br>-x86-partial-unrolling-threshold. Some quick and dirty numbers from<br>my Haswell system:<br><br>That's interesting. Thanks for helping with this! My hypothesis is<br>that either:<br>1. None of those are large enough (try 60000 and see if it does<br>anything).<br>2. You're hitting the branch cutoff: try setting<br>-x86-partial-max-branches=40000 (or something else really large) and<br>then try again.<br><br><br>#2 appears to be the main issue, though it appears an unrolling<br>threshold of 28 is also low enough to be causing some regressions<br>once the cut off is taken care of, at least when r207940 is in the<br>mix.<br><br><br>Louis<br><br><br><br>WITHOUT r207940 and with just larger<br>-x86-partial-unrolling-thresholds:<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=0 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.032s<br>user 0m0.028s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.014s<br>user 0m0.011s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=60000 Bubblesort.c && time ./a.out<br><br><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=600000 Bubblesort.c && time ./a.out<br><br><br>/dev/null<br><br><br>real 0m0.031s<br>user 0m0.027s<br>sys 0m0.001s<br><br><br><br><br>WITHOUT r207940 and with -x86-partial-max-branches:<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=28 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.015s<br>user 0m0.011s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=0 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.014s<br>user 0m0.011s<br>sys 0m0.001s<br><br><br><br><br>WITH r207940 and with -x86-partial-max-branches:<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=0 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=28 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.017s<br>user 0m0.014s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=28 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.016s<br>user 0m0.013s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=40 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.017s<br>user 0m0.013s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=60 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.015s<br>user 0m0.011s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=60 -mllvm<br>-x86-partial-max-branches=40000 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.014s<br>user 0m0.011s<br>sys 0m0.001s<br><br><br><br><br><br><br><br>BASELINE:<br><br>bash-3.2$ ../good/bin/clang -O3 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.021s<br>user 0m0.011s<br>sys 0m0.001s<br><br><br>WITHOUT r207940:<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=0 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.032s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=18 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=28 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=40 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=60 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br><br><br><br><br>bash-3.2$ ../good/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=600 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br><br><br>WITH r207940:<br>bash-3.2$ ../bad/bin/clang -O3 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s..<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=0 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=18 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=28 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=40 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=60 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.031s<br>user 0m0.028s<br>sys 0m0.001s<br>bash-3.2$ ../bad/bin/clang -O3 -mllvm<br>-x86-partial-unrolling-threshold=600 Bubblesort.c && time ./a.out ><br>/dev/null<br><br><br>real 0m0.030s<br>user 0m0.027s<br>sys 0m0.001s<br>bash-3.2$<br><br><br>Louis<br><br><br>-Hal<br><br><br><br><br>Louis<br><br>On May 5, 2014, at 3:09 AM, Benjamin Kramer < <a href="mailto:benny.kra@gmail.com">benny.kra@gmail.com</a> ><br>wrote:<br><br><br><br><br>On 05.05.2014, at 01:18, Nadav Rotem < <a href="mailto:nrotem@apple.com">nrotem@apple.com</a> > wrote:<br><br><br><br>Hi Ben,<br><br>Thanks for working on this. Overall it sounds like a good change<br>and unrolling 8 times sounds way too high, even for small loops.<br>Did you get a chance to measure the performance difference of<br>this patch?<br><br>I didn't find any significant runtime change in the test suite or<br>when trying some of the synthetic benchmarks that were showing<br>extreme unrolling. Code size is a bit better though.<br><br>I initially observed this behavior when looking into the vectorizer<br>( <a href="http://llvm.org/bugs/show_bug.cgi?id=14985">http://llvm.org/bugs/show_bug.cgi?id=14985</a> ) For the trivial<br>loop in the test case we used to unroll 2x in the loop vectorizer<br>(that's a good thing) and then up to another 8x in the loop<br>unroller, when we're targeting core2 or higher. I asked Hal and he<br>agreed that we were unrolling too much.<br><br>I guess it makes sense to actually use the threshold derived from<br>the processor manuals to drive unrolling instead of assuming that<br>more unrolling is better :)<br><br>- Ben<br><br><br><br><br>Thanks,<br>Nadav<br><br><br>On May 4, 2014, at 12:12 PM, Benjamin Kramer<br>< <a href="mailto:benny.kra@googlemail.com">benny.kra@googlemail.com</a> > wrote:<br><br><br><br>Author: d0k<br>Date: Sun May 4 14:12:38 2014<br>New Revision: 207940<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=207940&view=rev">http://llvm.org/viewvc/llvm-project?rev=207940&view=rev</a><br>Log:<br>LoopUnroll: If we're doing partial unrolling, use the<br>PartialThreshold to limit unrolling.<br><br>Otherwise we use the same threshold as for complete unrolling,<br>which is<br>way too high. This made us unroll any loop smaller than 150<br>instructions<br>by 8 times, but only if someone specified -march=core2 or better,<br>which happens to be the default on darwin.<br><br>Modified:<br>llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>llvm/trunk/test/Transforms/LoopUnroll/X86/partial.ll<br><br>Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>URL:<br><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=207940&r1=207939&r2=207940&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=207940&r1=207939&r2=207940&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>(original)<br>+++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Sun May<br>4 14:12:38 2014<br>@@ -238,9 +238,12 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPa<br>return false;<br>}<br>uint64_t Size = (uint64_t)LoopSize*Count;<br>- if (TripCount != 1 && Size > Threshold) {<br>- DEBUG(dbgs() << " Too large to fully unroll with count: "<br><< Count<br>- << " because size: " << Size << ">" << Threshold <<<br>"\n");<br>+ if (TripCount != 1 &&<br>+ (Size > Threshold || (Count != TripCount && Size ><br>PartialThreshold))) {<br>+ if (Size > Threshold)<br>+ DEBUG(dbgs() << " Too large to fully unroll with count:<br>" << Count<br>+ << " because size: " << Size << ">" <<<br>Threshold << "\n");<br>+<br>bool AllowPartial = UserAllowPartial ? CurrentAllowPartial :<br>UP.Partial;<br>if (!AllowPartial && !(Runtime && TripCount == 0)) {<br>DEBUG(dbgs() << " will not try to unroll partially because<br>"<br><br>Modified: llvm/trunk/test/Transforms/LoopUnroll/X86/partial.ll<br>URL:<br>http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/X86/partial.ll?rev=207940&r1=207939&r2=207940&view=diff<br>==============================================================================<br>--- llvm/trunk/test/Transforms/LoopUnroll/X86/partial.ll<br>(original)<br>+++ llvm/trunk/test/Transforms/LoopUnroll/X86/partial.ll Sun May<br>4 14:12:38 2014<br>@@ -76,5 +76,52 @@ for.end:<br>ret void<br>}<br><br>+define zeroext i16 @test1(i16* nocapture readonly %arr, i32 %n)<br>#0 {<br>+entry:<br>+ %cmp25 = icmp eq i32 %n, 0<br>+ br i1 %cmp25, label %for.end, label %for.body<br>+<br>+for.body: ; preds =<br>%entry, %for.body<br>+ %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0,<br>%entry ]<br>+ %reduction.026 = phi i16 [ %add14, %for.body ], [ 0, %entry ]<br>+ %arrayidx = getelementptr inbounds i16* %arr, i64 %indvars.iv<br>+ %0 = load i16* %arrayidx, align 2<br>+ %add = add i16 %0, %reduction.026<br>+ %sext = mul i64 %indvars.iv, 12884901888<br>+ %idxprom3 = ashr exact i64 %sext, 32<br>+ %arrayidx4 = getelementptr inbounds i16* %arr, i64 %idxprom3<br>+ %1 = load i16* %arrayidx4, align 2<br>+ %add7 = add i16 %add, %1<br>+ %sext28 = mul i64 %indvars.iv, 21474836480<br>+ %idxprom10 = ashr exact i64 %sext28, 32<br>+ %arrayidx11 = getelementptr inbounds i16* %arr, i64 %idxprom10<br>+ %2 = load i16* %arrayidx11, align 2<br>+ %add14 = add i16 %add7, %2<br>+ %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1<br>+ %lftr.wideiv = trunc i64 %indvars.iv.next to i32<br>+ %exitcond = icmp eq i32 %lftr.wideiv, %n<br>+ br i1 %exitcond, label %for.end, label %for.body<br>+<br>+for.end: ; preds =<br>%for.body, %entry<br>+ %reduction.0.lcssa = phi i16 [ 0, %entry ], [ %add14,<br>%for.body ]<br>+ ret i16 %reduction.0.lcssa<br>+<br>+; This loop is too large to be partially unrolled (size=16)<br>+<br>+; CHECK-LABEL: @test1<br>+; CHECK: br<br>+; CHECK: br<br>+; CHECK: br<br>+; CHECK: br<br>+; CHECK-NOT: br<br>+<br>+; CHECK-NOUNRL-LABEL: @test1<br>+; CHECK-NOUNRL: br<br>+; CHECK-NOUNRL: br<br>+; CHECK-NOUNRL: br<br>+; CHECK-NOUNRL: br<br>+; CHECK-NOUNRL-NOT: br<br>+}<br>+<br>attributes #0 = { nounwind uwtable }<br><br><br><br>_______________________________________________<br>llvm-commits mailing list<br>llvm-commits@cs.uiuc.edu<br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br><br><br><br>_______________________________________________<br>llvm-commits mailing list<br>llvm-commits@cs.uiuc.edu<br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br><br>_______________________________________________<br>llvm-commits mailing list<br>llvm-commits@cs.uiuc.edu<br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br><br><br>--<br>Hal Finkel<br>Assistant Computational Scientist<br>Leadership Computing Facility<br>Argonne National Laboratory<br><br><br>--<br>Hal Finkel<br>Assistant Computational Scientist<br>Leadership Computing Facility<br>Argonne National Laboratory<br>_______________________________________________<br>llvm-commits mailing list<br>llvm-commits@cs.uiuc.edu<br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br><br><br>--<br>Hal Finkel<br>Assistant Computational Scientist<br>Leadership Computing Facility<br>Argonne National Laboratory<br><br></blockquote><br>--<span class="Apple-converted-space"> </span><br>Hal Finkel<br>Assistant Computational Scientist<br>Leadership Computing Facility<br>Argonne National Laboratory</div></blockquote></div><br></div></body></html>