#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 parse_numwords(char **words) {
  int i;
  for (i = 0; i < 20; ++i)
    if (words[i] == NULL)
      return i;
  return 20;
}


x86 assembly (clang, -O0):
<parse_numwords>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x14,-0x14(%rbp)
jge    114a <parse_numwords+0x4a>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    1137 <parse_numwords+0x37>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1151 <parse_numwords+0x51>
jmp    113c <parse_numwords+0x3c>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <parse_numwords+0xf>
movl   $0x14,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_numwords>:
cmpq   $0x0,(%rdi)
je     11e2 <parse_numwords+0xe2>
cmpq   $0x0,0x8(%rdi)
je     11e5 <parse_numwords+0xe5>
cmpq   $0x0,0x10(%rdi)
je     11eb <parse_numwords+0xeb>
cmpq   $0x0,0x18(%rdi)
je     11f1 <parse_numwords+0xf1>
cmpq   $0x0,0x20(%rdi)
je     11f7 <parse_numwords+0xf7>
cmpq   $0x0,0x28(%rdi)
je     11fd <parse_numwords+0xfd>
cmpq   $0x0,0x30(%rdi)
je     1203 <parse_numwords+0x103>
cmpq   $0x0,0x38(%rdi)
je     1209 <parse_numwords+0x109>
cmpq   $0x0,0x40(%rdi)
je     120f <parse_numwords+0x10f>
cmpq   $0x0,0x48(%rdi)
je     1215 <parse_numwords+0x115>
cmpq   $0x0,0x50(%rdi)
je     121b <parse_numwords+0x11b>
cmpq   $0x0,0x58(%rdi)
je     1221 <parse_numwords+0x121>
cmpq   $0x0,0x60(%rdi)
je     1227 <parse_numwords+0x127>
cmpq   $0x0,0x68(%rdi)
je     122d <parse_numwords+0x12d>
cmpq   $0x0,0x70(%rdi)
je     1233 <parse_numwords+0x133>
cmpq   $0x0,0x78(%rdi)
je     1239 <parse_numwords+0x139>
cmpq   $0x0,0x80(%rdi)
je     123f <parse_numwords+0x13f>
cmpq   $0x0,0x88(%rdi)
je     1245 <parse_numwords+0x145>
cmpq   $0x0,0x90(%rdi)
je     124b <parse_numwords+0x14b>
cmpq   $0x1,0x98(%rdi)
01
mov    $0x14,%eax
sbb    $0x0,%eax
ret
xor    %eax,%eax
ret
mov    $0x1,%eax
ret
mov    $0x2,%eax
ret
mov    $0x3,%eax
ret
mov    $0x4,%eax
ret
mov    $0x5,%eax
ret
mov    $0x6,%eax
ret
mov    $0x7,%eax
ret
mov    $0x8,%eax
ret
mov    $0x9,%eax
ret
mov    $0xa,%eax
ret
mov    $0xb,%eax
ret
mov    $0xc,%eax
ret
mov    $0xd,%eax
ret
mov    $0xe,%eax
ret
mov    $0xf,%eax
ret
mov    $0x10,%eax
ret
mov    $0x11,%eax
ret
mov    $0x12,%eax
ret

LLVM IR (-O0):
define i32 @parse_numwords(i8** %0) {
%2 = alloca i32
%3 = alloca i8**
%4 = alloca i32
store i8** %0, i8*** %3
store i32 0, i32* %4
br label %5
5: ; preds = %18, %1
%6 = load i32, i32* %4
%7 = icmp slt i32 %6, 20
br i1 %7, label %8, label %21
8: ; preds = %5
%9 = load i8**, i8*** %3
%10 = load i32, i32* %4
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds i8*, i8** %9, i64 %11
%13 = load i8*, i8** %12
%14 = icmp eq i8* %13, null
br i1 %14, label %15, label %17
15: ; preds = %8
%16 = load i32, i32* %4
store i32 %16, i32* %2
br label %22
17: ; preds = %8
br label %18
18: ; preds = %17
%19 = load i32, i32* %4
%20 = add nsw i32 %19, 1
store i32 %20, i32* %4
br label %5
21: ; preds = %5
store i32 20, i32* %2
br label %22
22: ; preds = %21, %15
%23 = load i32, i32* %2
ret i32 %23
}

