#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 {
  int /*<<< orphan*/ s_addr;
};
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ feof(int /*<<< orphan*/ *);
char *fgets(char *, int, int /*<<< orphan*/ *);
int /*<<< orphan*/ *fopen(char *, char *);
int /*<<< orphan*/ free(char *);
char *inet_ntoa(struct in_addr);
scalar_t__ strcmp(char *, char *);
char *strdup(char *);
scalar_t__ strlen(char *);
int /*<<< orphan*/ strtol(char *, int /*<<< orphan*/ *, int);
int get_default_gw(char **iface, char **gw) {
  FILE *f;
  char line[100], *ret, *p, *striface = NULL, *strgw = NULL;
  struct in_addr in;
  int check_iface;
  check_iface = (iface && *iface && strlen(*iface) > 0);
  f = fopen("/proc/net/route", "r");
  if (!f)
    return -1;
  while (!feof(f)) {
    ret = fgets(line, 100, f);
    if (!ret)
      return -1;
    p = line;
    while (*p && *p != ' ' && *p != '\t')
      p++;
    if (!*p)
      continue;
    *p++ = 0;
    if (check_iface && strcmp(*iface, line))
      continue;
    while (*p && (*p == ' ' || *p == '\t'))
      p++;
    if (!*p)
      continue;
    ret = p;
    while (*p && *p != ' ' && *p != '\t')
      p++;
    if (!*p)
      continue;
    *p++ = 0;
    if (strcmp(ret, "00000000"))
      continue;
    ret = p;
    while (*p && *p != ' ' && *p != '\t')
      p++;
    if (!*p)
      continue;
    *p++ = 0;
    in.s_addr = strtol(ret, NULL, 16);
    if (iface) {
      striface = strdup(line);
      if (!striface)
        goto errout;
    }
    if (gw) {
      strgw = strdup(inet_ntoa(in));
      if (!strgw)
        goto errout;
    }
    *iface = striface;
    *gw = strgw;
    return 0;
  }
errout:
  if (striface)
    free(striface);
  if (strgw)
    free(strgw);
  return -1;
}


