#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*/ add_windows(double, double);
int /*<<< orphan*/ angular_cylinder(double, double, double, double);
int /*<<< orphan*/ crenelation(double, double);
int /*<<< orphan*/ diff();
int /*<<< orphan*/ enddiff();
int /*<<< orphan*/ endonion();
int /*<<< orphan*/ endxlate();
int /*<<< orphan*/ hollow_angular_cylinder(double, double, double, double);
int irandomn(int);
int /*<<< orphan*/ onion();
double perturbup(double, double);
int /*<<< orphan*/ xlate(double, double, double);
void pointy_tower(double x, double y, double r, double h, int flying,
                  double fa) {
  double pointiness;
  pointiness = perturbup(1.4, 0.5);
  int extra_pointy;
  if (r > h * 0.20)
    flying = 0;
  extra_pointy = (r < h * 0.30 && irandomn(100) < 40);
  xlate(x, y, 0);
  diff();
  onion();
  if (flying) {
    hollow_angular_cylinder(h * 0.75, 0.15 * r, 0.15 * r, fa);
    xlate(0, 0, h * 0.5);
    angular_cylinder(h * 0.25, 0.10 * r, r * 1.2, fa);
    xlate(0, 0, h * 0.25);
    angular_cylinder(1.6 * r, 1.2 * r, r * 1.2, fa);
    xlate(0, 0, r * 1.6);
    angular_cylinder(pointiness * r, 1.2 * r, 0, fa);
    if (extra_pointy)
      angular_cylinder(pointiness * 2 * r, 0.6 * r, 0, fa);
  } else {
    hollow_angular_cylinder(h, r, 0.80 * r, fa);
    xlate(0, 0, h - 0.6 * r);
    angular_cylinder(0.6 * r, 0.81 * r, r * 1.2, fa);
    xlate(0, 0, r * 0.6);
    angular_cylinder(0.6 * r, 1.2 * r, r * 1.2, fa);
    xlate(0, 0, r * 0.6);
    angular_cylinder(pointiness * r, 1.2 * r, 0, fa);
    if (extra_pointy)
      angular_cylinder(pointiness * 2 * r, 0.6 * r, 0, fa);
  }
  endxlate();
  endxlate();
  endxlate();
  endonion();
  if (!flying) {
    add_windows(r, h);
  }
  if (!flying)
    xlate(0, 0, h + 3);
  else
    xlate(0, 0, h * 0.85);
  crenelation(r * 1.2, r * 2);
  endxlate();
  enddiff();
  endxlate();
}


