#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 */
scalar_t__ fNewMemory(void **, int);
scalar_t__ strlen(char *);
char *SU_Centered(char *The_String, int In_The_Width, char With_The_Filler) {
  int Left_Margin;
  int Right_Margin;
  int i;
  int j;
  char *Centered_String;
  ;
  if (fNewMemory((void **)&Centered_String, In_The_Width + 1)) {
    Left_Margin = (In_The_Width - (int)strlen(The_String)) / 2;
    Right_Margin = (int)strlen(The_String) + Left_Margin;
    for (i = 0; i < Left_Margin; i++) {
      Centered_String[i] = With_The_Filler;
    }
    j = 0;
    for (i = i; i < Right_Margin; i++) {
      Centered_String[i] = The_String[j++];
    }
    for (i = i; i < In_The_Width; i++) {
      Centered_String[i] = With_The_Filler;
    }
    Centered_String[i] = '\0';
    return Centered_String;
  } else
    return NULL;
}


x86 assembly (clang, -O0):
<SU_Centered>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %dl,%al
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %al,-0x15(%rbp)
mov    -0x14(%rbp),%esi
add    $0x1,%esi
lea    -0x30(%rbp),%rdi
call   1040 <fNewMemory@plt>
cmp    $0x0,%rax
je     123b <SU_Centered+0x11b>
mov    -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,%rcx
mov    -0x34(%rbp),%eax
sub    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
add    -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11ad <SU_Centered+0x8d>
mov    -0x15(%rbp),%dl
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1185 <SU_Centered+0x65>
movl   $0x0,-0x28(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11f4 <SU_Centered+0xd4>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11ba <SU_Centered+0x9a>
mov    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1222 <SU_Centered+0x102>
mov    -0x15(%rbp),%dl
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11fa <SU_Centered+0xda>
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1243 <SU_Centered+0x123>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<SU_Centered>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %edx,%ebp
mov    %esi,%r14d
mov    %rdi,%r15
lea    0x1(%r14),%esi
mov    %rsp,%rdi
call   1040 <fNewMemory@plt>
xor    %ebx,%ebx
test   %rax,%rax
je     12ec <SU_Centered+0x1cc>
mov    %r15,%rdi
call   1030 <strlen@plt>
mov    %r14d,%edx
sub    %eax,%edx
mov    %edx,%ecx
shr    $0x1f,%ecx
add    %edx,%ecx
sar    %ecx
add    %ecx,%eax
cmp    $0x2,%edx
jl     11d4 <SU_Centered+0xb4>
mov    %ecx,%edi
lea    -0x1(%rdi),%rsi
mov    %edi,%edx
and    $0x3,%edx
cmp    $0x3,%rsi
jae    1178 <SU_Centered+0x58>
xor    %esi,%esi
jmp    11ac <SU_Centered+0x8c>
and    $0xfffffffc,%edi
xor    %esi,%esi
nopl   (%rax)
mov    (%rsp),%rbx
mov    %bpl,(%rbx,%rsi,1)
mov    (%rsp),%rbx
mov    %bpl,0x1(%rbx,%rsi,1)
mov    (%rsp),%rbx
mov    %bpl,0x2(%rbx,%rsi,1)
mov    (%rsp),%rbx
mov    %bpl,0x3(%rbx,%rsi,1)
add    $0x4,%rsi
cmp    %rsi,%rdi
jne    1180 <SU_Centered+0x60>
test   %rdx,%rdx
je     11d2 <SU_Centered+0xb2>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rsp),%rdi
mov    %bpl,(%rdi,%rsi,1)
add    $0x1,%rsi
add    $0xffffffffffffffff,%rdx
jne    11c0 <SU_Centered+0xa0>
mov    %ecx,%ebx
sub    %ebx,%eax
jle    1279 <SU_Centered+0x159>
mov    %ebx,%ebx
lea    -0x1(%rax),%rdx
mov    %eax,%edi
and    $0x3,%edi
cmp    $0x3,%rdx
jae    11f9 <SU_Centered+0xd9>
xor    %edx,%edx
test   %rdi,%rdi
jne    1253 <SU_Centered+0x133>
jmp    1279 <SU_Centered+0x159>
and    $0xfffffffc,%eax
xor    %edx,%edx
xchg   %ax,%ax
movzbl (%r15,%rdx,1),%ecx
mov    (%rsp),%rsi
add    %rbx,%rsi
mov    %cl,(%rdx,%rsi,1)
movzbl 0x1(%r15,%rdx,1),%ecx
mov    (%rsp),%rsi
add    %rbx,%rsi
mov    %cl,0x1(%rdx,%rsi,1)
movzbl 0x2(%r15,%rdx,1),%ecx
mov    (%rsp),%rsi
add    %rbx,%rsi
mov    %cl,0x2(%rdx,%rsi,1)
movzbl 0x3(%r15,%rdx,1),%ecx
mov    (%rsp),%rsi
add    %rbx,%rsi
mov    %cl,0x3(%rdx,%rsi,1)
add    $0x4,%rdx
cmp    %rdx,%rax
jne    1200 <SU_Centered+0xe0>
add    %rdx,%rbx
test   %rdi,%rdi
je     1279 <SU_Centered+0x159>
add    %rdx,%r15
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movzbl (%r15,%rax,1),%edx
mov    (%rsp),%rsi
mov    %dl,(%rsi,%rbx,1)
add    $0x1,%rbx
add    $0x1,%rax
cmp    %rax,%rdi
jne    1260 <SU_Centered+0x140>
cmp    %r14d,%ebx
jge    12de <SU_Centered+0x1be>
mov    %ebx,%eax
mov    %r14d,%ecx
sub    %ebx,%ecx
not    %ebx
add    %r14d,%ebx
and    $0x3,%ecx
je     12a1 <SU_Centered+0x181>
nop
mov    (%rsp),%rdx
mov    %bpl,(%rdx,%rax,1)
add    $0x1,%rax
add    $0xffffffff,%ecx
jne    1290 <SU_Centered+0x170>
cmp    $0x3,%ebx
jb     12dc <SU_Centered+0x1bc>
cs nopw 0x0(%rax,%rax,1)
mov    (%rsp),%rcx
mov    %bpl,(%rcx,%rax,1)
mov    (%rsp),%rcx
mov    %bpl,0x1(%rcx,%rax,1)
mov    (%rsp),%rcx
mov    %bpl,0x2(%rcx,%rax,1)
mov    (%rsp),%rcx
mov    %bpl,0x3(%rcx,%rax,1)
add    $0x4,%rax
cmp    %r14d,%eax
jl     12b0 <SU_Centered+0x190>
mov    %eax,%ebx
mov    (%rsp),%rax
mov    %ebx,%ecx
movb   $0x0,(%rax,%rcx,1)
mov    (%rsp),%rbx
mov    %rbx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i8* @SU_Centered(i8* %0, i32 %1, i8 signext %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i8
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i8*
store i8* %0, i8** %5
store i32 %1, i32* %6
store i8 %2, i8* %7
%13 = load i32, i32* %6
%14 = add nsw i32 %13, 1
%15 = call i64 @fNewMemory(i8** %12, i32 %14)
%16 = icmp ne i64 %15, 0
br i1 %16, label %17, label %83
17: ; preds = %3
%18 = load i32, i32* %6
%19 = load i8*, i8** %5
%20 = call i64 @strlen(i8* %19)
%21 = trunc i64 %20 to i32
%22 = sub nsw i32 %18, %21
%23 = sdiv i32 %22, 2
store i32 %23, i32* %8
%24 = load i8*, i8** %5
%25 = call i64 @strlen(i8* %24)
%26 = trunc i64 %25 to i32
%27 = load i32, i32* %8
%28 = add nsw i32 %26, %27
store i32 %28, i32* %9
store i32 0, i32* %10
br label %29
29: ; preds = %39, %17
%30 = load i32, i32* %10
%31 = load i32, i32* %8
%32 = icmp slt i32 %30, %31
br i1 %32, label %33, label %42
33: ; preds = %29
%34 = load i8, i8* %7
%35 = load i8*, i8** %12
%36 = load i32, i32* %10
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8, i8* %35, i64 %37
store i8 %34, i8* %38
br label %39
39: ; preds = %33
%40 = load i32, i32* %10
%41 = add nsw i32 %40, 1
store i32 %41, i32* %10
br label %29
42: ; preds = %29
store i32 0, i32* %11
%43 = load i32, i32* %10
store i32 %43, i32* %10
br label %44
44: ; preds = %59, %42
%45 = load i32, i32* %10
%46 = load i32, i32* %9
%47 = icmp slt i32 %45, %46
br i1 %47, label %48, label %62
48: ; preds = %44
%49 = load i8*, i8** %5
%50 = load i32, i32* %11
%51 = add nsw i32 %50, 1
store i32 %51, i32* %11
%52 = sext i32 %50 to i64
%53 = getelementptr inbounds i8, i8* %49, i64 %52
%54 = load i8, i8* %53
%55 = load i8*, i8** %12
%56 = load i32, i32* %10
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %55, i64 %57
store i8 %54, i8* %58
br label %59
59: ; preds = %48
%60 = load i32, i32* %10
%61 = add nsw i32 %60, 1
store i32 %61, i32* %10
br label %44
62: ; preds = %44
%63 = load i32, i32* %10
store i32 %63, i32* %10
br label %64
64: ; preds = %74, %62
%65 = load i32, i32* %10
%66 = load i32, i32* %6
%67 = icmp slt i32 %65, %66
br i1 %67, label %68, label %77
68: ; preds = %64
%69 = load i8, i8* %7
%70 = load i8*, i8** %12
%71 = load i32, i32* %10
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i8, i8* %70, i64 %72
store i8 %69, i8* %73
br label %74
74: ; preds = %68
%75 = load i32, i32* %10
%76 = add nsw i32 %75, 1
store i32 %76, i32* %10
br label %64
77: ; preds = %64
%78 = load i8*, i8** %12
%79 = load i32, i32* %10
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds i8, i8* %78, i64 %80
store i8 0, i8* %81
%82 = load i8*, i8** %12
store i8* %82, i8** %4
br label %84
83: ; preds = %3
store i8* null, i8** %4
br label %84
84: ; preds = %83, %77
%85 = load i8*, i8** %4
ret i8* %85
}

