#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 *, char, char, char, char, char, char, char,
                          char, char, char, char);
int main() {
  char char1 = 'H';
  char char2 = 'e';
  char char3 = 'l';
  char char4 = 'l';
  char char5 = 'o';
  char char6 = 'W';
  char char7 = 'o';
  char char8 = 'r';
  char char9 = 'l';
  char char10 = 'd';
  char char11 = '!';
  printf("%c%c%c%c%c%c%c%c%c%c%c \n", char1, char2, char3, char4, char5, char6,
         char7, char8, char9, char10, char11);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
push   %r14
push   %rbx
sub    $0x40,%rsp
movl   $0x0,-0x14(%rbp)
movb   $0x48,-0x15(%rbp)
movb   $0x65,-0x16(%rbp)
movb   $0x6c,-0x17(%rbp)
movb   $0x6c,-0x18(%rbp)
movb   $0x6f,-0x19(%rbp)
movb   $0x57,-0x1a(%rbp)
movb   $0x6f,-0x1b(%rbp)
movb   $0x72,-0x1c(%rbp)
movb   $0x6c,-0x1d(%rbp)
movb   $0x64,-0x1e(%rbp)
movb   $0x21,-0x1f(%rbp)
mov    -0x15(%rbp),%sil
mov    -0x16(%rbp),%dl
mov    -0x17(%rbp),%cl
mov    -0x18(%rbp),%r8b
mov    -0x19(%rbp),%r9b
mov    -0x1a(%rbp),%r14b
mov    -0x1b(%rbp),%bl
mov    -0x1c(%rbp),%r11b
mov    -0x1d(%rbp),%r10b
mov    -0x1e(%rbp),%al
lea    0xe87(%rip),%rdi
movsbl %sil,%esi
movsbl %dl,%edx
movsbl %cl,%ecx
movsbl %r8b,%r8d
movsbl %r9b,%r9d
movsbl %r14b,%r14d
mov    %r14d,(%rsp)
movsbl %bl,%ebx
mov    %ebx,0x8(%rsp)
movsbl %r11b,%r11d
mov    %r11d,0x10(%rsp)
movsbl %r10b,%r10d
mov    %r10d,0x18(%rsp)
movsbl %al,%eax
mov    %eax,0x20(%rsp)
movsbl -0x1f(%rbp),%eax
mov    %eax,0x28(%rsp)
call   1030 <printf@plt>
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
lea    0xee8(%rip),%rdi
mov    $0x48,%esi
mov    $0x65,%edx
mov    $0x6c,%ecx
mov    $0x6c,%r8d
mov    $0x6f,%r9d
push   $0x21
push   $0x64
push   $0x6c
push   $0x72
push   $0x6f
push   $0x57
call   1030 <printf@plt>
add    $0x30,%rsp
xor    %eax,%eax
pop    %rcx
ret

LLVM IR (-O0):
@.str = [25 x i8] c"%c%c%c%c%c%c%c%c%c%c%c \0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i8
%3 = alloca i8
%4 = alloca i8
%5 = alloca i8
%6 = alloca i8
%7 = alloca i8
%8 = alloca i8
%9 = alloca i8
%10 = alloca i8
%11 = alloca i8
%12 = alloca i8
store i32 0, i32* %1
store i8 72, i8* %2
store i8 101, i8* %3
store i8 108, i8* %4
store i8 108, i8* %5
store i8 111, i8* %6
store i8 87, i8* %7
store i8 111, i8* %8
store i8 114, i8* %9
store i8 108, i8* %10
store i8 100, i8* %11
store i8 33, i8* %12
%13 = load i8, i8* %2
%14 = load i8, i8* %3
%15 = load i8, i8* %4
%16 = load i8, i8* %5
%17 = load i8, i8* %6
%18 = load i8, i8* %7
%19 = load i8, i8* %8
%20 = load i8, i8* %9
%21 = load i8, i8* %10
%22 = load i8, i8* %11
%23 = load i8, i8* %12
%24 = call i32 @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i64 0, i64 0), i8 signext %13, i8 signext %14, i8 signext %15, i8 signext %16, i8 signext %17, i8 signext %18, i8 signext %19, i8 signext %20, i8 signext %21, i8 signext %22, i8 signext %23)
ret i32 0
}

LLVM IR (-O2):
@.str = [25 x i8] c"%c%c%c%c%c%c%c%c%c%c%c \0A\00"
define i32 @main() {
%1 = tail call i32 @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i64 0, i64 0), i8 signext 72, i8 signext 101, i8 signext 108, i8 signext 108, i8 signext 111, i8 signext 87, i8 signext 111, i8 signext 114, i8 signext 108, i8 signext 100, i8 signext 33)
ret i32 0
}