Index: docs/LangRef.rst =================================================================== --- docs/LangRef.rst +++ docs/LangRef.rst @@ -10081,7 +10081,7 @@ :: - declare void @llvm.va_start(i8* ) + declare void @llvm.va_start(i8* nocapture ) Overview: """"""""" @@ -10113,7 +10113,7 @@ :: - declare void @llvm.va_end(i8* ) + declare void @llvm.va_end(i8* nocapture ) Overview: """"""""" @@ -10146,7 +10146,7 @@ :: - declare void @llvm.va_copy(i8* , i8* ) + declare void @llvm.va_copy(i8* nocapture , i8* nocapture ) Overview: """"""""" Index: include/llvm/IR/Intrinsics.td =================================================================== --- include/llvm/IR/Intrinsics.td +++ include/llvm/IR/Intrinsics.td @@ -303,10 +303,10 @@ //===--------------- Variable Argument Handling Intrinsics ----------------===// // -def int_vastart : Intrinsic<[], [llvm_ptr_ty], [], "llvm.va_start">; -def int_vacopy : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty], [], - "llvm.va_copy">; -def int_vaend : Intrinsic<[], [llvm_ptr_ty], [], "llvm.va_end">; +def int_vastart : Intrinsic<[], [llvm_ptr_ty], [NoCapture<0>], "llvm.va_start">; +def int_vacopy : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty], + [NoCapture<0>, NoCapture<1>], "llvm.va_copy">; +def int_vaend : Intrinsic<[], [llvm_ptr_ty], [NoCapture<0>], "llvm.va_end">; //===------------------- Garbage Collection Intrinsics --------------------===// // Index: test/Transforms/TailCallElim/basic.ll =================================================================== --- test/Transforms/TailCallElim/basic.ll +++ test/Transforms/TailCallElim/basic.ll @@ -237,5 +237,20 @@ ret void } +; Argument pointer is not captured by va_start or va_end, and the call can be +; marked tail. +define void @test16(...) { +; CHECK-LABEL: @test16 +; CHECK: tail call void @noarg() +entry: + %ap = alloca i8 + call void @llvm.va_start(i8* %ap) + call void @llvm.va_end(i8* %ap) + call void @noarg() + ret void +} + declare void @bar(%struct.foo* byval) declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) +declare void @llvm.va_start(i8* nocapture) +declare void @llvm.va_end(i8* nocapture)