char **buildargv(input)
char *input;
{
  char *arg;
  char *copybuf;
  int squote = 0;
  int dquote = 0;
  int bsquote = 0;
  int argc = 0;
  int maxargc = 0;
  char **argv = 0;
  char **nargv;
  if (input != 0) {
    copybuf = (char *)__builtin_alloca(strlen(input) + 1);
    do {
      while (((*input) == ' ' || (*input) == '\t')) {
        input++;
      }
      if ((maxargc == 0) || (argc >= (maxargc - 1))) {
        if (argv == 0) {
          maxargc = 8;
          nargv = (char **)malloc(maxargc * sizeof(char *));
        } else {
          maxargc *= 2;
          nargv = (char **)realloc(argv, maxargc * sizeof(char *));
        }
        if (nargv == 0) {
          if (argv != 0) {
            freeargv(argv);
            argv = 0;
          }
          break;
        }
        argv = nargv;
        argv[argc] = 0;
      }
      arg = copybuf;
      while (*input != '\0') {
        if (((*input) == ' ' || (*input) == '\t') && !squote && !dquote &&
            !bsquote) {
          break;
        } else {
          if (bsquote) {
            bsquote = 0;
            *arg++ = *input;
          } else if (*input == '\\') {
            bsquote = 1;
          } else if (squote) {
            if (*input == '\'') {
              squote = 0;
            } else {
              *arg++ = *input;
            }
          } else if (dquote) {
            if (*input == '"') {
              dquote = 0;
            } else {
              *arg++ = *input;
            }
          } else {
            if (*input == '\'') {
              squote = 1;
            } else if (*input == '"') {
              dquote = 1;
            } else {
              *arg++ = *input;
            }
          }
          input++;
        }
      }
      *arg = '\0';
      argv[argc] = strdup(copybuf);
      if (argv[argc] == 0) {
        freeargv(argv);
        argv = 0;
        break;
      }
      argc++;
      argv[argc] = 0;
      while (((*input) == ' ' || (*input) == '\t')) {
        input++;
      }
    } while (*input != '\0');
  }
  return (argv);
}


