#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 zint_symbol {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ bin_append(unsigned char, int, char *);
int /*<<< orphan*/ rs_encode(int, unsigned char *, unsigned char *);
int /*<<< orphan*/ rs_free();
int /*<<< orphan*/ rs_init_code(int, int /*<<< orphan*/);
int /*<<< orphan*/ rs_init_gf(int);
int /*<<< orphan*/ strcat(char *, char *);
int strlen(char *);
void micro_qr_m1(struct zint_symbol *symbol, char binary_data[]) {
  int i, j, latch;
  int bits_total, bits_left;
  int data_codewords, ecc_codewords;
  unsigned char data_blocks[4], ecc_blocks[3];
  bits_total = 20;
  latch = 0;
  bits_left = bits_total - (int)strlen(binary_data);
  if (bits_left <= 3) {
    for (i = 0; i < bits_left; i++) {
      strcat(binary_data, "0");
    }
    latch = 1;
  } else {
    strcat(binary_data, "000");
  }
  if (latch == 0) {
    bits_left = bits_total - (int)strlen(binary_data);
    if (bits_left <= 4) {
      for (i = 0; i < bits_left; i++) {
        strcat(binary_data, "0");
      }
      latch = 1;
    }
  }
  if (latch == 0) {
    int remainder = 8 - (strlen(binary_data) % 8);
    if (remainder == 8) {
      remainder = 0;
    }
    for (i = 0; i < remainder; i++) {
      strcat(binary_data, "0");
    }
    bits_left = bits_total - (int)strlen(binary_data);
    if (bits_left > 4) {
      remainder = (bits_left - 4) / 8;
      for (i = 0; i < remainder; i++) {
        strcat(binary_data, (i & 1) ? "00010001" : "11101100");
      }
    }
    bin_append(0, 4, binary_data);
  }
  data_codewords = 3;
  ecc_codewords = 2;
  for (i = 0; i < (data_codewords - 1); i++) {
    data_blocks[i] = 0;
    for (j = 0; j < 8; j++) {
      if (binary_data[(i * 8) + j] == '1') {
        data_blocks[i] += 0x80 >> j;
      }
    }
  }
  data_blocks[2] = 0;
  for (j = 0; j < 4; j++) {
    if (binary_data[16 + j] == '1') {
      data_blocks[2] += 0x80 >> j;
    }
  }
  (void)symbol;
  rs_init_gf(0x11d);
  rs_init_code(ecc_codewords, 0);
  rs_encode(data_codewords, data_blocks, ecc_blocks);
  rs_free();
  for (i = 0; i < ecc_codewords; i++) {
    bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
  }
}


