void __attribute__((no)) chars(int i, ...) {
  __builtin_va_list args;
  __builtin_va_start(args, i);
  if (__builtin_va_arg(args, int) != 1)
    __builtin_abort();
  if (__builtin_va_arg(args, int) != 2)
    __builtin_abort();
  __builtin_va_end(args);
}


x86 assembly (clang, -O0):
<chars>:
push   %rbp
mov    %rsp,%rbp
sub    $0x100,%rsp
test   %al,%al
je     1149 <chars+0x39>
movaps %xmm0,-0xa0(%rbp)
movaps %xmm1,-0x90(%rbp)
movaps %xmm2,-0x80(%rbp)
movaps %xmm3,-0x70(%rbp)
movaps %xmm4,-0x60(%rbp)
movaps %xmm5,-0x50(%rbp)
movaps %xmm6,-0x40(%rbp)
movaps %xmm7,-0x30(%rbp)
mov    %r9,-0xa8(%rbp)
mov    %r8,-0xb0(%rbp)
mov    %rcx,-0xb8(%rbp)
mov    %rdx,-0xc0(%rbp)
mov    %rsi,-0xc8(%rbp)
mov    %edi,-0x4(%rbp)
lea    -0x20(%rbp),%rax
lea    -0xd0(%rbp),%rcx
mov    %rcx,0x10(%rax)
lea    0x10(%rbp),%rcx
mov    %rcx,0x8(%rax)
movl   $0x30,0x4(%rax)
movl   $0x8,(%rax)
lea    -0x20(%rbp),%rax
mov    %rax,-0xe0(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0xd4(%rbp)
cmp    $0x28,%eax
ja     11d5 <chars+0xc5>
mov    -0xe0(%rbp),%rcx
mov    -0xd4(%rbp),%edx
movslq %edx,%rax
add    0x10(%rcx),%rax
add    $0x8,%edx
mov    %edx,(%rcx)
mov    %rax,-0xe8(%rbp)
jmp    11f2 <chars+0xe2>
mov    -0xe0(%rbp),%rcx
mov    0x8(%rcx),%rdx
mov    %rdx,%rax
add    $0x8,%rdx
mov    %rdx,0x8(%rcx)
mov    %rax,-0xe8(%rbp)
mov    -0xe8(%rbp),%rax
cmpl   $0x1,(%rax)
je     1207 <chars+0xf7>
call   1030 <abort@plt>
lea    -0x20(%rbp),%rax
mov    %rax,-0xf8(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0xec(%rbp)
cmp    $0x28,%eax
ja     1249 <chars+0x139>
mov    -0xf8(%rbp),%rcx
mov    -0xec(%rbp),%edx
movslq %edx,%rax
add    0x10(%rcx),%rax
add    $0x8,%edx
mov    %edx,(%rcx)
mov    %rax,-0x100(%rbp)
jmp    1266 <chars+0x156>
mov    -0xf8(%rbp),%rcx
mov    0x8(%rcx),%rdx
mov    %rdx,%rax
add    $0x8,%rdx
mov    %rdx,0x8(%rcx)
mov    %rax,-0x100(%rbp)
mov    -0x100(%rbp),%rax
cmpl   $0x2,(%rax)
je     127b <chars+0x16b>
call   1030 <abort@plt>
add    $0x100,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<chars>:
sub    $0xd8,%rsp
mov    %rsi,0x28(%rsp)
mov    %rdx,0x30(%rsp)
mov    %rcx,0x38(%rsp)
mov    %r8,0x40(%rsp)
mov    %r9,0x48(%rsp)
test   %al,%al
je     116b <chars+0x5b>
movaps %xmm0,0x50(%rsp)
movaps %xmm1,0x60(%rsp)
movaps %xmm2,0x70(%rsp)
movaps %xmm3,0x80(%rsp)
movaps %xmm4,0x90(%rsp)
movaps %xmm5,0xa0(%rsp)
movaps %xmm6,0xb0(%rsp)
movaps %xmm7,0xc0(%rsp)
lea    0x20(%rsp),%rax
mov    %rax,0x10(%rsp)
lea    0xe0(%rsp),%rax
mov    %rax,0x8(%rsp)
movabs $0x3000000008,%rax
mov    %rax,(%rsp)
mov    $0x8,%eax
mov    $0x8,%ecx
cmp    $0x28,%rcx
ja     11ad <chars+0x9d>
add    0x10(%rsp),%rcx
add    $0x8,%eax
mov    %eax,(%rsp)
jmp    11bb <chars+0xab>
mov    0x8(%rsp),%rcx
lea    0x8(%rcx),%rdx
mov    %rdx,0x8(%rsp)
cmpl   $0x1,(%rcx)
jne    11ef <chars+0xdf>
cmp    $0x28,%eax
ja     11d4 <chars+0xc4>
mov    %eax,%ecx
add    0x10(%rsp),%rcx
add    $0x8,%eax
mov    %eax,(%rsp)
jmp    11e2 <chars+0xd2>
mov    0x8(%rsp),%rcx
lea    0x8(%rcx),%rax
mov    %rax,0x8(%rsp)
cmpl   $0x2,(%rcx)
jne    11ef <chars+0xdf>
add    $0xd8,%rsp
ret
call   1030 <abort@plt>

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

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