x86 assembly (clang, -O0):
<buildargv>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movq   $0x0,-0x38(%rbp)
cmpq   $0x0,-0x8(%rbp)
je     1509 <buildargv+0x3b9>
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,%rcx
add    $0x10,%rcx
and    $0xfffffffffffffff0,%rcx
mov    %rsp,%rax
sub    %rcx,%rax
mov    %rax,%rsp
mov    %rax,-0x18(%rbp)
jmp    11b8 <buildargv+0x68>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x41(%rbp)
je     11dd <buildargv+0x8d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    11ed <buildargv+0x9d>
jmp    11fe <buildargv+0xae>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11b8 <buildargv+0x68>
cmpl   $0x0,-0x2c(%rbp)
je     1219 <buildargv+0xc9>
mov    -0x28(%rbp),%eax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jl     12a5 <buildargv+0x155>
cmpq   $0x0,-0x38(%rbp)
jne    1241 <buildargv+0xf1>
movl   $0x8,-0x2c(%rbp)
movslq -0x2c(%rbp),%rdi
shl    $0x3,%rdi
call   1050 <malloc@plt>
mov    %rax,-0x40(%rbp)
jmp    125f <buildargv+0x10f>
mov    -0x2c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x38(%rbp),%rdi
movslq -0x2c(%rbp),%rsi
shl    $0x3,%rsi
call   1060 <realloc@plt>
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jne    128d <buildargv+0x13d>
cmpq   $0x0,-0x38(%rbp)
je     1288 <buildargv+0x138>
mov    -0x38(%rbp),%rdi
mov    $0x0,%al
call   1040 <freeargv@plt>
movq   $0x0,-0x38(%rbp)
jmp    1504 <buildargv+0x3b4>
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x28(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1446 <buildargv+0x2f6>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
je     12dd <buildargv+0x18d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
jne    1300 <buildargv+0x1b0>
cmpl   $0x0,-0x1c(%rbp)
jne    1300 <buildargv+0x1b0>
cmpl   $0x0,-0x20(%rbp)
jne    1300 <buildargv+0x1b0>
cmpl   $0x0,-0x24(%rbp)
jne    1300 <buildargv+0x1b0>
jmp    1446 <buildargv+0x2f6>
cmpl   $0x0,-0x24(%rbp)
je     132d <buildargv+0x1dd>
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1435 <buildargv+0x2e5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    1349 <buildargv+0x1f9>
movl   $0x1,-0x24(%rbp)
jmp    1430 <buildargv+0x2e0>
cmpl   $0x0,-0x1c(%rbp)
je     138b <buildargv+0x23b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x27,%eax
jne    136f <buildargv+0x21f>
movl   $0x0,-0x1c(%rbp)
jmp    1386 <buildargv+0x236>
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    142b <buildargv+0x2db>
cmpl   $0x0,-0x20(%rbp)
je     13cd <buildargv+0x27d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
jne    13b1 <buildargv+0x261>
movl   $0x0,-0x20(%rbp)
jmp    13c8 <buildargv+0x278>
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1426 <buildargv+0x2d6>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x27,%eax
jne    13e9 <buildargv+0x299>
movl   $0x1,-0x1c(%rbp)
jmp    1421 <buildargv+0x2d1>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
jne    1405 <buildargv+0x2b5>
movl   $0x1,-0x20(%rbp)
jmp    141c <buildargv+0x2cc>
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1421 <buildargv+0x2d1>
jmp    1426 <buildargv+0x2d6>
jmp    142b <buildargv+0x2db>
jmp    1430 <buildargv+0x2e0>
jmp    1435 <buildargv+0x2e5>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    12ad <buildargv+0x15d>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rdi
call   1070 <strdup@plt>
mov    %rax,%rdx
mov    -0x38(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
movslq -0x28(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    1490 <buildargv+0x340>
mov    -0x38(%rbp),%rdi
mov    $0x0,%al
call   1040 <freeargv@plt>
movq   $0x0,-0x38(%rbp)
jmp    1504 <buildargv+0x3b4>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x28(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x42(%rbp)
je     14ce <buildargv+0x37e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x42(%rbp)
mov    -0x42(%rbp),%al
test   $0x1,%al
jne    14de <buildargv+0x38e>
jmp    14ef <buildargv+0x39f>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    14a9 <buildargv+0x359>
jmp    14f4 <buildargv+0x3a4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11b3 <buildargv+0x63>
jmp    1509 <buildargv+0x3b9>
mov    -0x38(%rbp),%rax
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<buildargv>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
test   %rdi,%rdi
je     1343 <buildargv+0x1f3>
mov    %rdi,%rbx
call   1030 <strlen@plt>
mov    %rsp,%rcx
add    $0x10,%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%rcx
mov    %rcx,-0x40(%rbp)
mov    %rcx,%rsp
xor    %ecx,%ecx
xor    %r14d,%r14d
xor    %r13d,%r13d
xor    %r15d,%r15d
movl   $0x0,-0x2c(%rbp)
xor    %r12d,%r12d
jmp    11a4 <buildargv+0x54>
xchg   %ax,%ax
add    $0x1,%rbx
mov    (%rbx),%al
cmp    $0x20,%al
je     11a0 <buildargv+0x50>
cmp    $0x9,%al
je     11a0 <buildargv+0x50>
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %rcx,-0x38(%rbp)
jae    11c1 <buildargv+0x71>
cltq
cmp    %rax,%rcx
jl     1210 <buildargv+0xc0>
test   %r12,%r12
je     11e7 <buildargv+0x97>
mov    -0x2c(%rbp),%eax
add    %eax,%eax
mov    %eax,-0x2c(%rbp)
movslq %eax,%rsi
shl    $0x3,%rsi
mov    %r12,%rdi
call   1060 <realloc@plt>
test   %rax,%rax
jne    1201 <buildargv+0xb1>
jmp    1339 <buildargv+0x1e9>
mov    $0x40,%edi
call   1050 <malloc@plt>
test   %rax,%rax
je     1343 <buildargv+0x1f3>
movl   $0x8,-0x2c(%rbp)
mov    -0x38(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    %rax,%r12
mov    -0x40(%rbp),%rax
jmp    122d <buildargv+0xdd>
cs nopw 0x0(%rax,%rax,1)
mov    %cl,(%rax)
add    $0x1,%rax
xor    %r15d,%r15d
add    $0x1,%rbx
movzbl (%rbx),%ecx
cmp    $0x20,%cl
je     1250 <buildargv+0x100>
test   %cl,%cl
je     12f6 <buildargv+0x1a6>
cmp    $0x9,%cl
jne    1278 <buildargv+0x128>
test   %r14d,%r14d
je     1270 <buildargv+0x120>
jmp    1278 <buildargv+0x128>
nopl   0x0(%rax)
test   %r14d,%r14d
je     1270 <buildargv+0x120>
test   %r15d,%r15d
jne    1220 <buildargv+0xd0>
mov    %cl,(%rax)
add    $0x1,%rax
xor    %r15d,%r15d
mov    $0x1,%r14d
add    $0x1,%rbx
jmp    122d <buildargv+0xdd>
nop
mov    %r13d,%edx
or     %r15d,%edx
je     12f0 <buildargv+0x1a0>
test   %r15d,%r15d
jne    1220 <buildargv+0xd0>
mov    $0x1,%r15d
cmp    $0x5c,%cl
je     1229 <buildargv+0xd9>
test   %r14d,%r14d
jne    12aa <buildargv+0x15a>
test   %r13d,%r13d
jne    12b8 <buildargv+0x168>
cmp    $0x27,%cl
je     12d1 <buildargv+0x181>
cmp    $0x22,%cl
jne    12df <buildargv+0x18f>
mov    $0x1,%r13d
xor    %r14d,%r14d
jmp    1226 <buildargv+0xd6>
xor    %r14d,%r14d
cmp    $0x27,%cl
je     1226 <buildargv+0xd6>
jmp    125a <buildargv+0x10a>
xor    %r14d,%r14d
cmp    $0x22,%cl
je     12e8 <buildargv+0x198>
mov    %cl,(%rax)
add    $0x1,%rax
mov    $0x1,%r13d
jmp    1226 <buildargv+0xd6>
xor    %r13d,%r13d
mov    $0x1,%r14d
jmp    1226 <buildargv+0xd6>
mov    %cl,(%rax)
add    $0x1,%rax
xor    %r14d,%r14d
xor    %r13d,%r13d
jmp    1226 <buildargv+0xd6>
xor    %r13d,%r13d
xor    %r15d,%r15d
movb   $0x0,(%rax)
mov    -0x40(%rbp),%rdi
call   1070 <strdup@plt>
mov    -0x38(%rbp),%rcx
mov    %rax,(%r12,%rcx,8)
test   %rax,%rax
je     1339 <buildargv+0x1e9>
movq   $0x0,0x8(%r12,%rcx,8)
add    $0x1,%rcx
jmp    1324 <buildargv+0x1d4>
xchg   %ax,%ax
add    $0x1,%rbx
movzbl (%rbx),%eax
cmp    $0x9,%al
je     1320 <buildargv+0x1d0>
cmp    $0x20,%al
je     1320 <buildargv+0x1d0>
test   %al,%al
jne    11a4 <buildargv+0x54>
jmp    1346 <buildargv+0x1f6>
mov    %r12,%rdi
xor    %eax,%eax
call   1040 <freeargv@plt>
xor    %r12d,%r12d
mov    %r12,%rax
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i8** @buildargv(i8* %0) {
%2 = icmp eq i8* %0, null
br i1 %2, label %110, label %3
3: ; preds = %1
%4 = tail call i64 @strlen(i8* %0)
%5 = add i64 %4, 1
%6 = alloca i8, i64 %5
br label %7
7: ; preds = %102, %3
%8 = phi i64 [ 0, %3 ], [ %100, %102 ]
%9 = phi i8* [ %0, %3 ], [ %103, %102 ]
%10 = phi i32 [ 0, %3 ], [ %49, %102 ]
%11 = phi i32 [ 0, %3 ], [ %94, %102 ]
%12 = phi i32 [ 0, %3 ], [ %95, %102 ]
%13 = phi i32 [ 0, %3 ], [ %44, %102 ]
%14 = phi i8** [ null, %3 ], [ %45, %102 ]
br label %15
15: ; preds = %18, %7
%16 = phi i8* [ %9, %7 ], [ %19, %18 ]
%17 = load i8, i8* %16
switch i8 %17, label %20 [
i8 32, label %18
i8 9, label %18
]
18: ; preds = %15, %15
%19 = getelementptr inbounds i8, i8* %16, i64 1
br label %15
20: ; preds = %15
%21 = icmp ne i32 %13, 0
%22 = add nsw i32 %13, -1
%23 = sext i32 %22 to i64
%24 = icmp slt i64 %8, %23
%25 = select i1 %21, i1 %24, i1 false
br i1 %25, label %43, label %26
26: ; preds = %20
%27 = icmp eq i8** %14, null
br i1 %27, label %28, label %31
28: ; preds = %26
%29 = tail call dereferenceable_or_null(64) i8* @malloc(i64 64)
%30 = icmp eq i8* %29, null
br i1 %30, label %110, label %38
31: ; preds = %26
%32 = shl nsw i32 %13, 1
%33 = bitcast i8** %14 to i8*
%34 = sext i32 %32 to i64
%35 = shl nsw i64 %34, 3
%36 = tail call i8* @realloc(i8* %33, i64 %35)
%37 = icmp eq i8* %36, null
br i1 %37, label %107, label %38
38: ; preds = %31, %28
%39 = phi i8* [ %36, %31 ], [ %29, %28 ]
%40 = phi i32 [ %32, %31 ], [ 8, %28 ]
%41 = bitcast i8* %39 to i8**
%42 = getelementptr inbounds i8*, i8** %41, i64 %8
store i8* null, i8** %42
br label %43
43: ; preds = %20, %38
%44 = phi i32 [ %40, %38 ], [ %13, %20 ]
%45 = phi i8** [ %41, %38 ], [ %14, %20 ]
br label %46
46: ; preds = %87, %43
%47 = phi i8* [ %6, %43 ], [ %88, %87 ]
%48 = phi i8* [ %16, %43 ], [ %92, %87 ]
%49 = phi i32 [ %10, %43 ], [ %89, %87 ]
%50 = phi i32 [ %11, %43 ], [ %90, %87 ]
%51 = phi i32 [ %12, %43 ], [ %91, %87 ]
%52 = load i8, i8* %48
switch i8 %52, label %53 [
i8 0, label %93
i8 32, label %57
]
53: ; preds = %46
%54 = icmp ne i8 %52, 9
%55 = icmp ne i32 %49, 0
%56 = select i1 %54, i1 true, i1 %55
br i1 %56, label %63, label %59
57: ; preds = %46
%58 = icmp eq i32 %49, 0
br i1 %58, label %59, label %65
59: ; preds = %53, %57
%60 = icmp ne i32 %50, 0
%61 = icmp ne i32 %51, 0
%62 = select i1 %60, i1 true, i1 %61
br i1 %62, label %63, label %93
63: ; preds = %59, %53
%64 = icmp eq i32 %51, 0
br i1 %64, label %69, label %67
65: ; preds = %57
%66 = icmp eq i32 %51, 0
br i1 %66, label %75, label %67
67: ; preds = %65, %63
%68 = getelementptr inbounds i8, i8* %47, i64 1
store i8 %52, i8* %47
br label %87
69: ; preds = %63
%70 = icmp eq i8 %52, 92
br i1 %70, label %87, label %71
71: ; preds = %69
%72 = icmp eq i32 %49, 0
br i1 %72, label %77, label %73
73: ; preds = %71
%74 = icmp eq i8 %52, 39
br i1 %74, label %87, label %75
75: ; preds = %65, %73
%76 = getelementptr inbounds i8, i8* %47, i64 1
store i8 %52, i8* %47
br label %87
77: ; preds = %71
%78 = icmp eq i32 %50, 0
br i1 %78, label %83, label %79
79: ; preds = %77
%80 = icmp eq i8 %52, 34
br i1 %80, label %87, label %81
81: ; preds = %79
%82 = getelementptr inbounds i8, i8* %47, i64 1
store i8 %52, i8* %47
br label %87
83: ; preds = %77
switch i8 %52, label %85 [
i8 39, label %87
i8 34, label %84
]
84: ; preds = %83
br label %87
85: ; preds = %83
%86 = getelementptr inbounds i8, i8* %47, i64 1
store i8 %52, i8* %47
br label %87
87: ; preds = %83, %79, %73, %69, %81, %84, %85, %75, %67
%88 = phi i8* [ %68, %67 ], [ %76, %75 ], [ %82, %81 ], [ %47, %84 ], [ %86, %85 ], [ %47, %69 ], [ %47, %73 ], [ %47, %79 ], [ %47, %83 ]
%89 = phi i32 [ %49, %67 ], [ 1, %75 ], [ 0, %81 ], [ 0, %84 ], [ 0, %85 ], [ %49, %69 ], [ 0, %73 ], [ 0, %79 ], [ 1, %83 ]
%90 = phi i32 [ %50, %67 ], [ %50, %75 ], [ 1, %81 ], [ 1, %84 ], [ 0, %85 ], [ %50, %69 ], [ %50, %73 ], [ 0, %79 ], [ 0, %83 ]
%91 = phi i32 [ 0, %67 ], [ 0, %75 ], [ 0, %81 ], [ 0, %84 ], [ 0, %85 ], [ 1, %69 ], [ 0, %73 ], [ 0, %79 ], [ 0, %83 ]
%92 = getelementptr inbounds i8, i8* %48, i64 1
br label %46
93: ; preds = %46, %59
%94 = phi i32 [ %50, %46 ], [ 0, %59 ]
%95 = phi i32 [ %51, %46 ], [ 0, %59 ]
store i8 0, i8* %47
%96 = call i8* @strdup(i8* %6)
%97 = getelementptr inbounds i8*, i8** %45, i64 %8
store i8* %96, i8** %97
%98 = icmp eq i8* %96, null
br i1 %98, label %107, label %99
99: ; preds = %93
%100 = add nuw i64 %8, 1
%101 = getelementptr inbounds i8*, i8** %45, i64 %100
store i8* null, i8** %101
br label %102
102: ; preds = %105, %99
%103 = phi i8* [ %48, %99 ], [ %106, %105 ]
%104 = load i8, i8* %103
switch i8 %104, label %7 [
i8 32, label %105
i8 9, label %105
i8 0, label %110
]
105: ; preds = %102, %102
%106 = getelementptr inbounds i8, i8* %103, i64 1
br label %102
107: ; preds = %93, %31
%108 = phi i8** [ %14, %31 ], [ %45, %93 ]
%109 = tail call i32 (i8**, ...) bitcast (i32 (...)* @freeargv to i32 (i8**, ...)*)(i8** %108)
br label %110
110: ; preds = %28, %102, %107, %1
%111 = phi i8** [ null, %1 ], [ null, %107 ], [ %45, %102 ], [ null, %28 ]
ret i8** %111
}