[llvm] r244920 - Emit argmemonly attribute for intrinsics.

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 11:16:34 PDT 2015


This change caused the following bot failure:

http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/12131/consoleFull#6159817088254eaf0-7326-4999-85b0-388101f2d404 <http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_check/12131/consoleFull#6159817088254eaf0-7326-4999-85b0-388101f2d404>

-Chris

> On Aug 13, 2015, at 10:40 AM, Igor Laevsky via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: igor.laevsky
> Date: Thu Aug 13 12:40:04 2015
> New Revision: 244920
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=244920&view=rev
> Log:
> Emit argmemonly attribute for intrinsics.
> 
> Differential Revision: http://reviews.llvm.org/D11352
> 
> 
> Modified:
>    llvm/trunk/test/Analysis/BasicAA/cs-cs.ll
>    llvm/trunk/test/Analysis/BasicAA/intrinsics.ll
>    llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll
>    llvm/trunk/test/Bitcode/compatibility-3.6.ll
>    llvm/trunk/test/Bitcode/compatibility.ll
>    llvm/trunk/test/Transforms/Inline/inline_invoke.ll
>    llvm/trunk/test/Transforms/Inline/noalias-calls.ll
>    llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll
>    llvm/trunk/test/Transforms/ObjCARC/nested.ll
>    llvm/trunk/utils/TableGen/CodeGenIntrinsics.h
>    llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp
> 
> Modified: llvm/trunk/test/Analysis/BasicAA/cs-cs.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/cs-cs.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/BasicAA/cs-cs.ll (original)
> +++ llvm/trunk/test/Analysis/BasicAA/cs-cs.ll Thu Aug 13 12:40:04 2015
> @@ -22,18 +22,18 @@ entry:
> ; CHECK-LABEL: Function: test1:
> 
> ; CHECK: NoAlias:      i8* %p, i8* %q
> -; CHECK: Just Ref:  Ptr: i8* %p        <->  %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:  Ptr: i8* %q        <->  %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> +; CHECK: Just Ref:  Ptr: i8* %p        <->  %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:  Ptr: i8* %q        <->  %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> ; CHECK: NoModRef:  Ptr: i8* %p        <->  call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16)
> ; CHECK: Both ModRef:  Ptr: i8* %q     <->  call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16)
> -; CHECK: Just Ref:  Ptr: i8* %p        <->  %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:  Ptr: i8* %q        <->  %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1 <->   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16)
> -; CHECK: NoModRef:   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1 <->   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) <->   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) <->   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1 <->   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1
> -; CHECK: NoModRef:   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #1 <->   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16)
> +; CHECK: Just Ref:  Ptr: i8* %p        <->  %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:  Ptr: i8* %q        <->  %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4 <->   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16)
> +; CHECK: NoModRef:   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4 <->   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) <->   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) <->   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4 <->   %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4
> +; CHECK: NoModRef:   %b = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) #4 <->   call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16)
> }
> 
> define void @test2(i8* %P, i8* %Q) nounwind ssp {
> @@ -233,7 +233,9 @@ define void @test6(i8* %P) nounwind ssp
> ; CHECK: Just Ref:   call void @a_readonly_func(i8* %P) <->   call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false)
> }
> 
> -attributes #0 = { nounwind readonly }
> -attributes #1 = { nounwind }
> +attributes #0 = { nounwind readonly argmemonly }
> +attributes #1 = { nounwind argmemonly }
> attributes #2 = { noinline nounwind readonly }
> attributes #3 = { nounwind ssp }
> +attributes #4 = { nounwind }
> +
> 
> Modified: llvm/trunk/test/Analysis/BasicAA/intrinsics.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/intrinsics.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/BasicAA/intrinsics.ll (original)
> +++ llvm/trunk/test/Analysis/BasicAA/intrinsics.ll Thu Aug 13 12:40:04 2015
> @@ -38,5 +38,6 @@ entry:
> declare <8 x i16> @llvm.arm.neon.vld1.v8i16(i8*, i32) nounwind readonly
> declare void @llvm.arm.neon.vst1.v8i16(i8*, <8 x i16>, i32) nounwind
> 
> -; CHECK: attributes #0 = { nounwind readonly }
> +; CHECK: attributes #0 = { nounwind readonly argmemonly }
> +; CHECK: attributes #1 = { nounwind argmemonly }
> ; CHECK: attributes [[ATTR]] = { nounwind }
> 
> Modified: llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll (original)
> +++ llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll Thu Aug 13 12:40:04 2015
> @@ -22,7 +22,8 @@ entry:
> declare <8 x i16> @llvm.arm.neon.vld1.v8i16(i8*, i32) nounwind readonly
> declare void @llvm.arm.neon.vst1.v8i16(i8*, <8 x i16>, i32) nounwind
> 
> -; CHECK: attributes #0 = { nounwind readonly }
> +; CHECK: attributes #0 = { nounwind readonly argmemonly }
> +; CHECK: attributes #1 = { nounwind argmemonly }
> ; CHECK: attributes [[NUW]] = { nounwind }
> 
> !0 = !{!"tbaa root", null}
> 
> Modified: llvm/trunk/test/Bitcode/compatibility-3.6.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-3.6.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-3.6.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-3.6.ll Thu Aug 13 12:40:04 2015
> @@ -981,7 +981,7 @@ exit:
>   ; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>
> 
>   call void @f.nobuiltin() builtin
> -  ; CHECK: call void @f.nobuiltin() #31
> +  ; CHECK: call void @f.nobuiltin() #33
> 
>   call fastcc noalias i32* @f.noalias() noinline
>   ; CHECK: call fastcc noalias i32* @f.noalias() #11
> @@ -1179,7 +1179,11 @@ define void @intrinsics.codegen() {
> ; CHECK: attributes #26 = { sspstrong }
> ; CHECK: attributes #27 = { uwtable }
> ; CHECK: attributes #28 = { "cpu"="cortex-a8" }
> -; CHECK: attributes #31 = { builtin }
> +; CHECK: attributes #29 = { nounwind readnone }
> +; CHECK: attributes #30 = { nounwind readonly argmemonly }
> +; CHECK: attributes #31 = { nounwind argmemonly }
> +; CHECK: attributes #32 = { nounwind readonly }
> +; CHECK: attributes #33 = { builtin }
> 
> ;; Metadata
> 
> 
> Modified: llvm/trunk/test/Bitcode/compatibility.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility.ll Thu Aug 13 12:40:04 2015
> @@ -1024,7 +1024,7 @@ exit:
>   ; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>
> 
>   call void @f.nobuiltin() builtin
> -  ; CHECK: call void @f.nobuiltin() #34
> +  ; CHECK: call void @f.nobuiltin() #36
> 
>   call fastcc noalias i32* @f.noalias() noinline
>   ; CHECK: call fastcc noalias i32* @f.noalias() #12
> @@ -1245,8 +1245,10 @@ define void @misc.metadata() {
> ; CHECK: attributes #30 = { uwtable }
> ; CHECK: attributes #31 = { "cpu"="cortex-a8" }
> ; CHECK: attributes #32 = { nounwind readnone }
> -; CHECK: attributes #33 = { nounwind readonly }
> -; CHECK: attributes #34 = { builtin }
> +; CHECK: attributes #33 = { nounwind readonly argmemonly }
> +; CHECK: attributes #34 = { nounwind argmemonly }
> +; CHECK: attributes #35 = { nounwind readonly }
> +; CHECK: attributes #36 = { builtin }
> 
> ;; Metadata
> 
> 
> Modified: llvm/trunk/test/Transforms/Inline/inline_invoke.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/inline_invoke.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/Inline/inline_invoke.ll (original)
> +++ llvm/trunk/test/Transforms/Inline/inline_invoke.ll Thu Aug 13 12:40:04 2015
> @@ -344,4 +344,5 @@ terminate:
> ; CHECK: attributes [[NUW]] = { nounwind }
> ; CHECK: attributes #1 = { nounwind readnone }
> ; CHECK: attributes #2 = { ssp uwtable }
> -; CHECK: attributes #3 = { noreturn nounwind }
> +; CHECK: attributes #3 = { nounwind argmemonly }
> +; CHECK: attributes #4 = { noreturn nounwind }
> 
> Modified: llvm/trunk/test/Transforms/Inline/noalias-calls.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/noalias-calls.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/Inline/noalias-calls.ll (original)
> +++ llvm/trunk/test/Transforms/Inline/noalias-calls.ll Thu Aug 13 12:40:04 2015
> @@ -16,24 +16,25 @@ entry:
>   ret void
> }
> 
> -define void @foo(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #1 {
> +define void @foo(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #2 {
> entry:
>   tail call void @hello(i8* %a, i8* %c, i8* %b)
>   ret void
> }
> 
> -; CHECK: define void @foo(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #1 {
> +; CHECK: define void @foo(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #2 {
> ; CHECK: entry:
> -; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 16, i32 16, i1 false) #0, !noalias !0
> -; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %c, i64 16, i32 16, i1 false) #0, !noalias !3
> -; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %c, i64 16, i32 16, i1 false) #0, !alias.scope !5
> -; CHECK:   call void @hey() #0, !noalias !5
> -; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %c, i64 16, i32 16, i1 false) #0, !noalias !3
> +; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 16, i32 16, i1 false) #1, !noalias !0
> +; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %c, i64 16, i32 16, i1 false) #1, !noalias !3
> +; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %c, i64 16, i32 16, i1 false) #1, !alias.scope !5
> +; CHECK:   call void @hey() #1, !noalias !5
> +; CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %c, i64 16, i32 16, i1 false) #1, !noalias !3
> ; CHECK:   ret void
> ; CHECK: }
> 
> -attributes #0 = { nounwind }
> -attributes #1 = { nounwind uwtable }
> +attributes #0 = { nounwind argmemonly }
> +attributes #1 = { nounwind }
> +attributes #2 = { nounwind uwtable }
> 
> ; CHECK: !0 = !{!1}
> ; CHECK: !1 = distinct !{!1, !2, !"hello: %c"}
> 
> Modified: llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll (original)
> +++ llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll Thu Aug 13 12:40:04 2015
> @@ -206,5 +206,6 @@ declare void @f1(%struct.big* nocapture
> declare void @f2(%struct.big*)
> 
> ; CHECK: attributes [[NUW]] = { nounwind }
> -; CHECK: attributes #1 = { nounwind ssp }
> -; CHECK: attributes #2 = { nounwind ssp uwtable }
> +; CHECK: attributes #1 = { nounwind argmemonly }
> +; CHECK: attributes #2 = { nounwind ssp }
> +; CHECK: attributes #3 = { nounwind ssp uwtable }
> 
> Modified: llvm/trunk/test/Transforms/ObjCARC/nested.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/nested.ll?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/ObjCARC/nested.ll (original)
> +++ llvm/trunk/test/Transforms/ObjCARC/nested.ll Thu Aug 13 12:40:04 2015
> @@ -819,5 +819,7 @@ entry:
>   ret void
> }
> 
> -; CHECK: attributes [[NUW]] = { nounwind }
> +
> +; CHECK: attributes #0 = { nounwind argmemonly }
> ; CHECK: attributes #1 = { nonlazybind }
> +; CHECK: attributes [[NUW]] = { nounwind }
> 
> Modified: llvm/trunk/utils/TableGen/CodeGenIntrinsics.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenIntrinsics.h?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenIntrinsics.h (original)
> +++ llvm/trunk/utils/TableGen/CodeGenIntrinsics.h Thu Aug 13 12:40:04 2015
> @@ -60,9 +60,10 @@ namespace llvm {
>     IntrinsicSignature IS;
> 
>     // Memory mod/ref behavior of this intrinsic.
> -    enum {
> +    enum ModRefKind {
>       NoMem, ReadArgMem, ReadMem, ReadWriteArgMem, ReadWriteMem
> -    } ModRef;
> +    };
> +    ModRefKind ModRef;
> 
>     /// This is set to true if the intrinsic is overloaded by its argument
>     /// types.
> 
> Modified: llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp?rev=244920&r1=244919&r2=244920&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp Thu Aug 13 12:40:04 2015
> @@ -503,28 +503,6 @@ void IntrinsicEmitter::EmitGenerator(con
> }
> 
> namespace {
> -enum ModRefKind {
> -  MRK_none,
> -  MRK_readonly,
> -  MRK_readnone
> -};
> -}
> -
> -static ModRefKind getModRefKind(const CodeGenIntrinsic &intrinsic) {
> -  switch (intrinsic.ModRef) {
> -  case CodeGenIntrinsic::NoMem:
> -    return MRK_readnone;
> -  case CodeGenIntrinsic::ReadArgMem:
> -  case CodeGenIntrinsic::ReadMem:
> -    return MRK_readonly;
> -  case CodeGenIntrinsic::ReadWriteArgMem:
> -  case CodeGenIntrinsic::ReadWriteMem:
> -    return MRK_none;
> -  }
> -  llvm_unreachable("bad mod-ref kind");
> -}
> -
> -namespace {
> struct AttributeComparator {
>   bool operator()(const CodeGenIntrinsic *L, const CodeGenIntrinsic *R) const {
>     // Sort throwing intrinsics after non-throwing intrinsics.
> @@ -541,8 +519,8 @@ struct AttributeComparator {
>       return R->isConvergent;
> 
>     // Try to order by readonly/readnone attribute.
> -    ModRefKind LK = getModRefKind(*L);
> -    ModRefKind RK = getModRefKind(*R);
> +    CodeGenIntrinsic::ModRefKind LK = L->ModRef;
> +    CodeGenIntrinsic::ModRefKind RK = R->ModRef;
>     if (LK != RK) return (LK > RK);
> 
>     // Order by argument attributes.
> @@ -649,10 +627,10 @@ EmitAttributes(const std::vector<CodeGen
>       }
>     }
> 
> -    ModRefKind modRef = getModRefKind(intrinsic);
> -
> -    if (!intrinsic.canThrow || modRef || intrinsic.isNoReturn ||
> -        intrinsic.isNoDuplicate || intrinsic.isConvergent) {
> +    if (!intrinsic.canThrow ||
> +        intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem ||
> +        intrinsic.isNoReturn || intrinsic.isNoDuplicate ||
> +        intrinsic.isConvergent) {
>       OS << "      const Attribute::AttrKind Atts[] = {";
>       bool addComma = false;
>       if (!intrinsic.canThrow) {
> @@ -678,17 +656,29 @@ EmitAttributes(const std::vector<CodeGen
>         addComma = true;
>       }
> 
> -      switch (modRef) {
> -      case MRK_none: break;
> -      case MRK_readonly:
> +      switch (intrinsic.ModRef) {
> +      case CodeGenIntrinsic::NoMem:
> +        if (addComma)
> +          OS << ",";
> +        OS << "Attribute::ReadNone";
> +        break;
> +      case CodeGenIntrinsic::ReadArgMem:
> +        if (addComma)
> +          OS << ",";
> +        OS << "Attribute::ReadOnly,";
> +        OS << "Attribute::ArgMemOnly";
> +        break;
> +      case CodeGenIntrinsic::ReadMem:
>         if (addComma)
>           OS << ",";
>         OS << "Attribute::ReadOnly";
>         break;
> -      case MRK_readnone:
> +      case CodeGenIntrinsic::ReadWriteArgMem:
>         if (addComma)
>           OS << ",";
> -        OS << "Attribute::ReadNone";
> +        OS << "Attribute::ArgMemOnly";
> +        break;
> +      case CodeGenIntrinsic::ReadWriteMem:
>         break;
>       }
>       OS << "};\n";
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150813/77343cf2/attachment.html>


More information about the llvm-commits mailing list