#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*/ GLUquadricObj;

/* Variables and functions */
int /*<<< orphan*/ glColor3f(float, float, float);
int /*<<< orphan*/ glRotatef(float, float, float, float);
int /*<<< orphan*/ glTranslatef(float, float, float);
int /*<<< orphan*/ gluCylinder(int /*<<< orphan*/ *, float, float, float, int,
                               int);
int /*<<< orphan*/ *gluNewQuadric();
int /*<<< orphan*/ glutSolidSphere(double, int, int);
void drawtree() {
  glColor3f(0.188f, 0.143f, 0.143f);
  glTranslatef(0.0f, 3.0f, 0.0f);
  GLUquadricObj *quadratic;
  quadratic = gluNewQuadric();
  glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
  gluCylinder(quadratic, 0.2f, 0.3f, 5.5f, 32, 32);
  glColor3f(0.0f, 0.3f, 0.0f);
  glutSolidSphere(1.0, 32, 32);
}


x86 assembly (clang, -O0):
<drawtree>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  0xeb0(%rip),%xmm0
movss  0xeac(%rip),%xmm2
movaps %xmm2,%xmm1
call   1040 <glColor3f@plt>
xorps  %xmm2,%xmm2
movss  0xe91(%rip),%xmm1
movaps %xmm2,%xmm0
call   1070 <glTranslatef@plt>
mov    $0x0,%al
call   1030 <gluNewQuadric@plt>
mov    %rax,-0x8(%rbp)
movss  0xe6e(%rip),%xmm0
movss  0xe6a(%rip),%xmm1
xorps  %xmm3,%xmm3
movaps %xmm3,%xmm2
call   1080 <glRotatef@plt>
mov    -0x8(%rbp),%rdi
movss  0xe47(%rip),%xmm0
movss  0xe3b(%rip),%xmm1
movss  0xe3b(%rip),%xmm2
mov    $0x20,%edx
mov    %edx,%esi
call   1060 <gluCylinder@plt>
xorps  %xmm2,%xmm2
movss  0xe1c(%rip),%xmm1
movaps %xmm2,%xmm0
call   1040 <glColor3f@plt>
movsd  0xe04(%rip),%xmm0
mov    $0x20,%esi
mov    %esi,%edi
call   1050 <glutSolidSphere@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<drawtree>:
push   %rbx
movss  0xe97(%rip),%xmm0
movss  0xe93(%rip),%xmm1
movaps %xmm1,%xmm2
call   1040 <glColor3f@plt>
movss  0xe87(%rip),%xmm1
xorps  %xmm0,%xmm0
xorps  %xmm2,%xmm2
call   1070 <glTranslatef@plt>
xor    %eax,%eax
call   1030 <gluNewQuadric@plt>
mov    %rax,%rbx
movss  0xe6e(%rip),%xmm0
movss  0xe6a(%rip),%xmm1
xorps  %xmm2,%xmm2
xorps  %xmm3,%xmm3
call   1080 <glRotatef@plt>
movss  0xe5b(%rip),%xmm0
movss  0xe57(%rip),%xmm1
movss  0xe53(%rip),%xmm2
mov    %rbx,%rdi
mov    $0x20,%esi
mov    $0x20,%edx
call   1060 <gluCylinder@plt>
xorps  %xmm0,%xmm0
xorps  %xmm2,%xmm2
movss  0xe2f(%rip),%xmm1
call   1040 <glColor3f@plt>
movsd  0xe2a(%rip),%xmm0
mov    $0x20,%edi
mov    $0x20,%esi
pop    %rbx
jmp    1050 <glutSolidSphere@plt>

LLVM IR (-O0):
define void @drawtree() {
%1 = alloca i32*
%2 = call i32 @glColor3f(float 0x3FC8106240000000, float 0x3FC24DD300000000, float 0x3FC24DD300000000)
%3 = call i32 @glTranslatef(float 0.000000e+00, float 3.000000e+00, float 0.000000e+00)
%4 = call i32* (...) @gluNewQuadric()
store i32* %4, i32** %1
%5 = call i32 @glRotatef(float 9.000000e+01, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00)
%6 = load i32*, i32** %1
%7 = call i32 @gluCylinder(i32* %6, float 0x3FC99999A0000000, float 0x3FD3333340000000, float 5.500000e+00, i32 32, i32 32)
%8 = call i32 @glColor3f(float 0.000000e+00, float 0x3FD3333340000000, float 0.000000e+00)
%9 = call i32 @glutSolidSphere(double 1.000000e+00, i32 32, i32 32)
ret void
}

LLVM IR (-O2):
define void @drawtree() {
%1 = tail call i32 @glColor3f(float 0x3FC8106240000000, float 0x3FC24DD300000000, float 0x3FC24DD300000000)
%2 = tail call i32 @glTranslatef(float 0.000000e+00, float 3.000000e+00, float 0.000000e+00)
%3 = tail call i32* (...) @gluNewQuadric()
%4 = tail call i32 @glRotatef(float 9.000000e+01, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00)
%5 = tail call i32 @gluCylinder(i32* %3, float 0x3FC99999A0000000, float 0x3FD3333340000000, float 5.500000e+00, i32 32, i32 32)
%6 = tail call i32 @glColor3f(float 0.000000e+00, float 0x3FD3333340000000, float 0.000000e+00)
%7 = tail call i32 @glutSolidSphere(double 1.000000e+00, i32 32, i32 32)
ret void
}