#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*/ Visual;
typedef int /*<<< orphan*/ Screen;
typedef int /*<<< orphan*/ Bool;

/* Variables and functions */
int /*<<< orphan*/ *DefaultVisualOfScreen(int /*<<< orphan*/ *);
int /*<<< orphan*/ DirectColor;
int /*<<< orphan*/ GrayScale;
int /*<<< orphan*/ PseudoColor;
int /*<<< orphan*/ StaticColor;
int /*<<< orphan*/ StaticGray;
int /*<<< orphan*/ TrueColor;
int /*<<< orphan*/ *pick_best_visual_of_class(int /*<<< orphan*/ *,
                                              int /*<<< orphan*/);
int visual_depth(int /*<<< orphan*/ *, int /*<<< orphan*/ *);
Visual *pick_best_visual(Screen *screen, Bool prefer_writable_cells,
                         Bool color_only) {
  Visual *visual;
  if (!prefer_writable_cells) {
    if ((visual = pick_best_visual_of_class(screen, TrueColor)) &&
        visual_depth(screen, visual) >= 16)
      return visual;
  }
  if ((visual = pick_best_visual_of_class(screen, PseudoColor)) &&
      (!color_only || visual_depth(screen, visual) > 1))
    return visual;
  if ((visual = pick_best_visual_of_class(screen, TrueColor)) &&
      (!color_only || visual_depth(screen, visual) > 1))
    return visual;
  if ((visual = pick_best_visual_of_class(screen, DirectColor)) &&
      (!color_only || visual_depth(screen, visual) > 1))
    return visual;
  if ((visual = pick_best_visual_of_class(screen, StaticColor)) &&
      (!color_only || visual_depth(screen, visual) > 1))
    return visual;
  if (!color_only) {
    if ((visual = pick_best_visual_of_class(screen, GrayScale)) &&
        (!color_only || visual_depth(screen, visual) > 1))
      return visual;
    if ((visual = pick_best_visual_of_class(screen, StaticGray)) &&
        (!color_only || visual_depth(screen, visual) > 1))
      return visual;
  }
  visual = DefaultVisualOfScreen(screen);
  if (!color_only || visual_depth(screen, visual) > 1)
    return visual;
  else
    return 0;
}


