int my_h(__builtin_va_list list) {
  __builtin_va_arg(list, int);
  return __builtin_va_arg(list, int);
}


x86 assembly (clang, -O0):
<my_h>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    (%rax),%eax
mov    %eax,-0xc(%rbp)
cmp    $0x28,%eax
ja     113a <my_h+0x3a>
mov    -0x18(%rbp),%rcx
mov    -0xc(%rbp),%edx
movslq %edx,%rax
add    0x10(%rcx),%rax
add    $0x8,%edx
mov    %edx,(%rcx)
mov    %rax,-0x20(%rbp)
jmp    1151 <my_h+0x51>
mov    -0x18(%rbp),%rcx
mov    0x8(%rcx),%rdx
mov    %rdx,%rax
add    $0x8,%rdx
mov    %rdx,0x8(%rcx)
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
cmp    $0x28,%eax
ja     1187 <my_h+0x87>
mov    -0x30(%rbp),%rcx
mov    -0x24(%rbp),%edx
movslq %edx,%rax
add    0x10(%rcx),%rax
add    $0x8,%edx
mov    %edx,(%rcx)
mov    %rax,-0x38(%rbp)
jmp    119e <my_h+0x9e>
mov    -0x30(%rbp),%rcx
mov    0x8(%rcx),%rdx
mov    %rdx,%rax
add    $0x8,%rdx
mov    %rdx,0x8(%rcx)
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<my_h>:
mov    (%rdi),%ecx
cmp    $0x29,%rcx
jae    111f <my_h+0x1f>
lea    0x8(%rcx),%rax
mov    %eax,(%rdi)
cmp    $0x20,%ecx
ja     1124 <my_h+0x24>
add    0x10(%rdi),%rax
add    $0x10,%ecx
mov    %ecx,(%rdi)
mov    (%rax),%eax
ret
addq   $0x8,0x8(%rdi)
mov    0x8(%rdi),%rax
lea    0x8(%rax),%rcx
mov    %rcx,0x8(%rdi)
mov    (%rax),%eax
ret

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

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