#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*/ line(int, int, int, int);
int /*<<< orphan*/ setPixel(int, int);
void bezier(int x0, int y0, int x1, int y1, int x2, int y2) {
  int sx = x2 - x1, sy = y2 - y1;
  long xx = x0 - x1, yy = y0 - y1, xy;
  double dx, dy, err, cur = xx * sy - yy * sx;
  if (sx * (long)sx + sy * (long)sy > xx * xx + yy * yy) {
    x2 = x0;
    x0 = sx + x1;
    y2 = y0;
    y0 = sy + y1;
    cur = -cur;
  }
  if (cur != 0) {
    xx += sx;
    xx *= sx = x0 < x2 ? 1 : -1;
    yy += sy;
    yy *= sy = y0 < y2 ? 1 : -1;
    xy = 2 * xx * yy;
    xx *= xx;
    yy *= yy;
    if (cur * sx * sy < 0) {
      xx = -xx;
      yy = -yy;
      xy = -xy;
      cur = -cur;
    }
    dx = 4.0 * sy * cur * (x1 - x0) + xx - xy;
    dy = 4.0 * sx * cur * (y0 - y1) + yy - xy;
    xx += xx;
    yy += yy;
    err = dx + dy + xy;
    do {
      setPixel(x0, y0);
      if (x0 == x2 && y0 == y2)
        return;
      y1 = 2 * err < dx;
      if (2 * err > dy) {
        x0 += sx;
        dx -= xy;
        err += dy += yy;
      }
      if (y1) {
        y0 += sy;
        dy -= xy;
        err += dx += xx;
      }
    } while (dy < dx);
  }
  line(x0, y0, x2, y2);
}


