#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 in_addr {
  scalar_t__ s_addr;
};

/* Variables and functions */
scalar_t__ INADDR_ANY;
int /*<<< orphan*/ fputs(char *, int /*<<< orphan*/);
int /*<<< orphan*/ stderr;
void add(struct in_addr *results, struct in_addr address) {
  for (int i = 0; i < 32 - 1; ++i) {
    if (results[i].s_addr == INADDR_ANY) {
      results[i] = address;
      return;
    }
  }
  fputs("too many results to remember them all\n", stderr);
}


x86 assembly (clang, -O0):
<add>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rsi,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x1f,-0x14(%rbp)
jge    1175 <add+0x65>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    0x2ea4(%rip),%rcx
cmp    (%rcx),%rax
jne    1162 <add+0x52>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    -0x8(%rbp),%rdx
mov    %rdx,(%rax,%rcx,8)
jmp    118a <add+0x7a>
jmp    1167 <add+0x57>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1127 <add+0x17>
mov    0x2e5c(%rip),%rax
mov    (%rax),%esi
lea    0xe7b(%rip),%rdi
call   1030 <fputs@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<add>:
mov    0x2ed1(%rip),%rax
mov    (%rax),%rax
cmp    %rax,(%rdi)
jne    1126 <add+0x16>
xor    %ecx,%ecx
mov    %rsi,(%rdi,%rcx,8)
ret
mov    $0x1,%ecx
cmp    %rax,0x8(%rdi)
je     12ed <add+0x1dd>
mov    $0x2,%ecx
cmp    %rax,0x10(%rdi)
je     12ed <add+0x1dd>
mov    $0x3,%ecx
cmp    %rax,0x18(%rdi)
je     12ed <add+0x1dd>
mov    $0x4,%ecx
cmp    %rax,0x20(%rdi)
je     12ed <add+0x1dd>
mov    $0x5,%ecx
cmp    %rax,0x28(%rdi)
je     12ed <add+0x1dd>
mov    $0x6,%ecx
cmp    %rax,0x30(%rdi)
je     12ed <add+0x1dd>
mov    $0x7,%ecx
cmp    %rax,0x38(%rdi)
je     12ed <add+0x1dd>
mov    $0x8,%ecx
cmp    %rax,0x40(%rdi)
je     12ed <add+0x1dd>
mov    $0x9,%ecx
cmp    %rax,0x48(%rdi)
je     12ed <add+0x1dd>
mov    $0xa,%ecx
cmp    %rax,0x50(%rdi)
je     12ed <add+0x1dd>
mov    $0xb,%ecx
cmp    %rax,0x58(%rdi)
je     12ed <add+0x1dd>
mov    $0xc,%ecx
cmp    %rax,0x60(%rdi)
je     12ed <add+0x1dd>
mov    $0xd,%ecx
cmp    %rax,0x68(%rdi)
je     12ed <add+0x1dd>
mov    $0xe,%ecx
cmp    %rax,0x70(%rdi)
je     12ed <add+0x1dd>
mov    $0xf,%ecx
cmp    %rax,0x78(%rdi)
je     12ed <add+0x1dd>
mov    $0x10,%ecx
cmp    %rax,0x80(%rdi)
je     12ed <add+0x1dd>
mov    $0x11,%ecx
cmp    %rax,0x88(%rdi)
je     12ed <add+0x1dd>
mov    $0x12,%ecx
cmp    %rax,0x90(%rdi)
je     12ed <add+0x1dd>
mov    $0x13,%ecx
cmp    %rax,0x98(%rdi)
je     12ed <add+0x1dd>
mov    $0x14,%ecx
cmp    %rax,0xa0(%rdi)
je     12ed <add+0x1dd>
mov    $0x15,%ecx
cmp    %rax,0xa8(%rdi)
je     12ed <add+0x1dd>
mov    $0x16,%ecx
cmp    %rax,0xb0(%rdi)
je     12ed <add+0x1dd>
mov    $0x17,%ecx
cmp    %rax,0xb8(%rdi)
je     12ed <add+0x1dd>
mov    $0x18,%ecx
cmp    %rax,0xc0(%rdi)
je     12ed <add+0x1dd>
mov    $0x19,%ecx
cmp    %rax,0xc8(%rdi)
je     12ed <add+0x1dd>
mov    $0x1a,%ecx
cmp    %rax,0xd0(%rdi)
je     12ed <add+0x1dd>
mov    $0x1b,%ecx
cmp    %rax,0xd8(%rdi)
je     12ed <add+0x1dd>
mov    $0x1c,%ecx
cmp    %rax,0xe0(%rdi)
je     12ed <add+0x1dd>
mov    $0x1d,%ecx
cmp    %rax,0xe8(%rdi)
je     12ed <add+0x1dd>
mov    $0x1e,%ecx
cmp    %rax,0xf0(%rdi)
jne    12f2 <add+0x1e2>
mov    %rsi,(%rdi,%rcx,8)
ret
mov    0x2cdf(%rip),%rax
mov    (%rax),%esi
lea    0xcfe(%rip),%rdi
jmp    1030 <fputs@plt>

