#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 */
struct YsGLSL3DRenderer {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ YsGLSL3DRendererInitializeUniform(struct YsGLSL3DRenderer *);
struct YsGLSL3DRenderer *YsGLSLCreateAndInitialize3DRenderer();
int /*<<< orphan*/
YsGLSLFlash3DRendererCreateProgram(struct YsGLSL3DRenderer *);
struct YsGLSL3DRenderer *YsGLSLCreateFlash3DRenderer(void) {
  struct YsGLSL3DRenderer *renderer = YsGLSLCreateAndInitialize3DRenderer();
  if (NULL != renderer) {
    YsGLSLFlash3DRendererCreateProgram(renderer);
    YsGLSL3DRendererInitializeUniform(renderer);
  }
  return renderer;
}


x86 assembly (clang, -O0):
<YsGLSLCreateFlash3DRenderer>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    $0x0,%al
call   1030 <YsGLSLCreateAndInitialize3DRenderer@plt>
mov    %rax,-0x8(%rbp)
xor    %eax,%eax
cmp    -0x8(%rbp),%rax
je     1161 <YsGLSLCreateFlash3DRenderer+0x31>
mov    -0x8(%rbp),%rdi
call   1050 <YsGLSLFlash3DRendererCreateProgram@plt>
mov    -0x8(%rbp),%rdi
call   1040 <YsGLSL3DRendererInitializeUniform@plt>
mov    -0x8(%rbp),%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<YsGLSLCreateFlash3DRenderer>:
push   %rbx
xor    %eax,%eax
call   1030 <YsGLSLCreateAndInitialize3DRenderer@plt>
mov    %rax,%rbx
test   %rax,%rax
je     1150 <YsGLSLCreateFlash3DRenderer+0x20>
mov    %rbx,%rdi
call   1050 <YsGLSLFlash3DRendererCreateProgram@plt>
mov    %rbx,%rdi
call   1040 <YsGLSL3DRendererInitializeUniform@plt>
mov    %rbx,%rax
pop    %rbx
ret

LLVM IR (-O0):
%struct.YsGLSL3DRenderer = type { i32 }
define %struct.YsGLSL3DRenderer* @YsGLSLCreateFlash3DRenderer() {
%1 = alloca %struct.YsGLSL3DRenderer*
%2 = call %struct.YsGLSL3DRenderer* (...) @YsGLSLCreateAndInitialize3DRenderer()
store %struct.YsGLSL3DRenderer* %2, %struct.YsGLSL3DRenderer** %1
%3 = load %struct.YsGLSL3DRenderer*, %struct.YsGLSL3DRenderer** %1
%4 = icmp ne %struct.YsGLSL3DRenderer* null, %3
br i1 %4, label %5, label %10
5: ; preds = %0
%6 = load %struct.YsGLSL3DRenderer*, %struct.YsGLSL3DRenderer** %1
%7 = call i32 @YsGLSLFlash3DRendererCreateProgram(%struct.YsGLSL3DRenderer* %6)
%8 = load %struct.YsGLSL3DRenderer*, %struct.YsGLSL3DRenderer** %1
%9 = call i32 @YsGLSL3DRendererInitializeUniform(%struct.YsGLSL3DRenderer* %8)
br label %10
10: ; preds = %5, %0
%11 = load %struct.YsGLSL3DRenderer*, %struct.YsGLSL3DRenderer** %1
ret %struct.YsGLSL3DRenderer* %11
}

LLVM IR (-O2):
%struct.YsGLSL3DRenderer = type { i32 }
define %struct.YsGLSL3DRenderer* @YsGLSLCreateFlash3DRenderer() {
%1 = tail call %struct.YsGLSL3DRenderer* (...) @YsGLSLCreateAndInitialize3DRenderer()
%2 = icmp eq %struct.YsGLSL3DRenderer* %1, null
br i1 %2, label %6, label %3
3: ; preds = %0
%4 = tail call i32 @YsGLSLFlash3DRendererCreateProgram(%struct.YsGLSL3DRenderer* %1)
%5 = tail call i32 @YsGLSL3DRendererInitializeUniform(%struct.YsGLSL3DRenderer* %1)
br label %6
6: ; preds = %3, %0
ret %struct.YsGLSL3DRenderer* %1
}