#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int func_ret_int(int, int, int);
void f() {
  register int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
  register char *c1, *c2, *c3, *c4, *c5, *c6, *c7, *c8, *c9, *c10;
  extern int a_lang_lang_lang_lang;
  double dbl;
  int func_ret_in();
  double func_ret_double();
  char *func_ret_char_ptr();
  i1 = 1;
  i2 = 2;
  i3 = 3;
  i4 = 4;
  i5 = 5;
  i6 = 6;
  i7 = 7;
  i8 = 8;
  i9 = 9;
  i10 = 10;
  c1 = (char *)110;
  c2 = (char *)120;
  c3 = (char *)130;
  c4 = (char *)140;
  c5 = (char *)150;
  c6 = (char *)160;
  c7 = (char *)170;
  c8 = (char *)180;
  c9 = (char *)190;
  c10 = (char *)210;
  a_lang_lang_lang_lang = 1;
  i2 = func_ret_int(10, i1, i10);
  dbl = func_ret_double();
  c1 = func_ret_char_ptr(c1);
}


x86 assembly (clang, -O0):
<f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movl   $0x1,-0x4(%rbp)
movl   $0x2,-0x8(%rbp)
movl   $0x3,-0xc(%rbp)
movl   $0x4,-0x10(%rbp)
movl   $0x5,-0x14(%rbp)
movl   $0x6,-0x18(%rbp)
movl   $0x7,-0x1c(%rbp)
movl   $0x8,-0x20(%rbp)
movl   $0x9,-0x24(%rbp)
movl   $0xa,-0x28(%rbp)
mov    $0x6e,%eax
mov    %rax,-0x30(%rbp)
mov    $0x78,%eax
mov    %rax,-0x38(%rbp)
mov    $0x82,%eax
mov    %rax,-0x40(%rbp)
mov    $0x8c,%eax
mov    %rax,-0x48(%rbp)
mov    $0x96,%eax
mov    %rax,-0x50(%rbp)
mov    $0xa0,%eax
mov    %rax,-0x58(%rbp)
mov    $0xaa,%eax
mov    %rax,-0x60(%rbp)
mov    $0xb4,%eax
mov    %rax,-0x68(%rbp)
mov    $0xbe,%eax
mov    %rax,-0x70(%rbp)
mov    $0xd2,%eax
mov    %rax,-0x78(%rbp)
mov    0x2dfe(%rip),%rax
movl   $0x1,(%rax)
mov    -0x4(%rbp),%esi
mov    -0x28(%rbp),%edx
mov    $0xa,%edi
call   1050 <func_ret_int@plt>
mov    %eax,-0x8(%rbp)
mov    $0x0,%al
call   1030 <func_ret_double@plt>
movsd  %xmm0,-0x80(%rbp)
mov    -0x30(%rbp),%rdi
mov    $0x0,%al
call   1040 <func_ret_char_ptr@plt>
mov    %rax,-0x30(%rbp)
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f>:
push   %rax
mov    0x2ea8(%rip),%rax
movl   $0x1,(%rax)
mov    $0xa,%edi
mov    $0x1,%esi
mov    $0xa,%edx
call   1050 <func_ret_int@plt>
xor    %eax,%eax
call   1030 <func_ret_double@plt>
mov    $0x6e,%edi
xor    %eax,%eax
pop    %rcx
jmp    1040 <func_ret_char_ptr@plt>

LLVM IR (-O0):
@a_lang_lang_lang_lang = external global i32
define void @f() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca i8*
%14 = alloca i8*
%15 = alloca i8*
%16 = alloca i8*
%17 = alloca i8*
%18 = alloca i8*
%19 = alloca i8*
%20 = alloca i8*
%21 = alloca double
store i32 1, i32* %1
store i32 2, i32* %2
store i32 3, i32* %3
store i32 4, i32* %4
store i32 5, i32* %5
store i32 6, i32* %6
store i32 7, i32* %7
store i32 8, i32* %8
store i32 9, i32* %9
store i32 10, i32* %10
store i8* inttoptr (i64 110 to i8*), i8** %11
store i8* inttoptr (i64 120 to i8*), i8** %12
store i8* inttoptr (i64 130 to i8*), i8** %13
store i8* inttoptr (i64 140 to i8*), i8** %14
store i8* inttoptr (i64 150 to i8*), i8** %15
store i8* inttoptr (i64 160 to i8*), i8** %16
store i8* inttoptr (i64 170 to i8*), i8** %17
store i8* inttoptr (i64 180 to i8*), i8** %18
store i8* inttoptr (i64 190 to i8*), i8** %19
store i8* inttoptr (i64 210 to i8*), i8** %20
store i32 1, i32* @a_lang_lang_lang_lang
%22 = load i32, i32* %1
%23 = load i32, i32* %10
%24 = call i32 @func_ret_int(i32 10, i32 %22, i32 %23)
store i32 %24, i32* %2
%25 = call double (...) @func_ret_double()
store double %25, double* %21
%26 = load i8*, i8** %11
%27 = call i8* (i8*, ...) bitcast (i8* (...)* @func_ret_char_ptr to i8* (i8*, ...)*)(i8* %26)
store i8* %27, i8** %11
ret void
}

LLVM IR (-O2):
@a_lang_lang_lang_lang = external global i32
define void @f() {
store i32 1, i32* @a_lang_lang_lang_lang
%1 = tail call i32 @func_ret_int(i32 10, i32 1, i32 10)
%2 = tail call double (...) @func_ret_double()
%3 = tail call i8* (i8*, ...) bitcast (i8* (...)* @func_ret_char_ptr to i8* (i8*, ...)*)(i8* inttoptr (i64 110 to i8*))
ret void
}