LLVM IR (-O0):
%struct.in_addr = type { i64 }
@INADDR_ANY = global i64 0
@.str = [39 x i8] c"too many results to remember them all\0A\00"
@stderr = global i32 0
define void @add(%struct.in_addr* %0, i64 %1) {
%3 = alloca %struct.in_addr
%4 = alloca %struct.in_addr*
%5 = alloca i32
%6 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %3, i32 0, i32 0
store i64 %1, i64* %6
store %struct.in_addr* %0, %struct.in_addr** %4
store i32 0, i32* %5
br label %7
7: ; preds = %27, %2
%8 = load i32, i32* %5
%9 = icmp slt i32 %8, 31
br i1 %9, label %10, label %30
10: ; preds = %7
%11 = load %struct.in_addr*, %struct.in_addr** %4
%12 = load i32, i32* %5
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %11, i64 %13
%15 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %14, i32 0, i32 0
%16 = load i64, i64* %15
%17 = load i64, i64* @INADDR_ANY
%18 = icmp eq i64 %16, %17
br i1 %18, label %19, label %26
19: ; preds = %10
%20 = load %struct.in_addr*, %struct.in_addr** %4
%21 = load i32, i32* %5
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %20, i64 %22
%24 = bitcast %struct.in_addr* %23 to i8*
%25 = bitcast %struct.in_addr* %3 to i8*
br label %33
26: ; preds = %10
br label %27
27: ; preds = %26
%28 = load i32, i32* %5
%29 = add nsw i32 %28, 1
store i32 %29, i32* %5
br label %7
30: ; preds = %7
%31 = load i32, i32* @stderr
%32 = call i32 @fputs(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0), i32 %31)
br label %33
33: ; preds = %30, %19
ret void
}

