#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ putc(char, int /*<<< orphan*/ *);
void hotLoop(int w, int h, double x, double y, double *p_Cr, double *p_Ci,
             int iter, double *p_Tr, double *p_Ti, double limit, double *p_Zr,
             double *p_Zi, char *p_byte_acc, int *p_bit_num, FILE *outStream) {
  *p_Cr = (2.0 * x / w - 1.5);
  *p_Ci = (2.0 * y / h - 1.0);
  int i;
  for (i = 0; i < iter && (*p_Tr + *p_Ti <= limit * limit); ++i) {
    *p_Zi = 2.0 * (*p_Zr) * (*p_Zi) + *p_Ci;
    *p_Zr = *p_Tr - *p_Ti + *p_Cr;
    *p_Tr = (*p_Zr) * (*p_Zr);
    *p_Ti = (*p_Zi) * (*p_Zi);
  }
  *p_byte_acc <<= 1;
  if (*p_Tr + *p_Ti <= limit * limit)
    *p_byte_acc |= 0x01;
  ++(*p_bit_num);
  if (*p_bit_num == 8) {
    putc(*p_byte_acc, outStream);
    *p_byte_acc = 0;
    *p_bit_num = 0;
  } else if (x == w - 1) {
    *p_byte_acc <<= (8 - w % 8);
    putc(*p_byte_acc, outStream);
    *p_byte_acc = 0;
    *p_bit_num = 0;
  }
}


