#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 O_NOCTTY;
int O_RDWR;
int open(char *, int);
int find_serial() {
  int fd = -1;
  char port[] = "/dev/ttyUSB_";
  for (unsigned i = 0; i < 10; i++) {
    port[11] = i + 0x30;
    fd = open(port, O_RDWR | O_NOCTTY);
    if (!fd) {
      return fd;
    }
  }
  port[8] = 'S';
  port[10] = 0;
  for (unsigned i = 0; i < 10; i++) {
    port[9] = i + 0x30;
    fd = open(port, O_RDWR | O_NOCTTY);
    if (!fd) {
      break;
    }
  }
  return fd;
}


x86 assembly (clang, -O0):
<find_serial>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movl   $0xffffffff,-0x8(%rbp)
mov    0xeda(%rip),%rax
mov    %rax,-0x15(%rbp)
mov    0xed8(%rip),%eax
mov    %eax,-0xd(%rbp)
mov    0xed3(%rip),%al
mov    %al,-0x9(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0xa,-0x1c(%rbp)
jae    119c <find_serial+0x8c>
mov    -0x1c(%rbp),%eax
add    $0x30,%eax
mov    %al,-0xa(%rbp)
lea    -0x15(%rbp),%rdi
mov    0x2e87(%rip),%rax
mov    (%rax),%esi
mov    0x2e6e(%rip),%rax
or     (%rax),%esi
call   1030 <open@plt>
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    1189 <find_serial+0x79>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1204 <find_serial+0xf4>
jmp    118e <find_serial+0x7e>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1143 <find_serial+0x33>
movb   $0x53,-0xd(%rbp)
movb   $0x0,-0xb(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0xa,-0x20(%rbp)
jae    11fe <find_serial+0xee>
mov    -0x20(%rbp),%eax
add    $0x30,%eax
mov    %al,-0xc(%rbp)
lea    -0x15(%rbp),%rdi
mov    0x2e1f(%rip),%rax
mov    (%rax),%esi
mov    0x2e06(%rip),%rax
or     (%rax),%esi
call   1030 <open@plt>
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    11eb <find_serial+0xdb>
jmp    11fe <find_serial+0xee>
jmp    11f0 <find_serial+0xe0>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11ab <find_serial+0x9b>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<find_serial>:
push   %rbp
push   %r14
push   %rbx
sub    $0x10,%rsp
movabs $0x5f425355797474,%rax
mov    %rax,0x5(%rsp)
movabs $0x7974742f7665642f,%rax
74 74 79
mov    %rax,(%rsp)
movb   $0x30,0xb(%rsp)
mov    0x2ea7(%rip),%rbx
mov    0x2e90(%rip),%rbp
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
xor    %r14d,%r14d
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x31,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x32,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x33,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x34,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x35,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x36,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x37,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x38,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x39,0xb(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movw   $0x3053,0x8(%rsp)
movb   $0x0,0xa(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x31,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x32,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x33,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x34,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x35,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x36,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x37,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x38,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
test   %eax,%eax
je     133c <find_serial+0x22c>
movb   $0x39,0x9(%rsp)
mov    0x0(%rbp),%esi
or     (%rbx),%esi
mov    %rsp,%rdi
call   1030 <open@plt>
mov    %eax,%r14d
mov    %r14d,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
@__const.find_serial.port = [13 x i8] c"/dev/ttyUSB_\00"
@O_RDWR = global i32 0
@O_NOCTTY = global i32 0
define i32 @find_serial() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca [13 x i8]
%4 = alloca i32
%5 = alloca i32
store i32 -1, i32* %2
%6 = bitcast [13 x i8]* %3 to i8*
store i32 0, i32* %4
br label %7
7: ; preds = %25, %0
%8 = load i32, i32* %4
%9 = icmp ult i32 %8, 10
br i1 %9, label %10, label %28
10: ; preds = %7
%11 = load i32, i32* %4
%12 = add i32 %11, 48
%13 = trunc i32 %12 to i8
%14 = getelementptr inbounds [13 x i8], [13 x i8]* %3, i64 0, i64 11
store i8 %13, i8* %14
%15 = getelementptr inbounds [13 x i8], [13 x i8]* %3, i64 0, i64 0
%16 = load i32, i32* @O_RDWR
%17 = load i32, i32* @O_NOCTTY
%18 = or i32 %16, %17
%19 = call i32 @open(i8* %15, i32 %18)
store i32 %19, i32* %2
%20 = load i32, i32* %2
%21 = icmp ne i32 %20, 0
br i1 %21, label %24, label %22
22: ; preds = %10
%23 = load i32, i32* %2
store i32 %23, i32* %1
br label %53
24: ; preds = %10
br label %25
25: ; preds = %24
%26 = load i32, i32* %4
%27 = add i32 %26, 1
store i32 %27, i32* %4
br label %7
28: ; preds = %7
%29 = getelementptr inbounds [13 x i8], [13 x i8]* %3, i64 0, i64 8
store i8 83, i8* %29
%30 = getelementptr inbounds [13 x i8], [13 x i8]* %3, i64 0, i64 10
store i8 0, i8* %30
store i32 0, i32* %5
br label %31
31: ; preds = %48, %28
%32 = load i32, i32* %5
%33 = icmp ult i32 %32, 10
br i1 %33, label %34, label %51
34: ; preds = %31
%35 = load i32, i32* %5
%36 = add i32 %35, 48
%37 = trunc i32 %36 to i8
%38 = getelementptr inbounds [13 x i8], [13 x i8]* %3, i64 0, i64 9
store i8 %37, i8* %38
%39 = getelementptr inbounds [13 x i8], [13 x i8]* %3, i64 0, i64 0
%40 = load i32, i32* @O_RDWR
%41 = load i32, i32* @O_NOCTTY
%42 = or i32 %40, %41
%43 = call i32 @open(i8* %39, i32 %42)
store i32 %43, i32* %2
%44 = load i32, i32* %2
%45 = icmp ne i32 %44, 0
br i1 %45, label %47, label %46
46: ; preds = %34
br label %51
47: ; preds = %34
br label %48
48: ; preds = %47
%49 = load i32, i32* %5
%50 = add i32 %49, 1
store i32 %50, i32* %5
br label %31
51: ; preds = %46, %31
%52 = load i32, i32* %2
store i32 %52, i32* %1
br label %53
53: ; preds = %51, %22
%54 = load i32, i32* %1
ret i32 %54
}

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