unsigned short nextport(block)
char *block;
{
  register unsigned int x;
  register unsigned int y;
  y = 70000;
  while (y > 0) {
    x = (random() & 0xffff);
    if (block[x] == 1) {
      block[x] = 2;
      break;
    }
    x = 0;
    y--;
  }
  if (x)
    return (x);
  y = 65535;
  while (y > 0) {
    if (block[y] == 1) {
      block[y] = 2;
      break;
    }
    y--;
  }
  if (y)
    return (y);
  return (0);
}


x86 assembly (clang, -O0):
<nextport>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x11170,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jbe    1175 <nextport+0x65>
mov    $0x0,%al
call   1030 <random@plt>
and    $0xffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1,%eax
jne    1160 <nextport+0x50>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
movb   $0x2,(%rax,%rcx,1)
jmp    1175 <nextport+0x65>
movl   $0x0,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1123 <nextport+0x13>
cmpl   $0x0,-0x14(%rbp)
je     118b <nextport+0x7b>
mov    -0x14(%rbp),%eax
mov    %ax,-0x2(%rbp)
jmp    11ea <nextport+0xda>
movl   $0xffff,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jbe    11ce <nextport+0xbe>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1,%eax
jne    11c0 <nextport+0xb0>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
movb   $0x2,(%rax,%rcx,1)
jmp    11ce <nextport+0xbe>
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1192 <nextport+0x82>
cmpl   $0x0,-0x18(%rbp)
je     11e4 <nextport+0xd4>
mov    -0x18(%rbp),%eax
mov    %ax,-0x2(%rbp)
jmp    11ea <nextport+0xda>
movw   $0x0,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<nextport>:
push   %rbp
push   %rbx
push   %rax
mov    %rdi,%rbx
mov    $0xfffeee90,%ebp
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
call   1030 <random@plt>
movzwl %ax,%ecx
cmpb   $0x1,(%rbx,%rcx,1)
je     1136 <nextport+0x26>
inc    %ebp
jne    1120 <nextport+0x10>
jmp    113e <nextport+0x2e>
movb   $0x2,(%rbx,%rcx,1)
test   %ecx,%ecx
jne    118d <nextport+0x7d>
mov    $0xffff,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %ecx,%eax
cmpb   $0x1,(%rbx,%rax,1)
je     1185 <nextport+0x75>
lea    -0x1(%rcx),%eax
cmpb   $0x1,(%rbx,%rax,1)
je     1187 <nextport+0x77>
lea    -0x2(%rcx),%eax
cmpb   $0x1,(%rbx,%rax,1)
je     1187 <nextport+0x77>
lea    -0x3(%rcx),%eax
cmpb   $0x1,(%rbx,%rax,1)
je     1187 <nextport+0x77>
lea    -0x4(%rcx),%eax
cmpb   $0x1,(%rbx,%rax,1)
je     1187 <nextport+0x77>
add    $0xfffffffb,%ecx
jne    1150 <nextport+0x40>
xor    %eax,%eax
jmp    118d <nextport+0x7d>
mov    %ecx,%eax
mov    %eax,%ecx
movb   $0x2,(%rbx,%rcx,1)
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define zeroext i16 @nextport(i8* %0) {
%2 = alloca i16
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
store i8* %0, i8** %3
store i32 70000, i32* %5
br label %6
6: ; preds = %24, %1
%7 = load i32, i32* %5
%8 = icmp ugt i32 %7, 0
br i1 %8, label %9, label %27
9: ; preds = %6
%10 = call i32 (...) @random()
%11 = and i32 %10, 65535
store i32 %11, i32* %4
%12 = load i8*, i8** %3
%13 = load i32, i32* %4
%14 = zext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %12, i64 %14
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 1
br i1 %18, label %19, label %24
19: ; preds = %9
%20 = load i8*, i8** %3
%21 = load i32, i32* %4
%22 = zext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %20, i64 %22
store i8 2, i8* %23
br label %27
24: ; preds = %9
store i32 0, i32* %4
%25 = load i32, i32* %5
%26 = add i32 %25, -1
store i32 %26, i32* %5
br label %6
27: ; preds = %19, %6
%28 = load i32, i32* %4
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %33
30: ; preds = %27
%31 = load i32, i32* %4
%32 = trunc i32 %31 to i16
store i16 %32, i16* %2
br label %60
33: ; preds = %27
store i32 65535, i32* %5
br label %34
34: ; preds = %50, %33
%35 = load i32, i32* %5
%36 = icmp ugt i32 %35, 0
br i1 %36, label %37, label %53
37: ; preds = %34
%38 = load i8*, i8** %3
%39 = load i32, i32* %5
%40 = zext i32 %39 to i64
%41 = getelementptr inbounds i8, i8* %38, i64 %40
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 1
br i1 %44, label %45, label %50
45: ; preds = %37
%46 = load i8*, i8** %3
%47 = load i32, i32* %5
%48 = zext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %46, i64 %48
store i8 2, i8* %49
br label %53
50: ; preds = %37
%51 = load i32, i32* %5
%52 = add i32 %51, -1
store i32 %52, i32* %5
br label %34
53: ; preds = %45, %34
%54 = load i32, i32* %5
%55 = icmp ne i32 %54, 0
br i1 %55, label %56, label %59
56: ; preds = %53
%57 = load i32, i32* %5
%58 = trunc i32 %57 to i16
store i16 %58, i16* %2
br label %60
59: ; preds = %53
store i16 0, i16* %2
br label %60
60: ; preds = %59, %56, %30
%61 = load i16, i16* %2
ret i16 %61
}