x86 assembly (clang, -O0):
<hotLoop>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
mov    %r9,-0x38(%rbp)
movsd  %xmm2,-0x40(%rbp)
movsd  0xeab(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe9d(%rip),%xmm1
subsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xe81(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe63(%rip),%xmm1
subsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%ecx
xor    %eax,%eax
cmp    -0x2c(%rbp),%ecx
mov    %al,-0x45(%rbp)
jge    11e5 <hotLoop+0xd5>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm1
mov    0x10(%rbp),%rax
addsd  (%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
mov    %al,-0x45(%rbp)
mov    -0x45(%rbp),%al
test   $0x1,%al
jne    11f5 <hotLoop+0xe5>
jmp    1283 <hotLoop+0x173>
mov    0x18(%rbp),%rax
movsd  0xe07(%rip),%xmm0
mulsd  (%rax),%xmm0
mov    0x20(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
mov    0x10(%rbp),%rax
subsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
addsd  (%rax),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    0x18(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    0x20(%rbp),%rax
mulsd  (%rax),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11b0 <hotLoop+0xa0>
mov    0x28(%rbp),%rax
movsbl (%rax),%ecx
shl    $0x1,%ecx
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm1
mov    0x10(%rbp),%rax
addsd  (%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     12bf <hotLoop+0x1af>
mov    0x28(%rbp),%rax
movsbl (%rax),%ecx
or     $0x1,%ecx
mov    %cl,(%rax)
mov    0x30(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    0x30(%rbp),%rax
cmpl   $0x8,(%rax)
jne    12ff <hotLoop+0x1ef>
mov    0x28(%rbp),%rax
mov    (%rax),%al
mov    0x38(%rbp),%rsi
movsbl %al,%edi
call   1030 <putc@plt>
mov    0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    0x30(%rbp),%rax
movl   $0x0,(%rax)
jmp    1365 <hotLoop+0x255>
movsd  -0x10(%rbp),%xmm0
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
ucomisd %xmm1,%xmm0
jne    1360 <hotLoop+0x250>
jp     1360 <hotLoop+0x250>
mov    -0x4(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    $0x8,%ecx
sub    %edx,%ecx
mov    0x28(%rbp),%rax
movsbl (%rax),%edx
shl    %cl,%edx
mov    %edx,%ecx
mov    %cl,(%rax)
mov    0x28(%rbp),%rax
mov    (%rax),%al
mov    0x38(%rbp),%rsi
movsbl %al,%edi
call   1030 <putc@plt>
mov    0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    0x30(%rbp),%rax
movl   $0x0,(%rax)
jmp    1365 <hotLoop+0x255>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hotLoop>:
push   %r14
push   %rbx
push   %rax
mov    0x38(%rsp),%r14
mov    0x20(%rsp),%rax
movapd %xmm0,%xmm3
addsd  %xmm0,%xmm3
cvtsi2sd %edi,%xmm4
divsd  %xmm4,%xmm3
addsd  0xeca(%rip),%xmm3
xorps  %xmm4,%xmm4
cvtsi2sd %esi,%xmm4
addsd  %xmm1,%xmm1
divsd  %xmm4,%xmm1
addsd  0xebb(%rip),%xmm1
movsd  %xmm3,(%rdx)
movsd  %xmm1,(%rcx)
mulsd  %xmm2,%xmm2
test   %r8d,%r8d
jle    11bb <hotLoop+0xab>
mov    0x30(%rsp),%rsi
mov    0x28(%rsp),%rbx
movsd  (%rax),%xmm1
nopl   0x0(%rax)
addsd  (%r9),%xmm1
ucomisd %xmm1,%xmm2
jb     11bb <hotLoop+0xab>
movsd  (%rbx),%xmm1
addsd  %xmm1,%xmm1
mulsd  (%rsi),%xmm1
addsd  (%rcx),%xmm1
movsd  %xmm1,(%rsi)
movsd  (%r9),%xmm1
subsd  (%rax),%xmm1
addsd  (%rdx),%xmm1
movsd  %xmm1,(%rbx)
mulsd  %xmm1,%xmm1
movsd  %xmm1,(%r9)
movsd  (%rsi),%xmm1
mulsd  %xmm1,%xmm1
movsd  %xmm1,(%rax)
add    $0xffffffff,%r8d
jne    1170 <hotLoop+0x60>
mov    0x40(%rsp),%rbx
mov    (%r14),%cl
add    %cl,%cl
mov    %cl,(%r14)
movsd  (%r9),%xmm1
addsd  (%rax),%xmm1
ucomisd %xmm1,%xmm2
jb     11dd <hotLoop+0xcd>
or     $0x1,%cl
mov    %cl,(%r14)
mov    (%rbx),%eax
add    $0x1,%eax
mov    %eax,(%rbx)
cmp    $0x8,%eax
jne    11ee <hotLoop+0xde>
mov    (%r14),%al
jmp    121d <hotLoop+0x10d>
lea    -0x1(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
ucomisd %xmm0,%xmm1
jne    1234 <hotLoop+0x124>
jp     1234 <hotLoop+0x124>
lea    0x7(%rdi),%eax
test   %edi,%edi
cmovns %edi,%eax
and    $0xf8,%eax
sub    %eax,%edi
movzbl (%r14),%eax
mov    $0x8,%cl
sub    %dil,%cl
shl    %cl,%eax
mov    %al,(%r14)
mov    0x48(%rsp),%rsi
movsbl %al,%edi
call   1030 <putc@plt>
movb   $0x0,(%r14)
movl   $0x0,(%rbx)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @hotLoop(i32 %0, i32 %1, double %2, double %3, double* %4, double* %5, i32 %6, double* %7, double* %8, double %9, double* %10, double* %11, i8* %12, i32* %13, i32* %14) {
%16 = alloca i32
%17 = alloca i32
%18 = alloca double
%19 = alloca double
%20 = alloca double*
%21 = alloca double*
%22 = alloca i32
%23 = alloca double*
%24 = alloca double*
%25 = alloca double
%26 = alloca double*
%27 = alloca double*
%28 = alloca i8*
%29 = alloca i32*
%30 = alloca i32*
%31 = alloca i32
store i32 %0, i32* %16
store i32 %1, i32* %17
store double %2, double* %18
store double %3, double* %19
store double* %4, double** %20
store double* %5, double** %21
store i32 %6, i32* %22
store double* %7, double** %23
store double* %8, double** %24
store double %9, double* %25
store double* %10, double** %26
store double* %11, double** %27
store i8* %12, i8** %28
store i32* %13, i32** %29
store i32* %14, i32** %30
%32 = load double, double* %18
%33 = fmul double 2.000000e+00, %32
%34 = load i32, i32* %16
%35 = sitofp i32 %34 to double
%36 = fdiv double %33, %35
%37 = fsub double %36, 1.500000e+00
%38 = load double*, double** %20
store double %37, double* %38
%39 = load double, double* %19
%40 = fmul double 2.000000e+00, %39
%41 = load i32, i32* %17
%42 = sitofp i32 %41 to double
%43 = fdiv double %40, %42
%44 = fsub double %43, 1.000000e+00
%45 = load double*, double** %21
store double %44, double* %45
store i32 0, i32* %31
br label %46
46: ; preds = %93, %15
%47 = load i32, i32* %31
%48 = load i32, i32* %22
%49 = icmp slt i32 %47, %48
br i1 %49, label %50, label %60
50: ; preds = %46
%51 = load double*, double** %23
%52 = load double, double* %51
%53 = load double*, double** %24
%54 = load double, double* %53
%55 = fadd double %52, %54
%56 = load double, double* %25
%57 = load double, double* %25
%58 = fmul double %56, %57
%59 = fcmp ole double %55, %58
br label %60
60: ; preds = %50, %46
%61 = phi i1 [ false, %46 ], [ %59, %50 ]
br i1 %61, label %62, label %96
62: ; preds = %60
%63 = load double*, double** %26
%64 = load double, double* %63
%65 = fmul double 2.000000e+00, %64
%66 = load double*, double** %27
%67 = load double, double* %66
%68 = load double*, double** %21
%69 = load double, double* %68
%70 = call double @llvm.fmuladd.f64(double %65, double %67, double %69)
%71 = load double*, double** %27
store double %70, double* %71
%72 = load double*, double** %23
%73 = load double, double* %72
%74 = load double*, double** %24
%75 = load double, double* %74
%76 = fsub double %73, %75
%77 = load double*, double** %20
%78 = load double, double* %77
%79 = fadd double %76, %78
%80 = load double*, double** %26
store double %79, double* %80
%81 = load double*, double** %26
%82 = load double, double* %81
%83 = load double*, double** %26
%84 = load double, double* %83
%85 = fmul double %82, %84
%86 = load double*, double** %23
store double %85, double* %86
%87 = load double*, double** %27
%88 = load double, double* %87
%89 = load double*, double** %27
%90 = load double, double* %89
%91 = fmul double %88, %90
%92 = load double*, double** %24
store double %91, double* %92
br label %93
93: ; preds = %62
%94 = load i32, i32* %31
%95 = add nsw i32 %94, 1
store i32 %95, i32* %31
br label %46
96: ; preds = %60
%97 = load i8*, i8** %28
%98 = load i8, i8* %97
%99 = sext i8 %98 to i32
%100 = shl i32 %99, 1
%101 = trunc i32 %100 to i8
store i8 %101, i8* %97
%102 = load double*, double** %23
%103 = load double, double* %102
%104 = load double*, double** %24
%105 = load double, double* %104
%106 = fadd double %103, %105
%107 = load double, double* %25
%108 = load double, double* %25
%109 = fmul double %107, %108
%110 = fcmp ole double %106, %109
br i1 %110, label %111, label %117
111: ; preds = %96
%112 = load i8*, i8** %28
%113 = load i8, i8* %112
%114 = sext i8 %113 to i32
%115 = or i32 %114, 1
%116 = trunc i32 %115 to i8
store i8 %116, i8* %112
br label %117
117: ; preds = %111, %96
%118 = load i32*, i32** %29
%119 = load i32, i32* %118
%120 = add nsw i32 %119, 1
store i32 %120, i32* %118
%121 = load i32*, i32** %29
%122 = load i32, i32* %121
%123 = icmp eq i32 %122, 8
br i1 %123, label %124, label %131
124: ; preds = %117
%125 = load i8*, i8** %28
%126 = load i8, i8* %125
%127 = load i32*, i32** %30
%128 = call i32 @putc(i8 signext %126, i32* %127)
%129 = load i8*, i8** %28
store i8 0, i8* %129
%130 = load i32*, i32** %29
store i32 0, i32* %130
br label %153
131: ; preds = %117
%132 = load double, double* %18
%133 = load i32, i32* %16
%134 = sub nsw i32 %133, 1
%135 = sitofp i32 %134 to double
%136 = fcmp oeq double %132, %135
br i1 %136, label %137, label %152
137: ; preds = %131
%138 = load i32, i32* %16
%139 = srem i32 %138, 8
%140 = sub nsw i32 8, %139
%141 = load i8*, i8** %28
%142 = load i8, i8* %141
%143 = sext i8 %142 to i32
%144 = shl i32 %143, %140
%145 = trunc i32 %144 to i8
store i8 %145, i8* %141
%146 = load i8*, i8** %28
%147 = load i8, i8* %146
%148 = load i32*, i32** %30
%149 = call i32 @putc(i8 signext %147, i32* %148)
%150 = load i8*, i8** %28
store i8 0, i8* %150
%151 = load i32*, i32** %29
store i32 0, i32* %151
br label %152
152: ; preds = %137, %131
br label %153
153: ; preds = %152, %124
ret void
}

LLVM IR (-O2):
define void @hotLoop(i32 %0, i32 %1, double %2, double %3, double* nocapture %4, double* nocapture %5, i32 %6, double* nocapture %7, double* nocapture %8, double %9, double* nocapture %10, double* nocapture %11, i8* nocapture %12, i32* nocapture %13, i32* nocapture %14) {
%16 = fmul double %2, 2.000000e+00
%17 = sitofp i32 %0 to double
%18 = fdiv double %16, %17
%19 = fadd double %18, -1.500000e+00
store double %19, double* %4
%20 = fmul double %3, 2.000000e+00
%21 = sitofp i32 %1 to double
%22 = fdiv double %20, %21
%23 = fadd double %22, -1.000000e+00
store double %23, double* %5
%24 = icmp sgt i32 %6, 0
%25 = fmul double %9, %9
br i1 %24, label %26, label %50
26: ; preds = %15
%27 = load double, double* %8
br label %28
28: ; preds = %26, %34
%29 = phi double [ %27, %26 ], [ %47, %34 ]
%30 = phi i32 [ 0, %26 ], [ %48, %34 ]
%31 = load double, double* %7
%32 = fadd double %31, %29
%33 = fcmp ugt double %32, %25
br i1 %33, label %50, label %34
34: ; preds = %28
%35 = load double, double* %10
%36 = fmul double %35, 2.000000e+00
%37 = load double, double* %11
%38 = load double, double* %5
%39 = tail call double @llvm.fmuladd.f64(double %36, double %37, double %38)
store double %39, double* %11
%40 = load double, double* %7
%41 = load double, double* %8
%42 = fsub double %40, %41
%43 = load double, double* %4
%44 = fadd double %42, %43
store double %44, double* %10
%45 = fmul double %44, %44
store double %45, double* %7
%46 = load double, double* %11
%47 = fmul double %46, %46
store double %47, double* %8
%48 = add nuw nsw i32 %30, 1
%49 = icmp eq i32 %48, %6
br i1 %49, label %50, label %28
50: ; preds = %28, %34, %15
%51 = load i8, i8* %12
%52 = shl i8 %51, 1
store i8 %52, i8* %12
%53 = load double, double* %7
%54 = load double, double* %8
%55 = fadd double %53, %54
%56 = fcmp ugt double %55, %25
br i1 %56, label %59, label %57
57: ; preds = %50
%58 = or i8 %52, 1
store i8 %58, i8* %12
br label %59
59: ; preds = %57, %50
%60 = load i32, i32* %13
%61 = add nsw i32 %60, 1
store i32 %61, i32* %13
%62 = icmp eq i32 %61, 8
br i1 %62, label %63, label %65
63: ; preds = %59
%64 = load i8, i8* %12
br label %76
65: ; preds = %59
%66 = add nsw i32 %0, -1
%67 = sitofp i32 %66 to double
%68 = fcmp oeq double %67, %2
br i1 %68, label %69, label %79
69: ; preds = %65
%70 = srem i32 %0, 8
%71 = sub nsw i32 8, %70
%72 = load i8, i8* %12
%73 = zext i8 %72 to i32
%74 = shl nuw nsw i32 %73, %71
%75 = trunc i32 %74 to i8
store i8 %75, i8* %12
br label %76
76: ; preds = %63, %69
%77 = phi i8 [ %75, %69 ], [ %64, %63 ]
%78 = tail call i32 @putc(i8 signext %77, i32* %14)
store i8 0, i8* %12
store i32 0, i32* %13
br label %79
79: ; preds = %76, %65
ret void
}