x86 assembly (clang, -O0):
<micro_qr_m1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x14,-0x20(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jg     11ee <micro_qr_m1+0x7e>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    11e2 <micro_qr_m1+0x72>
mov    -0x10(%rbp),%rdi
lea    0xe33(%rip),%rsi
call   1090 <strcat@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11b8 <micro_qr_m1+0x48>
movl   $0x1,-0x1c(%rbp)
jmp    11fe <micro_qr_m1+0x8e>
mov    -0x10(%rbp),%rdi
lea    0xe07(%rip),%rsi
call   1090 <strcat@plt>
cmpl   $0x0,-0x1c(%rbp)
jne    1268 <micro_qr_m1+0xf8>
mov    -0x20(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x40(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x4,-0x24(%rbp)
jg     1263 <micro_qr_m1+0xf3>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    125c <micro_qr_m1+0xec>
mov    -0x10(%rbp),%rdi
lea    0xdb9(%rip),%rsi
call   1090 <strcat@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1232 <micro_qr_m1+0xc2>
movl   $0x1,-0x1c(%rbp)
jmp    1268 <micro_qr_m1+0xf8>
cmpl   $0x0,-0x1c(%rbp)
jne    135d <micro_qr_m1+0x1ed>
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    $0x8,%eax
sub    %edx,%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x8,-0x38(%rbp)
jne    129e <micro_qr_m1+0x12e>
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    12cf <micro_qr_m1+0x15f>
mov    -0x10(%rbp),%rdi
lea    0xd46(%rip),%rsi
call   1090 <strcat@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12a5 <micro_qr_m1+0x135>
mov    -0x20(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x44(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x4,-0x24(%rbp)
jle    134d <micro_qr_m1+0x1dd>
mov    -0x24(%rbp),%eax
sub    $0x4,%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    1348 <micro_qr_m1+0x1d8>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%ecx
and    $0x1,%ecx
lea    0xce6(%rip),%rsi
lea    0xcd6(%rip),%rax
cmp    $0x0,%ecx
cmovne %rax,%rsi
call   1090 <strcat@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    130a <micro_qr_m1+0x19a>
jmp    134d <micro_qr_m1+0x1dd>
mov    -0x10(%rbp),%rdx
xor    %edi,%edi
mov    $0x4,%esi
call   1060 <bin_append@plt>
movl   $0x3,-0x28(%rbp)
movl   $0x2,-0x2c(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    13f9 <micro_qr_m1+0x289>
movslq -0x14(%rbp),%rax
movb   $0x0,-0x30(%rbp,%rax,1)
movl   $0x0,-0x18(%rbp)
cmpl   $0x8,-0x18(%rbp)
jge    13e6 <micro_qr_m1+0x276>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x3,%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    13d3 <micro_qr_m1+0x263>
mov    -0x18(%rbp),%ecx
mov    $0x80,%edx
sar    %cl,%edx
movslq -0x14(%rbp),%rax
movzbl -0x30(%rbp,%rax,1),%ecx
add    %edx,%ecx
mov    %cl,-0x30(%rbp,%rax,1)
jmp    13d8 <micro_qr_m1+0x268>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1393 <micro_qr_m1+0x223>
jmp    13eb <micro_qr_m1+0x27b>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1372 <micro_qr_m1+0x202>
movb   $0x0,-0x2e(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x4,-0x18(%rbp)
jge    1450 <micro_qr_m1+0x2e0>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x10,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    143d <micro_qr_m1+0x2cd>
mov    -0x18(%rbp),%ecx
mov    $0x80,%eax
sar    %cl,%eax
mov    %eax,%ecx
movzbl -0x2e(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x2e(%rbp)
jmp    1442 <micro_qr_m1+0x2d2>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1404 <micro_qr_m1+0x294>
mov    $0x11d,%edi
call   1080 <rs_init_gf@plt>
mov    -0x2c(%rbp),%edi
xor    %esi,%esi
call   1070 <rs_init_code@plt>
mov    -0x28(%rbp),%edi
lea    -0x30(%rbp),%rsi
lea    -0x33(%rbp),%rdx
call   1050 <rs_encode@plt>
mov    $0x0,%al
call   1030 <rs_free@plt>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    14bc <micro_qr_m1+0x34c>
mov    -0x2c(%rbp),%eax
sub    -0x14(%rbp),%eax
sub    $0x1,%eax
cltq
mov    -0x33(%rbp,%rax,1),%al
mov    -0x10(%rbp),%rdx
mov    $0x8,%esi
movzbl %al,%edi
call   1060 <bin_append@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1482 <micro_qr_m1+0x312>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<micro_qr_m1>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%r14
mov    %rsi,%rdi
call   1040 <strlen@plt>
mov    $0x14,%ebx
cmp    $0x11,%eax
jl     11c5 <micro_qr_m1+0x55>
cmp    $0x13,%eax
ja     12b9 <micro_qr_m1+0x149>
sub    %eax,%ebx
cmp    $0x2,%ebx
mov    $0x1,%ebp
cmovge %ebx,%ebp
lea    0xe54(%rip),%rbx
xchg   %ax,%ax
mov    %r14,%rdi
mov    %rbx,%rsi
call   1090 <strcat@plt>
add    $0xffffffff,%ebp
jne    11b0 <micro_qr_m1+0x40>
jmp    12b9 <micro_qr_m1+0x149>
lea    0xe34(%rip),%rsi
mov    %r14,%rdi
call   1090 <strcat@plt>
mov    %r14,%rdi
call   1040 <strlen@plt>
cmp    $0x10,%eax
jl     1215 <micro_qr_m1+0xa5>
cmp    $0x13,%eax
ja     12b9 <micro_qr_m1+0x149>
sub    %eax,%ebx
cmp    $0x2,%ebx
mov    $0x1,%ebp
cmovge %ebx,%ebp
lea    0xe04(%rip),%rbx
xchg   %ax,%ax
mov    %r14,%rdi
mov    %rbx,%rsi
call   1090 <strcat@plt>
add    $0xffffffff,%ebp
jne    1200 <micro_qr_m1+0x90>
jmp    12b9 <micro_qr_m1+0x149>
mov    %r14,%rdi
call   1040 <strlen@plt>
mov    %eax,%ebx
lea    0x7(%rbx),%eax
test   %ebx,%ebx
cmovns %ebx,%eax
and    $0xfffffff8,%eax
sub    %eax,%ebx
je     124f <micro_qr_m1+0xdf>
add    $0xfffffff8,%ebx
lea    0xdca(%rip),%r15
nopl   0x0(%rax,%rax,1)
mov    %r14,%rdi
mov    %r15,%rsi
call   1090 <strcat@plt>
inc    %ebx
jne    1240 <micro_qr_m1+0xd0>
mov    %r14,%rdi
call   1040 <strlen@plt>
cmp    $0xf,%eax
jg     12aa <micro_qr_m1+0x13a>
mov    $0x10,%ecx
sub    %eax,%ecx
mov    $0x17,%ebx
sub    %eax,%ebx
test   %ecx,%ecx
cmovns %ecx,%ebx
cmp    $0x8,%ecx
jl     12aa <micro_qr_m1+0x13a>
sar    $0x3,%ebx
xor    %ebp,%ebp
lea    0xd8d(%rip),%r15
lea    0xd7d(%rip),%r12
nopw   0x0(%rax,%rax,1)
test   $0x1,%bpl
mov    %r12,%rsi
cmove  %r15,%rsi
mov    %r14,%rdi
call   1090 <strcat@plt>
add    $0x1,%ebp
cmp    %ebp,%ebx
jne    1290 <micro_qr_m1+0x120>
xor    %edi,%edi
mov    $0x4,%esi
mov    %r14,%rdx
call   1060 <bin_append@plt>
movb   $0x0,0x9(%rsp)
cmpb   $0x31,(%r14)
sete   %al
shl    $0x7,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x1(%r14)
je     1416 <micro_qr_m1+0x2a6>
cmpb   $0x31,0x2(%r14)
je     1427 <micro_qr_m1+0x2b7>
cmpb   $0x31,0x3(%r14)
je     1438 <micro_qr_m1+0x2c8>
cmpb   $0x31,0x4(%r14)
je     1449 <micro_qr_m1+0x2d9>
cmpb   $0x31,0x5(%r14)
je     145a <micro_qr_m1+0x2ea>
cmpb   $0x31,0x6(%r14)
je     146b <micro_qr_m1+0x2fb>
cmpb   $0x31,0x7(%r14)
jne    131b <micro_qr_m1+0x1ab>
add    $0x1,%al
mov    %al,0x9(%rsp)
movb   $0x0,0xa(%rsp)
cmpb   $0x31,0x8(%r14)
sete   %al
shl    $0x7,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0x9(%r14)
je     1481 <micro_qr_m1+0x311>
cmpb   $0x31,0xa(%r14)
je     1492 <micro_qr_m1+0x322>
cmpb   $0x31,0xb(%r14)
je     14a3 <micro_qr_m1+0x333>
cmpb   $0x31,0xc(%r14)
je     14b4 <micro_qr_m1+0x344>
cmpb   $0x31,0xd(%r14)
je     14c5 <micro_qr_m1+0x355>
cmpb   $0x31,0xe(%r14)
je     14d6 <micro_qr_m1+0x366>
cmpb   $0x31,0xf(%r14)
jne    137e <micro_qr_m1+0x20e>
add    $0x1,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0x10(%r14)
sete   %al
shl    $0x7,%al
cmpb   $0x31,0x11(%r14)
sete   %cl
shl    $0x6,%cl
or     %al,%cl
cmpb   $0x31,0x12(%r14)
sete   %al
shl    $0x5,%al
or     %cl,%al
cmpb   $0x31,0x13(%r14)
sete   %cl
shl    $0x4,%cl
or     %al,%cl
mov    %cl,0xb(%rsp)
mov    $0x11d,%edi
call   1080 <rs_init_gf@plt>
mov    $0x2,%edi
xor    %esi,%esi
call   1070 <rs_init_code@plt>
lea    0x9(%rsp),%rsi
lea    0xd(%rsp),%rdx
mov    $0x3,%edi
call   1050 <rs_encode@plt>
xor    %eax,%eax
call   1030 <rs_free@plt>
movzbl 0xe(%rsp),%edi
mov    $0x8,%esi
mov    %r14,%rdx
call   1060 <bin_append@plt>
movzbl 0xd(%rsp),%edi
mov    $0x8,%esi
mov    %r14,%rdx
call   1060 <bin_append@plt>
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
or     $0x40,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x2(%r14)
jne    12e2 <micro_qr_m1+0x172>
add    $0x20,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x3(%r14)
jne    12ed <micro_qr_m1+0x17d>
add    $0x10,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x4(%r14)
jne    12f8 <micro_qr_m1+0x188>
add    $0x8,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x5(%r14)
jne    1303 <micro_qr_m1+0x193>
add    $0x4,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x6(%r14)
jne    130e <micro_qr_m1+0x19e>
add    $0x2,%al
mov    %al,0x9(%rsp)
cmpb   $0x31,0x7(%r14)
je     1315 <micro_qr_m1+0x1a5>
jmp    131b <micro_qr_m1+0x1ab>
or     $0x40,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0xa(%r14)
jne    1345 <micro_qr_m1+0x1d5>
add    $0x20,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0xb(%r14)
jne    1350 <micro_qr_m1+0x1e0>
add    $0x10,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0xc(%r14)
jne    135b <micro_qr_m1+0x1eb>
add    $0x8,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0xd(%r14)
jne    1366 <micro_qr_m1+0x1f6>
add    $0x4,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0xe(%r14)
jne    1371 <micro_qr_m1+0x201>
add    $0x2,%al
mov    %al,0xa(%rsp)
cmpb   $0x31,0xf(%r14)
je     1378 <micro_qr_m1+0x208>
jmp    137e <micro_qr_m1+0x20e>

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

LLVM IR (-O2):
%struct.zint_symbol = type { i32 }
@.str = [2 x i8] c"0\00"
@.str.1 = [4 x i8] c"000\00"
@.str.2 = [9 x i8] c"00010001\00"
@.str.3 = [9 x i8] c"11101100\00"
define void @micro_qr_m1(%struct.zint_symbol* nocapture readnone %0, i8* %1) {
%3 = alloca [4 x i8]
%4 = alloca [3 x i8]
%5 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
%6 = getelementptr inbounds [3 x i8], [3 x i8]* %4, i64 0, i64 0
%7 = tail call i32 @strlen(i8* %1)
%8 = sub i32 20, %7
%9 = icmp sgt i32 %7, 16
br i1 %9, label %10, label %19
10: ; preds = %2
%11 = icmp ult i32 %7, 20
br i1 %11, label %12, label %60
12: ; preds = %10
%13 = call i32 @llvm.smax.i32(i32 %8, i32 1)
br label %14
14: ; preds = %12, %14
%15 = phi i32 [ %17, %14 ], [ 0, %12 ]
%16 = tail call i32 @strcat(i8* %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%17 = add nuw nsw i32 %15, 1
%18 = icmp eq i32 %17, %13
br i1 %18, label %60, label %14
19: ; preds = %2
%20 = tail call i32 @strcat(i8* %1, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0))
%21 = tail call i32 @strlen(i8* %1)
%22 = sub i32 20, %21
%23 = icmp sgt i32 %21, 15
br i1 %23, label %24, label %33
24: ; preds = %19
%25 = icmp ult i32 %21, 20
br i1 %25, label %26, label %60
26: ; preds = %24
%27 = call i32 @llvm.smax.i32(i32 %22, i32 1)
br label %28
28: ; preds = %26, %28
%29 = phi i32 [ %31, %28 ], [ 0, %26 ]
%30 = tail call i32 @strcat(i8* %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%31 = add nuw nsw i32 %29, 1
%32 = icmp eq i32 %31, %27
br i1 %32, label %60, label %28
33: ; preds = %19
%34 = tail call i32 @strlen(i8* %1)
%35 = srem i32 %34, 8
%36 = sub nsw i32 8, %35
%37 = icmp eq i32 %35, 0
br i1 %37, label %43, label %38
38: ; preds = %33, %38
%39 = phi i32 [ %41, %38 ], [ 0, %33 ]
%40 = tail call i32 @strcat(i8* %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%41 = add nuw nsw i32 %39, 1
%42 = icmp eq i32 %41, %36
br i1 %42, label %43, label %38
43: ; preds = %38, %33
%44 = tail call i32 @strlen(i8* %1)
%45 = icmp slt i32 %44, 16
br i1 %45, label %46, label %58
46: ; preds = %43
%47 = sub i32 16, %44
%48 = sdiv i32 %47, 8
%49 = icmp sgt i32 %47, 7
br i1 %49, label %50, label %58
50: ; preds = %46, %50
%51 = phi i32 [ %56, %50 ], [ 0, %46 ]
%52 = and i32 %51, 1
%53 = icmp eq i32 %52, 0
%54 = select i1 %53, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0)
%55 = tail call i32 @strcat(i8* %1, i8* %54)
%56 = add nuw nsw i32 %51, 1
%57 = icmp eq i32 %56, %48
br i1 %57, label %58, label %50
58: ; preds = %50, %46, %43
%59 = tail call i32 @bin_append(i8 zeroext 0, i32 4, i8* %1)
br label %60
60: ; preds = %28, %14, %10, %24, %58
store i8 0, i8* %5
%61 = load i8, i8* %1
%62 = icmp eq i8 %61, 49
%63 = select i1 %62, i8 -128, i8 0
store i8 %63, i8* %5
%64 = select i1 %62, i8 -128, i8 0
%65 = getelementptr inbounds i8, i8* %1, i64 1
%66 = load i8, i8* %65
%67 = icmp eq i8 %66, 49
br i1 %67, label %68, label %70
68: ; preds = %60
%69 = or i8 %64, 64
store i8 %69, i8* %5
br label %70
70: ; preds = %68, %60
%71 = phi i8 [ %69, %68 ], [ %64, %60 ]
%72 = getelementptr inbounds i8, i8* %1, i64 2
%73 = load i8, i8* %72
%74 = icmp eq i8 %73, 49
br i1 %74, label %75, label %77
75: ; preds = %70
%76 = add i8 %71, 32
store i8 %76, i8* %5
br label %77
77: ; preds = %75, %70
%78 = phi i8 [ %76, %75 ], [ %71, %70 ]
%79 = getelementptr inbounds i8, i8* %1, i64 3
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 49
br i1 %81, label %82, label %84
82: ; preds = %77
%83 = add i8 %78, 16
store i8 %83, i8* %5
br label %84
84: ; preds = %82, %77
%85 = phi i8 [ %83, %82 ], [ %78, %77 ]
%86 = getelementptr inbounds i8, i8* %1, i64 4
%87 = load i8, i8* %86
%88 = icmp eq i8 %87, 49
br i1 %88, label %89, label %91
89: ; preds = %84
%90 = add i8 %85, 8
store i8 %90, i8* %5
br label %91
91: ; preds = %89, %84
%92 = phi i8 [ %90, %89 ], [ %85, %84 ]
%93 = getelementptr inbounds i8, i8* %1, i64 5
%94 = load i8, i8* %93
%95 = icmp eq i8 %94, 49
br i1 %95, label %96, label %98
96: ; preds = %91
%97 = add i8 %92, 4
store i8 %97, i8* %5
br label %98
98: ; preds = %96, %91
%99 = phi i8 [ %97, %96 ], [ %92, %91 ]
%100 = getelementptr inbounds i8, i8* %1, i64 6
%101 = load i8, i8* %100
%102 = icmp eq i8 %101, 49
br i1 %102, label %103, label %105
103: ; preds = %98
%104 = add i8 %99, 2
store i8 %104, i8* %5
br label %105
105: ; preds = %103, %98
%106 = phi i8 [ %104, %103 ], [ %99, %98 ]
%107 = getelementptr inbounds i8, i8* %1, i64 7
%108 = load i8, i8* %107
%109 = icmp eq i8 %108, 49
br i1 %109, label %110, label %112
110: ; preds = %105
%111 = add i8 %106, 1
store i8 %111, i8* %5
br label %112
112: ; preds = %110, %105
%113 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 1
store i8 0, i8* %113
%114 = getelementptr inbounds i8, i8* %1, i64 8
%115 = load i8, i8* %114
%116 = icmp eq i8 %115, 49
%117 = select i1 %116, i8 -128, i8 0
store i8 %117, i8* %113
%118 = select i1 %116, i8 -128, i8 0
%119 = getelementptr inbounds i8, i8* %1, i64 9
%120 = load i8, i8* %119
%121 = icmp eq i8 %120, 49
br i1 %121, label %122, label %124
122: ; preds = %112
%123 = or i8 %118, 64
store i8 %123, i8* %113
br label %124
124: ; preds = %122, %112
%125 = phi i8 [ %123, %122 ], [ %118, %112 ]
%126 = getelementptr inbounds i8, i8* %1, i64 10
%127 = load i8, i8* %126
%128 = icmp eq i8 %127, 49
br i1 %128, label %129, label %131
129: ; preds = %124
%130 = add i8 %125, 32
store i8 %130, i8* %113
br label %131
131: ; preds = %129, %124
%132 = phi i8 [ %130, %129 ], [ %125, %124 ]
%133 = getelementptr inbounds i8, i8* %1, i64 11
%134 = load i8, i8* %133
%135 = icmp eq i8 %134, 49
br i1 %135, label %136, label %138
136: ; preds = %131
%137 = add i8 %132, 16
store i8 %137, i8* %113
br label %138
138: ; preds = %136, %131
%139 = phi i8 [ %137, %136 ], [ %132, %131 ]
%140 = getelementptr inbounds i8, i8* %1, i64 12
%141 = load i8, i8* %140
%142 = icmp eq i8 %141, 49
br i1 %142, label %143, label %145
143: ; preds = %138
%144 = add i8 %139, 8
store i8 %144, i8* %113
br label %145
145: ; preds = %143, %138
%146 = phi i8 [ %144, %143 ], [ %139, %138 ]
%147 = getelementptr inbounds i8, i8* %1, i64 13
%148 = load i8, i8* %147
%149 = icmp eq i8 %148, 49
br i1 %149, label %150, label %152
150: ; preds = %145
%151 = add i8 %146, 4
store i8 %151, i8* %113
br label %152
152: ; preds = %150, %145
%153 = phi i8 [ %151, %150 ], [ %146, %145 ]
%154 = getelementptr inbounds i8, i8* %1, i64 14
%155 = load i8, i8* %154
%156 = icmp eq i8 %155, 49
br i1 %156, label %157, label %159
157: ; preds = %152
%158 = add i8 %153, 2
store i8 %158, i8* %113
br label %159
159: ; preds = %157, %152
%160 = phi i8 [ %158, %157 ], [ %153, %152 ]
%161 = getelementptr inbounds i8, i8* %1, i64 15
%162 = load i8, i8* %161
%163 = icmp eq i8 %162, 49
br i1 %163, label %164, label %166
164: ; preds = %159
%165 = add i8 %160, 1
store i8 %165, i8* %113
br label %166
166: ; preds = %164, %159
%167 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 2
%168 = getelementptr inbounds i8, i8* %1, i64 16
%169 = load i8, i8* %168
%170 = icmp eq i8 %169, 49
%171 = select i1 %170, i8 -128, i8 0
%172 = getelementptr inbounds i8, i8* %1, i64 17
%173 = load i8, i8* %172
%174 = icmp eq i8 %173, 49
%175 = select i1 %174, i8 64, i8 0
%176 = or i8 %171, %175
%177 = getelementptr inbounds i8, i8* %1, i64 18
%178 = load i8, i8* %177
%179 = icmp eq i8 %178, 49
%180 = select i1 %179, i8 32, i8 0
%181 = or i8 %176, %180
%182 = getelementptr inbounds i8, i8* %1, i64 19
%183 = load i8, i8* %182
%184 = icmp eq i8 %183, 49
%185 = select i1 %184, i8 16, i8 0
%186 = or i8 %181, %185
store i8 %186, i8* %167
%187 = tail call i32 @rs_init_gf(i32 285)
%188 = tail call i32 @rs_init_code(i32 2, i32 0)
%189 = call i32 @rs_encode(i32 3, i8* %5, i8* %6)
%190 = call i32 (...) @rs_free()
%191 = getelementptr inbounds [3 x i8], [3 x i8]* %4, i64 0, i64 1
%192 = load i8, i8* %191
%193 = call i32 @bin_append(i8 zeroext %192, i32 8, i8* %1)
%194 = load i8, i8* %6
%195 = call i32 @bin_append(i8 zeroext %194, i32 8, i8* %1)
ret void
}