LLVM IR (-O2):
%struct.in_addr = type { i64 }
@INADDR_ANY = global i64 0
@.str = [39 x i8] c"too many results to remember them all\0A\00"
@stderr = global i32 0
define void @add(%struct.in_addr* nocapture %0, i64 %1) {
%3 = load i64, i64* @INADDR_ANY
%4 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 0, i32 0
%5 = load i64, i64* %4
%6 = icmp eq i64 %5, %3
br i1 %6, label %130, label %7
7: ; preds = %2
%8 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 1, i32 0
%9 = load i64, i64* %8
%10 = icmp eq i64 %9, %3
br i1 %10, label %130, label %11
11: ; preds = %7
%12 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 2, i32 0
%13 = load i64, i64* %12
%14 = icmp eq i64 %13, %3
br i1 %14, label %130, label %15
15: ; preds = %11
%16 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 3, i32 0
%17 = load i64, i64* %16
%18 = icmp eq i64 %17, %3
br i1 %18, label %130, label %19
19: ; preds = %15
%20 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 4, i32 0
%21 = load i64, i64* %20
%22 = icmp eq i64 %21, %3
br i1 %22, label %130, label %23
23: ; preds = %19
%24 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 5, i32 0
%25 = load i64, i64* %24
%26 = icmp eq i64 %25, %3
br i1 %26, label %130, label %27
27: ; preds = %23
%28 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 6, i32 0
%29 = load i64, i64* %28
%30 = icmp eq i64 %29, %3
br i1 %30, label %130, label %31
31: ; preds = %27
%32 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 7, i32 0
%33 = load i64, i64* %32
%34 = icmp eq i64 %33, %3
br i1 %34, label %130, label %35
35: ; preds = %31
%36 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 8, i32 0
%37 = load i64, i64* %36
%38 = icmp eq i64 %37, %3
br i1 %38, label %130, label %39
39: ; preds = %35
%40 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 9, i32 0
%41 = load i64, i64* %40
%42 = icmp eq i64 %41, %3
br i1 %42, label %130, label %43
43: ; preds = %39
%44 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 10, i32 0
%45 = load i64, i64* %44
%46 = icmp eq i64 %45, %3
br i1 %46, label %130, label %47
47: ; preds = %43
%48 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 11, i32 0
%49 = load i64, i64* %48
%50 = icmp eq i64 %49, %3
br i1 %50, label %130, label %51
51: ; preds = %47
%52 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 12, i32 0
%53 = load i64, i64* %52
%54 = icmp eq i64 %53, %3
br i1 %54, label %130, label %55
55: ; preds = %51
%56 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 13, i32 0
%57 = load i64, i64* %56
%58 = icmp eq i64 %57, %3
br i1 %58, label %130, label %59
59: ; preds = %55
%60 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 14, i32 0
%61 = load i64, i64* %60
%62 = icmp eq i64 %61, %3
br i1 %62, label %130, label %63
63: ; preds = %59
%64 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 15, i32 0
%65 = load i64, i64* %64
%66 = icmp eq i64 %65, %3
br i1 %66, label %130, label %67
67: ; preds = %63
%68 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 16, i32 0
%69 = load i64, i64* %68
%70 = icmp eq i64 %69, %3
br i1 %70, label %130, label %71
71: ; preds = %67
%72 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 17, i32 0
%73 = load i64, i64* %72
%74 = icmp eq i64 %73, %3
br i1 %74, label %130, label %75
75: ; preds = %71
%76 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 18, i32 0
%77 = load i64, i64* %76
%78 = icmp eq i64 %77, %3
br i1 %78, label %130, label %79
79: ; preds = %75
%80 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 19, i32 0
%81 = load i64, i64* %80
%82 = icmp eq i64 %81, %3
br i1 %82, label %130, label %83
83: ; preds = %79
%84 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 20, i32 0
%85 = load i64, i64* %84
%86 = icmp eq i64 %85, %3
br i1 %86, label %130, label %87
87: ; preds = %83
%88 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 21, i32 0
%89 = load i64, i64* %88
%90 = icmp eq i64 %89, %3
br i1 %90, label %130, label %91
91: ; preds = %87
%92 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 22, i32 0
%93 = load i64, i64* %92
%94 = icmp eq i64 %93, %3
br i1 %94, label %130, label %95
95: ; preds = %91
%96 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 23, i32 0
%97 = load i64, i64* %96
%98 = icmp eq i64 %97, %3
br i1 %98, label %130, label %99
99: ; preds = %95
%100 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 24, i32 0
%101 = load i64, i64* %100
%102 = icmp eq i64 %101, %3
br i1 %102, label %130, label %103
103: ; preds = %99
%104 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 25, i32 0
%105 = load i64, i64* %104
%106 = icmp eq i64 %105, %3
br i1 %106, label %130, label %107
107: ; preds = %103
%108 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 26, i32 0
%109 = load i64, i64* %108
%110 = icmp eq i64 %109, %3
br i1 %110, label %130, label %111
111: ; preds = %107
%112 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 27, i32 0
%113 = load i64, i64* %112
%114 = icmp eq i64 %113, %3
br i1 %114, label %130, label %115
115: ; preds = %111
%116 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 28, i32 0
%117 = load i64, i64* %116
%118 = icmp eq i64 %117, %3
br i1 %118, label %130, label %119
119: ; preds = %115
%120 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 29, i32 0
%121 = load i64, i64* %120
%122 = icmp eq i64 %121, %3
br i1 %122, label %130, label %123
123: ; preds = %119
%124 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 30, i32 0
%125 = load i64, i64* %124
%126 = icmp eq i64 %125, %3
br i1 %126, label %130, label %127
127: ; preds = %123
%128 = load i32, i32* @stderr
%129 = tail call i32 @fputs(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0), i32 %128)
br label %133
130: ; preds = %123, %119, %115, %111, %107, %103, %99, %95, %91, %87, %83, %79, %75, %71, %67, %63, %59, %55, %51, %47, %43, %39, %35, %31, %27, %23, %19, %15, %11, %7, %2
%131 = phi i64 [ 0, %2 ], [ 1, %7 ], [ 2, %11 ], [ 3, %15 ], [ 4, %19 ], [ 5, %23 ], [ 6, %27 ], [ 7, %31 ], [ 8, %35 ], [ 9, %39 ], [ 10, %43 ], [ 11, %47 ], [ 12, %51 ], [ 13, %55 ], [ 14, %59 ], [ 15, %63 ], [ 16, %67 ], [ 17, %71 ], [ 18, %75 ], [ 19, %79 ], [ 20, %83 ], [ 21, %87 ], [ 22, %91 ], [ 23, %95 ], [ 24, %99 ], [ 25, %103 ], [ 26, %107 ], [ 27, %111 ], [ 28, %115 ], [ 29, %119 ], [ 30, %123 ]
%132 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %0, i64 %131, i32 0
store i64 %1, i64* %132
br label %133
133: ; preds = %130, %127
ret void
}