#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 /*<<< orphan*/ printf(char *, ...);
extern char Bar12(int i1, int i2, unsigned int ui1, signed char c1,
                  signed char c2, unsigned char uc1, int i3, int i4,
                  unsigned int ui2, signed char c3, signed char c4,
                  unsigned char uc2) {
  printf(" Hello from Bar12: \n");
  printf(" i1 = %d, i2 = %d, ui1 = %d\n ", i1, i2, ui1);
  printf(" c1 = %c, c2 = %c, uc1 = %c\n ", c1, c2, uc1);
  printf(" i3 = %d, i4 = %d, ui2 = %d\n ", i3, i4, ui2);
  printf(" c1 = %c, c2 = %c, uc1 = %c\n ", c3, c4, uc2);
  return '1';
}


x86 assembly (clang, -O0):
<Bar12>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %r8d,-0x20(%rbp)
mov    %ecx,%eax
mov    -0x20(%rbp),%ecx
mov    %eax,-0x1c(%rbp)
mov    %edx,%eax
mov    -0x1c(%rbp),%edx
mov    %eax,-0x18(%rbp)
mov    %esi,%eax
mov    -0x18(%rbp),%esi
mov    %eax,-0x14(%rbp)
mov    %edi,%r8d
mov    -0x14(%rbp),%edi
mov    %r9b,%al
mov    0x38(%rbp),%r9b
mov    0x30(%rbp),%r9b
mov    0x28(%rbp),%r9b
mov    0x20(%rbp),%r9d
mov    0x18(%rbp),%r9d
mov    0x10(%rbp),%r9d
mov    %r8d,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %dl,-0xd(%rbp)
mov    %cl,-0xe(%rbp)
mov    %al,-0xf(%rbp)
lea    0xe91(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
mov    -0x4(%rbp),%esi
mov    -0x8(%rbp),%edx
mov    -0xc(%rbp),%ecx
lea    0xe8f(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movsbl -0xd(%rbp),%esi
movsbl -0xe(%rbp),%edx
movzbl -0xf(%rbp),%ecx
lea    0xe93(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
mov    0x10(%rbp),%esi
mov    0x18(%rbp),%edx
mov    0x20(%rbp),%ecx
lea    0xe9a(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movsbl 0x28(%rbp),%esi
movsbl 0x30(%rbp),%edx
movzbl 0x38(%rbp),%ecx
lea    0xe62(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
mov    $0x31,%al
movsbl %al,%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Bar12>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r9d,0x8(%rsp)
mov    %r8d,%ebp
mov    %ecx,%r13d
mov    %edx,%r14d
mov    %esi,%r15d
mov    %edi,%r12d
movsbl 0x68(%rsp),%eax
mov    %eax,0x14(%rsp)
movsbl 0x70(%rsp),%eax
mov    %eax,0x10(%rsp)
movzbl 0x78(%rsp),%eax
mov    %eax,0xc(%rsp)
lea    0xef6(%rip),%rdi
call   1030 <puts@plt>
lea    0xe90(%rip),%rdi
mov    %r12d,%esi
mov    %r15d,%edx
mov    %r14d,%ecx
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xe97(%rip),%rbx
mov    %rbx,%rdi
mov    %r13d,%esi
mov    %ebp,%edx
mov    0x8(%rsp),%ecx
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xe9b(%rip),%rdi
mov    0x50(%rsp),%esi
mov    0x58(%rsp),%edx
mov    0x60(%rsp),%ecx
xor    %eax,%eax
call   1040 <printf@plt>
mov    %rbx,%rdi
mov    0x14(%rsp),%esi
mov    0x10(%rsp),%edx
mov    0xc(%rsp),%ecx
xor    %eax,%eax
call   1040 <printf@plt>
mov    $0x31,%al
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [21 x i8] c" Hello from Bar12: \0A\00"
@.str.1 = [30 x i8] c" i1 = %d, i2 = %d, ui1 = %d\0A \00"
@.str.2 = [30 x i8] c" c1 = %c, c2 = %c, uc1 = %c\0A \00"
@.str.3 = [30 x i8] c" i3 = %d, i4 = %d, ui2 = %d\0A \00"
define signext i8 @Bar12(i32 %0, i32 %1, i32 %2, i8 signext %3, i8 signext %4, i8 zeroext %5, i32 %6, i32 %7, i32 %8, i8 signext %9, i8 signext %10, i8 zeroext %11) {
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i8
%17 = alloca i8
%18 = alloca i8
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i8
%23 = alloca i8
%24 = alloca i8
store i32 %0, i32* %13
store i32 %1, i32* %14
store i32 %2, i32* %15
store i8 %3, i8* %16
store i8 %4, i8* %17
store i8 %5, i8* %18
store i32 %6, i32* %19
store i32 %7, i32* %20
store i32 %8, i32* %21
store i8 %9, i8* %22
store i8 %10, i8* %23
store i8 %11, i8* %24
%25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str, i64 0, i64 0))
%26 = load i32, i32* %13
%27 = load i32, i32* %14
%28 = load i32, i32* %15
%29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.1, i64 0, i64 0), i32 %26, i32 %27, i32 %28)
%30 = load i8, i8* %16
%31 = sext i8 %30 to i32
%32 = load i8, i8* %17
%33 = sext i8 %32 to i32
%34 = load i8, i8* %18
%35 = zext i8 %34 to i32
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.2, i64 0, i64 0), i32 %31, i32 %33, i32 %35)
%37 = load i32, i32* %19
%38 = load i32, i32* %20
%39 = load i32, i32* %21
%40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.3, i64 0, i64 0), i32 %37, i32 %38, i32 %39)
%41 = load i8, i8* %22
%42 = sext i8 %41 to i32
%43 = load i8, i8* %23
%44 = sext i8 %43 to i32
%45 = load i8, i8* %24
%46 = zext i8 %45 to i32
%47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.2, i64 0, i64 0), i32 %42, i32 %44, i32 %46)
ret i8 49
}

LLVM IR (-O2):
@.str.1 = [30 x i8] c" i1 = %d, i2 = %d, ui1 = %d\0A \00"
@.str.2 = [30 x i8] c" c1 = %c, c2 = %c, uc1 = %c\0A \00"
@.str.3 = [30 x i8] c" i3 = %d, i4 = %d, ui2 = %d\0A \00"
@str = [20 x i8] c" Hello from Bar12: \00"
define signext i8 @Bar12(i32 %0, i32 %1, i32 %2, i8 signext %3, i8 signext %4, i8 zeroext %5, i32 %6, i32 %7, i32 %8, i8 signext %9, i8 signext %10, i8 zeroext %11) {
%13 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @str, i64 0, i64 0))
%14 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([30 x i8], [30 x i8]* @.str.1, i64 0, i64 0), i32 %0, i32 %1, i32 %2)
%15 = sext i8 %3 to i32
%16 = sext i8 %4 to i32
%17 = zext i8 %5 to i32
%18 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([30 x i8], [30 x i8]* @.str.2, i64 0, i64 0), i32 %15, i32 %16, i32 %17)
%19 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([30 x i8], [30 x i8]* @.str.3, i64 0, i64 0), i32 %6, i32 %7, i32 %8)
%20 = sext i8 %9 to i32
%21 = sext i8 %10 to i32
%22 = zext i8 %11 to i32
%23 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([30 x i8], [30 x i8]* @.str.2, i64 0, i64 0), i32 %20, i32 %21, i32 %22)
ret i8 49
}