x86 assembly (clang, -O0):
<pointy_tower>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
mov    %edi,-0x24(%rbp)
movsd  %xmm4,-0x30(%rbp)
movsd  0xe1c(%rip),%xmm0
movsd  0xe1c(%rip),%xmm1
call   1040 <perturbup@plt>
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xdf5(%rip),%xmm1
mulsd  -0x20(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jbe    1221 <pointy_tower+0x61>
movl   $0x0,-0x24(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  0xdea(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
xor    %eax,%eax
ucomisd %xmm1,%xmm0
mov    %al,-0x3d(%rbp)
jbe    1255 <pointy_tower+0x95>
mov    $0x64,%edi
call   10d0 <irandomn@plt>
cmp    $0x28,%eax
setl   %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x3c(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
xorps  %xmm2,%xmm2
call   1030 <xlate@plt>
mov    $0x0,%al
call   10e0 <diff@plt>
mov    $0x0,%al
call   1060 <onion@plt>
cmpl   $0x0,-0x24(%rbp)
je     13c4 <pointy_tower+0x204>
movsd  0xdde(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  0xdc9(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  0xdbc(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
call   1090 <hollow_angular_cylinder@plt>
movsd  0xd4d(%rip),%xmm2
mulsd  -0x20(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  0xd7d(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  0xd78(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  0xd2b(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
call   1070 <angular_cylinder@plt>
movsd  0xd4c(%rip),%xmm2
mulsd  -0x20(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  0xd2c(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xcef(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  0xce2(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
call   1070 <angular_cylinder@plt>
movsd  0xcfb(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  -0x38(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xca9(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm3
xorps  %xmm2,%xmm2
call   1070 <angular_cylinder@plt>
cmpl   $0x0,-0x3c(%rbp)
je     13bf <pointy_tower+0x1ff>
movsd  0xcad(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xc7b(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm3
xorps  %xmm2,%xmm2
call   1070 <angular_cylinder@plt>
jmp    14fb <pointy_tower+0x33b>
movsd  -0x20(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  0xc6a(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
call   1090 <hollow_angular_cylinder@plt>
movsd  -0x20(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
movsd  0xc41(%rip),%xmm1
mulsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  0xc16(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xc11(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  0xbf4(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
call   1070 <angular_cylinder@plt>
movsd  0xbe5(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  0xbcd(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xbb8(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  0xbab(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
call   1070 <angular_cylinder@plt>
movsd  0xb9c(%rip),%xmm2
mulsd  -0x18(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  -0x38(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xb72(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm3
xorps  %xmm2,%xmm2
call   1070 <angular_cylinder@plt>
cmpl   $0x0,-0x3c(%rbp)
je     14f6 <pointy_tower+0x336>
movsd  0xb76(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xb44(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm3
xorps  %xmm2,%xmm2
call   1070 <angular_cylinder@plt>
jmp    14fb <pointy_tower+0x33b>
mov    $0x0,%al
call   10a0 <endxlate@plt>
mov    $0x0,%al
call   10a0 <endxlate@plt>
mov    $0x0,%al
call   10a0 <endxlate@plt>
mov    $0x0,%al
call   10c0 <endonion@plt>
cmpl   $0x0,-0x24(%rbp)
jne    1530 <pointy_tower+0x370>
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
call   10b0 <add_windows@plt>
cmpl   $0x0,-0x24(%rbp)
jne    1557 <pointy_tower+0x397>
movsd  0xb36(%rip),%xmm2
addsd  -0x20(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
jmp    156f <pointy_tower+0x3af>
movsd  0xb21(%rip),%xmm2
mulsd  -0x20(%rbp),%xmm2
xorps  %xmm1,%xmm1
movaps %xmm1,%xmm0
call   1030 <xlate@plt>
movsd  0xaa9(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xac4(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
call   1050 <crenelation@plt>
mov    $0x0,%al
call   10a0 <endxlate@plt>
mov    $0x0,%al
call   1080 <enddiff@plt>
mov    $0x0,%al
call   10a0 <endxlate@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pointy_tower>:
push   %rbp
push   %r14
push   %rbx
sub    $0x40,%rsp
movsd  %xmm4,0x10(%rsp)
mov    %edi,%ebp
movsd  %xmm3,0x20(%rsp)
movsd  %xmm2,0x8(%rsp)
movsd  %xmm1,0x18(%rsp)
movsd  %xmm0,0x28(%rsp)
movsd  0xe10(%rip),%xmm0
movsd  0xe10(%rip),%xmm1
call   1040 <perturbup@plt>
movsd  0x20(%rsp),%xmm2
movsd  0x8(%rsp),%xmm1
movsd  0xdff(%rip),%xmm4
mulsd  %xmm2,%xmm4
movsd  0xdfb(%rip),%xmm3
mulsd  %xmm2,%xmm3
ucomisd %xmm1,%xmm3
movsd  %xmm0,0x30(%rsp)
jbe    1252 <pointy_tower+0x92>
mov    $0x64,%edi
movsd  %xmm4,0x38(%rsp)
call   10d0 <irandomn@plt>
movsd  0x38(%rsp),%xmm4
movsd  0x8(%rsp),%xmm1
cmp    $0x28,%eax
setl   %r14b
jmp    1255 <pointy_tower+0x95>
xor    %r14d,%r14d
ucomisd %xmm4,%xmm1
seta   %bl
xorpd  %xmm2,%xmm2
movsd  0x28(%rsp),%xmm0
movsd  0x18(%rsp),%xmm1
call   1030 <xlate@plt>
xor    %eax,%eax
call   10e0 <diff@plt>
xor    %eax,%eax
call   1060 <onion@plt>
test   %ebp,%ebp
sete   %bpl
or     %bl,%bpl
je     1399 <pointy_tower+0x1d9>
movsd  0xdc2(%rip),%xmm2
movsd  0x8(%rsp),%xmm1
mulsd  %xmm1,%xmm2
movsd  0x20(%rsp),%xmm0
movsd  0x10(%rsp),%xmm3
call   1090 <hollow_angular_cylinder@plt>
movsd  0xda7(%rip),%xmm2
mulsd  0x8(%rsp),%xmm2
addsd  0x20(%rsp),%xmm2
xorps  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
call   1030 <xlate@plt>
movsd  0xd77(%rip),%xmm0
movsd  0x8(%rsp),%xmm3
mulsd  %xmm3,%xmm0
movsd  %xmm0,0x18(%rsp)
movsd  0xd77(%rip),%xmm1
mulsd  %xmm3,%xmm1
movsd  0xd43(%rip),%xmm2
mulsd  %xmm3,%xmm2
movsd  %xmm2,0x28(%rsp)
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
movsd  0x18(%rsp),%xmm2
call   1030 <xlate@plt>
movsd  0x18(%rsp),%xmm0
movsd  0x28(%rsp),%xmm1
movaps %xmm1,%xmm2
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
xorps  %xmm0,%xmm0
xorps  %xmm1,%xmm1
movsd  0x18(%rsp),%xmm2
call   1030 <xlate@plt>
movsd  0x30(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
xorpd  %xmm2,%xmm2
movsd  0x28(%rsp),%xmm1
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
test   %r14b,%r14b
je     14c4 <pointy_tower+0x304>
movsd  0x30(%rsp),%xmm0
addsd  %xmm0,%xmm0
mulsd  0x8(%rsp),%xmm0
xorpd  %xmm2,%xmm2
movsd  0x18(%rsp),%xmm1
jmp    14b9 <pointy_tower+0x2f9>
movsd  0xc7f(%rip),%xmm0
mulsd  0x20(%rsp),%xmm0
movsd  0xc79(%rip),%xmm1
mulsd  0x8(%rsp),%xmm1
movapd %xmm1,%xmm2
movsd  0x10(%rsp),%xmm3
call   1090 <hollow_angular_cylinder@plt>
movsd  0xc3c(%rip),%xmm2
mulsd  0x20(%rsp),%xmm2
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
call   1030 <xlate@plt>
movsd  0xc49(%rip),%xmm0
mulsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x28(%rsp)
movsd  0xc3d(%rip),%xmm1
movsd  0x8(%rsp),%xmm3
mulsd  %xmm3,%xmm1
movsd  0xc33(%rip),%xmm2
mulsd  %xmm3,%xmm2
movsd  %xmm2,0x18(%rsp)
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
movsd  0x28(%rsp),%xmm2
call   1030 <xlate@plt>
movsd  0xc0b(%rip),%xmm0
mulsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x28(%rsp)
movsd  0x18(%rsp),%xmm1
movaps %xmm1,%xmm2
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
xorpd  %xmm0,%xmm0
xorps  %xmm1,%xmm1
movsd  0x28(%rsp),%xmm2
call   1030 <xlate@plt>
movsd  0x30(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
xorpd  %xmm2,%xmm2
movsd  0x18(%rsp),%xmm1
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
test   %r14b,%r14b
je     14c4 <pointy_tower+0x304>
movsd  0x30(%rsp),%xmm0
addsd  %xmm0,%xmm0
movsd  0x8(%rsp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xb9f(%rip),%xmm1
mulsd  %xmm2,%xmm1
xorpd  %xmm2,%xmm2
movsd  0x10(%rsp),%xmm3
call   1070 <angular_cylinder@plt>
xor    %eax,%eax
call   10a0 <endxlate@plt>
xor    %eax,%eax
call   10a0 <endxlate@plt>
xor    %eax,%eax
call   10a0 <endxlate@plt>
xor    %eax,%eax
call   10c0 <endonion@plt>
test   %bpl,%bpl
je     1506 <pointy_tower+0x346>
movsd  0x8(%rsp),%xmm0
movsd  0x20(%rsp),%xmm1
call   10b0 <add_windows@plt>
movsd  0x20(%rsp),%xmm2
addsd  0xb74(%rip),%xmm2
jmp    1514 <pointy_tower+0x354>
movsd  0x20(%rsp),%xmm2
mulsd  0xb5c(%rip),%xmm2
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
call   1030 <xlate@plt>
movsd  0xb17(%rip),%xmm0
movsd  0x8(%rsp),%xmm1
mulsd  %xmm1,%xmm0
addsd  %xmm1,%xmm1
call   1050 <crenelation@plt>
xor    %eax,%eax
call   10a0 <endxlate@plt>
xor    %eax,%eax
call   1080 <enddiff@plt>
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbx
pop    %r14
pop    %rbp
jmp    10a0 <endxlate@plt>

LLVM IR (-O0):
define void @pointy_tower(double %0, double %1, double %2, double %3, i32 %4, double %5) {
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca i32
%12 = alloca double
%13 = alloca double
%14 = alloca i32
store double %0, double* %7
store double %1, double* %8
store double %2, double* %9
store double %3, double* %10
store i32 %4, i32* %11
store double %5, double* %12
%15 = call double @perturbup(double 1.400000e+00, double 5.000000e-01)
store double %15, double* %13
%16 = load double, double* %9
%17 = load double, double* %10
%18 = fmul double %17, 2.000000e-01
%19 = fcmp ogt double %16, %18
br i1 %19, label %20, label %21
20: ; preds = %6
store i32 0, i32* %11
br label %21
21: ; preds = %20, %6
%22 = load double, double* %9
%23 = load double, double* %10
%24 = fmul double %23, 3.000000e-01
%25 = fcmp olt double %22, %24
br i1 %25, label %26, label %29
26: ; preds = %21
%27 = call i32 @irandomn(i32 100)
%28 = icmp slt i32 %27, 40
br label %29
29: ; preds = %26, %21
%30 = phi i1 [ false, %21 ], [ %28, %26 ]
%31 = zext i1 %30 to i32
store i32 %31, i32* %14
%32 = load double, double* %7
%33 = load double, double* %8
%34 = call i32 @xlate(double %32, double %33, double 0.000000e+00)
%35 = call i32 (...) @diff()
%36 = call i32 (...) @onion()
%37 = load i32, i32* %11
%38 = icmp ne i32 %37, 0
br i1 %38, label %39, label %92
39: ; preds = %29
%40 = load double, double* %10
%41 = fmul double %40, 7.500000e-01
%42 = load double, double* %9
%43 = fmul double 1.500000e-01, %42
%44 = load double, double* %9
%45 = fmul double 1.500000e-01, %44
%46 = load double, double* %12
%47 = call i32 @hollow_angular_cylinder(double %41, double %43, double %45, double %46)
%48 = load double, double* %10
%49 = fmul double %48, 5.000000e-01
%50 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %49)
%51 = load double, double* %10
%52 = fmul double %51, 2.500000e-01
%53 = load double, double* %9
%54 = fmul double 1.000000e-01, %53
%55 = load double, double* %9
%56 = fmul double %55, 1.200000e+00
%57 = load double, double* %12
%58 = call i32 @angular_cylinder(double %52, double %54, double %56, double %57)
%59 = load double, double* %10
%60 = fmul double %59, 2.500000e-01
%61 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %60)
%62 = load double, double* %9
%63 = fmul double 1.600000e+00, %62
%64 = load double, double* %9
%65 = fmul double 1.200000e+00, %64
%66 = load double, double* %9
%67 = fmul double %66, 1.200000e+00
%68 = load double, double* %12
%69 = call i32 @angular_cylinder(double %63, double %65, double %67, double %68)
%70 = load double, double* %9
%71 = fmul double %70, 1.600000e+00
%72 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %71)
%73 = load double, double* %13
%74 = load double, double* %9
%75 = fmul double %73, %74
%76 = load double, double* %9
%77 = fmul double 1.200000e+00, %76
%78 = load double, double* %12
%79 = call i32 @angular_cylinder(double %75, double %77, double 0.000000e+00, double %78)
%80 = load i32, i32* %14
%81 = icmp ne i32 %80, 0
br i1 %81, label %82, label %91
82: ; preds = %39
%83 = load double, double* %13
%84 = fmul double %83, 2.000000e+00
%85 = load double, double* %9
%86 = fmul double %84, %85
%87 = load double, double* %9
%88 = fmul double 6.000000e-01, %87
%89 = load double, double* %12
%90 = call i32 @angular_cylinder(double %86, double %88, double 0.000000e+00, double %89)
br label %91
91: ; preds = %82, %39
br label %144
92: ; preds = %29
%93 = load double, double* %10
%94 = load double, double* %9
%95 = load double, double* %9
%96 = fmul double 8.000000e-01, %95
%97 = load double, double* %12
%98 = call i32 @hollow_angular_cylinder(double %93, double %94, double %96, double %97)
%99 = load double, double* %10
%100 = load double, double* %9
%101 = call double @llvm.fmuladd.f64(double -6.000000e-01, double %100, double %99)
%102 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %101)
%103 = load double, double* %9
%104 = fmul double 6.000000e-01, %103
%105 = load double, double* %9
%106 = fmul double 8.100000e-01, %105
%107 = load double, double* %9
%108 = fmul double %107, 1.200000e+00
%109 = load double, double* %12
%110 = call i32 @angular_cylinder(double %104, double %106, double %108, double %109)
%111 = load double, double* %9
%112 = fmul double %111, 6.000000e-01
%113 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %112)
%114 = load double, double* %9
%115 = fmul double 6.000000e-01, %114
%116 = load double, double* %9
%117 = fmul double 1.200000e+00, %116
%118 = load double, double* %9
%119 = fmul double %118, 1.200000e+00
%120 = load double, double* %12
%121 = call i32 @angular_cylinder(double %115, double %117, double %119, double %120)
%122 = load double, double* %9
%123 = fmul double %122, 6.000000e-01
%124 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %123)
%125 = load double, double* %13
%126 = load double, double* %9
%127 = fmul double %125, %126
%128 = load double, double* %9
%129 = fmul double 1.200000e+00, %128
%130 = load double, double* %12
%131 = call i32 @angular_cylinder(double %127, double %129, double 0.000000e+00, double %130)
%132 = load i32, i32* %14
%133 = icmp ne i32 %132, 0
br i1 %133, label %134, label %143
134: ; preds = %92
%135 = load double, double* %13
%136 = fmul double %135, 2.000000e+00
%137 = load double, double* %9
%138 = fmul double %136, %137
%139 = load double, double* %9
%140 = fmul double 6.000000e-01, %139
%141 = load double, double* %12
%142 = call i32 @angular_cylinder(double %138, double %140, double 0.000000e+00, double %141)
br label %143
143: ; preds = %134, %92
br label %144
144: ; preds = %143, %91
%145 = call i32 (...) @endxlate()
%146 = call i32 (...) @endxlate()
%147 = call i32 (...) @endxlate()
%148 = call i32 (...) @endonion()
%149 = load i32, i32* %11
%150 = icmp ne i32 %149, 0
br i1 %150, label %155, label %151
151: ; preds = %144
%152 = load double, double* %9
%153 = load double, double* %10
%154 = call i32 @add_windows(double %152, double %153)
br label %155
155: ; preds = %151, %144
%156 = load i32, i32* %11
%157 = icmp ne i32 %156, 0
br i1 %157, label %162, label %158
158: ; preds = %155
%159 = load double, double* %10
%160 = fadd double %159, 3.000000e+00
%161 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %160)
br label %166
162: ; preds = %155
%163 = load double, double* %10
%164 = fmul double %163, 8.500000e-01
%165 = call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %164)
br label %166
166: ; preds = %162, %158
%167 = load double, double* %9
%168 = fmul double %167, 1.200000e+00
%169 = load double, double* %9
%170 = fmul double %169, 2.000000e+00
%171 = call i32 @crenelation(double %168, double %170)
%172 = call i32 (...) @endxlate()
%173 = call i32 (...) @enddiff()
%174 = call i32 (...) @endxlate()
ret void
}

LLVM IR (-O2):
define void @pointy_tower(double %0, double %1, double %2, double %3, i32 %4, double %5) {
%7 = tail call double @perturbup(double 1.400000e+00, double 5.000000e-01)
%8 = fmul double %3, 2.000000e-01
%9 = fcmp olt double %8, %2
%10 = fmul double %3, 3.000000e-01
%11 = fcmp ogt double %10, %2
br i1 %11, label %12, label %15
12: ; preds = %6
%13 = tail call i32 @irandomn(i32 100)
%14 = icmp slt i32 %13, 40
br label %15
15: ; preds = %12, %6
%16 = phi i1 [ false, %6 ], [ %14, %12 ]
%17 = tail call i32 @xlate(double %0, double %1, double 0.000000e+00)
%18 = tail call i32 (...) @diff()
%19 = tail call i32 (...) @onion()
%20 = icmp eq i32 %4, 0
%21 = or i1 %9, %20
br i1 %21, label %43, label %22
22: ; preds = %15
%23 = fmul double %3, 7.500000e-01
%24 = fmul double %2, 1.500000e-01
%25 = tail call i32 @hollow_angular_cylinder(double %23, double %24, double %24, double %5)
%26 = fmul double %3, 5.000000e-01
%27 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %26)
%28 = fmul double %3, 2.500000e-01
%29 = fmul double %2, 1.000000e-01
%30 = fmul double %2, 1.200000e+00
%31 = tail call i32 @angular_cylinder(double %28, double %29, double %30, double %5)
%32 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %28)
%33 = fmul double %2, 1.600000e+00
%34 = tail call i32 @angular_cylinder(double %33, double %30, double %30, double %5)
%35 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %33)
%36 = fmul double %7, %2
%37 = tail call i32 @angular_cylinder(double %36, double %30, double 0.000000e+00, double %5)
br i1 %16, label %38, label %61
38: ; preds = %22
%39 = fmul double %7, 2.000000e+00
%40 = fmul double %39, %2
%41 = fmul double %2, 6.000000e-01
%42 = tail call i32 @angular_cylinder(double %40, double %41, double 0.000000e+00, double %5)
br label %61
43: ; preds = %15
%44 = fmul double %2, 8.000000e-01
%45 = tail call i32 @hollow_angular_cylinder(double %3, double %2, double %44, double %5)
%46 = tail call double @llvm.fmuladd.f64(double %2, double -6.000000e-01, double %3)
%47 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %46)
%48 = fmul double %2, 6.000000e-01
%49 = fmul double %2, 8.100000e-01
%50 = fmul double %2, 1.200000e+00
%51 = tail call i32 @angular_cylinder(double %48, double %49, double %50, double %5)
%52 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %48)
%53 = tail call i32 @angular_cylinder(double %48, double %50, double %50, double %5)
%54 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %48)
%55 = fmul double %7, %2
%56 = tail call i32 @angular_cylinder(double %55, double %50, double 0.000000e+00, double %5)
br i1 %16, label %57, label %61
57: ; preds = %43
%58 = fmul double %7, 2.000000e+00
%59 = fmul double %58, %2
%60 = tail call i32 @angular_cylinder(double %59, double %48, double 0.000000e+00, double %5)
br label %61
61: ; preds = %43, %57, %22, %38
%62 = tail call i32 (...) @endxlate()
%63 = tail call i32 (...) @endxlate()
%64 = tail call i32 (...) @endxlate()
%65 = tail call i32 (...) @endonion()
br i1 %21, label %66, label %69
66: ; preds = %61
%67 = tail call i32 @add_windows(double %2, double %3)
%68 = fadd double %3, 3.000000e+00
br label %71
69: ; preds = %61
%70 = fmul double %3, 8.500000e-01
br label %71
71: ; preds = %69, %66
%72 = phi double [ %70, %69 ], [ %68, %66 ]
%73 = tail call i32 @xlate(double 0.000000e+00, double 0.000000e+00, double %72)
%74 = fmul double %2, 1.200000e+00
%75 = fmul double %2, 2.000000e+00
%76 = tail call i32 @crenelation(double %74, double %75)
%77 = tail call i32 (...) @endxlate()
%78 = tail call i32 (...) @enddiff()
%79 = tail call i32 (...) @endxlate()
ret void
}