LLVM IR (-O2):
define i8* @SU_Centered(i8* nocapture %0, i32 %1, i8 signext %2) {
%4 = alloca i8*
%5 = bitcast i8** %4 to i8*
%6 = add nsw i32 %1, 1
%7 = call i64 @fNewMemory(i8** %4, i32 %6)
%8 = icmp eq i64 %7, 0
br i1 %8, label %160, label %9
9: ; preds = %3
%10 = call i64 @strlen(i8* dereferenceable(1) %0)
%11 = trunc i64 %10 to i32
%12 = sub nsw i32 %1, %11
%13 = sdiv i32 %12, 2
%14 = add i32 %13, %11
%15 = icmp sgt i32 %12, 1
br i1 %15, label %16, label %34
16: ; preds = %9
%17 = zext i32 %13 to i64
%18 = add nsw i64 %17, -1
%19 = and i64 %17, 3
%20 = icmp ult i64 %18, 3
br i1 %20, label %23, label %21
21: ; preds = %16
%22 = and i64 %17, 4294967292
br label %46
23: ; preds = %46, %16
%24 = phi i64 [ 0, %16 ], [ %60, %46 ]
%25 = icmp eq i64 %19, 0
br i1 %25, label %34, label %26
26: ; preds = %23, %26
%27 = phi i64 [ %31, %26 ], [ %24, %23 ]
%28 = phi i64 [ %32, %26 ], [ 0, %23 ]
%29 = load i8*, i8** %4
%30 = getelementptr inbounds i8, i8* %29, i64 %27
store i8 %2, i8* %30
%31 = add nuw nsw i64 %27, 1
%32 = add i64 %28, 1
%33 = icmp eq i64 %32, %19
br i1 %33, label %34, label %26
34: ; preds = %23, %26, %9
%35 = phi i32 [ 0, %9 ], [ %13, %26 ], [ %13, %23 ]
%36 = icmp sgt i32 %14, %35
br i1 %36, label %37, label %83
37: ; preds = %34
%38 = zext i32 %35 to i64
%39 = sub i32 %14, %35
%40 = zext i32 %39 to i64
%41 = add nsw i64 %40, -1
%42 = and i64 %40, 3
%43 = icmp ult i64 %41, 3
br i1 %43, label %63, label %44
44: ; preds = %37
%45 = and i64 %40, 4294967292
br label %105
46: ; preds = %46, %21
%47 = phi i64 [ 0, %21 ], [ %60, %46 ]
%48 = phi i64 [ 0, %21 ], [ %61, %46 ]
%49 = load i8*, i8** %4
%50 = getelementptr inbounds i8, i8* %49, i64 %47
store i8 %2, i8* %50
%51 = or i64 %47, 1
%52 = load i8*, i8** %4
%53 = getelementptr inbounds i8, i8* %52, i64 %51
store i8 %2, i8* %53
%54 = or i64 %47, 2
%55 = load i8*, i8** %4
%56 = getelementptr inbounds i8, i8* %55, i64 %54
store i8 %2, i8* %56
%57 = or i64 %47, 3
%58 = load i8*, i8** %4
%59 = getelementptr inbounds i8, i8* %58, i64 %57
store i8 %2, i8* %59
%60 = add nuw nsw i64 %47, 4
%61 = add i64 %48, 4
%62 = icmp eq i64 %61, %22
br i1 %62, label %23, label %46
63: ; preds = %105, %37
%64 = phi i64 [ undef, %37 ], [ %132, %105 ]
%65 = phi i64 [ %38, %37 ], [ %132, %105 ]
%66 = phi i64 [ 0, %37 ], [ %127, %105 ]
%67 = icmp eq i64 %42, 0
br i1 %67, label %80, label %68
68: ; preds = %63, %68
%69 = phi i64 [ %77, %68 ], [ %65, %63 ]
%70 = phi i64 [ %72, %68 ], [ %66, %63 ]
%71 = phi i64 [ %78, %68 ], [ 0, %63 ]
%72 = add nuw nsw i64 %70, 1
%73 = getelementptr inbounds i8, i8* %0, i64 %70
%74 = load i8, i8* %73
%75 = load i8*, i8** %4
%76 = getelementptr inbounds i8, i8* %75, i64 %69
store i8 %74, i8* %76
%77 = add nuw nsw i64 %69, 1
%78 = add i64 %71, 1
%79 = icmp eq i64 %78, %42
br i1 %79, label %80, label %68
80: ; preds = %68, %63
%81 = phi i64 [ %64, %63 ], [ %77, %68 ]
%82 = trunc i64 %81 to i32
br label %83
83: ; preds = %80, %34
%84 = phi i32 [ %35, %34 ], [ %82, %80 ]
%85 = icmp slt i32 %84, %1
br i1 %85, label %86, label %154
86: ; preds = %83
%87 = zext i32 %84 to i64
%88 = sub i32 %1, %84
%89 = xor i32 %84, -1
%90 = add i32 %89, %1
%91 = and i32 %88, 3
%92 = icmp eq i32 %91, 0
br i1 %92, label %101, label %93
93: ; preds = %86, %93
%94 = phi i64 [ %98, %93 ], [ %87, %86 ]
%95 = phi i32 [ %99, %93 ], [ 0, %86 ]
%96 = load i8*, i8** %4
%97 = getelementptr inbounds i8, i8* %96, i64 %94
store i8 %2, i8* %97
%98 = add nuw nsw i64 %94, 1
%99 = add i32 %95, 1
%100 = icmp eq i32 %99, %91
br i1 %100, label %101, label %93
101: ; preds = %93, %86
%102 = phi i64 [ %87, %86 ], [ %98, %93 ]
%103 = phi i64 [ undef, %86 ], [ %98, %93 ]
%104 = icmp ult i32 %90, 3
br i1 %104, label %151, label %135
105: ; preds = %105, %44
%106 = phi i64 [ %38, %44 ], [ %132, %105 ]
%107 = phi i64 [ 0, %44 ], [ %127, %105 ]
%108 = phi i64 [ 0, %44 ], [ %133, %105 ]
%109 = or i64 %107, 1
%110 = getelementptr inbounds i8, i8* %0, i64 %107
%111 = load i8, i8* %110
%112 = load i8*, i8** %4
%113 = getelementptr inbounds i8, i8* %112, i64 %106
store i8 %111, i8* %113
%114 = add nuw nsw i64 %106, 1
%115 = or i64 %107, 2
%116 = getelementptr inbounds i8, i8* %0, i64 %109
%117 = load i8, i8* %116
%118 = load i8*, i8** %4
%119 = getelementptr inbounds i8, i8* %118, i64 %114
store i8 %117, i8* %119
%120 = add nuw nsw i64 %106, 2
%121 = or i64 %107, 3
%122 = getelementptr inbounds i8, i8* %0, i64 %115
%123 = load i8, i8* %122
%124 = load i8*, i8** %4
%125 = getelementptr inbounds i8, i8* %124, i64 %120
store i8 %123, i8* %125
%126 = add nuw nsw i64 %106, 3
%127 = add nuw nsw i64 %107, 4
%128 = getelementptr inbounds i8, i8* %0, i64 %121
%129 = load i8, i8* %128
%130 = load i8*, i8** %4
%131 = getelementptr inbounds i8, i8* %130, i64 %126
store i8 %129, i8* %131
%132 = add nuw nsw i64 %106, 4
%133 = add i64 %108, 4
%134 = icmp eq i64 %133, %45
br i1 %134, label %63, label %105
135: ; preds = %101, %135
%136 = phi i64 [ %148, %135 ], [ %102, %101 ]
%137 = load i8*, i8** %4
%138 = getelementptr inbounds i8, i8* %137, i64 %136
store i8 %2, i8* %138
%139 = add nuw nsw i64 %136, 1
%140 = load i8*, i8** %4
%141 = getelementptr inbounds i8, i8* %140, i64 %139
store i8 %2, i8* %141
%142 = add nuw nsw i64 %136, 2
%143 = load i8*, i8** %4
%144 = getelementptr inbounds i8, i8* %143, i64 %142
store i8 %2, i8* %144
%145 = add nuw nsw i64 %136, 3
%146 = load i8*, i8** %4
%147 = getelementptr inbounds i8, i8* %146, i64 %145
store i8 %2, i8* %147
%148 = add nuw nsw i64 %136, 4
%149 = trunc i64 %148 to i32
%150 = icmp slt i32 %149, %1
br i1 %150, label %135, label %151
151: ; preds = %135, %101
%152 = phi i64 [ %103, %101 ], [ %148, %135 ]
%153 = trunc i64 %152 to i32
br label %154
154: ; preds = %151, %83
%155 = phi i32 [ %84, %83 ], [ %153, %151 ]
%156 = load i8*, i8** %4
%157 = zext i32 %155 to i64
%158 = getelementptr inbounds i8, i8* %156, i64 %157
store i8 0, i8* %158
%159 = load i8*, i8** %4
br label %160
160: ; preds = %3, %154
%161 = phi i8* [ %159, %154 ], [ null, %3 ]
ret i8* %161
}