#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 /*<<< orphan*/ qr_diran(char *, unsigned char, int);
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_m3(char binary_data[], int ecc_mode) {
  int i, j, latch;
  int bits_total, bits_left, remainder;
  int data_codewords, ecc_codewords;
  unsigned char data_blocks[12], ecc_blocks[9];
  latch = 0;
  if (ecc_mode == 1) {
    bits_total = 84;
  }
  if (ecc_mode == 2) {
    bits_total = 68;
  }
  bits_left = bits_total - strlen(binary_data);
  if (bits_left <= 7) {
    for (i = 0; i < bits_left; i++) {
      strcat(binary_data, "0");
    }
    latch = 1;
  } else {
    strcat(binary_data, "0000000");
  }
  if (latch == 0) {
    bits_left = bits_total - strlen(binary_data);
    if (bits_left <= 4) {
      for (i = 0; i < bits_left; i++) {
        strcat(binary_data, "0");
      }
      latch = 1;
    }
  }
  if (latch == 0) {
    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 - 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");
      }
    }
    strcat(binary_data, "0000");
  }
  if (ecc_mode == 1) {
    data_codewords = 11;
    ecc_codewords = 6;
  }
  if (ecc_mode == 2) {
    data_codewords = 9;
    ecc_codewords = 8;
  }
  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;
      }
    }
  }
  if (ecc_mode == 1) {
    data_blocks[10] = 0;
    for (j = 0; j < 4; j++) {
      if (binary_data[80 + j] == '1') {
        data_blocks[10] += 0x80 >> j;
      }
    }
  }
  if (ecc_mode == 2) {
    data_blocks[8] = 0;
    for (j = 0; j < 4; j++) {
      if (binary_data[64 + j] == '1') {
        data_blocks[8] += 0x80 >> j;
      }
    }
  }
  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++) {
    qr_diran(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80);
  }
  return;
}


