#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*/ ai_bestcard(int *, int, int *);
int /*<<< orphan*/ data_addgold(int, int);
int /*<<< orphan*/ data_build(int, int);
int /*<<< orphan*/ data_buildwonder(int, int);
int /*<<< orphan*/ data_discard(int, int);
int data_getdir(int, int);
int /*<<< orphan*/ data_gethand(int, int *);
int data_getnext(int);
scalar_t__ data_getwonderstages(int);
int /*<<< orphan*/ weight_buildwonder(int, int *);
scalar_t__ wonder_numstages(int);
int /*<<< orphan*/ write_trade(int, int, int);
void ai_turn(int player) {
  int bestcard[5];
  int hand[7];
  data_gethand(player, hand);
  int wonder[4];
  wonder[0] = 0;
  int i;
  if (data_getwonderstages(player) < wonder_numstages(player))
    weight_buildwonder(player, wonder);
  ai_bestcard(hand, player, bestcard);
  if (bestcard[0] > wonder[0] && bestcard[0] > 0) {
    data_build(player, bestcard[1]);
    for (i = 0; i < 2; i++) {
      data_addgold(bestcard[2 + i], data_getdir(i, player));
    }
    write_trade(player, bestcard[2], bestcard[3]);
    data_addgold(bestcard[4] * -1, player);
    return;
  }
  ai_bestcard(hand, data_getnext(player), bestcard);
  if (bestcard[0] == 0)
    bestcard[1] = hand[0];
  if (wonder[0] > 0) {
    data_buildwonder(player, bestcard[1]);
    for (i = 0; i < 2; i++) {
      data_addgold(wonder[1 + i], data_getdir(i, player));
    }
    write_trade(player, wonder[1], wonder[2]);
    data_addgold(wonder[3] * -1, player);
    return;
  }
  data_discard(player, bestcard[1]);
  data_addgold(3, player);
}


