sumv(int a, __builtin_va_list l) {
  int t = 0;
  while (a) {
    t += a;
    a = __builtin_va_arg(l, int);
  }
  return t;
}


x86 assembly (clang, -O0):
<sumv>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     117c <sumv+0x7c>
mov    -0x4(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    (%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x28,%eax
ja     1157 <sumv+0x57>
mov    -0x20(%rbp),%rcx
mov    -0x18(%rbp),%edx
movslq %edx,%rax
add    0x10(%rcx),%rax
add    $0x8,%edx
mov    %edx,(%rcx)
mov    %rax,-0x28(%rbp)
jmp    116e <sumv+0x6e>
mov    -0x20(%rbp),%rcx
mov    0x8(%rcx),%rdx
mov    %rdx,%rax
add    $0x8,%rdx
mov    %rdx,0x8(%rcx)
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1112 <sumv+0x12>
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sumv>:
test   %edi,%edi
je     113b <sumv+0x3b>
mov    (%rsi),%r8d
xor    %eax,%eax
jmp    1124 <sumv+0x24>
nopl   0x0(%rax,%rax,1)
mov    0x8(%rsi),%rdx
lea    0x8(%rdx),%rcx
mov    %rcx,0x8(%rsi)
add    %edi,%eax
mov    (%rdx),%edi
test   %edi,%edi
je     113a <sumv+0x3a>
cmp    $0x28,%r8d
ja     1110 <sumv+0x10>
mov    %r8d,%edx
add    0x10(%rsi),%rdx
add    $0x8,%r8d
mov    %r8d,(%rsi)
jmp    111c <sumv+0x1c>
ret
xor    %eax,%eax
ret

LLVM IR (-O0):
%struct.__va_list_tag = type { i32, i32, i8*, i8* }
define i32 @sumv(i32 %0, %struct.__va_list_tag* %1) {
%3 = alloca i32
%4 = alloca %struct.__va_list_tag*
%5 = alloca i32
store i32 %0, i32* %3
store %struct.__va_list_tag* %1, %struct.__va_list_tag** %4
store i32 0, i32* %5
br label %6
6: ; preds = %28, %2
%7 = load i32, i32* %3
%8 = icmp ne i32 %7, 0
br i1 %8, label %9, label %31
9: ; preds = %6
%10 = load i32, i32* %3
%11 = load i32, i32* %5
%12 = add nsw i32 %11, %10
store i32 %12, i32* %5
%13 = load %struct.__va_list_tag*, %struct.__va_list_tag** %4
%14 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %13, i32 0, i32 0
%15 = load i32, i32* %14
%16 = icmp ule i32 %15, 40
br i1 %16, label %17, label %23
17: ; preds = %9
%18 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %13, i32 0, i32 3
%19 = load i8*, i8** %18
%20 = getelementptr i8, i8* %19, i32 %15
%21 = bitcast i8* %20 to i32*
%22 = add i32 %15, 8
store i32 %22, i32* %14
br label %28
23: ; preds = %9
%24 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %13, i32 0, i32 2
%25 = load i8*, i8** %24
%26 = bitcast i8* %25 to i32*
%27 = getelementptr i8, i8* %25, i32 8
store i8* %27, i8** %24
br label %28
28: ; preds = %23, %17
%29 = phi i32* [ %21, %17 ], [ %26, %23 ]
%30 = load i32, i32* %29
store i32 %30, i32* %3
br label %6
31: ; preds = %6
%32 = load i32, i32* %5
ret i32 %32
}

LLVM IR (-O2):
%struct.__va_list_tag = type { i32, i32, i8*, i8* }
define i32 @sumv(i32 %0, %struct.__va_list_tag* nocapture %1) {
%3 = icmp eq i32 %0, 0
br i1 %3, label %29, label %4
4: ; preds = %2
%5 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %1, i64 0, i32 0
%6 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %1, i64 0, i32 2
%7 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %1, i64 0, i32 3
%8 = load i32, i32* %5
br label %9
9: ; preds = %4, %23
%10 = phi i32 [ %8, %4 ], [ %24, %23 ]
%11 = phi i32 [ 0, %4 ], [ %13, %23 ]
%12 = phi i32 [ %0, %4 ], [ %27, %23 ]
%13 = add nsw i32 %11, %12
%14 = icmp ult i32 %10, 41
br i1 %14, label %15, label %20
15: ; preds = %9
%16 = load i8*, i8** %7
%17 = zext i32 %10 to i64
%18 = getelementptr i8, i8* %16, i64 %17
%19 = add nuw nsw i32 %10, 8
store i32 %19, i32* %5
br label %23
20: ; preds = %9
%21 = load i8*, i8** %6
%22 = getelementptr i8, i8* %21, i64 8
store i8* %22, i8** %6
br label %23
23: ; preds = %20, %15
%24 = phi i32 [ %19, %15 ], [ %10, %20 ]
%25 = phi i8* [ %18, %15 ], [ %21, %20 ]
%26 = bitcast i8* %25 to i32*
%27 = load i32, i32* %26
%28 = icmp eq i32 %27, 0
br i1 %28, label %29, label %9
29: ; preds = %23, %2
%30 = phi i32 [ 0, %2 ], [ %13, %23 ]
ret i32 %30
}