x86 assembly (clang, -O0):
<pick_best_visual>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1194 <pick_best_visual+0x64>
mov    -0x10(%rbp),%rdi
mov    0x2e89(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     118f <pick_best_visual+0x5f>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x10,%eax
jl     118f <pick_best_visual+0x5f>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
jmp    1194 <pick_best_visual+0x64>
mov    -0x10(%rbp),%rdi
mov    0x2e11(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     11e1 <pick_best_visual+0xb1>
cmpl   $0x0,-0x18(%rbp)
je     11d4 <pick_best_visual+0xa4>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    11e1 <pick_best_visual+0xb1>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
mov    -0x10(%rbp),%rdi
mov    0x2df4(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     122e <pick_best_visual+0xfe>
cmpl   $0x0,-0x18(%rbp)
je     1221 <pick_best_visual+0xf1>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    122e <pick_best_visual+0xfe>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
mov    -0x10(%rbp),%rdi
mov    0x2db7(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     127b <pick_best_visual+0x14b>
cmpl   $0x0,-0x18(%rbp)
je     126e <pick_best_visual+0x13e>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    127b <pick_best_visual+0x14b>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
mov    -0x10(%rbp),%rdi
mov    0x2d3a(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     12c8 <pick_best_visual+0x198>
cmpl   $0x0,-0x18(%rbp)
je     12bb <pick_best_visual+0x18b>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    12c8 <pick_best_visual+0x198>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
cmpl   $0x0,-0x18(%rbp)
jne    1371 <pick_best_visual+0x241>
mov    -0x10(%rbp),%rdi
mov    0x2ceb(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     131f <pick_best_visual+0x1ef>
cmpl   $0x0,-0x18(%rbp)
je     1312 <pick_best_visual+0x1e2>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    131f <pick_best_visual+0x1ef>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
mov    -0x10(%rbp),%rdi
mov    0x2ca6(%rip),%rax
mov    (%rax),%esi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     136c <pick_best_visual+0x23c>
cmpl   $0x0,-0x18(%rbp)
je     135f <pick_best_visual+0x22f>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    136c <pick_best_visual+0x23c>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
jmp    1371 <pick_best_visual+0x241>
mov    -0x10(%rbp),%rdi
call   1040 <DefaultVisualOfScreen@plt>
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x18(%rbp)
je     139e <pick_best_visual+0x26e>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    13ab <pick_best_visual+0x27b>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13b3 <pick_best_visual+0x283>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pick_best_visual>:
push   %rbp
push   %r14
push   %rbx
mov    %edx,%r14d
mov    %rdi,%rbx
test   %esi,%esi
je     1214 <pick_best_visual+0xe4>
mov    0x2e67(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
test   %rax,%rax
je     1178 <pick_best_visual+0x48>
mov    %rax,%rbp
test   %r14d,%r14d
je     126b <pick_best_visual+0x13b>
mov    %rbx,%rdi
mov    %rbp,%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jg     126b <pick_best_visual+0x13b>
mov    0x2e61(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
test   %rax,%rax
je     11ae <pick_best_visual+0x7e>
mov    %rax,%rbp
test   %r14d,%r14d
je     126b <pick_best_visual+0x13b>
mov    %rbx,%rdi
mov    %rbp,%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jg     126b <pick_best_visual+0x13b>
mov    0x2e3b(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
test   %rax,%rax
je     11e4 <pick_best_visual+0xb4>
mov    %rax,%rbp
test   %r14d,%r14d
je     126b <pick_best_visual+0x13b>
mov    %rbx,%rdi
mov    %rbp,%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jg     126b <pick_best_visual+0x13b>
mov    0x2dd5(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
test   %rax,%rax
je     1247 <pick_best_visual+0x117>
mov    %rax,%rbp
test   %r14d,%r14d
je     126b <pick_best_visual+0x13b>
mov    %rbx,%rdi
mov    %rbp,%rsi
call   1030 <visual_depth@plt>
cmp    $0x1,%eax
jle    124c <pick_best_visual+0x11c>
jmp    126b <pick_best_visual+0x13b>
mov    0x2dc5(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
test   %rax,%rax
je     1142 <pick_best_visual+0x12>
mov    %rax,%rbp
mov    %rbx,%rdi
mov    %rax,%rsi
call   1030 <visual_depth@plt>
cmp    $0xf,%eax
jle    1142 <pick_best_visual+0x12>
jmp    126b <pick_best_visual+0x13b>
test   %r14d,%r14d
je     1273 <pick_best_visual+0x143>
mov    %rbx,%rdi
call   1040 <DefaultVisualOfScreen@plt>
mov    %rax,%r14
mov    %rbx,%rdi
mov    %rax,%rsi
call   1030 <visual_depth@plt>
xor    %ebp,%ebp
cmp    $0x2,%eax
cmovge %r14,%rbp
mov    %rbp,%rax
pop    %rbx
pop    %r14
pop    %rbp
ret
mov    0x2d4e(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,%rbp
test   %rax,%rax
jne    126b <pick_best_visual+0x13b>
mov    0x2d3d(%rip),%rax
mov    (%rax),%esi
mov    %rbx,%rdi
call   1050 <pick_best_visual_of_class@plt>
mov    %rax,%rbp
test   %rax,%rax
jne    126b <pick_best_visual+0x13b>
mov    %rbx,%rdi
pop    %rbx
pop    %r14
pop    %rbp
jmp    1040 <DefaultVisualOfScreen@plt>

LLVM IR (-O0):
@TrueColor = global i32 0
@PseudoColor = global i32 0
@DirectColor = global i32 0
@StaticColor = global i32 0
@GrayScale = global i32 0
@StaticGray = global i32 0
define i32* @pick_best_visual(i32* %0, i32 %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32*
store i32* %0, i32** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%9 = load i32, i32* %6
%10 = icmp ne i32 %9, 0
br i1 %10, label %24, label %11
11: ; preds = %3
%12 = load i32*, i32** %5
%13 = load i32, i32* @TrueColor
%14 = call i32* @pick_best_visual_of_class(i32* %12, i32 %13)
store i32* %14, i32** %8
%15 = icmp ne i32* %14, null
br i1 %15, label %16, label %23
16: ; preds = %11
%17 = load i32*, i32** %5
%18 = load i32*, i32** %8
%19 = call i32 @visual_depth(i32* %17, i32* %18)
%20 = icmp sge i32 %19, 16
br i1 %20, label %21, label %23
21: ; preds = %16
%22 = load i32*, i32** %8
store i32* %22, i32** %4
br label %131
23: ; preds = %16, %11
br label %24
24: ; preds = %23, %3
%25 = load i32*, i32** %5
%26 = load i32, i32* @PseudoColor
%27 = call i32* @pick_best_visual_of_class(i32* %25, i32 %26)
store i32* %27, i32** %8
%28 = icmp ne i32* %27, null
br i1 %28, label %29, label %39
29: ; preds = %24
%30 = load i32, i32* %7
%31 = icmp ne i32 %30, 0
br i1 %31, label %32, label %37
32: ; preds = %29
%33 = load i32*, i32** %5
%34 = load i32*, i32** %8
%35 = call i32 @visual_depth(i32* %33, i32* %34)
%36 = icmp sgt i32 %35, 1
br i1 %36, label %37, label %39
37: ; preds = %32, %29
%38 = load i32*, i32** %8
store i32* %38, i32** %4
br label %131
39: ; preds = %32, %24
%40 = load i32*, i32** %5
%41 = load i32, i32* @TrueColor
%42 = call i32* @pick_best_visual_of_class(i32* %40, i32 %41)
store i32* %42, i32** %8
%43 = icmp ne i32* %42, null
br i1 %43, label %44, label %54
44: ; preds = %39
%45 = load i32, i32* %7
%46 = icmp ne i32 %45, 0
br i1 %46, label %47, label %52
47: ; preds = %44
%48 = load i32*, i32** %5
%49 = load i32*, i32** %8
%50 = call i32 @visual_depth(i32* %48, i32* %49)
%51 = icmp sgt i32 %50, 1
br i1 %51, label %52, label %54
52: ; preds = %47, %44
%53 = load i32*, i32** %8
store i32* %53, i32** %4
br label %131
54: ; preds = %47, %39
%55 = load i32*, i32** %5
%56 = load i32, i32* @DirectColor
%57 = call i32* @pick_best_visual_of_class(i32* %55, i32 %56)
store i32* %57, i32** %8
%58 = icmp ne i32* %57, null
br i1 %58, label %59, label %69
59: ; preds = %54
%60 = load i32, i32* %7
%61 = icmp ne i32 %60, 0
br i1 %61, label %62, label %67
62: ; preds = %59
%63 = load i32*, i32** %5
%64 = load i32*, i32** %8
%65 = call i32 @visual_depth(i32* %63, i32* %64)
%66 = icmp sgt i32 %65, 1
br i1 %66, label %67, label %69
67: ; preds = %62, %59
%68 = load i32*, i32** %8
store i32* %68, i32** %4
br label %131
69: ; preds = %62, %54
%70 = load i32*, i32** %5
%71 = load i32, i32* @StaticColor
%72 = call i32* @pick_best_visual_of_class(i32* %70, i32 %71)
store i32* %72, i32** %8
%73 = icmp ne i32* %72, null
br i1 %73, label %74, label %84
74: ; preds = %69
%75 = load i32, i32* %7
%76 = icmp ne i32 %75, 0
br i1 %76, label %77, label %82
77: ; preds = %74
%78 = load i32*, i32** %5
%79 = load i32*, i32** %8
%80 = call i32 @visual_depth(i32* %78, i32* %79)
%81 = icmp sgt i32 %80, 1
br i1 %81, label %82, label %84
82: ; preds = %77, %74
%83 = load i32*, i32** %8
store i32* %83, i32** %4
br label %131
84: ; preds = %77, %69
%85 = load i32, i32* %7
%86 = icmp ne i32 %85, 0
br i1 %86, label %118, label %87
87: ; preds = %84
%88 = load i32*, i32** %5
%89 = load i32, i32* @GrayScale
%90 = call i32* @pick_best_visual_of_class(i32* %88, i32 %89)
store i32* %90, i32** %8
%91 = icmp ne i32* %90, null
br i1 %91, label %92, label %102
92: ; preds = %87
%93 = load i32, i32* %7
%94 = icmp ne i32 %93, 0
br i1 %94, label %95, label %100
95: ; preds = %92
%96 = load i32*, i32** %5
%97 = load i32*, i32** %8
%98 = call i32 @visual_depth(i32* %96, i32* %97)
%99 = icmp sgt i32 %98, 1
br i1 %99, label %100, label %102
100: ; preds = %95, %92
%101 = load i32*, i32** %8
store i32* %101, i32** %4
br label %131
102: ; preds = %95, %87
%103 = load i32*, i32** %5
%104 = load i32, i32* @StaticGray
%105 = call i32* @pick_best_visual_of_class(i32* %103, i32 %104)
store i32* %105, i32** %8
%106 = icmp ne i32* %105, null
br i1 %106, label %107, label %117
107: ; preds = %102
%108 = load i32, i32* %7
%109 = icmp ne i32 %108, 0
br i1 %109, label %110, label %115
110: ; preds = %107
%111 = load i32*, i32** %5
%112 = load i32*, i32** %8
%113 = call i32 @visual_depth(i32* %111, i32* %112)
%114 = icmp sgt i32 %113, 1
br i1 %114, label %115, label %117
115: ; preds = %110, %107
%116 = load i32*, i32** %8
store i32* %116, i32** %4
br label %131
117: ; preds = %110, %102
br label %118
118: ; preds = %117, %84
%119 = load i32*, i32** %5
%120 = call i32* @DefaultVisualOfScreen(i32* %119)
store i32* %120, i32** %8
%121 = load i32, i32* %7
%122 = icmp ne i32 %121, 0
br i1 %122, label %123, label %128
123: ; preds = %118
%124 = load i32*, i32** %5
%125 = load i32*, i32** %8
%126 = call i32 @visual_depth(i32* %124, i32* %125)
%127 = icmp sgt i32 %126, 1
br i1 %127, label %128, label %130
128: ; preds = %123, %118
%129 = load i32*, i32** %8
store i32* %129, i32** %4
br label %131
130: ; preds = %123
store i32* null, i32** %4
br label %131
131: ; preds = %130, %128, %115, %100, %82, %67, %52, %37, %21
%132 = load i32*, i32** %4
ret i32* %132
}

LLVM IR (-O2):
@TrueColor = global i32 0
@PseudoColor = global i32 0
@DirectColor = global i32 0
@StaticColor = global i32 0
@GrayScale = global i32 0
@StaticGray = global i32 0
define i32* @pick_best_visual(i32* %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %1, 0
br i1 %4, label %5, label %12
5: ; preds = %3
%6 = load i32, i32* @TrueColor
%7 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %6)
%8 = icmp eq i32* %7, null
br i1 %8, label %12, label %9
9: ; preds = %5
%10 = tail call i32 @visual_depth(i32* %0, i32* %7)
%11 = icmp sgt i32 %10, 15
br i1 %11, label %64, label %12
12: ; preds = %5, %9, %3
%13 = load i32, i32* @PseudoColor
%14 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %13)
%15 = icmp eq i32* %14, null
br i1 %15, label %21, label %16
16: ; preds = %12
%17 = icmp eq i32 %2, 0
br i1 %17, label %64, label %18
18: ; preds = %16
%19 = tail call i32 @visual_depth(i32* %0, i32* %14)
%20 = icmp sgt i32 %19, 1
br i1 %20, label %64, label %21
21: ; preds = %18, %12
%22 = load i32, i32* @TrueColor
%23 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %22)
%24 = icmp eq i32* %23, null
br i1 %24, label %30, label %25
25: ; preds = %21
%26 = icmp eq i32 %2, 0
br i1 %26, label %64, label %27
27: ; preds = %25
%28 = tail call i32 @visual_depth(i32* %0, i32* %23)
%29 = icmp sgt i32 %28, 1
br i1 %29, label %64, label %30
30: ; preds = %27, %21
%31 = load i32, i32* @DirectColor
%32 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %31)
%33 = icmp eq i32* %32, null
br i1 %33, label %39, label %34
34: ; preds = %30
%35 = icmp eq i32 %2, 0
br i1 %35, label %64, label %36
36: ; preds = %34
%37 = tail call i32 @visual_depth(i32* %0, i32* %32)
%38 = icmp sgt i32 %37, 1
br i1 %38, label %64, label %39
39: ; preds = %36, %30
%40 = load i32, i32* @StaticColor
%41 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %40)
%42 = icmp eq i32* %41, null
%43 = icmp eq i32 %2, 0
br i1 %42, label %48, label %44
44: ; preds = %39
br i1 %43, label %64, label %45
45: ; preds = %44
%46 = tail call i32 @visual_depth(i32* %0, i32* %41)
%47 = icmp sgt i32 %46, 1
br i1 %47, label %64, label %59
48: ; preds = %39
br i1 %43, label %49, label %59
49: ; preds = %48
%50 = load i32, i32* @GrayScale
%51 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %50)
%52 = icmp eq i32* %51, null
br i1 %52, label %53, label %64
53: ; preds = %49
%54 = load i32, i32* @StaticGray
%55 = tail call i32* @pick_best_visual_of_class(i32* %0, i32 %54)
%56 = icmp eq i32* %55, null
br i1 %56, label %57, label %64
57: ; preds = %53
%58 = tail call i32* @DefaultVisualOfScreen(i32* %0)
br label %64
59: ; preds = %45, %48
%60 = tail call i32* @DefaultVisualOfScreen(i32* %0)
%61 = tail call i32 @visual_depth(i32* %0, i32* %60)
%62 = icmp sgt i32 %61, 1
%63 = select i1 %62, i32* %60, i32* null
br label %64
64: ; preds = %57, %59, %53, %49, %44, %45, %34, %36, %25, %27, %16, %18, %9
%65 = phi i32* [ %7, %9 ], [ %14, %18 ], [ %14, %16 ], [ %23, %27 ], [ %23, %25 ], [ %32, %36 ], [ %32, %34 ], [ %41, %45 ], [ %41, %44 ], [ %51, %49 ], [ %55, %53 ], [ %63, %59 ], [ %58, %57 ]
ret i32* %65
}