<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jun 20, 2010, at 1:25 PM, Dale Johannesen wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jun 18, 2010, at 5:44 PM, Evan Cheng wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jun 18, 2010, at 12:00 PM, Dale Johannesen wrote:</div><blockquote type="cite"><div><font class="Apple-style-span"><br></font><br>Added: llvm/trunk/test/CodeGen/ARM/call-tc.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/call-tc.ll?rev=106299&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/call-tc.ll?rev=106299&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/call-tc.ll (added)<br>+++ llvm/trunk/test/CodeGen/ARM/call-tc.ll Fri Jun 18 14:00:18 2010<br>@@ -0,0 +1,36 @@<br>+; RUN: llc < %s -march=arm | FileCheck %s -check-prefix=CHECKV4<br>+; RUN: llc < %s -march=arm -mattr=+v5t | FileCheck %s -check-prefix=CHECKV5<br>+; RUN: llc < %s -march=arm -mtriple=arm-linux-gnueabi\<br>+; RUN:   -relocation-model=pic | FileCheck %s -check-prefix=CHECKELF<br>+<br>+@t = weak global i32 ()* null           ; <i32 ()**> [#uses=1]<br>+<br>+declare void @g(i32, i32, i32, i32)<br>+<br>+define void @f() {<br>+; CHECKELF: PLT<br>+        call void @g( i32 1, i32 2, i32 3, i32 4 )<br></div></blockquote><div><br></div>Why are you testing a non-tail call here?</div></div></blockquote><div><br></div><div>Originally we had call.ll whose behavior changed (correctly) when tail calls were added.  Now call.ll has the "tail" removed in the source, so its ouput is unchanged, while tail-tc.ll is the original tail.ll, modified to check for what should come out with tail calls on.  It is useful to test that things don't change as well as that they do, IMO, but I can remove the stuff that doesn't directly test tail calls if you prefer.</div></div></div></blockquote><div><br></div>If you feel the tests are useful please leave them in. But please do add a comment. I thought you forgot "tail" and was afraid it was checking for the wrong patterns.</div><div><br></div><div>Evan</div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div>+        ret void<br>+}<br>+<br>+define void @g.upgrd.1() {<br>+; CHECKV4: bx r0 @ TAILCALL<br>+; CHECKV5: bx r0 @ TAILCALL<br>+        %tmp = load i32 ()** @t         ; <i32 ()*> [#uses=1]<br>+        %tmp.upgrd.2 = tail call i32 %tmp( )            ; <i32> [#uses=0]<br>+        ret void<br>+}<br>+<br>+define i32* @m_231b(i32, i32, i32*, i32*, i32*) nounwind {<br>+; CHECKV4: m_231b<br>+; CHECKV4: bx r{{.*}}<br>+BB0:<br>+  %5 = inttoptr i32 %0 to i32*                    ; <i32*> [#uses=1]<br>+  %t35 = volatile load i32* %5                    ; <i32> [#uses=1]<br>+  %6 = inttoptr i32 %t35 to i32**                 ; <i32**> [#uses=1]<br>+  %7 = getelementptr i32** %6, i32 86             ; <i32**> [#uses=1]<br>+  %8 = load i32** %7                              ; <i32*> [#uses=1]<br>+  %9 = bitcast i32* %8 to i32* (i32, i32*, i32, i32*, i32*, i32*)* ; <i32* (i32, i32*, i32, i32*, i32*, i32*)*> [#uses=1]<br>+  %10 = call i32* %9(i32 %0, i32* null, i32 %1, i32* %2, i32* %3, i32* %4) ; <i32*> [#uses=1]<br></div></blockquote><div><br></div>Same here.</div><div><br></div><div>Evan</div><div><br><blockquote type="cite"><div>+  ret i32* %10<br>+}<br><br>Added: llvm/trunk/test/CodeGen/ARM/ifcvt6-tc.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ifcvt6-tc.ll?rev=106299&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ifcvt6-tc.ll?rev=106299&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/ifcvt6-tc.ll (added)<br>+++ llvm/trunk/test/CodeGen/ARM/ifcvt6-tc.ll Fri Jun 18 14:00:18 2010<br>@@ -0,0 +1,23 @@<br>+; RUN: llc < %s -march=arm -mtriple=arm-apple-darwin | \<br>+; RUN:   grep cmpne | count 1<br>+; RUN: llc < %s -march=arm -mtriple=arm-apple-darwin | \<br>+; RUN:   grep bhi | count 1<br>+; Here, tail call wins over eliminating branches.  It is 1 fewer instruction<br>+; and removes all stack accesses, so seems like a win.<br>+<br>+define void @foo(i32 %X, i32 %Y) {<br>+entry:<br>+<span class="Apple-tab-span" style="white-space:pre">      </span>%tmp1 = icmp ult i32 %X, 4<span class="Apple-tab-span" style="white-space:pre">  </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>%tmp4 = icmp eq i32 %Y, 0<span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>%tmp7 = or i1 %tmp4, %tmp1<span class="Apple-tab-span" style="white-space:pre">  </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>br i1 %tmp7, label %cond_true, label %UnifiedReturnBlock<br>+<br>+cond_true:<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %entry<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>%tmp10 = tail call i32 (...)* @bar( )<span class="Apple-tab-span" style="white-space:pre">       </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=0]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>ret void<br>+<br>+UnifiedReturnBlock:<span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %entry<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>ret void<br>+}<br>+<br>+declare i32 @bar(...)<br><br>Added: llvm/trunk/test/CodeGen/ARM/insn-sched1-tc.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/insn-sched1-tc.ll?rev=106299&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/insn-sched1-tc.ll?rev=106299&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/insn-sched1-tc.ll (added)<br>+++ llvm/trunk/test/CodeGen/ARM/insn-sched1-tc.ll Fri Jun 18 14:00:18 2010<br>@@ -0,0 +1,11 @@<br>+; RUN: llc < %s -march=arm -mattr=+v6<br>+; RUN: llc < %s -mtriple=arm-apple-darwin -mattr=+v6 |\<br>+; RUN:   grep mov | count 2<br>+<br>+define i32 @test(i32 %x) {<br>+        %tmp = trunc i32 %x to i16              ; <i16> [#uses=1]<br>+        %tmp2 = tail call i32 @f( i32 1, i16 %tmp )             ; <i32> [#uses=1]<br>+        ret i32 %tmp2<br>+}<br>+<br>+declare i32 @f(i32, i16)<br><br>Added: llvm/trunk/test/CodeGen/ARM/ldm-tc.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ldm-tc.ll?rev=106299&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ldm-tc.ll?rev=106299&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/ldm-tc.ll (added)<br>+++ llvm/trunk/test/CodeGen/ARM/ldm-tc.ll Fri Jun 18 14:00:18 2010<br>@@ -0,0 +1,37 @@<br>+; RUN: llc < %s -mtriple=arm-apple-darwin | FileCheck %s<br>+<br>+@X = external global [0 x i32]          ; <[0 x i32]*> [#uses=5]<br>+<br>+define i32 @t1() {<br>+; CHECK: t1:<br>+; CHECK: ldmia<br>+        %tmp = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 0)            ; <i32> [#uses=1]<br>+        %tmp3 = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 1)           ; <i32> [#uses=1]<br>+        %tmp4 = tail call i32 @f1( i32 %tmp, i32 %tmp3 )                ; <i32> [#uses=1]<br>+        ret i32 %tmp4<br>+}<br>+<br>+define i32 @t2() {<br>+; CHECK: t2:<br>+; CHECK: ldmia<br>+        %tmp = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 2)            ; <i32> [#uses=1]<br>+        %tmp3 = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 3)           ; <i32> [#uses=1]<br>+        %tmp5 = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 4)           ; <i32> [#uses=1]<br>+        %tmp6 = tail call i32 @f2( i32 %tmp, i32 %tmp3, i32 %tmp5 )             ; <i32> [#uses=1]<br>+        ret i32 %tmp6<br>+}<br>+<br>+define i32 @t3() {<br>+; CHECK: t3:<br>+; CHECK: ldmib<br>+; CHECK: b.w _f2 @ TAILCALL<br>+        %tmp = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 1)            ; <i32> [#uses=1]<br>+        %tmp3 = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 2)           ; <i32> [#uses=1]<br>+        %tmp5 = load i32* getelementptr ([0 x i32]* @X, i32 0, i32 3)           ; <i32> [#uses=1]<br>+        %tmp6 = tail call i32 @f2( i32 %tmp, i32 %tmp3, i32 %tmp5 )             ; <i32> [#uses=1]<br>+        ret i32 %tmp6<br>+}<br>+<br>+declare i32 @f1(i32, i32)<br>+<br>+declare i32 @f2(i32, i32, i32)<br><br>Added: llvm/trunk/test/CodeGen/Thumb2/thumb2-call-tc.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/thumb2-call-tc.ll?rev=106299&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/thumb2-call-tc.ll?rev=106299&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/Thumb2/thumb2-call-tc.ll (added)<br>+++ llvm/trunk/test/CodeGen/Thumb2/thumb2-call-tc.ll Fri Jun 18 14:00:18 2010<br>@@ -0,0 +1,27 @@<br>+; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mattr=+thumb2 | FileCheck %s -check-prefix=DARWIN<br>+; RUN: llc < %s -mtriple=thumbv7-linux -mattr=+thumb2 | FileCheck %s -check-prefix=LINUX<br>+<br>+@t = weak global i32 ()* null           ; <i32 ()**> [#uses=1]<br>+<br>+declare void @g(i32, i32, i32, i32)<br>+<br>+define void @f() {<br>+; DARWIN: f:<br>+; DARWIN: blx _g<br>+<br>+; LINUX: f:<br>+; LINUX: bl g<br>+        call void @g( i32 1, i32 2, i32 3, i32 4 )<br>+        ret void<br>+}<br>+<br>+define void @h() {<br>+; DARWIN: h:<br>+; DARWIN: bx r0 @ TAILCALL<br>+<br>+; LINUX: h:<br>+; LINUX: bx r0 @ TAILCALL<br>+        %tmp = load i32 ()** @t         ; <i32 ()*> [#uses=1]<br>+        %tmp.upgrd.2 = tail call i32 %tmp( )            ; <i32> [#uses=0]<br>+        ret void<br>+}<br><br>Added: llvm/trunk/test/CodeGen/Thumb2/thumb2-ifcvt1-tc.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/thumb2-ifcvt1-tc.ll?rev=106299&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/thumb2-ifcvt1-tc.ll?rev=106299&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/Thumb2/thumb2-ifcvt1-tc.ll (added)<br>+++ llvm/trunk/test/CodeGen/Thumb2/thumb2-ifcvt1-tc.ll Fri Jun 18 14:00:18 2010<br>@@ -0,0 +1,86 @@<br>+; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s<br>+<br>+define i32 @t1(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {<br>+; CHECK: t1:<br>+; CHECK: it ne<br>+; CHECK: cmpne<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>switch i32 %c, label %cond_next [<br>+<span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">    </span> i32 1, label %cond_true<br>+<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre">    </span> i32 7, label %cond_true<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>]<br>+<br>+cond_true:<br>+<span class="Apple-tab-span" style="white-space:pre">        </span>%tmp12 = add i32 %a, 1<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>%tmp1518 = add i32 %tmp12, %b<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>ret i32 %tmp1518<br>+<br>+cond_next:<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>%tmp15 = add i32 %b, %a<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>ret i32 %tmp15<br>+}<br>+<br>+; FIXME: Check for # of unconditional branch after adding branch folding post ifcvt.<br>+define i32 @t2(i32 %a, i32 %b) nounwind {<br>+entry:<br>+; CHECK: t2:<br>+; CHECK: ite gt<br>+; CHECK: subgt<br>+; CHECK: suble<br>+<span class="Apple-tab-span" style="white-space:pre">     </span>%tmp1434 = icmp eq i32 %a, %b<span class="Apple-tab-span" style="white-space:pre">       </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>br i1 %tmp1434, label %bb17, label %bb.outer<br>+<br>+bb.outer:<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %cond_false, %entry<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>%b_addr.021.0.ph = phi i32 [ %b, %entry ], [ %tmp10, %cond_false ]<span class="Apple-tab-span" style="white-space:pre">  </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=5]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%a_addr.026.0.ph = phi i32 [ %a, %entry ], [ %a_addr.026.0, %cond_false ]<span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>br label %bb<br>+<br>+bb:<span class="Apple-tab-span" style="white-space:pre">       </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %cond_true, %bb.outer<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%indvar = phi i32 [ 0, %bb.outer ], [ %indvar.next, %cond_true ]<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=2]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%tmp. = sub i32 0, %b_addr.021.0.ph<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%tmp.40 = mul i32 %indvar, %tmp.<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%a_addr.026.0 = add i32 %tmp.40, %a_addr.026.0.ph<span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=6]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%tmp3 = icmp sgt i32 %a_addr.026.0, %b_addr.021.0.ph<span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>br i1 %tmp3, label %cond_true, label %cond_false<br>+<br>+cond_true:<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %bb<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>%tmp7 = sub i32 %a_addr.026.0, %b_addr.021.0.ph<span class="Apple-tab-span" style="white-space:pre">     </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=2]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%tmp1437 = icmp eq i32 %tmp7, %b_addr.021.0.ph<span class="Apple-tab-span" style="white-space:pre">      </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>%indvar.next = add i32 %indvar, 1<span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>br i1 %tmp1437, label %bb17, label %bb<br>+<br>+cond_false:<span class="Apple-tab-span" style="white-space:pre">     </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %bb<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>%tmp10 = sub i32 %b_addr.021.0.ph, %a_addr.026.0<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=2]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>%tmp14 = icmp eq i32 %a_addr.026.0, %tmp10<span class="Apple-tab-span" style="white-space:pre">  </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>br i1 %tmp14, label %bb17, label %bb.outer<br>+<br>+bb17:<span class="Apple-tab-span" style="white-space:pre">       </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %cond_false, %cond_true, %entry<br>+<span class="Apple-tab-span" style="white-space:pre">        </span>%a_addr.026.1 = phi i32 [ %a, %entry ], [ %tmp7, %cond_true ], [ %a_addr.026.0, %cond_false ]<span class="Apple-tab-span" style="white-space:pre">       </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>ret i32 %a_addr.026.1<br>+}<br>+<br>+@x = external global i32*<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32**> [#uses=1]<br>+<br>+define void @foo(i32 %a) nounwind {<br>+entry:<br>+<span class="Apple-tab-span" style="white-space:pre">      </span>%tmp = load i32** @x<span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i32*> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>store i32 %a, i32* %tmp<br>+<span class="Apple-tab-span" style="white-space:pre">  </span>ret void<br>+}<br>+<br>+; Tail call prevents use of ifcvt in this one.  Seems like a win though.<br>+define void @t3(i32 %a, i32 %b) nounwind {<br>+entry:<br>+; CHECK: t3:<br>+; CHECK-NOT: it lt<br>+; CHECK-NOT: poplt<br>+; CHECK: b.w _foo @ TAILCALL<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>%tmp1 = icmp sgt i32 %a, 10<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre">    </span>; <i1> [#uses=1]<br>+<span class="Apple-tab-span" style="white-space:pre">   </span>br i1 %tmp1, label %cond_true, label %UnifiedReturnBlock<br>+<br>+cond_true:<span class="Apple-tab-span" style="white-space:pre">    </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %entry<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>tail call void @foo( i32 %b )<br>+<span class="Apple-tab-span" style="white-space:pre">    </span>ret void<br>+<br>+UnifiedReturnBlock:<span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>; preds = %entry<br>+<span class="Apple-tab-span" style="white-space:pre"> </span>ret void<br>+}<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br></div></blockquote></div><br></div></blockquote></div><br></div></blockquote></div><br></body></html>