#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 abs(unsigned char);
scalar_t__ malloc(int);
int /*<<< orphan*/ memset(unsigned char *, int /*<<< orphan*/, int);
int /*<<< orphan*/ printf(char *, int, int, int);
unsigned char *create_fg_image(unsigned char *input, unsigned char *bg,
                               int threshold) {
  int subtracted_cnt = 0;
  int i;
  unsigned char *out = (unsigned char *)malloc(4608000 * sizeof(unsigned char));
  memset(out, 0, 4608000 * sizeof(unsigned char));
  for (i = 0; i < 4608000; i += 5) {
    (abs(input[i] - bg[i]) > threshold) ? out[i] = input[i] : subtracted_cnt++;
    (abs(input[i + 1] - bg[i + 1]) > threshold) ? out[i + 1] = input[i + 1]
                                                : subtracted_cnt++;
    (abs(input[i + 2] - bg[i + 2]) > threshold) ? out[i + 2] = input[i + 2]
                                                : subtracted_cnt++;
    (abs(input[i + 3] - bg[i + 3]) > threshold) ? out[i + 3] = input[i + 3]
                                                : subtracted_cnt++;
  }
  printf("%d (%2.1f %) of Total %d is subtracted.\n", subtracted_cnt,
         (subtracted_cnt / (double)3686400) * 100.0, 3686400);
  return out;
}