x86 assembly (clang, -O0):
<get_default_gw>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movq   $0x0,-0xa8(%rbp)
movq   $0x0,-0xb0(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0xbd(%rbp)
je     11fb <get_default_gw+0x6b>
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmpq   $0x0,(%rcx)
mov    %al,-0xbd(%rbp)
je     11fb <get_default_gw+0x6b>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
call   1050 <strlen@plt>
cmp    $0x0,%rax
setg   %al
mov    %al,-0xbd(%rbp)
mov    -0xbd(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0xbc(%rbp)
lea    0xded(%rip),%rdi
lea    0xdf6(%rip),%rsi
call   10a0 <fopen@plt>
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    123a <get_default_gw+0xaa>
movl   $0xffffffff,-0x4(%rbp)
jmp    1689 <get_default_gw+0x4f9>
jmp    123f <get_default_gw+0xaf>
mov    -0x20(%rbp),%rdi
call   1080 <feof@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
test   $0x1,%al
jne    125d <get_default_gw+0xcd>
jmp    1649 <get_default_gw+0x4b9>
lea    -0x90(%rbp),%rdi
mov    -0x20(%rbp),%rdx
mov    $0x64,%esi
call   1060 <fgets@plt>
mov    %rax,-0x98(%rbp)
cmpq   $0x0,-0x98(%rbp)
jne    1293 <get_default_gw+0x103>
movl   $0xffffffff,-0x4(%rbp)
jmp    1689 <get_default_gw+0x4f9>
lea    -0x90(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xbe(%rbp)
je     12ed <get_default_gw+0x15d>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0xbe(%rbp)
je     12ed <get_default_gw+0x15d>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
setne  %al
mov    %al,-0xbe(%rbp)
mov    -0xbe(%rbp),%al
test   $0x1,%al
jne    1300 <get_default_gw+0x170>
jmp    1317 <get_default_gw+0x187>
mov    -0xa0(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xa0(%rbp)
jmp    12a1 <get_default_gw+0x111>
mov    -0xa0(%rbp),%rax
cmpb   $0x0,(%rax)
jne    132c <get_default_gw+0x19c>
jmp    123f <get_default_gw+0xaf>
mov    -0xa0(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0xa0(%rbp)
movb   $0x0,(%rax)
cmpl   $0x0,-0xbc(%rbp)
je     1373 <get_default_gw+0x1e3>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
lea    -0x90(%rbp),%rsi
call   1070 <strcmp@plt>
cmp    $0x0,%rax
je     1373 <get_default_gw+0x1e3>
jmp    123f <get_default_gw+0xaf>
jmp    1378 <get_default_gw+0x1e8>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xbf(%rbp)
je     13d0 <get_default_gw+0x240>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0xc0(%rbp)
je     13c4 <get_default_gw+0x234>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0xc0(%rbp)
mov    -0xc0(%rbp),%al
mov    %al,-0xbf(%rbp)
mov    -0xbf(%rbp),%al
test   $0x1,%al
jne    13e3 <get_default_gw+0x253>
jmp    13fa <get_default_gw+0x26a>
mov    -0xa0(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xa0(%rbp)
jmp    1378 <get_default_gw+0x1e8>
mov    -0xa0(%rbp),%rax
cmpb   $0x0,(%rax)
jne    140f <get_default_gw+0x27f>
jmp    123f <get_default_gw+0xaf>
mov    -0xa0(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xc1(%rbp)
je     1469 <get_default_gw+0x2d9>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0xc1(%rbp)
je     1469 <get_default_gw+0x2d9>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
setne  %al
mov    %al,-0xc1(%rbp)
mov    -0xc1(%rbp),%al
test   $0x1,%al
jne    147c <get_default_gw+0x2ec>
jmp    1493 <get_default_gw+0x303>
mov    -0xa0(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xa0(%rbp)
jmp    141d <get_default_gw+0x28d>
mov    -0xa0(%rbp),%rax
cmpb   $0x0,(%rax)
jne    14a8 <get_default_gw+0x318>
jmp    123f <get_default_gw+0xaf>
mov    -0xa0(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0xa0(%rbp)
movb   $0x0,(%rax)
mov    -0x98(%rbp),%rdi
lea    0xb44(%rip),%rsi
call   1070 <strcmp@plt>
cmp    $0x0,%rax
je     14e2 <get_default_gw+0x352>
jmp    123f <get_default_gw+0xaf>
mov    -0xa0(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xc2(%rbp)
je     153c <get_default_gw+0x3ac>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0xc2(%rbp)
je     153c <get_default_gw+0x3ac>
mov    -0xa0(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
setne  %al
mov    %al,-0xc2(%rbp)
mov    -0xc2(%rbp),%al
test   $0x1,%al
jne    154f <get_default_gw+0x3bf>
jmp    1566 <get_default_gw+0x3d6>
mov    -0xa0(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0xa0(%rbp)
jmp    14f0 <get_default_gw+0x360>
mov    -0xa0(%rbp),%rax
cmpb   $0x0,(%rax)
jne    157b <get_default_gw+0x3eb>
jmp    123f <get_default_gw+0xaf>
mov    -0xa0(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0xa0(%rbp)
movb   $0x0,(%rax)
mov    -0x98(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1090 <strtol@plt>
mov    %eax,-0xb8(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     15e4 <get_default_gw+0x454>
lea    -0x90(%rbp),%rdi
call   10b0 <strdup@plt>
mov    %rax,-0xa8(%rbp)
cmpq   $0x0,-0xa8(%rbp)
jne    15df <get_default_gw+0x44f>
jmp    164e <get_default_gw+0x4be>
jmp    15e4 <get_default_gw+0x454>
cmpq   $0x0,-0x18(%rbp)
je     1621 <get_default_gw+0x491>
mov    -0xb8(%rbp),%edi
call   1040 <inet_ntoa@plt>
mov    %rax,%rdi
call   10b0 <strdup@plt>
mov    %rax,-0xb0(%rbp)
cmpq   $0x0,-0xb0(%rbp)
jne    161c <get_default_gw+0x48c>
jmp    164e <get_default_gw+0x4be>
jmp    1621 <get_default_gw+0x491>
mov    -0xa8(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0xb0(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1689 <get_default_gw+0x4f9>
jmp    164e <get_default_gw+0x4be>
cmpq   $0x0,-0xa8(%rbp)
je     1668 <get_default_gw+0x4d8>
mov    -0xa8(%rbp),%rdi
call   1030 <free@plt>
cmpq   $0x0,-0xb0(%rbp)
je     1682 <get_default_gw+0x4f2>
mov    -0xb0(%rbp),%rdi
call   1030 <free@plt>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_default_gw>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %rsi,%rbp
mov    %rdi,%r12
test   %rdi,%rdi
je     11c3 <get_default_gw+0x33>
mov    (%r12),%rdi
test   %rdi,%rdi
je     11c3 <get_default_gw+0x33>
call   1050 <strlen@plt>
test   %rax,%rax
setg   %al
mov    %eax,0x4(%rsp)
jmp    11cb <get_default_gw+0x3b>
movl   $0x0,0x4(%rsp)
lea    0xe2e(%rip),%rdi
lea    0xe37(%rip),%rsi
call   10a0 <fopen@plt>
mov    $0xffffffff,%r15d
test   %rax,%rax
je     11f8 <get_default_gw+0x68>
mov    %rax,%rbx
mov    %rax,%rdi
call   1080 <feof@plt>
test   %eax,%eax
je     1210 <get_default_gw+0x80>
mov    $0xffffffff,%r15d
mov    %r15d,%eax
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rbp,0x8(%rsp)
lea    0x10(%rsp),%r13
jmp    124c <get_default_gw+0xbc>
movb   $0x0,-0x1(%rbp)
mov    %r14,%rdi
lea    0xde8(%rip),%rsi
call   1070 <strcmp@plt>
test   %rax,%rax
je     12f9 <get_default_gw+0x169>
nopl   0x0(%rax,%rax,1)
mov    %rbx,%rdi
call   1080 <feof@plt>
test   %eax,%eax
jne    11fe <get_default_gw+0x6e>
mov    %r13,%rdi
mov    $0x64,%esi
mov    %rbx,%rdx
call   1060 <fgets@plt>
test   %rax,%rax
je     11f8 <get_default_gw+0x68>
lea    0x12(%rsp),%rbp
lea    0x11(%rsp),%r14
mov    %r13,%rax
xchg   %ax,%ax
movzbl (%rax),%ecx
test   %cl,%cl
je     1240 <get_default_gw+0xb0>
cmp    $0x9,%cl
je     1290 <get_default_gw+0x100>
cmp    $0x20,%cl
je     1290 <get_default_gw+0x100>
add    $0x1,%rax
add    $0x1,%r14
add    $0x1,%rbp
jmp    1270 <get_default_gw+0xe0>
nop
movb   $0x0,(%rax)
cmpb   $0x0,0x4(%rsp)
je     12b8 <get_default_gw+0x128>
mov    (%r12),%rdi
mov    %r13,%rsi
call   1070 <strcmp@plt>
test   %rax,%rax
jne    1240 <get_default_gw+0xb0>
jmp    12b8 <get_default_gw+0x128>
nopl   (%rax)
add    $0x1,%r14
add    $0x1,%rbp
movzbl (%r14),%eax
cmp    $0x9,%al
je     12b0 <get_default_gw+0x120>
cmp    $0x20,%al
je     12b0 <get_default_gw+0x120>
test   %al,%al
je     1240 <get_default_gw+0xb0>
nopl   0x0(%rax)
test   %al,%al
je     1240 <get_default_gw+0xb0>
cmp    $0x9,%al
je     121c <get_default_gw+0x8c>
cmp    $0x20,%al
je     121c <get_default_gw+0x8c>
movzbl 0x0(%rbp),%eax
add    $0x1,%rbp
test   %al,%al
jne    12d8 <get_default_gw+0x148>
jmp    1240 <get_default_gw+0xb0>
mov    %rbp,%rax
nopl   0x0(%rax)
movzbl (%rax),%ecx
test   %cl,%cl
je     1240 <get_default_gw+0xb0>
cmp    $0x9,%cl
je     131b <get_default_gw+0x18b>
cmp    $0x20,%cl
je     131b <get_default_gw+0x18b>
add    $0x1,%rax
jmp    1300 <get_default_gw+0x170>
movb   $0x0,(%rax)
xor    %ebx,%ebx
mov    %rbp,%rdi
xor    %esi,%esi
mov    $0x10,%edx
call   1090 <strtol@plt>
mov    %eax,%r14d
test   %r12,%r12
je     134d <get_default_gw+0x1bd>
lea    0x10(%rsp),%rdi
call   10b0 <strdup@plt>
mov    %rax,%rbx
test   %rax,%rax
je     11f8 <get_default_gw+0x68>
xor    %r15d,%r15d
mov    0x8(%rsp),%rbp
test   %rbp,%rbp
je     1385 <get_default_gw+0x1f5>
mov    %r14d,%edi
call   1040 <inet_ntoa@plt>
mov    %rax,%rdi
call   10b0 <strdup@plt>
test   %rax,%rax
jne    1387 <get_default_gw+0x1f7>
test   %rbx,%rbx
je     11f8 <get_default_gw+0x68>
mov    %rbx,%rdi
call   1030 <free@plt>
jmp    11f8 <get_default_gw+0x68>
xor    %eax,%eax
mov    %rbx,(%r12)
mov    %rax,0x0(%rbp)
jmp    11fe <get_default_gw+0x6e>

LLVM IR (-O0):
%struct.in_addr = type { i32 }
@.str = [16 x i8] c"/proc/net/route\00"
@.str.1 = [2 x i8] c"r\00"
@.str.2 = [9 x i8] c"00000000\00"
define i32 @get_default_gw(i8** %0, i8** %1) {
%3 = alloca i32
%4 = alloca i8**
%5 = alloca i8**
%6 = alloca i32*
%7 = alloca [100 x i8]
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca %struct.in_addr
%13 = alloca i32
store i8** %0, i8*** %4
store i8** %1, i8*** %5
store i8* null, i8** %10
store i8* null, i8** %11
%14 = load i8**, i8*** %4
%15 = icmp ne i8** %14, null
br i1 %15, label %16, label %25
16: ; preds = %2
%17 = load i8**, i8*** %4
%18 = load i8*, i8** %17
%19 = icmp ne i8* %18, null
br i1 %19, label %20, label %25
20: ; preds = %16
%21 = load i8**, i8*** %4
%22 = load i8*, i8** %21
%23 = call i64 @strlen(i8* %22)
%24 = icmp sgt i64 %23, 0
br label %25
25: ; preds = %20, %16, %2
%26 = phi i1 [ false, %16 ], [ false, %2 ], [ %24, %20 ]
%27 = zext i1 %26 to i32
store i32 %27, i32* %13
%28 = call i32* @fopen(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
store i32* %28, i32** %6
%29 = load i32*, i32** %6
%30 = icmp ne i32* %29, null
br i1 %30, label %32, label %31
31: ; preds = %25
store i32 -1, i32* %3
br label %219
32: ; preds = %25
br label %33
33: ; preds = %172, %145, %138, %111, %83, %71, %32
%34 = load i32*, i32** %6
%35 = call i32 @feof(i32* %34)
%36 = icmp ne i32 %35, 0
%37 = xor i1 %36, true
br i1 %37, label %38, label %205
38: ; preds = %33
%39 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 0
%40 = load i32*, i32** %6
%41 = call i8* @fgets(i8* %39, i32 100, i32* %40)
store i8* %41, i8** %8
%42 = load i8*, i8** %8
%43 = icmp ne i8* %42, null
br i1 %43, label %45, label %44
44: ; preds = %38
store i32 -1, i32* %3
br label %219
45: ; preds = %38
%46 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 0
store i8* %46, i8** %9
br label %47
47: ; preds = %64, %45
%48 = load i8*, i8** %9
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = icmp ne i32 %50, 0
br i1 %51, label %52, label %62
52: ; preds = %47
%53 = load i8*, i8** %9
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp ne i32 %55, 32
br i1 %56, label %57, label %62
57: ; preds = %52
%58 = load i8*, i8** %9
%59 = load i8, i8* %58
%60 = sext i8 %59 to i32
%61 = icmp ne i32 %60, 9
br label %62
62: ; preds = %57, %52, %47
%63 = phi i1 [ false, %52 ], [ false, %47 ], [ %61, %57 ]
br i1 %63, label %64, label %67
64: ; preds = %62
%65 = load i8*, i8** %9
%66 = getelementptr inbounds i8, i8* %65, i32 1
store i8* %66, i8** %9
br label %47
67: ; preds = %62
%68 = load i8*, i8** %9
%69 = load i8, i8* %68
%70 = icmp ne i8 %69, 0
br i1 %70, label %72, label %71
71: ; preds = %67
br label %33
72: ; preds = %67
%73 = load i8*, i8** %9
%74 = getelementptr inbounds i8, i8* %73, i32 1
store i8* %74, i8** %9
store i8 0, i8* %73
%75 = load i32, i32* %13
%76 = icmp ne i32 %75, 0
br i1 %76, label %77, label %84
77: ; preds = %72
%78 = load i8**, i8*** %4
%79 = load i8*, i8** %78
%80 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 0
%81 = call i64 @strcmp(i8* %79, i8* %80)
%82 = icmp ne i64 %81, 0
br i1 %82, label %83, label %84
83: ; preds = %77
br label %33
84: ; preds = %77, %72
br label %85
85: ; preds = %104, %84
%86 = load i8*, i8** %9
%87 = load i8, i8* %86
%88 = sext i8 %87 to i32
%89 = icmp ne i32 %88, 0
br i1 %89, label %90, label %102
90: ; preds = %85
%91 = load i8*, i8** %9
%92 = load i8, i8* %91
%93 = sext i8 %92 to i32
%94 = icmp eq i32 %93, 32
br i1 %94, label %100, label %95
95: ; preds = %90
%96 = load i8*, i8** %9
%97 = load i8, i8* %96
%98 = sext i8 %97 to i32
%99 = icmp eq i32 %98, 9
br label %100
100: ; preds = %95, %90
%101 = phi i1 [ true, %90 ], [ %99, %95 ]
br label %102
102: ; preds = %100, %85
%103 = phi i1 [ false, %85 ], [ %101, %100 ]
br i1 %103, label %104, label %107
104: ; preds = %102
%105 = load i8*, i8** %9
%106 = getelementptr inbounds i8, i8* %105, i32 1
store i8* %106, i8** %9
br label %85
107: ; preds = %102
%108 = load i8*, i8** %9
%109 = load i8, i8* %108
%110 = icmp ne i8 %109, 0
br i1 %110, label %112, label %111
111: ; preds = %107
br label %33
112: ; preds = %107
%113 = load i8*, i8** %9
store i8* %113, i8** %8
br label %114
114: ; preds = %131, %112
%115 = load i8*, i8** %9
%116 = load i8, i8* %115
%117 = sext i8 %116 to i32
%118 = icmp ne i32 %117, 0
br i1 %118, label %119, label %129
119: ; preds = %114
%120 = load i8*, i8** %9
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = icmp ne i32 %122, 32
br i1 %123, label %124, label %129
124: ; preds = %119
%125 = load i8*, i8** %9
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp ne i32 %127, 9
br label %129
129: ; preds = %124, %119, %114
%130 = phi i1 [ false, %119 ], [ false, %114 ], [ %128, %124 ]
br i1 %130, label %131, label %134
131: ; preds = %129
%132 = load i8*, i8** %9
%133 = getelementptr inbounds i8, i8* %132, i32 1
store i8* %133, i8** %9
br label %114
134: ; preds = %129
%135 = load i8*, i8** %9
%136 = load i8, i8* %135
%137 = icmp ne i8 %136, 0
br i1 %137, label %139, label %138
138: ; preds = %134
br label %33
139: ; preds = %134
%140 = load i8*, i8** %9
%141 = getelementptr inbounds i8, i8* %140, i32 1
store i8* %141, i8** %9
store i8 0, i8* %140
%142 = load i8*, i8** %8
%143 = call i64 @strcmp(i8* %142, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0))
%144 = icmp ne i64 %143, 0
br i1 %144, label %145, label %146
145: ; preds = %139
br label %33
146: ; preds = %139
%147 = load i8*, i8** %9
store i8* %147, i8** %8
br label %148
148: ; preds = %165, %146
%149 = load i8*, i8** %9
%150 = load i8, i8* %149
%151 = sext i8 %150 to i32
%152 = icmp ne i32 %151, 0
br i1 %152, label %153, label %163
153: ; preds = %148
%154 = load i8*, i8** %9
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = icmp ne i32 %156, 32
br i1 %157, label %158, label %163
158: ; preds = %153
%159 = load i8*, i8** %9
%160 = load i8, i8* %159
%161 = sext i8 %160 to i32
%162 = icmp ne i32 %161, 9
br label %163
163: ; preds = %158, %153, %148
%164 = phi i1 [ false, %153 ], [ false, %148 ], [ %162, %158 ]
br i1 %164, label %165, label %168
165: ; preds = %163
%166 = load i8*, i8** %9
%167 = getelementptr inbounds i8, i8* %166, i32 1
store i8* %167, i8** %9
br label %148
168: ; preds = %163
%169 = load i8*, i8** %9
%170 = load i8, i8* %169
%171 = icmp ne i8 %170, 0
br i1 %171, label %173, label %172
172: ; preds = %168
br label %33
173: ; preds = %168
%174 = load i8*, i8** %9
%175 = getelementptr inbounds i8, i8* %174, i32 1
store i8* %175, i8** %9
store i8 0, i8* %174
%176 = load i8*, i8** %8
%177 = call i32 @strtol(i8* %176, i32* null, i32 16)
%178 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %12, i32 0, i32 0
store i32 %177, i32* %178
%179 = load i8**, i8*** %4
%180 = icmp ne i8** %179, null
br i1 %180, label %181, label %188
181: ; preds = %173
%182 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 0
%183 = call i8* @strdup(i8* %182)
store i8* %183, i8** %10
%184 = load i8*, i8** %10
%185 = icmp ne i8* %184, null
br i1 %185, label %187, label %186
186: ; preds = %181
br label %206
187: ; preds = %181
br label %188
188: ; preds = %187, %173
%189 = load i8**, i8*** %5
%190 = icmp ne i8** %189, null
br i1 %190, label %191, label %200
191: ; preds = %188
%192 = getelementptr inbounds %struct.in_addr, %struct.in_addr* %12, i32 0, i32 0
%193 = load i32, i32* %192
%194 = call i8* @inet_ntoa(i32 %193)
%195 = call i8* @strdup(i8* %194)
store i8* %195, i8** %11
%196 = load i8*, i8** %11
%197 = icmp ne i8* %196, null
br i1 %197, label %199, label %198
198: ; preds = %191
br label %206
199: ; preds = %191
br label %200
200: ; preds = %199, %188
%201 = load i8*, i8** %10
%202 = load i8**, i8*** %4
store i8* %201, i8** %202
%203 = load i8*, i8** %11
%204 = load i8**, i8*** %5
store i8* %203, i8** %204
store i32 0, i32* %3
br label %219
205: ; preds = %33
br label %206
206: ; preds = %205, %198, %186
%207 = load i8*, i8** %10
%208 = icmp ne i8* %207, null
br i1 %208, label %209, label %212
209: ; preds = %206
%210 = load i8*, i8** %10
%211 = call i32 @free(i8* %210)
br label %212
212: ; preds = %209, %206
%213 = load i8*, i8** %11
%214 = icmp ne i8* %213, null
br i1 %214, label %215, label %218
215: ; preds = %212
%216 = load i8*, i8** %11
%217 = call i32 @free(i8* %216)
br label %218
218: ; preds = %215, %212
store i32 -1, i32* %3
br label %219
219: ; preds = %218, %200, %44, %31
%220 = load i32, i32* %3
ret i32 %220
}

LLVM IR (-O2):
@.str = [16 x i8] c"/proc/net/route\00"
@.str.1 = [2 x i8] c"r\00"
@.str.2 = [9 x i8] c"00000000\00"
define i32 @get_default_gw(i8** %0, i8** writeonly %1) {
%3 = alloca [100 x i8]
%4 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 0
%5 = icmp eq i8** %0, null
br i1 %5, label %12, label %6
6: ; preds = %2
%7 = load i8*, i8** %0
%8 = icmp eq i8* %7, null
br i1 %8, label %12, label %9
9: ; preds = %6
%10 = tail call i64 @strlen(i8* %7)
%11 = icmp sgt i64 %10, 0
br label %12
12: ; preds = %9, %6, %2
%13 = phi i1 [ false, %6 ], [ false, %2 ], [ %11, %9 ]
%14 = tail call i32* @fopen(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%15 = icmp eq i32* %14, null
br i1 %15, label %74, label %16
16: ; preds = %12
%17 = call i32 @feof(i32* %14)
%18 = icmp eq i32 %17, 0
br i1 %18, label %19, label %74
19: ; preds = %16, %33
%20 = call i8* @fgets(i8* %4, i32 100, i32* %14)
%21 = icmp eq i8* %20, null
br i1 %21, label %74, label %22
22: ; preds = %19, %25
%23 = phi i8* [ %26, %25 ], [ %4, %19 ]
%24 = load i8, i8* %23
switch i8 %24, label %25 [
i8 0, label %33
i8 9, label %27
i8 32, label %27
]
25: ; preds = %22
%26 = getelementptr inbounds i8, i8* %23, i64 1
br label %22
27: ; preds = %22, %22
store i8 0, i8* %23
br i1 %13, label %29, label %28
28: ; preds = %29, %27
br label %36
29: ; preds = %27
%30 = load i8*, i8** %0
%31 = call i64 @strcmp(i8* %30, i8* %4)
%32 = icmp eq i64 %31, 0
br i1 %32, label %28, label %33
33: ; preds = %22, %36, %41, %51, %29, %47
%34 = call i32 @feof(i32* %14)
%35 = icmp eq i32 %34, 0
br i1 %35, label %19, label %74
36: ; preds = %40, %28
%37 = phi i8* [ %23, %28 ], [ %38, %40 ]
%38 = getelementptr inbounds i8, i8* %37, i64 1
%39 = load i8, i8* %38
switch i8 %39, label %41 [
i8 9, label %40
i8 32, label %40
i8 0, label %33
]
40: ; preds = %36, %36
br label %36
41: ; preds = %36, %44
%42 = phi i8 [ %46, %44 ], [ %39, %36 ]
%43 = phi i8* [ %45, %44 ], [ %38, %36 ]
switch i8 %42, label %44 [
i8 0, label %33
i8 9, label %47
i8 32, label %47
]
44: ; preds = %41
%45 = getelementptr inbounds i8, i8* %43, i64 1
%46 = load i8, i8* %45
br label %41
47: ; preds = %41, %41
%48 = getelementptr inbounds i8, i8* %43, i64 1
store i8 0, i8* %43
%49 = call i64 @strcmp(i8* %38, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0))
%50 = icmp eq i64 %49, 0
br i1 %50, label %51, label %33
51: ; preds = %47, %54
%52 = phi i8* [ %55, %54 ], [ %48, %47 ]
%53 = load i8, i8* %52
switch i8 %53, label %54 [
i8 0, label %33
i8 9, label %56
i8 32, label %56
]
54: ; preds = %51
%55 = getelementptr inbounds i8, i8* %52, i64 1
br label %51
56: ; preds = %51, %51
store i8 0, i8* %52
%57 = call i32 @strtol(i8* nocapture %48, i32* null, i32 16)
br i1 %5, label %61, label %58
58: ; preds = %56
%59 = call i8* @strdup(i8* %4)
%60 = icmp eq i8* %59, null
br i1 %60, label %74, label %61
61: ; preds = %58, %56
%62 = phi i8* [ %59, %58 ], [ null, %56 ]
%63 = icmp eq i8** %1, null
br i1 %63, label %68, label %64
64: ; preds = %61
%65 = call i8* @inet_ntoa(i32 %57)
%66 = call i8* @strdup(i8* %65)
%67 = icmp eq i8* %66, null
br i1 %67, label %70, label %68
68: ; preds = %64, %61
%69 = phi i8* [ %66, %64 ], [ null, %61 ]
store i8* %62, i8** %0
store i8* %69, i8** %1
br label %74
70: ; preds = %64
%71 = icmp eq i8* %62, null
br i1 %71, label %74, label %72
72: ; preds = %70
%73 = call i32 @free(i8* %62)
br label %74
74: ; preds = %19, %33, %16, %58, %72, %70, %12, %68
%75 = phi i32 [ 0, %68 ], [ -1, %12 ], [ -1, %70 ], [ -1, %72 ], [ -1, %58 ], [ -1, %16 ], [ -1, %33 ], [ -1, %19 ]
ret i32 %75
}