x86 assembly (clang, -O0):
<micro_qr_m3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x1,-0xc(%rbp)
jne    1197 <micro_qr_m3+0x27>
movl   $0x54,-0x1c(%rbp)
cmpl   $0x2,-0xc(%rbp)
jne    11a8 <micro_qr_m3+0x38>
movl   $0x44,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x48(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x7,-0x20(%rbp)
jg     1208 <micro_qr_m3+0x98>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11fc <micro_qr_m3+0x8c>
mov    -0x8(%rbp),%rdi
lea    0xe1d(%rip),%rsi
call   1090 <strcat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    11d2 <micro_qr_m3+0x62>
movl   $0x1,-0x18(%rbp)
jmp    1218 <micro_qr_m3+0xa8>
mov    -0x8(%rbp),%rdi
lea    0xded(%rip),%rsi
call   1090 <strcat@plt>
cmpl   $0x0,-0x18(%rbp)
jne    1282 <micro_qr_m3+0x112>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x4c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x4,-0x20(%rbp)
jg     127d <micro_qr_m3+0x10d>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1276 <micro_qr_m3+0x106>
mov    -0x8(%rbp),%rdi
lea    0xda3(%rip),%rsi
call   1090 <strcat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    124c <micro_qr_m3+0xdc>
movl   $0x1,-0x18(%rbp)
jmp    1282 <micro_qr_m3+0x112>
cmpl   $0x0,-0x18(%rbp)
jne    1377 <micro_qr_m3+0x207>
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    $0x8,%eax
sub    %edx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x8,-0x24(%rbp)
jne    12b8 <micro_qr_m3+0x148>
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12e9 <micro_qr_m3+0x179>
mov    -0x8(%rbp),%rdi
lea    0xd30(%rip),%rsi
call   1090 <strcat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    12bf <micro_qr_m3+0x14f>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x50(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x4,-0x20(%rbp)
jle    1367 <micro_qr_m3+0x1f7>
mov    -0x20(%rbp),%eax
sub    $0x4,%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1362 <micro_qr_m3+0x1f2>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%ecx
and    $0x1,%ecx
lea    0xcd0(%rip),%rsi
lea    0xcc0(%rip),%rax
cmp    $0x0,%ecx
cmovne %rax,%rsi
call   1090 <strcat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1324 <micro_qr_m3+0x1b4>
jmp    1367 <micro_qr_m3+0x1f7>
mov    -0x8(%rbp),%rdi
lea    0xc91(%rip),%rsi
call   1090 <strcat@plt>
cmpl   $0x1,-0xc(%rbp)
jne    138f <micro_qr_m3+0x21f>
movl   $0xb,-0x28(%rbp)
movl   $0x6,-0x2c(%rbp)
cmpl   $0x2,-0xc(%rbp)
jne    13a7 <micro_qr_m3+0x237>
movl   $0x9,-0x28(%rbp)
movl   $0x8,-0x2c(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1435 <micro_qr_m3+0x2c5>
movslq -0x10(%rbp),%rax
movb   $0x0,-0x38(%rbp,%rax,1)
movl   $0x0,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jge    1422 <micro_qr_m3+0x2b2>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    140f <micro_qr_m3+0x29f>
mov    -0x14(%rbp),%ecx
mov    $0x80,%edx
sar    %cl,%edx
movslq -0x10(%rbp),%rax
movzbl -0x38(%rbp,%rax,1),%ecx
add    %edx,%ecx
mov    %cl,-0x38(%rbp,%rax,1)
jmp    1414 <micro_qr_m3+0x2a4>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    13cf <micro_qr_m3+0x25f>
jmp    1427 <micro_qr_m3+0x2b7>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    13ae <micro_qr_m3+0x23e>
cmpl   $0x1,-0xc(%rbp)
jne    149b <micro_qr_m3+0x32b>
movb   $0x0,-0x2e(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    1496 <micro_qr_m3+0x326>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x50,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    1483 <micro_qr_m3+0x313>
mov    -0x14(%rbp),%ecx
mov    $0x80,%eax
sar    %cl,%eax
mov    %eax,%ecx
movzbl -0x2e(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x2e(%rbp)
jmp    1488 <micro_qr_m3+0x318>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    144a <micro_qr_m3+0x2da>
jmp    149b <micro_qr_m3+0x32b>
cmpl   $0x2,-0xc(%rbp)
jne    1501 <micro_qr_m3+0x391>
movb   $0x0,-0x30(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    14fc <micro_qr_m3+0x38c>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x40,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    14e9 <micro_qr_m3+0x379>
mov    -0x14(%rbp),%ecx
mov    $0x80,%eax
sar    %cl,%eax
mov    %eax,%ecx
movzbl -0x30(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x30(%rbp)
jmp    14ee <micro_qr_m3+0x37e>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    14b0 <micro_qr_m3+0x340>
jmp    1501 <micro_qr_m3+0x391>
mov    $0x11d,%edi
call   1080 <rs_init_gf@plt>
mov    -0x2c(%rbp),%edi
xor    %esi,%esi
call   1060 <rs_init_code@plt>
mov    -0x28(%rbp),%edi
lea    -0x38(%rbp),%rsi
lea    -0x41(%rbp),%rdx
call   1050 <rs_encode@plt>
mov    $0x0,%al
call   1030 <rs_free@plt>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    156b <micro_qr_m3+0x3fb>
mov    -0x8(%rbp),%rdi
mov    -0x2c(%rbp),%eax
sub    -0x10(%rbp),%eax
sub    $0x1,%eax
cltq
mov    $0x80,%edx
movzbl -0x41(%rbp,%rax,1),%esi
call   1070 <qr_diran@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1533 <micro_qr_m3+0x3c3>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<micro_qr_m3>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %esi,%r15d
mov    %rdi,%rbx
xor    %r12d,%r12d
cmp    $0x2,%esi
setne  %r12b
shl    $0x4,%r12d
or     $0x44,%r12d
call   1040 <strlen@plt>
mov    %r12d,%ebp
sub    %eax,%ebp
cmp    $0x7,%ebp
jg     11d5 <micro_qr_m3+0x65>
test   %ebp,%ebp
jle    12ba <micro_qr_m3+0x14a>
lea    0xe52(%rip),%r14
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rbx,%rdi
mov    %r14,%rsi
call   1090 <strcat@plt>
add    $0xffffffff,%ebp
jne    11c0 <micro_qr_m3+0x50>
jmp    12ba <micro_qr_m3+0x14a>
lea    0xe24(%rip),%rsi
mov    %rbx,%rdi
call   1090 <strcat@plt>
mov    %rbx,%rdi
call   1040 <strlen@plt>
mov    %r12d,%ebp
sub    %eax,%ebp
cmp    $0x4,%ebp
jg     1225 <micro_qr_m3+0xb5>
test   %ebp,%ebp
jle    12ba <micro_qr_m3+0x14a>
lea    0xe01(%rip),%r14
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbx,%rdi
mov    %r14,%rsi
call   1090 <strcat@plt>
add    $0xffffffff,%ebp
jne    1210 <micro_qr_m3+0xa0>
jmp    12ba <micro_qr_m3+0x14a>
mov    %rbx,%rdi
call   1040 <strlen@plt>
mov    %eax,%ebp
lea    0x7(%rbp),%eax
test   %ebp,%ebp
cmovns %ebp,%eax
and    $0xfffffff8,%eax
sub    %eax,%ebp
je     125f <micro_qr_m3+0xef>
add    $0xfffffff8,%ebp
lea    0xdbe(%rip),%r14
nopl   0x0(%rax,%rax,1)
mov    %rbx,%rdi
mov    %r14,%rsi
call   1090 <strcat@plt>
inc    %ebp
jne    1250 <micro_qr_m3+0xe0>
mov    %rbx,%rdi
call   1040 <strlen@plt>
sub    %eax,%r12d
cmp    $0x5,%r12d
jl     12ab <micro_qr_m3+0x13b>
add    $0xfffffffc,%r12d
cmp    $0x8,%r12d
jb     12ab <micro_qr_m3+0x13b>
shr    $0x3,%r12d
xor    %ebp,%ebp
lea    0xd8a(%rip),%r14
lea    0xd7a(%rip),%r13
xchg   %ax,%ax
test   $0x1,%bpl
mov    %r13,%rsi
cmove  %r14,%rsi
mov    %rbx,%rdi
call   1090 <strcat@plt>
add    $0x1,%ebp
cmp    %ebp,%r12d
jne    1290 <micro_qr_m3+0x120>
lea    0xd51(%rip),%rsi
mov    %rbx,%rdi
call   1090 <strcat@plt>
xor    %eax,%eax
cmp    $0x2,%r15d
setne  %al
lea    (%rax,%rax,1),%r14d
add    $0x9,%r14d
add    %eax,%eax
add    $0x8,%eax
xor    %ecx,%ecx
jmp    12ed <micro_qr_m3+0x17d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rcx
cmp    %rcx,%rax
je     13a4 <micro_qr_m3+0x234>
movb   $0x0,0x3(%rsp,%rcx,1)
cmpb   $0x31,(%rbx,%rcx,8)
sete   %dl
shl    $0x7,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x1(%rbx,%rcx,8)
je     1340 <micro_qr_m3+0x1d0>
cmpb   $0x31,0x2(%rbx,%rcx,8)
je     134e <micro_qr_m3+0x1de>
cmpb   $0x31,0x3(%rbx,%rcx,8)
je     135c <micro_qr_m3+0x1ec>
cmpb   $0x31,0x4(%rbx,%rcx,8)
je     136a <micro_qr_m3+0x1fa>
cmpb   $0x31,0x5(%rbx,%rcx,8)
je     1378 <micro_qr_m3+0x208>
cmpb   $0x31,0x6(%rbx,%rcx,8)
je     1386 <micro_qr_m3+0x216>
cmpb   $0x31,0x7(%rbx,%rcx,8)
jne    12e0 <micro_qr_m3+0x170>
jmp    1398 <micro_qr_m3+0x228>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
or     $0x40,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x2(%rbx,%rcx,8)
jne    130e <micro_qr_m3+0x19e>
add    $0x20,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x3(%rbx,%rcx,8)
jne    1315 <micro_qr_m3+0x1a5>
add    $0x10,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x4(%rbx,%rcx,8)
jne    131c <micro_qr_m3+0x1ac>
add    $0x8,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x5(%rbx,%rcx,8)
jne    1323 <micro_qr_m3+0x1b3>
add    $0x4,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x6(%rbx,%rcx,8)
jne    132a <micro_qr_m3+0x1ba>
add    $0x2,%dl
mov    %dl,0x3(%rsp,%rcx,1)
cmpb   $0x31,0x7(%rbx,%rcx,8)
jne    12e0 <micro_qr_m3+0x170>
add    $0x1,%dl
mov    %dl,0x3(%rsp,%rcx,1)
jmp    12e0 <micro_qr_m3+0x170>
xor    %eax,%eax
cmp    $0x2,%r15d
sete   %al
cmp    $0x1,%r15d
jne    13e5 <micro_qr_m3+0x275>
cmpb   $0x31,0x50(%rbx)
sete   %cl
shl    $0x7,%cl
cmpb   $0x31,0x51(%rbx)
sete   %dl
shl    $0x6,%dl
or     %cl,%dl
cmpb   $0x31,0x52(%rbx)
sete   %cl
shl    $0x5,%cl
or     %dl,%cl
cmpb   $0x31,0x53(%rbx)
sete   %dl
shl    $0x4,%dl
or     %cl,%dl
mov    %dl,0xd(%rsp)
lea    (%rax,%rax,1),%ebp
add    $0x6,%ebp
cmp    $0x2,%r15d
jne    1423 <micro_qr_m3+0x2b3>
cmpb   $0x31,0x40(%rbx)
sete   %al
shl    $0x7,%al
cmpb   $0x31,0x41(%rbx)
sete   %cl
shl    $0x6,%cl
or     %al,%cl
cmpb   $0x31,0x42(%rbx)
sete   %al
shl    $0x5,%al
or     %cl,%al
cmpb   $0x31,0x43(%rbx)
sete   %cl
shl    $0x4,%cl
or     %al,%cl
mov    %cl,0xb(%rsp)
mov    $0x11d,%edi
call   1080 <rs_init_gf@plt>
mov    %ebp,%edi
xor    %esi,%esi
call   1060 <rs_init_code@plt>
lea    0x3(%rsp),%rsi
lea    0xf(%rsp),%rdx
mov    %r14d,%edi
call   1050 <rs_encode@plt>
xor    %eax,%eax
call   1030 <rs_free@plt>
mov    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl 0xe(%rsp,%rbp,1),%esi
mov    %rbx,%rdi
mov    $0x80,%edx
call   1070 <qr_diran@plt>
add    $0xffffffffffffffff,%rbp
jne    1460 <micro_qr_m3+0x2f0>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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