x86 assembly (clang, -O0):
<ai_turn>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%edi
lea    -0x40(%rbp),%rsi
call   1040 <data_gethand@plt>
movl   $0x0,-0x50(%rbp)
mov    -0x4(%rbp),%edi
call   1060 <data_getwonderstages@plt>
mov    %rax,-0x60(%rbp)
mov    -0x4(%rbp),%edi
call   1080 <wonder_numstages@plt>
mov    %rax,%rcx
mov    -0x60(%rbp),%rax
cmp    %rcx,%rax
jge    1211 <ai_turn+0x51>
mov    -0x4(%rbp),%edi
lea    -0x50(%rbp),%rsi
call   10d0 <weight_buildwonder@plt>
lea    -0x40(%rbp),%rdi
mov    -0x4(%rbp),%esi
lea    -0x20(%rbp),%rdx
call   10e0 <ai_bestcard@plt>
mov    -0x20(%rbp),%eax
cmp    -0x50(%rbp),%eax
jle    12a4 <ai_turn+0xe4>
cmpl   $0x0,-0x20(%rbp)
jle    12a4 <ai_turn+0xe4>
mov    -0x4(%rbp),%edi
mov    -0x1c(%rbp),%esi
call   10c0 <data_build@plt>
movl   $0x0,-0x54(%rbp)
cmpl   $0x2,-0x54(%rbp)
jge    1285 <ai_turn+0xc5>
mov    -0x54(%rbp),%eax
add    $0x2,%eax
cltq
mov    -0x20(%rbp,%rax,4),%eax
mov    %eax,-0x64(%rbp)
mov    -0x54(%rbp),%edi
mov    -0x4(%rbp),%esi
call   10a0 <data_getdir@plt>
mov    -0x64(%rbp),%edi
mov    %eax,%esi
call   1070 <data_addgold@plt>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1249 <ai_turn+0x89>
mov    -0x4(%rbp),%edi
mov    -0x18(%rbp),%esi
mov    -0x14(%rbp),%edx
call   10b0 <write_trade@plt>
imul   $0xffffffff,-0x10(%rbp),%edi
mov    -0x4(%rbp),%esi
call   1070 <data_addgold@plt>
jmp    1362 <ai_turn+0x1a2>
lea    -0x40(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x4(%rbp),%edi
call   1030 <data_getnext@plt>
mov    -0x70(%rbp),%rdi
mov    %eax,%esi
lea    -0x20(%rbp),%rdx
call   10e0 <ai_bestcard@plt>
cmpl   $0x0,-0x20(%rbp)
jne    12d3 <ai_turn+0x113>
mov    -0x40(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x50(%rbp)
jle    134a <ai_turn+0x18a>
mov    -0x4(%rbp),%edi
mov    -0x1c(%rbp),%esi
call   1090 <data_buildwonder@plt>
movl   $0x0,-0x54(%rbp)
cmpl   $0x2,-0x54(%rbp)
jge    132b <ai_turn+0x16b>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
cltq
mov    -0x50(%rbp,%rax,4),%eax
mov    %eax,-0x74(%rbp)
mov    -0x54(%rbp),%edi
mov    -0x4(%rbp),%esi
call   10a0 <data_getdir@plt>
mov    -0x74(%rbp),%edi
mov    %eax,%esi
call   1070 <data_addgold@plt>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    12ef <ai_turn+0x12f>
mov    -0x4(%rbp),%edi
mov    -0x4c(%rbp),%esi
mov    -0x48(%rbp),%edx
call   10b0 <write_trade@plt>
imul   $0xffffffff,-0x44(%rbp),%edi
mov    -0x4(%rbp),%esi
call   1070 <data_addgold@plt>
jmp    1362 <ai_turn+0x1a2>
mov    -0x4(%rbp),%edi
mov    -0x1c(%rbp),%esi
call   1050 <data_discard@plt>
mov    -0x4(%rbp),%esi
mov    $0x3,%edi
call   1070 <data_addgold@plt>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ai_turn>:
push   %rbp
push   %r14
push   %rbx
sub    $0x50,%rsp
mov    %edi,%ebx
lea    0x30(%rsp),%rsi
call   1040 <data_gethand@plt>
movl   $0x0,0x20(%rsp)
mov    %ebx,%edi
call   1060 <data_getwonderstages@plt>
mov    %rax,%rbp
mov    %ebx,%edi
call   1080 <wonder_numstages@plt>
cmp    %rax,%rbp
jge    11fe <ai_turn+0x3e>
lea    0x20(%rsp),%rsi
mov    %ebx,%edi
call   10d0 <weight_buildwonder@plt>
lea    0x30(%rsp),%rdi
mov    %rsp,%rdx
mov    %ebx,%esi
call   10e0 <ai_bestcard@plt>
mov    (%rsp),%eax
test   %eax,%eax
jle    1272 <ai_turn+0xb2>
cmp    0x20(%rsp),%eax
jle    1272 <ai_turn+0xb2>
mov    0x4(%rsp),%esi
mov    %ebx,%edi
call   10c0 <data_build@plt>
mov    0x8(%rsp),%r14d
xor    %ebp,%ebp
xor    %edi,%edi
mov    %ebx,%esi
call   10a0 <data_getdir@plt>
mov    %r14d,%edi
mov    %eax,%esi
call   1070 <data_addgold@plt>
mov    0xc(%rsp),%r14d
mov    $0x1,%edi
mov    %ebx,%esi
call   10a0 <data_getdir@plt>
mov    %r14d,%edi
mov    %eax,%esi
call   1070 <data_addgold@plt>
mov    0x8(%rsp),%esi
mov    0xc(%rsp),%edx
mov    %ebx,%edi
call   10b0 <write_trade@plt>
sub    0x10(%rsp),%ebp
jmp    12fc <ai_turn+0x13c>
mov    %ebx,%edi
call   1030 <data_getnext@plt>
lea    0x30(%rsp),%rdi
mov    %rsp,%rdx
mov    %eax,%esi
call   10e0 <ai_bestcard@plt>
cmpl   $0x0,(%rsp)
jne    1296 <ai_turn+0xd6>
mov    0x30(%rsp),%eax
mov    %eax,0x4(%rsp)
cmpl   $0x0,0x20(%rsp)
mov    0x4(%rsp),%esi
mov    %ebx,%edi
jle    12f2 <ai_turn+0x132>
call   1090 <data_buildwonder@plt>
mov    0x24(%rsp),%r14d
xor    %ebp,%ebp
xor    %edi,%edi
mov    %ebx,%esi
call   10a0 <data_getdir@plt>
mov    %r14d,%edi
mov    %eax,%esi
call   1070 <data_addgold@plt>
mov    0x28(%rsp),%r14d
mov    $0x1,%edi
mov    %ebx,%esi
call   10a0 <data_getdir@plt>
mov    %r14d,%edi
mov    %eax,%esi
call   1070 <data_addgold@plt>
mov    0x24(%rsp),%esi
mov    0x28(%rsp),%edx
mov    %ebx,%edi
call   10b0 <write_trade@plt>
sub    0x2c(%rsp),%ebp
jmp    12fc <ai_turn+0x13c>
call   1050 <data_discard@plt>
mov    $0x3,%ebp
mov    %ebp,%edi
mov    %ebx,%esi
call   1070 <data_addgold@plt>
add    $0x50,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define void @ai_turn(i32 %0) {
%2 = alloca i32
%3 = alloca [5 x i32]
%4 = alloca [7 x i32]
%5 = alloca [4 x i32]
%6 = alloca i32
store i32 %0, i32* %2
%7 = load i32, i32* %2
%8 = getelementptr inbounds [7 x i32], [7 x i32]* %4, i64 0, i64 0
%9 = call i32 @data_gethand(i32 %7, i32* %8)
%10 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 0
store i32 0, i32* %10
%11 = load i32, i32* %2
%12 = call i64 @data_getwonderstages(i32 %11)
%13 = load i32, i32* %2
%14 = call i64 @wonder_numstages(i32 %13)
%15 = icmp slt i64 %12, %14
br i1 %15, label %16, label %20
16: ; preds = %1
%17 = load i32, i32* %2
%18 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 0
%19 = call i32 @weight_buildwonder(i32 %17, i32* %18)
br label %20
20: ; preds = %16, %1
%21 = getelementptr inbounds [7 x i32], [7 x i32]* %4, i64 0, i64 0
%22 = load i32, i32* %2
%23 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 0
%24 = call i32 @ai_bestcard(i32* %21, i32 %22, i32* %23)
%25 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 0
%26 = load i32, i32* %25
%27 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 0
%28 = load i32, i32* %27
%29 = icmp sgt i32 %26, %28
br i1 %29, label %30, label %67
30: ; preds = %20
%31 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 0
%32 = load i32, i32* %31
%33 = icmp sgt i32 %32, 0
br i1 %33, label %34, label %67
34: ; preds = %30
%35 = load i32, i32* %2
%36 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 1
%37 = load i32, i32* %36
%38 = call i32 @data_build(i32 %35, i32 %37)
store i32 0, i32* %6
br label %39
39: ; preds = %52, %34
%40 = load i32, i32* %6
%41 = icmp slt i32 %40, 2
br i1 %41, label %42, label %55
42: ; preds = %39
%43 = load i32, i32* %6
%44 = add nsw i32 2, %43
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 %45
%47 = load i32, i32* %46
%48 = load i32, i32* %6
%49 = load i32, i32* %2
%50 = call i32 @data_getdir(i32 %48, i32 %49)
%51 = call i32 @data_addgold(i32 %47, i32 %50)
br label %52
52: ; preds = %42
%53 = load i32, i32* %6
%54 = add nsw i32 %53, 1
store i32 %54, i32* %6
br label %39
55: ; preds = %39
%56 = load i32, i32* %2
%57 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 2
%58 = load i32, i32* %57
%59 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 3
%60 = load i32, i32* %59
%61 = call i32 @write_trade(i32 %56, i32 %58, i32 %60)
%62 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 4
%63 = load i32, i32* %62
%64 = mul nsw i32 %63, -1
%65 = load i32, i32* %2
%66 = call i32 @data_addgold(i32 %64, i32 %65)
br label %124
67: ; preds = %30, %20
%68 = getelementptr inbounds [7 x i32], [7 x i32]* %4, i64 0, i64 0
%69 = load i32, i32* %2
%70 = call i32 @data_getnext(i32 %69)
%71 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 0
%72 = call i32 @ai_bestcard(i32* %68, i32 %70, i32* %71)
%73 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 0
%74 = load i32, i32* %73
%75 = icmp eq i32 %74, 0
br i1 %75, label %76, label %80
76: ; preds = %67
%77 = getelementptr inbounds [7 x i32], [7 x i32]* %4, i64 0, i64 0
%78 = load i32, i32* %77
%79 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 1
store i32 %78, i32* %79
br label %80
80: ; preds = %76, %67
%81 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 0
%82 = load i32, i32* %81
%83 = icmp sgt i32 %82, 0
br i1 %83, label %84, label %117
84: ; preds = %80
%85 = load i32, i32* %2
%86 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 1
%87 = load i32, i32* %86
%88 = call i32 @data_buildwonder(i32 %85, i32 %87)
store i32 0, i32* %6
br label %89
89: ; preds = %102, %84
%90 = load i32, i32* %6
%91 = icmp slt i32 %90, 2
br i1 %91, label %92, label %105
92: ; preds = %89
%93 = load i32, i32* %6
%94 = add nsw i32 1, %93
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 %95
%97 = load i32, i32* %96
%98 = load i32, i32* %6
%99 = load i32, i32* %2
%100 = call i32 @data_getdir(i32 %98, i32 %99)
%101 = call i32 @data_addgold(i32 %97, i32 %100)
br label %102
102: ; preds = %92
%103 = load i32, i32* %6
%104 = add nsw i32 %103, 1
store i32 %104, i32* %6
br label %89
105: ; preds = %89
%106 = load i32, i32* %2
%107 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 1
%108 = load i32, i32* %107
%109 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 2
%110 = load i32, i32* %109
%111 = call i32 @write_trade(i32 %106, i32 %108, i32 %110)
%112 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 3
%113 = load i32, i32* %112
%114 = mul nsw i32 %113, -1
%115 = load i32, i32* %2
%116 = call i32 @data_addgold(i32 %114, i32 %115)
br label %124
117: ; preds = %80
%118 = load i32, i32* %2
%119 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 1
%120 = load i32, i32* %119
%121 = call i32 @data_discard(i32 %118, i32 %120)
%122 = load i32, i32* %2
%123 = call i32 @data_addgold(i32 3, i32 %122)
br label %124
124: ; preds = %117, %105, %55
ret void
}

LLVM IR (-O2):
define void @ai_turn(i32 %0) {
%2 = alloca [5 x i32]
%3 = alloca [7 x i32]
%4 = alloca [4 x i32]
%5 = bitcast [5 x i32]* %2 to i8*
%6 = bitcast [7 x i32]* %3 to i8*
%7 = getelementptr inbounds [7 x i32], [7 x i32]* %3, i64 0, i64 0
%8 = call i32 @data_gethand(i32 %0, i32* %7)
%9 = bitcast [4 x i32]* %4 to i8*
%10 = getelementptr inbounds [4 x i32], [4 x i32]* %4, i64 0, i64 0
store i32 0, i32* %10
%11 = call i64 @data_getwonderstages(i32 %0)
%12 = call i64 @wonder_numstages(i32 %0)
%13 = icmp slt i64 %11, %12
br i1 %13, label %14, label %16
14: ; preds = %1
%15 = call i32 @weight_buildwonder(i32 %0, i32* %10)
br label %16
16: ; preds = %14, %1
%17 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 0
%18 = call i32 @ai_bestcard(i32* %7, i32 %0, i32* %17)
%19 = load i32, i32* %17
%20 = load i32, i32* %10
%21 = icmp sgt i32 %19, %20
%22 = icmp sgt i32 %19, 0
%23 = and i1 %22, %21
br i1 %23, label %24, label %42
24: ; preds = %16
%25 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 1
%26 = load i32, i32* %25
%27 = call i32 @data_build(i32 %0, i32 %26)
%28 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 2
%29 = load i32, i32* %28
%30 = call i32 @data_getdir(i32 0, i32 %0)
%31 = call i32 @data_addgold(i32 %29, i32 %30)
%32 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 3
%33 = load i32, i32* %32
%34 = call i32 @data_getdir(i32 1, i32 %0)
%35 = call i32 @data_addgold(i32 %33, i32 %34)
%36 = load i32, i32* %28
%37 = load i32, i32* %32
%38 = call i32 @write_trade(i32 %0, i32 %36, i32 %37)
%39 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 4
%40 = load i32, i32* %39
%41 = sub nsw i32 0, %40
br label %73
42: ; preds = %16
%43 = call i32 @data_getnext(i32 %0)
%44 = call i32 @ai_bestcard(i32* %7, i32 %43, i32* %17)
%45 = load i32, i32* %17
%46 = icmp eq i32 %45, 0
br i1 %46, label %47, label %50
47: ; preds = %42
%48 = load i32, i32* %7
%49 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 1
store i32 %48, i32* %49
br label %50
50: ; preds = %47, %42
%51 = load i32, i32* %10
%52 = icmp sgt i32 %51, 0
%53 = getelementptr inbounds [5 x i32], [5 x i32]* %2, i64 0, i64 1
%54 = load i32, i32* %53
br i1 %52, label %55, label %71
55: ; preds = %50
%56 = call i32 @data_buildwonder(i32 %0, i32 %54)
%57 = getelementptr inbounds [4 x i32], [4 x i32]* %4, i64 0, i64 1
%58 = load i32, i32* %57
%59 = call i32 @data_getdir(i32 0, i32 %0)
%60 = call i32 @data_addgold(i32 %58, i32 %59)
%61 = getelementptr inbounds [4 x i32], [4 x i32]* %4, i64 0, i64 2
%62 = load i32, i32* %61
%63 = call i32 @data_getdir(i32 1, i32 %0)
%64 = call i32 @data_addgold(i32 %62, i32 %63)
%65 = load i32, i32* %57
%66 = load i32, i32* %61
%67 = call i32 @write_trade(i32 %0, i32 %65, i32 %66)
%68 = getelementptr inbounds [4 x i32], [4 x i32]* %4, i64 0, i64 3
%69 = load i32, i32* %68
%70 = sub nsw i32 0, %69
br label %73
71: ; preds = %50
%72 = call i32 @data_discard(i32 %0, i32 %54)
br label %73
73: ; preds = %71, %55, %24
%74 = phi i32 [ 3, %71 ], [ %70, %55 ], [ %41, %24 ]
%75 = call i32 @data_addgold(i32 %74, i32 %0)
ret void
}