x86 assembly (clang, -O0):
<bezier>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
sub    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x4(%rbp),%eax
sub    -0xc(%rbp),%eax
cltq
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%eax
sub    -0x10(%rbp),%eax
cltq
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x20(%rbp),%rcx
imul   %rcx,%rax
mov    -0x30(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
imul   %rdx,%rcx
sub    %rcx,%rax
cvtsi2sd %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
movslq -0x1c(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   %rcx,%rax
movslq -0x20(%rbp),%rcx
movslq -0x20(%rbp),%rdx
imul   %rdx,%rcx
add    %rcx,%rax
mov    -0x28(%rbp),%rcx
imul   -0x28(%rbp),%rcx
mov    -0x30(%rbp),%rdx
imul   -0x30(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jle    1203 <bezier+0xe3>
mov    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x1c(%rbp),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x8(%rbp)
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1220 <bezier+0x100>
jp     1220 <bezier+0x100>
jmp    14ae <bezier+0x38e>
movslq -0x1c(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x4(%rbp),%edx
mov    -0x14(%rbp),%esi
mov    $0xffffffff,%eax
mov    $0x1,%ecx
cmp    %esi,%edx
cmovl  %ecx,%eax
mov    %eax,-0x1c(%rbp)
cltq
imul   -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
movslq -0x20(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%edx
mov    -0x18(%rbp),%esi
mov    $0xffffffff,%eax
mov    $0x1,%ecx
cmp    %esi,%edx
cmovl  %ecx,%eax
mov    %eax,-0x20(%rbp)
cltq
imul   -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
shl    $0x1,%rax
imul   -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rax
imul   -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
imul   -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
movsd  -0x58(%rbp),%xmm1
cvtsi2sdl -0x1c(%rbp),%xmm0
mulsd  %xmm0,%xmm1
cvtsi2sdl -0x20(%rbp),%xmm0
mulsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    130c <bezier+0x1ec>
xor    %eax,%eax
sub    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
xor    %eax,%eax
sub    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
xor    %eax,%eax
sub    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
cvtsi2sdl -0x20(%rbp),%xmm1
movsd  0xce7(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0xc(%rbp),%eax
sub    -0x4(%rbp),%eax
cvtsi2sd %eax,%xmm2
cvtsi2sdq -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdq -0x38(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xcaa(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x8(%rbp),%eax
sub    -0x10(%rbp),%eax
cvtsi2sd %eax,%xmm2
cvtsi2sdq -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdq -0x38(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
movsd  -0x40(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
cvtsi2sdq -0x38(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
call   1030 <setPixel@plt>
mov    -0x4(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    13df <bezier+0x2bf>
mov    -0x8(%rbp),%eax
cmp    -0x18(%rbp),%eax
jne    13df <bezier+0x2bf>
jmp    14bf <bezier+0x39f>
movsd  0xc21(%rip),%xmm1
mulsd  -0x50(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x10(%rbp)
movsd  0xc00(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    144f <bezier+0x32f>
mov    -0x1c(%rbp),%eax
add    -0x4(%rbp),%eax
mov    %eax,-0x4(%rbp)
cvtsi2sdq -0x38(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvtsi2sdq -0x30(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
cmpl   $0x0,-0x10(%rbp)
je     1490 <bezier+0x370>
mov    -0x20(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
cvtsi2sdq -0x38(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
cvtsi2sdq -0x28(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    1495 <bezier+0x375>
movsd  -0x48(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
ja     13b7 <bezier+0x297>
jmp    14ae <bezier+0x38e>
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
mov    -0x14(%rbp),%edx
mov    -0x18(%rbp),%ecx
call   1040 <line@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bezier>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %esi,%r15d
mov    %edi,%r14d
mov    %r8d,%esi
sub    %edx,%esi
mov    %r9d,%edi
sub    %ecx,%edi
mov    %r14d,%eax
sub    %edx,%eax
cltq
mov    %r15d,%ebp
sub    %ecx,%ebp
movslq %ebp,%r10
movslq %edi,%r11
mov    %r11,%rdi
imul   %rax,%rdi
movslq %esi,%rsi
mov    %rsi,%rbx
imul   %r10,%rbx
sub    %rbx,%rdi
cvtsi2sd %rdi,%xmm0
mov    %rsi,%rdi
imul   %rsi,%rdi
mov    %r11,%rbx
imul   %r11,%rbx
add    %rdi,%rbx
mov    %rax,%rdi
imul   %rax,%rdi
mov    %r10,%rbp
imul   %r10,%rbp
add    %rdi,%rbp
cmp    %rbp,%rbx
jbe    11a0 <bezier+0x80>
xorpd  0xe68(%rip),%xmm0
mov    %r9d,%ebp
mov    %r8d,%ebx
jmp    11ac <bezier+0x8c>
mov    %r15d,%ebp
mov    %r14d,%ebx
mov    %r8d,%r14d
mov    %r9d,%r15d
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
jne    11bc <bezier+0x9c>
jnp    137c <bezier+0x25c>
add    %rax,%rsi
xor    %eax,%eax
cmp    %r14d,%ebx
setl   %al
lea    (%rax,%rax,1),%r12d
add    $0xffffffff,%r12d
add    %rax,%rax
add    $0xffffffffffffffff,%rax
imul   %rsi,%rax
add    %r10,%r11
xor    %esi,%esi
cmp    %r15d,%ebp
setl   %sil
lea    (%rsi,%rsi,1),%r13d
add    $0xffffffff,%r13d
add    %rsi,%rsi
add    $0xffffffffffffffff,%rsi
imul   %r11,%rsi
mov    %rax,%rdi
imul   %rsi,%rdi
add    %rdi,%rdi
imul   %rax,%rax
imul   %rsi,%rsi
cvtsi2sd %r12d,%xmm1
movapd %xmm0,%xmm4
cvtsi2sd %r13d,%xmm3
mulsd  %xmm1,%xmm4
mulsd  %xmm3,%xmm4
ucomisd %xmm4,%xmm2
jbe    1238 <bezier+0x118>
neg    %rax
neg    %rsi
neg    %rdi
xorpd  0xdc8(%rip),%xmm0
movsd  0xdd0(%rip),%xmm2
mulsd  %xmm2,%xmm3
mulsd  %xmm0,%xmm3
sub    %ebx,%edx
xorps  %xmm4,%xmm4
cvtsi2sd %edx,%xmm4
mulsd  %xmm3,%xmm4
cvtsi2sd %rax,%xmm5
xorps  %xmm3,%xmm3
cvtsi2sd %rdi,%xmm3
addsd  %xmm4,%xmm5
subsd  %xmm3,%xmm5
mulsd  %xmm2,%xmm1
mulsd  %xmm0,%xmm1
mov    %ebp,%edx
sub    %ecx,%edx
xorps  %xmm0,%xmm0
cvtsi2sd %edx,%xmm0
mulsd  %xmm1,%xmm0
xorps  %xmm2,%xmm2
cvtsi2sd %rsi,%xmm2
addsd  %xmm0,%xmm2
subsd  %xmm3,%xmm2
add    %rax,%rax
add    %rsi,%rsi
movapd %xmm5,%xmm4
addsd  %xmm2,%xmm4
movsd  %xmm3,0x8(%rsp)
addsd  %xmm3,%xmm4
xorps  %xmm0,%xmm0
cvtsi2sd %rsi,%xmm0
movsd  %xmm0,0x20(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
movsd  %xmm0,0x18(%rsp)
jmp    12de <bezier+0x1be>
nopw   0x0(%rax,%rax,1)
ucomisd %xmm2,%xmm0
movapd %xmm0,%xmm5
jbe    137c <bezier+0x25c>
movsd  %xmm5,0x10(%rsp)
movsd  %xmm4,0x28(%rsp)
movsd  %xmm2,0x30(%rsp)
mov    %ebx,%edi
mov    %ebp,%esi
call   1030 <setPixel@plt>
cmp    %r15d,%ebp
jne    1307 <bezier+0x1e7>
cmp    %r14d,%ebx
je     1399 <bezier+0x279>
movsd  0x28(%rsp),%xmm4
movapd %xmm4,%xmm1
addsd  %xmm4,%xmm1
movsd  0x30(%rsp),%xmm2
ucomisd %xmm2,%xmm1
jbe    1350 <bezier+0x230>
add    %r12d,%ebx
movsd  0x10(%rsp),%xmm3
movapd %xmm3,%xmm0
subsd  0x8(%rsp),%xmm0
addsd  0x20(%rsp),%xmm2
addsd  %xmm2,%xmm4
ucomisd %xmm1,%xmm3
jbe    12d0 <bezier+0x1b0>
jmp    1364 <bezier+0x244>
cs nopw 0x0(%rax,%rax,1)
movsd  0x10(%rsp),%xmm3
movapd %xmm3,%xmm0
ucomisd %xmm1,%xmm3
jbe    12d0 <bezier+0x1b0>
add    %r13d,%ebp
subsd  0x8(%rsp),%xmm2
addsd  0x18(%rsp),%xmm0
addsd  %xmm0,%xmm4
jmp    12d0 <bezier+0x1b0>
mov    %ebx,%edi
mov    %ebp,%esi
mov    %r14d,%edx
mov    %r15d,%ecx
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1040 <line@plt>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @bezier(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i64
%16 = alloca i64
%17 = alloca i64
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store i32 %4, i32* %11
store i32 %5, i32* %12
%22 = load i32, i32* %11
%23 = load i32, i32* %9
%24 = sub nsw i32 %22, %23
store i32 %24, i32* %13
%25 = load i32, i32* %12
%26 = load i32, i32* %10
%27 = sub nsw i32 %25, %26
store i32 %27, i32* %14
%28 = load i32, i32* %7
%29 = load i32, i32* %9
%30 = sub nsw i32 %28, %29
%31 = sext i32 %30 to i64
store i64 %31, i64* %15
%32 = load i32, i32* %8
%33 = load i32, i32* %10
%34 = sub nsw i32 %32, %33
%35 = sext i32 %34 to i64
store i64 %35, i64* %16
%36 = load i64, i64* %15
%37 = load i32, i32* %14
%38 = sext i32 %37 to i64
%39 = mul nsw i64 %36, %38
%40 = load i64, i64* %16
%41 = load i32, i32* %13
%42 = sext i32 %41 to i64
%43 = mul nsw i64 %40, %42
%44 = sub nsw i64 %39, %43
%45 = sitofp i64 %44 to double
store double %45, double* %21
%46 = load i32, i32* %13
%47 = sext i32 %46 to i64
%48 = load i32, i32* %13
%49 = sext i32 %48 to i64
%50 = mul nsw i64 %47, %49
%51 = load i32, i32* %14
%52 = sext i32 %51 to i64
%53 = load i32, i32* %14
%54 = sext i32 %53 to i64
%55 = mul nsw i64 %52, %54
%56 = add nsw i64 %50, %55
%57 = load i64, i64* %15
%58 = load i64, i64* %15
%59 = mul nsw i64 %57, %58
%60 = load i64, i64* %16
%61 = load i64, i64* %16
%62 = mul nsw i64 %60, %61
%63 = add nsw i64 %59, %62
%64 = icmp sgt i64 %56, %63
br i1 %64, label %65, label %76
65: ; preds = %6
%66 = load i32, i32* %7
store i32 %66, i32* %11
%67 = load i32, i32* %13
%68 = load i32, i32* %9
%69 = add nsw i32 %67, %68
store i32 %69, i32* %7
%70 = load i32, i32* %8
store i32 %70, i32* %12
%71 = load i32, i32* %14
%72 = load i32, i32* %10
%73 = add nsw i32 %71, %72
store i32 %73, i32* %8
%74 = load double, double* %21
%75 = fneg double %74
store double %75, double* %21
br label %76
76: ; preds = %65, %6
%77 = load double, double* %21
%78 = fcmp une double %77, 0.000000e+00
br i1 %78, label %79, label %233
79: ; preds = %76
%80 = load i32, i32* %13
%81 = sext i32 %80 to i64
%82 = load i64, i64* %15
%83 = add nsw i64 %82, %81
store i64 %83, i64* %15
%84 = load i32, i32* %7
%85 = load i32, i32* %11
%86 = icmp slt i32 %84, %85
%87 = zext i1 %86 to i64
%88 = select i1 %86, i32 1, i32 -1
store i32 %88, i32* %13
%89 = sext i32 %88 to i64
%90 = load i64, i64* %15
%91 = mul nsw i64 %90, %89
store i64 %91, i64* %15
%92 = load i32, i32* %14
%93 = sext i32 %92 to i64
%94 = load i64, i64* %16
%95 = add nsw i64 %94, %93
store i64 %95, i64* %16
%96 = load i32, i32* %8
%97 = load i32, i32* %12
%98 = icmp slt i32 %96, %97
%99 = zext i1 %98 to i64
%100 = select i1 %98, i32 1, i32 -1
store i32 %100, i32* %14
%101 = sext i32 %100 to i64
%102 = load i64, i64* %16
%103 = mul nsw i64 %102, %101
store i64 %103, i64* %16
%104 = load i64, i64* %15
%105 = mul nsw i64 2, %104
%106 = load i64, i64* %16
%107 = mul nsw i64 %105, %106
store i64 %107, i64* %17
%108 = load i64, i64* %15
%109 = load i64, i64* %15
%110 = mul nsw i64 %109, %108
store i64 %110, i64* %15
%111 = load i64, i64* %16
%112 = load i64, i64* %16
%113 = mul nsw i64 %112, %111
store i64 %113, i64* %16
%114 = load double, double* %21
%115 = load i32, i32* %13
%116 = sitofp i32 %115 to double
%117 = fmul double %114, %116
%118 = load i32, i32* %14
%119 = sitofp i32 %118 to double
%120 = fmul double %117, %119
%121 = fcmp olt double %120, 0.000000e+00
br i1 %121, label %122, label %131
122: ; preds = %79
%123 = load i64, i64* %15
%124 = sub nsw i64 0, %123
store i64 %124, i64* %15
%125 = load i64, i64* %16
%126 = sub nsw i64 0, %125
store i64 %126, i64* %16
%127 = load i64, i64* %17
%128 = sub nsw i64 0, %127
store i64 %128, i64* %17
%129 = load double, double* %21
%130 = fneg double %129
store double %130, double* %21
br label %131
131: ; preds = %122, %79
%132 = load i32, i32* %14
%133 = sitofp i32 %132 to double
%134 = fmul double 4.000000e+00, %133
%135 = load double, double* %21
%136 = fmul double %134, %135
%137 = load i32, i32* %9
%138 = load i32, i32* %7
%139 = sub nsw i32 %137, %138
%140 = sitofp i32 %139 to double
%141 = load i64, i64* %15
%142 = sitofp i64 %141 to double
%143 = call double @llvm.fmuladd.f64(double %136, double %140, double %142)
%144 = load i64, i64* %17
%145 = sitofp i64 %144 to double
%146 = fsub double %143, %145
store double %146, double* %18
%147 = load i32, i32* %13
%148 = sitofp i32 %147 to double
%149 = fmul double 4.000000e+00, %148
%150 = load double, double* %21
%151 = fmul double %149, %150
%152 = load i32, i32* %8
%153 = load i32, i32* %10
%154 = sub nsw i32 %152, %153
%155 = sitofp i32 %154 to double
%156 = load i64, i64* %16
%157 = sitofp i64 %156 to double
%158 = call double @llvm.fmuladd.f64(double %151, double %155, double %157)
%159 = load i64, i64* %17
%160 = sitofp i64 %159 to double
%161 = fsub double %158, %160
store double %161, double* %19
%162 = load i64, i64* %15
%163 = load i64, i64* %15
%164 = add nsw i64 %163, %162
store i64 %164, i64* %15
%165 = load i64, i64* %16
%166 = load i64, i64* %16
%167 = add nsw i64 %166, %165
store i64 %167, i64* %16
%168 = load double, double* %18
%169 = load double, double* %19
%170 = fadd double %168, %169
%171 = load i64, i64* %17
%172 = sitofp i64 %171 to double
%173 = fadd double %170, %172
store double %173, double* %20
br label %174
174: ; preds = %228, %131
%175 = load i32, i32* %7
%176 = load i32, i32* %8
%177 = call i32 @setPixel(i32 %175, i32 %176)
%178 = load i32, i32* %7
%179 = load i32, i32* %11
%180 = icmp eq i32 %178, %179
br i1 %180, label %181, label %186
181: ; preds = %174
%182 = load i32, i32* %8
%183 = load i32, i32* %12
%184 = icmp eq i32 %182, %183
br i1 %184, label %185, label %186
185: ; preds = %181
br label %239
186: ; preds = %181, %174
%187 = load double, double* %20
%188 = fmul double 2.000000e+00, %187
%189 = load double, double* %18
%190 = fcmp olt double %188, %189
%191 = zext i1 %190 to i32
store i32 %191, i32* %10
%192 = load double, double* %20
%193 = fmul double 2.000000e+00, %192
%194 = load double, double* %19
%195 = fcmp ogt double %193, %194
br i1 %195, label %196, label %210
196: ; preds = %186
%197 = load i32, i32* %13
%198 = load i32, i32* %7
%199 = add nsw i32 %198, %197
store i32 %199, i32* %7
%200 = load i64, i64* %17
%201 = sitofp i64 %200 to double
%202 = load double, double* %18
%203 = fsub double %202, %201
store double %203, double* %18
%204 = load i64, i64* %16
%205 = sitofp i64 %204 to double
%206 = load double, double* %19
%207 = fadd double %206, %205
store double %207, double* %19
%208 = load double, double* %20
%209 = fadd double %208, %207
store double %209, double* %20
br label %210
210: ; preds = %196, %186
%211 = load i32, i32* %10
%212 = icmp ne i32 %211, 0
br i1 %212, label %213, label %227
213: ; preds = %210
%214 = load i32, i32* %14
%215 = load i32, i32* %8
%216 = add nsw i32 %215, %214
store i32 %216, i32* %8
%217 = load i64, i64* %17
%218 = sitofp i64 %217 to double
%219 = load double, double* %19
%220 = fsub double %219, %218
store double %220, double* %19
%221 = load i64, i64* %15
%222 = sitofp i64 %221 to double
%223 = load double, double* %18
%224 = fadd double %223, %222
store double %224, double* %18
%225 = load double, double* %20
%226 = fadd double %225, %224
store double %226, double* %20
br label %227
227: ; preds = %213, %210
br label %228
228: ; preds = %227
%229 = load double, double* %19
%230 = load double, double* %18
%231 = fcmp olt double %229, %230
br i1 %231, label %174, label %232
232: ; preds = %228
br label %233
233: ; preds = %232, %76
%234 = load i32, i32* %7
%235 = load i32, i32* %8
%236 = load i32, i32* %11
%237 = load i32, i32* %12
%238 = call i32 @line(i32 %234, i32 %235, i32 %236, i32 %237)
br label %239
239: ; preds = %233, %185
ret void
}

LLVM IR (-O2):
define void @bezier(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = sub nsw i32 %4, %2
%8 = sub nsw i32 %5, %3
%9 = sub nsw i32 %0, %2
%10 = sext i32 %9 to i64
%11 = sub nsw i32 %1, %3
%12 = sext i32 %11 to i64
%13 = sext i32 %8 to i64
%14 = mul nsw i64 %13, %10
%15 = sext i32 %7 to i64
%16 = mul nsw i64 %15, %12
%17 = sub nsw i64 %14, %16
%18 = sitofp i64 %17 to double
%19 = mul nsw i64 %15, %15
%20 = mul nsw i64 %13, %13
%21 = add nuw nsw i64 %20, %19
%22 = mul nsw i64 %10, %10
%23 = mul nsw i64 %12, %12
%24 = add nuw nsw i64 %23, %22
%25 = icmp ugt i64 %21, %24
br i1 %25, label %26, label %28
26: ; preds = %6
%27 = fneg double %18
br label %28
28: ; preds = %26, %6
%29 = phi i32 [ %5, %26 ], [ %1, %6 ]
%30 = phi i32 [ %4, %26 ], [ %0, %6 ]
%31 = phi i32 [ %0, %26 ], [ %4, %6 ]
%32 = phi i32 [ %1, %26 ], [ %5, %6 ]
%33 = phi double [ %27, %26 ], [ %18, %6 ]
%34 = fcmp une double %33, 0.000000e+00
br i1 %34, label %35, label %121
35: ; preds = %28
%36 = add nsw i64 %15, %10
%37 = icmp slt i32 %30, %31
%38 = select i1 %37, i32 1, i32 -1
%39 = sext i32 %38 to i64
%40 = mul nsw i64 %36, %39
%41 = add nsw i64 %13, %12
%42 = icmp slt i32 %29, %32
%43 = select i1 %42, i32 1, i32 -1
%44 = sext i32 %43 to i64
%45 = mul nsw i64 %41, %44
%46 = shl nsw i64 %40, 1
%47 = mul nsw i64 %46, %45
%48 = mul nsw i64 %40, %40
%49 = mul nsw i64 %45, %45
%50 = sitofp i32 %38 to double
%51 = fmul double %33, %50
%52 = sitofp i32 %43 to double
%53 = fmul double %51, %52
%54 = fcmp olt double %53, 0.000000e+00
br i1 %54, label %55, label %60
55: ; preds = %35
%56 = sub nsw i64 0, %48
%57 = sub nsw i64 0, %49
%58 = sub nsw i64 0, %47
%59 = fneg double %33
br label %60
60: ; preds = %55, %35
%61 = phi i64 [ %56, %55 ], [ %48, %35 ]
%62 = phi i64 [ %57, %55 ], [ %49, %35 ]
%63 = phi i64 [ %58, %55 ], [ %47, %35 ]
%64 = phi double [ %59, %55 ], [ %33, %35 ]
%65 = fmul double %52, 4.000000e+00
%66 = fmul double %65, %64
%67 = sub nsw i32 %2, %30
%68 = sitofp i32 %67 to double
%69 = sitofp i64 %61 to double
%70 = tail call double @llvm.fmuladd.f64(double %66, double %68, double %69)
%71 = sitofp i64 %63 to double
%72 = fsub double %70, %71
%73 = fmul double %50, 4.000000e+00
%74 = fmul double %73, %64
%75 = sub nsw i32 %29, %3
%76 = sitofp i32 %75 to double
%77 = sitofp i64 %62 to double
%78 = tail call double @llvm.fmuladd.f64(double %74, double %76, double %77)
%79 = fsub double %78, %71
%80 = shl nsw i64 %61, 1
%81 = shl nsw i64 %62, 1
%82 = fadd double %72, %79
%83 = fadd double %82, %71
%84 = sitofp i64 %81 to double
%85 = sitofp i64 %80 to double
br label %86
86: ; preds = %115, %60
%87 = phi i32 [ %29, %60 ], [ %116, %115 ]
%88 = phi i32 [ %30, %60 ], [ %106, %115 ]
%89 = phi double [ %72, %60 ], [ %117, %115 ]
%90 = phi double [ %79, %60 ], [ %118, %115 ]
%91 = phi double [ %83, %60 ], [ %119, %115 ]
%92 = tail call i32 @setPixel(i32 %88, i32 %87)
%93 = icmp eq i32 %88, %31
%94 = icmp eq i32 %87, %32
%95 = and i1 %94, %93
br i1 %95, label %125, label %96
96: ; preds = %86
%97 = fmul double %91, 2.000000e+00
%98 = fcmp olt double %97, %89
%99 = fcmp ogt double %97, %90
br i1 %99, label %100, label %105
100: ; preds = %96
%101 = add nsw i32 %88, %38
%102 = fsub double %89, %71
%103 = fadd double %90, %84
%104 = fadd double %91, %103
br label %105
105: ; preds = %100, %96
%106 = phi i32 [ %101, %100 ], [ %88, %96 ]
%107 = phi double [ %102, %100 ], [ %89, %96 ]
%108 = phi double [ %103, %100 ], [ %90, %96 ]
%109 = phi double [ %104, %100 ], [ %91, %96 ]
br i1 %98, label %110, label %115
110: ; preds = %105
%111 = add nsw i32 %87, %43
%112 = fsub double %108, %71
%113 = fadd double %107, %85
%114 = fadd double %113, %109
br label %115
115: ; preds = %105, %110
%116 = phi i32 [ %111, %110 ], [ %87, %105 ]
%117 = phi double [ %113, %110 ], [ %107, %105 ]
%118 = phi double [ %112, %110 ], [ %108, %105 ]
%119 = phi double [ %114, %110 ], [ %109, %105 ]
%120 = fcmp olt double %118, %117
br i1 %120, label %86, label %121
121: ; preds = %115, %28
%122 = phi i32 [ %29, %28 ], [ %116, %115 ]
%123 = phi i32 [ %30, %28 ], [ %106, %115 ]
%124 = tail call i32 @line(i32 %123, i32 %122, i32 %31, i32 %32)
br label %125
125: ; preds = %86, %121
ret void
}