LLVM IR (-O2):
define zeroext i16 @nextport(i8* nocapture %0) {
br label %4
2: ; preds = %4
%3 = icmp eq i32 %12, 0
br i1 %3, label %17, label %4
4: ; preds = %1, %2
%5 = phi i32 [ 70000, %1 ], [ %12, %2 ]
%6 = tail call i32 (...) @random()
%7 = and i32 %6, 65535
%8 = zext i32 %7 to i64
%9 = getelementptr inbounds i8, i8* %0, i64 %8
%10 = load i8, i8* %9
%11 = icmp eq i8 %10, 1
%12 = add nsw i32 %5, -1
br i1 %11, label %13, label %2
13: ; preds = %4
%14 = zext i32 %7 to i64
%15 = getelementptr inbounds i8, i8* %0, i64 %14
store i8 2, i8* %15
%16 = icmp eq i32 %7, 0
br i1 %16, label %17, label %18
17: ; preds = %2, %13
br label %20
18: ; preds = %13
%19 = trunc i32 %6 to i16
br label %58
20: ; preds = %55, %17
%21 = phi i32 [ 65535, %17 ], [ %56, %55 ]
%22 = zext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %0, i64 %22
%24 = load i8, i8* %23
%25 = icmp eq i8 %24, 1
br i1 %25, label %26, label %31
26: ; preds = %49, %43, %37, %31, %20
%27 = phi i32 [ %21, %20 ], [ %32, %31 ], [ %38, %37 ], [ %44, %43 ], [ %50, %49 ]
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds i8, i8* %0, i64 %28
store i8 2, i8* %29
%30 = trunc i32 %27 to i16
br label %58
31: ; preds = %20
%32 = add nsw i32 %21, -1
%33 = zext i32 %32 to i64
%34 = getelementptr inbounds i8, i8* %0, i64 %33
%35 = load i8, i8* %34
%36 = icmp eq i8 %35, 1
br i1 %36, label %26, label %37
37: ; preds = %31
%38 = add nsw i32 %21, -2
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %0, i64 %39
%41 = load i8, i8* %40
%42 = icmp eq i8 %41, 1
br i1 %42, label %26, label %43
43: ; preds = %37
%44 = add nsw i32 %21, -3
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %0, i64 %45
%47 = load i8, i8* %46
%48 = icmp eq i8 %47, 1
br i1 %48, label %26, label %49
49: ; preds = %43
%50 = add nsw i32 %21, -4
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %0, i64 %51
%53 = load i8, i8* %52
%54 = icmp eq i8 %53, 1
br i1 %54, label %26, label %55
55: ; preds = %49
%56 = add nsw i32 %21, -5
%57 = icmp eq i32 %56, 0
br i1 %57, label %58, label %20
58: ; preds = %55, %26, %18
%59 = phi i16 [ %19, %18 ], [ %30, %26 ], [ 0, %55 ]
ret i16 %59
}