#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 */
scalar_t__ GPSChecksumOK(unsigned char *, int);
int /*<<< orphan*/ ProcessGPGGACommand(unsigned char *, int);
int /*<<< orphan*/ ProcessGPRMCCommand(unsigned char *, int);
int /*<<< orphan*/ printf(char *, ...);
void ProcessLine(int fd, unsigned char *Buffer, int Count) {
  if (GPSChecksumOK(Buffer, Count)) {
    if ((Buffer[1] == 'G') && (Buffer[2] == 'P') && (Buffer[3] == 'R') &&
        (Buffer[4] == 'M') && (Buffer[5] == 'C')) {
      ProcessGPRMCCommand(Buffer, Count);
      printf("%s", Buffer);
    } else if ((Buffer[1] == 'G') && (Buffer[2] == 'P') && (Buffer[3] == 'G') &&
               (Buffer[4] == 'G') && (Buffer[5] == 'A')) {
      ProcessGPGGACommand(Buffer, Count);
      printf("%s", Buffer);
    } else if ((Buffer[1] == 'G') && (Buffer[2] == 'P') && (Buffer[3] == 'G') &&
               (Buffer[4] == 'S') && (Buffer[5] == 'V')) {
    } else if ((Buffer[1] == 'G') && (Buffer[2] == 'P') && (Buffer[3] == 'G') &&
               (Buffer[4] == 'L') && (Buffer[5] == 'L')) {
    } else if ((Buffer[1] == 'G') && (Buffer[2] == 'P') && (Buffer[3] == 'G') &&
               (Buffer[4] == 'S') && (Buffer[5] == 'A')) {
    } else if ((Buffer[1] == 'G') && (Buffer[2] == 'P') && (Buffer[3] == 'V') &&
               (Buffer[4] == 'T') && (Buffer[5] == 'G')) {
    } else {
      printf("Unknown NMEA sentence %c%c%c%c%c\r\n", Buffer[1], Buffer[2],
             Buffer[3], Buffer[4], Buffer[5]);
    }
  } else {
    printf("Bad checksum\r\n");
  }
}