x86 assembly (clang, -O0):
<create_fg_image>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    $0x465000,%edi
call   1060 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
xor    %esi,%esi
mov    $0x465000,%edx
call   1050 <memset@plt>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x465000,-0x1c(%rbp)
jge    131e <create_fg_image+0x1de>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
movzbl %al,%edi
call   1030 <abs@plt>
cmp    -0x14(%rbp),%eax
jle    11d5 <create_fg_image+0x95>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    -0x28(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
mov    %al,(%rcx,%rdx,1)
movzbl %al,%eax
jmp    11de <create_fg_image+0x9e>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
movzbl %al,%edi
call   1030 <abs@plt>
cmp    -0x14(%rbp),%eax
jle    123b <create_fg_image+0xfb>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    -0x28(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
mov    %al,(%rcx,%rdx,1)
movzbl %al,%eax
jmp    1244 <create_fg_image+0x104>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    $0x2,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
movzbl %al,%edi
call   1030 <abs@plt>
cmp    -0x14(%rbp),%eax
jle    12a1 <create_fg_image+0x161>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    -0x28(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    $0x2,%edx
movslq %edx,%rdx
mov    %al,(%rcx,%rdx,1)
movzbl %al,%eax
jmp    12aa <create_fg_image+0x16a>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    $0x3,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
movzbl %al,%edi
call   1030 <abs@plt>
cmp    -0x14(%rbp),%eax
jle    1307 <create_fg_image+0x1c7>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    -0x28(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    $0x3,%edx
movslq %edx,%rdx
mov    %al,(%rcx,%rdx,1)
movzbl %al,%eax
jmp    1310 <create_fg_image+0x1d0>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x1c(%rbp)
jmp    117f <create_fg_image+0x3f>
mov    -0x18(%rbp),%esi
cvtsi2sdl -0x18(%rbp),%xmm0
movsd  0xcda(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xcc6(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
lea    0xcc7(%rip),%rdi
mov    $0x384000,%ecx
call   1040 <printf@plt>
mov    -0x28(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<create_fg_image>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %edx,%r15d
mov    %rsi,%r12
mov    %rdi,%rbx
mov    $0x465000,%edi
call   1060 <malloc@plt>
mov    %rax,%r14
xor    %r13d,%r13d
mov    %rax,%rdi
xor    %esi,%esi
mov    $0x465000,%edx
call   1050 <memset@plt>
mov    $0xfffffffffffffffb,%rbp
jmp    1195 <create_fg_image+0x55>
nopl   0x0(%rax)
add    $0x1,%r13d
add    $0x5,%rbp
cmp    $0x464ffb,%rbp
jae    124e <create_fg_image+0x10e>
movzbl 0x5(%rbx,%rbp,1),%eax
sub    0x5(%r12,%rbp,1),%al
movzbl %al,%edi
call   1030 <abs@plt>
cmp    %r15d,%eax
jle    11c0 <create_fg_image+0x80>
movzbl 0x5(%rbx,%rbp,1),%eax
mov    %al,0x5(%r14,%rbp,1)
jmp    11c4 <create_fg_image+0x84>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r13d
movzbl 0x6(%rbx,%rbp,1),%eax
sub    0x6(%r12,%rbp,1),%al
movzbl %al,%edi
call   1030 <abs@plt>
cmp    %r15d,%eax
jle    11f0 <create_fg_image+0xb0>
movzbl 0x6(%rbx,%rbp,1),%eax
mov    %al,0x6(%r14,%rbp,1)
jmp    11f4 <create_fg_image+0xb4>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r13d
movzbl 0x7(%rbx,%rbp,1),%eax
sub    0x7(%r12,%rbp,1),%al
movzbl %al,%edi
call   1030 <abs@plt>
cmp    %r15d,%eax
jle    1220 <create_fg_image+0xe0>
movzbl 0x7(%rbx,%rbp,1),%eax
mov    %al,0x7(%r14,%rbp,1)
jmp    1224 <create_fg_image+0xe4>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r13d
movzbl 0x8(%rbx,%rbp,1),%eax
sub    0x8(%r12,%rbp,1),%al
movzbl %al,%edi
call   1030 <abs@plt>
cmp    %r15d,%eax
jle    1180 <create_fg_image+0x40>
movzbl 0x8(%rbx,%rbp,1),%eax
mov    %al,0x8(%r14,%rbp,1)
jmp    1184 <create_fg_image+0x44>
cvtsi2sd %r13d,%xmm0
divsd  0xda5(%rip),%xmm0
mulsd  0xda5(%rip),%xmm0
cvttsd2si %xmm0,%edx
lea    0xda2(%rip),%rdi
mov    %r13d,%esi
mov    $0x384000,%ecx
call   1040 <printf@plt>
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [41 x i8] c"%d (%2.1f %) of Total %d is subtracted.\0A\00"
define i8* @create_fg_image(i8* %0, i8* %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i8*
store i8* %0, i8** %4
store i8* %1, i8** %5
store i32 %2, i32* %6
store i32 0, i32* %7
%10 = call i64 @malloc(i32 4608000)
%11 = inttoptr i64 %10 to i8*
store i8* %11, i8** %9
%12 = load i8*, i8** %9
%13 = call i32 @memset(i8* %12, i32 0, i32 4608000)
store i32 0, i32* %8
br label %14
14: ; preds = %162, %3
%15 = load i32, i32* %8
%16 = icmp slt i32 %15, 4608000
br i1 %16, label %17, label %165
17: ; preds = %14
%18 = load i8*, i8** %4
%19 = load i32, i32* %8
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %18, i64 %20
%22 = load i8, i8* %21
%23 = zext i8 %22 to i32
%24 = load i8*, i8** %5
%25 = load i32, i32* %8
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %24, i64 %26
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = sub nsw i32 %23, %29
%31 = trunc i32 %30 to i8
%32 = call i32 @abs(i8 zeroext %31)
%33 = load i32, i32* %6
%34 = icmp sgt i32 %32, %33
br i1 %34, label %35, label %46
35: ; preds = %17
%36 = load i8*, i8** %4
%37 = load i32, i32* %8
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i8, i8* %36, i64 %38
%40 = load i8, i8* %39
%41 = load i8*, i8** %9
%42 = load i32, i32* %8
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %41, i64 %43
store i8 %40, i8* %44
%45 = zext i8 %40 to i32
br label %49
46: ; preds = %17
%47 = load i32, i32* %7
%48 = add nsw i32 %47, 1
store i32 %48, i32* %7
br label %49
49: ; preds = %46, %35
%50 = phi i32 [ %45, %35 ], [ %47, %46 ]
%51 = load i8*, i8** %4
%52 = load i32, i32* %8
%53 = add nsw i32 %52, 1
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %51, i64 %54
%56 = load i8, i8* %55
%57 = zext i8 %56 to i32
%58 = load i8*, i8** %5
%59 = load i32, i32* %8
%60 = add nsw i32 %59, 1
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds i8, i8* %58, i64 %61
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = sub nsw i32 %57, %64
%66 = trunc i32 %65 to i8
%67 = call i32 @abs(i8 zeroext %66)
%68 = load i32, i32* %6
%69 = icmp sgt i32 %67, %68
br i1 %69, label %70, label %83
70: ; preds = %49
%71 = load i8*, i8** %4
%72 = load i32, i32* %8
%73 = add nsw i32 %72, 1
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8, i8* %71, i64 %74
%76 = load i8, i8* %75
%77 = load i8*, i8** %9
%78 = load i32, i32* %8
%79 = add nsw i32 %78, 1
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds i8, i8* %77, i64 %80
store i8 %76, i8* %81
%82 = zext i8 %76 to i32
br label %86
83: ; preds = %49
%84 = load i32, i32* %7
%85 = add nsw i32 %84, 1
store i32 %85, i32* %7
br label %86
86: ; preds = %83, %70
%87 = phi i32 [ %82, %70 ], [ %84, %83 ]
%88 = load i8*, i8** %4
%89 = load i32, i32* %8
%90 = add nsw i32 %89, 2
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds i8, i8* %88, i64 %91
%93 = load i8, i8* %92
%94 = zext i8 %93 to i32
%95 = load i8*, i8** %5
%96 = load i32, i32* %8
%97 = add nsw i32 %96, 2
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i8, i8* %95, i64 %98
%100 = load i8, i8* %99
%101 = zext i8 %100 to i32
%102 = sub nsw i32 %94, %101
%103 = trunc i32 %102 to i8
%104 = call i32 @abs(i8 zeroext %103)
%105 = load i32, i32* %6
%106 = icmp sgt i32 %104, %105
br i1 %106, label %107, label %120
107: ; preds = %86
%108 = load i8*, i8** %4
%109 = load i32, i32* %8
%110 = add nsw i32 %109, 2
%111 = sext i32 %110 to i64
%112 = getelementptr inbounds i8, i8* %108, i64 %111
%113 = load i8, i8* %112
%114 = load i8*, i8** %9
%115 = load i32, i32* %8
%116 = add nsw i32 %115, 2
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds i8, i8* %114, i64 %117
store i8 %113, i8* %118
%119 = zext i8 %113 to i32
br label %123
120: ; preds = %86
%121 = load i32, i32* %7
%122 = add nsw i32 %121, 1
store i32 %122, i32* %7
br label %123
123: ; preds = %120, %107
%124 = phi i32 [ %119, %107 ], [ %121, %120 ]
%125 = load i8*, i8** %4
%126 = load i32, i32* %8
%127 = add nsw i32 %126, 3
%128 = sext i32 %127 to i64
%129 = getelementptr inbounds i8, i8* %125, i64 %128
%130 = load i8, i8* %129
%131 = zext i8 %130 to i32
%132 = load i8*, i8** %5
%133 = load i32, i32* %8
%134 = add nsw i32 %133, 3
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds i8, i8* %132, i64 %135
%137 = load i8, i8* %136
%138 = zext i8 %137 to i32
%139 = sub nsw i32 %131, %138
%140 = trunc i32 %139 to i8
%141 = call i32 @abs(i8 zeroext %140)
%142 = load i32, i32* %6
%143 = icmp sgt i32 %141, %142
br i1 %143, label %144, label %157
144: ; preds = %123
%145 = load i8*, i8** %4
%146 = load i32, i32* %8
%147 = add nsw i32 %146, 3
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i8, i8* %145, i64 %148
%150 = load i8, i8* %149
%151 = load i8*, i8** %9
%152 = load i32, i32* %8
%153 = add nsw i32 %152, 3
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds i8, i8* %151, i64 %154
store i8 %150, i8* %155
%156 = zext i8 %150 to i32
br label %160
157: ; preds = %123
%158 = load i32, i32* %7
%159 = add nsw i32 %158, 1
store i32 %159, i32* %7
br label %160
160: ; preds = %157, %144
%161 = phi i32 [ %156, %144 ], [ %158, %157 ]
br label %162
162: ; preds = %160
%163 = load i32, i32* %8
%164 = add nsw i32 %163, 5
store i32 %164, i32* %8
br label %14
165: ; preds = %14
%166 = load i32, i32* %7
%167 = load i32, i32* %7
%168 = sitofp i32 %167 to double
%169 = fdiv double %168, 3.686400e+06
%170 = fmul double %169, 1.000000e+02
%171 = fptosi double %170 to i32
%172 = call i32 @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str, i64 0, i64 0), i32 %166, i32 %171, i32 3686400)
%173 = load i8*, i8** %9
ret i8* %173
}

LLVM IR (-O2):
@.str = [41 x i8] c"%d (%2.1f %) of Total %d is subtracted.\0A\00"
define i8* @create_fg_image(i8* nocapture %0, i8* nocapture %1, i32 %2) {
%4 = tail call i64 @malloc(i32 4608000)
%5 = inttoptr i64 %4 to i8*
%6 = tail call i32 @memset(i8* %5, i32 0, i32 4608000)
br label %7
7: ; preds = %3, %67
%8 = phi i64 [ 0, %3 ], [ %69, %67 ]
%9 = phi i32 [ 0, %3 ], [ %68, %67 ]
%10 = getelementptr inbounds i8, i8* %0, i64 %8
%11 = load i8, i8* %10
%12 = getelementptr inbounds i8, i8* %1, i64 %8
%13 = load i8, i8* %12
%14 = sub i8 %11, %13
%15 = tail call i32 @abs(i8 zeroext %14)
%16 = icmp sgt i32 %15, %2
br i1 %16, label %17, label %20
17: ; preds = %7
%18 = load i8, i8* %10
%19 = getelementptr inbounds i8, i8* %5, i64 %8
store i8 %18, i8* %19
br label %22
20: ; preds = %7
%21 = add nsw i32 %9, 1
br label %22
22: ; preds = %20, %17
%23 = phi i32 [ %9, %17 ], [ %21, %20 ]
%24 = add nuw nsw i64 %8, 1
%25 = getelementptr inbounds i8, i8* %0, i64 %24
%26 = load i8, i8* %25
%27 = getelementptr inbounds i8, i8* %1, i64 %24
%28 = load i8, i8* %27
%29 = sub i8 %26, %28
%30 = tail call i32 @abs(i8 zeroext %29)
%31 = icmp sgt i32 %30, %2
br i1 %31, label %32, label %35
32: ; preds = %22
%33 = load i8, i8* %25
%34 = getelementptr inbounds i8, i8* %5, i64 %24
store i8 %33, i8* %34
br label %37
35: ; preds = %22
%36 = add nsw i32 %23, 1
br label %37
37: ; preds = %35, %32
%38 = phi i32 [ %23, %32 ], [ %36, %35 ]
%39 = add nuw nsw i64 %8, 2
%40 = getelementptr inbounds i8, i8* %0, i64 %39
%41 = load i8, i8* %40
%42 = getelementptr inbounds i8, i8* %1, i64 %39
%43 = load i8, i8* %42
%44 = sub i8 %41, %43
%45 = tail call i32 @abs(i8 zeroext %44)
%46 = icmp sgt i32 %45, %2
br i1 %46, label %47, label %50
47: ; preds = %37
%48 = load i8, i8* %40
%49 = getelementptr inbounds i8, i8* %5, i64 %39
store i8 %48, i8* %49
br label %52
50: ; preds = %37
%51 = add nsw i32 %38, 1
br label %52
52: ; preds = %50, %47
%53 = phi i32 [ %38, %47 ], [ %51, %50 ]
%54 = add nuw nsw i64 %8, 3
%55 = getelementptr inbounds i8, i8* %0, i64 %54
%56 = load i8, i8* %55
%57 = getelementptr inbounds i8, i8* %1, i64 %54
%58 = load i8, i8* %57
%59 = sub i8 %56, %58
%60 = tail call i32 @abs(i8 zeroext %59)
%61 = icmp sgt i32 %60, %2
br i1 %61, label %62, label %65
62: ; preds = %52
%63 = load i8, i8* %55
%64 = getelementptr inbounds i8, i8* %5, i64 %54
store i8 %63, i8* %64
br label %67
65: ; preds = %52
%66 = add nsw i32 %53, 1
br label %67
67: ; preds = %62, %65
%68 = phi i32 [ %53, %62 ], [ %66, %65 ]
%69 = add nuw nsw i64 %8, 5
%70 = icmp ult i64 %8, 4607995
br i1 %70, label %7, label %71
71: ; preds = %67
%72 = sitofp i32 %68 to double
%73 = fdiv double %72, 3.686400e+06
%74 = fmul double %73, 1.000000e+02
%75 = fptosi double %74 to i32
%76 = tail call i32 @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str, i64 0, i64 0), i32 %68, i32 %75, i32 3686400)
ret i8* %5
}