LLVM IR (-O2):
define i32 @parse_numwords(i8** nocapture %0) {
%2 = load i8*, i8** %0
%3 = icmp eq i8* %2, null
br i1 %3, label %81, label %4
4: ; preds = %1
%5 = getelementptr inbounds i8*, i8** %0, i64 1
%6 = load i8*, i8** %5
%7 = icmp eq i8* %6, null
br i1 %7, label %81, label %8
8: ; preds = %4
%9 = getelementptr inbounds i8*, i8** %0, i64 2
%10 = load i8*, i8** %9
%11 = icmp eq i8* %10, null
br i1 %11, label %81, label %12
12: ; preds = %8
%13 = getelementptr inbounds i8*, i8** %0, i64 3
%14 = load i8*, i8** %13
%15 = icmp eq i8* %14, null
br i1 %15, label %81, label %16
16: ; preds = %12
%17 = getelementptr inbounds i8*, i8** %0, i64 4
%18 = load i8*, i8** %17
%19 = icmp eq i8* %18, null
br i1 %19, label %81, label %20
20: ; preds = %16
%21 = getelementptr inbounds i8*, i8** %0, i64 5
%22 = load i8*, i8** %21
%23 = icmp eq i8* %22, null
br i1 %23, label %81, label %24
24: ; preds = %20
%25 = getelementptr inbounds i8*, i8** %0, i64 6
%26 = load i8*, i8** %25
%27 = icmp eq i8* %26, null
br i1 %27, label %81, label %28
28: ; preds = %24
%29 = getelementptr inbounds i8*, i8** %0, i64 7
%30 = load i8*, i8** %29
%31 = icmp eq i8* %30, null
br i1 %31, label %81, label %32
32: ; preds = %28
%33 = getelementptr inbounds i8*, i8** %0, i64 8
%34 = load i8*, i8** %33
%35 = icmp eq i8* %34, null
br i1 %35, label %81, label %36
36: ; preds = %32
%37 = getelementptr inbounds i8*, i8** %0, i64 9
%38 = load i8*, i8** %37
%39 = icmp eq i8* %38, null
br i1 %39, label %81, label %40
40: ; preds = %36
%41 = getelementptr inbounds i8*, i8** %0, i64 10
%42 = load i8*, i8** %41
%43 = icmp eq i8* %42, null
br i1 %43, label %81, label %44
44: ; preds = %40
%45 = getelementptr inbounds i8*, i8** %0, i64 11
%46 = load i8*, i8** %45
%47 = icmp eq i8* %46, null
br i1 %47, label %81, label %48
48: ; preds = %44
%49 = getelementptr inbounds i8*, i8** %0, i64 12
%50 = load i8*, i8** %49
%51 = icmp eq i8* %50, null
br i1 %51, label %81, label %52
52: ; preds = %48
%53 = getelementptr inbounds i8*, i8** %0, i64 13
%54 = load i8*, i8** %53
%55 = icmp eq i8* %54, null
br i1 %55, label %81, label %56
56: ; preds = %52
%57 = getelementptr inbounds i8*, i8** %0, i64 14
%58 = load i8*, i8** %57
%59 = icmp eq i8* %58, null
br i1 %59, label %81, label %60
60: ; preds = %56
%61 = getelementptr inbounds i8*, i8** %0, i64 15
%62 = load i8*, i8** %61
%63 = icmp eq i8* %62, null
br i1 %63, label %81, label %64
64: ; preds = %60
%65 = getelementptr inbounds i8*, i8** %0, i64 16
%66 = load i8*, i8** %65
%67 = icmp eq i8* %66, null
br i1 %67, label %81, label %68
68: ; preds = %64
%69 = getelementptr inbounds i8*, i8** %0, i64 17
%70 = load i8*, i8** %69
%71 = icmp eq i8* %70, null
br i1 %71, label %81, label %72
72: ; preds = %68
%73 = getelementptr inbounds i8*, i8** %0, i64 18
%74 = load i8*, i8** %73
%75 = icmp eq i8* %74, null
br i1 %75, label %81, label %76
76: ; preds = %72
%77 = getelementptr inbounds i8*, i8** %0, i64 19
%78 = load i8*, i8** %77
%79 = icmp eq i8* %78, null
%80 = select i1 %79, i32 19, i32 20
br label %81
81: ; preds = %76, %72, %68, %64, %60, %56, %52, %48, %44, %40, %36, %32, %28, %24, %20, %16, %12, %8, %4, %1
%82 = phi i32 [ 0, %1 ], [ 1, %4 ], [ 2, %8 ], [ 3, %12 ], [ 4, %16 ], [ 5, %20 ], [ 6, %24 ], [ 7, %28 ], [ 8, %32 ], [ 9, %36 ], [ 10, %40 ], [ 11, %44 ], [ 12, %48 ], [ 13, %52 ], [ 14, %56 ], [ 15, %60 ], [ 16, %64 ], [ 17, %68 ], [ 18, %72 ], [ %80, %76 ]
ret i32 %82
}