x86 assembly (clang, -O0):
<ProcessLine>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1060 <GPSChecksumOK@plt>
cmp    $0x0,%rax
je     1416 <ProcessLine+0x2d6>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x47,%eax
jne    11e0 <ProcessLine+0xa0>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x50,%eax
jne    11e0 <ProcessLine+0xa0>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x52,%eax
jne    11e0 <ProcessLine+0xa0>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x4d,%eax
jne    11e0 <ProcessLine+0xa0>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x43,%eax
jne    11e0 <ProcessLine+0xa0>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1040 <ProcessGPRMCCommand@plt>
mov    -0x10(%rbp),%rsi
lea    0xe2c(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    1411 <ProcessLine+0x2d1>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x47,%eax
jne    1258 <ProcessLine+0x118>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x50,%eax
jne    1258 <ProcessLine+0x118>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x47,%eax
jne    1258 <ProcessLine+0x118>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x47,%eax
jne    1258 <ProcessLine+0x118>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x41,%eax
jne    1258 <ProcessLine+0x118>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1050 <ProcessGPGGACommand@plt>
mov    -0x10(%rbp),%rsi
lea    0xdb4(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    140c <ProcessLine+0x2cc>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x47,%eax
jne    12b2 <ProcessLine+0x172>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x50,%eax
jne    12b2 <ProcessLine+0x172>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x47,%eax
jne    12b2 <ProcessLine+0x172>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x53,%eax
jne    12b2 <ProcessLine+0x172>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x56,%eax
jne    12b2 <ProcessLine+0x172>
jmp    1407 <ProcessLine+0x2c7>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x47,%eax
jne    130c <ProcessLine+0x1cc>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x50,%eax
jne    130c <ProcessLine+0x1cc>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x47,%eax
jne    130c <ProcessLine+0x1cc>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x4c,%eax
jne    130c <ProcessLine+0x1cc>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x4c,%eax
jne    130c <ProcessLine+0x1cc>
jmp    1402 <ProcessLine+0x2c2>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x47,%eax
jne    1366 <ProcessLine+0x226>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x50,%eax
jne    1366 <ProcessLine+0x226>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x47,%eax
jne    1366 <ProcessLine+0x226>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x53,%eax
jne    1366 <ProcessLine+0x226>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x41,%eax
jne    1366 <ProcessLine+0x226>
jmp    13fd <ProcessLine+0x2bd>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x47,%eax
jne    13c0 <ProcessLine+0x280>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x50,%eax
jne    13c0 <ProcessLine+0x280>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x56,%eax
jne    13c0 <ProcessLine+0x280>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x54,%eax
jne    13c0 <ProcessLine+0x280>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x47,%eax
jne    13c0 <ProcessLine+0x280>
jmp    13f8 <ProcessLine+0x2b8>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%esi
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%edx
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%ecx
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%r8d
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%r9d
lea    0xc12(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    13fd <ProcessLine+0x2bd>
jmp    1402 <ProcessLine+0x2c2>
jmp    1407 <ProcessLine+0x2c7>
jmp    140c <ProcessLine+0x2cc>
jmp    1411 <ProcessLine+0x2d1>
jmp    1424 <ProcessLine+0x2e4>
lea    0xc09(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ProcessLine>:
push   %rbp
push   %rbx
push   %rax
mov    %edx,%ebp
mov    %rsi,%rbx
mov    %rsi,%rdi
mov    %edx,%esi
call   1070 <GPSChecksumOK@plt>
test   %rax,%rax
je     119d <ProcessLine+0x4d>
movzbl 0x1(%rbx),%esi
mov    0x2(%rbx),%al
cmp    $0x47,%esi
jne    1233 <ProcessLine+0xe3>
cmp    $0x50,%al
jne    1233 <ProcessLine+0xe3>
cmpb   $0x52,0x3(%rbx)
jne    11af <ProcessLine+0x5f>
cmpb   $0x4d,0x4(%rbx)
jne    11af <ProcessLine+0x5f>
cmpb   $0x43,0x5(%rbx)
jne    11af <ProcessLine+0x5f>
mov    %rbx,%rdi
mov    %ebp,%esi
call   1050 <ProcessGPRMCCommand@plt>
jmp    11cb <ProcessLine+0x7b>
lea    0xe82(%rip),%rdi
add    $0x8,%rsp
pop    %rbx
pop    %rbp
jmp    1030 <puts@plt>
cmpb   $0x47,0x3(%rbx)
jne    11e2 <ProcessLine+0x92>
cmpb   $0x47,0x4(%rbx)
jne    11e2 <ProcessLine+0x92>
cmpb   $0x41,0x5(%rbx)
jne    11e2 <ProcessLine+0x92>
mov    %rbx,%rdi
mov    %ebp,%esi
call   1060 <ProcessGPGGACommand@plt>
lea    0xe2e(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
jmp    1040 <printf@plt>
cmpb   $0x47,0x3(%rbx)
jne    11f4 <ProcessLine+0xa4>
cmpb   $0x53,0x4(%rbx)
jne    11f4 <ProcessLine+0xa4>
cmpb   $0x56,0x5(%rbx)
je     122c <ProcessLine+0xdc>
cmpb   $0x47,0x3(%rbx)
jne    1206 <ProcessLine+0xb6>
cmpb   $0x4c,0x4(%rbx)
jne    1206 <ProcessLine+0xb6>
cmpb   $0x4c,0x5(%rbx)
je     122c <ProcessLine+0xdc>
cmpb   $0x47,0x3(%rbx)
jne    1218 <ProcessLine+0xc8>
cmpb   $0x53,0x4(%rbx)
jne    1218 <ProcessLine+0xc8>
cmpb   $0x41,0x5(%rbx)
je     122c <ProcessLine+0xdc>
mov    $0x50,%al
cmpb   $0x56,0x3(%rbx)
jne    1233 <ProcessLine+0xe3>
cmpb   $0x54,0x4(%rbx)
jne    1233 <ProcessLine+0xe3>
cmpb   $0x47,0x5(%rbx)
jne    1233 <ProcessLine+0xe3>
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret
movzbl %al,%edx
movzbl 0x3(%rbx),%ecx
movzbl 0x4(%rbx),%r8d
movzbl 0x5(%rbx),%r9d
lea    0xdb8(%rip),%rdi
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
jmp    1040 <printf@plt>

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

LLVM IR (-O2):
@.str = [3 x i8] c"%s\00"
@.str.1 = [35 x i8] c"Unknown NMEA sentence %c%c%c%c%c\0D\0A\00"
@str = [14 x i8] c"Bad checksum\0D\00"
define void @ProcessLine(i32 %0, i8* %1, i32 %2) {
%4 = tail call i64 @GPSChecksumOK(i8* %1, i32 %2)
%5 = icmp eq i64 %4, 0
br i1 %5, label %106, label %6
6: ; preds = %3
%7 = getelementptr inbounds i8, i8* %1, i64 1
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 71
%10 = getelementptr inbounds i8, i8* %1, i64 2
%11 = load i8, i8* %10
%12 = icmp eq i8 %11, 80
%13 = select i1 %9, i1 %12, i1 false
br i1 %13, label %14, label %92
14: ; preds = %6
%15 = getelementptr inbounds i8, i8* %1, i64 3
%16 = load i8, i8* %15
%17 = icmp eq i8 %16, 82
br i1 %17, label %18, label %29
18: ; preds = %14
%19 = getelementptr inbounds i8, i8* %1, i64 4
%20 = load i8, i8* %19
%21 = icmp eq i8 %20, 77
br i1 %21, label %22, label %29
22: ; preds = %18
%23 = getelementptr inbounds i8, i8* %1, i64 5
%24 = load i8, i8* %23
%25 = icmp eq i8 %24, 67
br i1 %25, label %26, label %29
26: ; preds = %22
%27 = tail call i32 @ProcessGPRMCCommand(i8* %1, i32 %2)
%28 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %108
29: ; preds = %22, %18, %14
%30 = getelementptr inbounds i8, i8* %1, i64 3
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 71
br i1 %32, label %33, label %44
33: ; preds = %29
%34 = getelementptr inbounds i8, i8* %1, i64 4
%35 = load i8, i8* %34
%36 = icmp eq i8 %35, 71
br i1 %36, label %37, label %44
37: ; preds = %33
%38 = getelementptr inbounds i8, i8* %1, i64 5
%39 = load i8, i8* %38
%40 = icmp eq i8 %39, 65
br i1 %40, label %41, label %44
41: ; preds = %37
%42 = tail call i32 @ProcessGPGGACommand(i8* %1, i32 %2)
%43 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %108
44: ; preds = %37, %33, %29
%45 = getelementptr inbounds i8, i8* %1, i64 3
%46 = load i8, i8* %45
%47 = icmp eq i8 %46, 71
br i1 %47, label %48, label %56
48: ; preds = %44
%49 = getelementptr inbounds i8, i8* %1, i64 4
%50 = load i8, i8* %49
%51 = icmp eq i8 %50, 83
br i1 %51, label %52, label %56
52: ; preds = %48
%53 = getelementptr inbounds i8, i8* %1, i64 5
%54 = load i8, i8* %53
%55 = icmp eq i8 %54, 86
br i1 %55, label %108, label %56
56: ; preds = %52, %48, %44
%57 = getelementptr inbounds i8, i8* %1, i64 3
%58 = load i8, i8* %57
%59 = icmp eq i8 %58, 71
br i1 %59, label %60, label %68
60: ; preds = %56
%61 = getelementptr inbounds i8, i8* %1, i64 4
%62 = load i8, i8* %61
%63 = icmp eq i8 %62, 76
br i1 %63, label %64, label %68
64: ; preds = %60
%65 = getelementptr inbounds i8, i8* %1, i64 5
%66 = load i8, i8* %65
%67 = icmp eq i8 %66, 76
br i1 %67, label %108, label %68
68: ; preds = %64, %60, %56
%69 = getelementptr inbounds i8, i8* %1, i64 3
%70 = load i8, i8* %69
%71 = icmp eq i8 %70, 71
br i1 %71, label %72, label %80
72: ; preds = %68
%73 = getelementptr inbounds i8, i8* %1, i64 4
%74 = load i8, i8* %73
%75 = icmp eq i8 %74, 83
br i1 %75, label %76, label %80
76: ; preds = %72
%77 = getelementptr inbounds i8, i8* %1, i64 5
%78 = load i8, i8* %77
%79 = icmp eq i8 %78, 65
br i1 %79, label %108, label %80
80: ; preds = %76, %72, %68
%81 = getelementptr inbounds i8, i8* %1, i64 3
%82 = load i8, i8* %81
%83 = icmp eq i8 %82, 86
br i1 %83, label %84, label %92
84: ; preds = %80
%85 = getelementptr inbounds i8, i8* %1, i64 4
%86 = load i8, i8* %85
%87 = icmp eq i8 %86, 84
br i1 %87, label %88, label %92
88: ; preds = %84
%89 = getelementptr inbounds i8, i8* %1, i64 5
%90 = load i8, i8* %89
%91 = icmp eq i8 %90, 71
br i1 %91, label %108, label %92
92: ; preds = %6, %88, %84, %80
%93 = phi i8 [ 80, %88 ], [ 80, %84 ], [ 80, %80 ], [ %11, %6 ]
%94 = zext i8 %8 to i32
%95 = zext i8 %93 to i32
%96 = getelementptr inbounds i8, i8* %1, i64 3
%97 = load i8, i8* %96
%98 = zext i8 %97 to i32
%99 = getelementptr inbounds i8, i8* %1, i64 4
%100 = load i8, i8* %99
%101 = zext i8 %100 to i32
%102 = getelementptr inbounds i8, i8* %1, i64 5
%103 = load i8, i8* %102
%104 = zext i8 %103 to i32
%105 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([35 x i8], [35 x i8]* @.str.1, i64 0, i64 0), i32 %94, i32 %95, i32 %98, i32 %101, i32 %104)
br label %108
106: ; preds = %3
%107 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @str, i64 0, i64 0))
br label %108
108: ; preds = %26, %52, %76, %88, %92, %64, %41, %106
ret void
}