#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*/ concat(char *, char *);
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 strlen(char *);
void micro_qr_m2(char binary_data[], int ecc_mode) {
  int i, latch;
  int bits_total, bits_left, remainder;
  int data_codewords, ecc_codewords;
  unsigned char data_blocks[6], ecc_blocks[7];
  latch = 0;
  if (ecc_mode == 1) {
    bits_total = 40;
  }
  if (ecc_mode == 2) {
    bits_total = 32;
  }
  bits_left = bits_total - strlen(binary_data);
  if (bits_left <= 5) {
    for (i = 0; i < bits_left; i++) {
      concat(binary_data, "0");
    }
    latch = 1;
  } else {
    concat(binary_data, "00000");
  }
  if (latch == 0) {
    remainder = 8 - (strlen(binary_data) % 8);
    if (remainder == 8) {
      remainder = 0;
    }
    for (i = 0; i < remainder; i++) {
      concat(binary_data, "0");
    }
    bits_left = bits_total - strlen(binary_data);
    remainder = bits_left / 8;
    for (i = 0; i < remainder; i++) {
      concat(binary_data, i & 1 ? "00010001" : "11101100");
    }
  }
  if (ecc_mode == 1) {
    data_codewords = 5;
    ecc_codewords = 5;
  }
  if (ecc_mode == 2) {
    data_codewords = 4;
    ecc_codewords = 6;
  }
  for (i = 0; i < data_codewords; i++) {
    data_blocks[i] = 0;
    if (binary_data[i * 8] == '1') {
      data_blocks[i] += 0x80;
    }
    if (binary_data[(i * 8) + 1] == '1') {
      data_blocks[i] += 0x40;
    }
    if (binary_data[(i * 8) + 2] == '1') {
      data_blocks[i] += 0x20;
    }
    if (binary_data[(i * 8) + 3] == '1') {
      data_blocks[i] += 0x10;
    }
    if (binary_data[(i * 8) + 4] == '1') {
      data_blocks[i] += 0x08;
    }
    if (binary_data[(i * 8) + 5] == '1') {
      data_blocks[i] += 0x04;
    }
    if (binary_data[(i * 8) + 6] == '1') {
      data_blocks[i] += 0x02;
    }
    if (binary_data[(i * 8) + 7] == '1') {
      data_blocks[i] += 0x01;
    }
  }
  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_m2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x1,-0xc(%rbp)
jne    1197 <micro_qr_m2+0x27>
movl   $0x28,-0x18(%rbp)
cmpl   $0x2,-0xc(%rbp)
jne    11a8 <micro_qr_m2+0x38>
movl   $0x20,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x5,-0x1c(%rbp)
jg     1208 <micro_qr_m2+0x98>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11fc <micro_qr_m2+0x8c>
mov    -0x8(%rbp),%rdi
lea    0xe1b(%rip),%rsi
call   1050 <concat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    11d2 <micro_qr_m2+0x62>
movl   $0x1,-0x14(%rbp)
jmp    1218 <micro_qr_m2+0xa8>
mov    -0x8(%rbp),%rdi
lea    0xded(%rip),%rsi
call   1050 <concat@plt>
cmpl   $0x0,-0x14(%rbp)
jne    12f0 <micro_qr_m2+0x180>
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    $0x8,%eax
sub    %edx,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x8,-0x20(%rbp)
jne    124e <micro_qr_m2+0xde>
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    127f <micro_qr_m2+0x10f>
mov    -0x8(%rbp),%rdi
lea    0xd98(%rip),%rsi
call   1050 <concat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1255 <micro_qr_m2+0xe5>
mov    -0x18(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x40(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    12eb <micro_qr_m2+0x17b>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%ecx
and    $0x1,%ecx
lea    0xd45(%rip),%rsi
lea    0xd35(%rip),%rax
cmp    $0x0,%ecx
cmovne %rax,%rsi
call   1050 <concat@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    12ad <micro_qr_m2+0x13d>
jmp    12f0 <micro_qr_m2+0x180>
cmpl   $0x1,-0xc(%rbp)
jne    1308 <micro_qr_m2+0x198>
movl   $0x5,-0x24(%rbp)
movl   $0x5,-0x28(%rbp)
cmpl   $0x2,-0xc(%rbp)
jne    1320 <micro_qr_m2+0x1b0>
movl   $0x4,-0x24(%rbp)
movl   $0x6,-0x28(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    14b7 <micro_qr_m2+0x347>
movslq -0x10(%rbp),%rax
movb   $0x0,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    1369 <micro_qr_m2+0x1f9>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x80,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    1396 <micro_qr_m2+0x226>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x40,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    13c3 <micro_qr_m2+0x253>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x20,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    13f0 <micro_qr_m2+0x280>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x10,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    141d <micro_qr_m2+0x2ad>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x8,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    144a <micro_qr_m2+0x2da>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x4,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    1477 <micro_qr_m2+0x307>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x2,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x3,%ecx
add    $0x7,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    14a4 <micro_qr_m2+0x334>
movslq -0x10(%rbp),%rax
movzbl -0x2e(%rbp,%rax,1),%ecx
add    $0x1,%ecx
mov    %cl,-0x2e(%rbp,%rax,1)
jmp    14a9 <micro_qr_m2+0x339>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1327 <micro_qr_m2+0x1b7>
mov    $0x11d,%edi
call   1090 <rs_init_gf@plt>
mov    -0x28(%rbp),%edi
xor    %esi,%esi
call   1070 <rs_init_code@plt>
mov    -0x24(%rbp),%edi
lea    -0x2e(%rbp),%rsi
lea    -0x35(%rbp),%rdx
call   1060 <rs_encode@plt>
mov    $0x0,%al
call   1030 <rs_free@plt>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1521 <micro_qr_m2+0x3b1>
mov    -0x8(%rbp),%rdi
mov    -0x28(%rbp),%eax
sub    -0x10(%rbp),%eax
sub    $0x1,%eax
cltq
mov    $0x80,%edx
movzbl -0x35(%rbp,%rax,1),%esi
call   1080 <qr_diran@plt>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    14e9 <micro_qr_m2+0x379>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<micro_qr_m2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %esi,%r14d
mov    %rdi,%rbx
xor    %eax,%eax
cmp    $0x2,%esi
setne  %al
lea    0x20(,%rax,8),%r12d
call   1040 <strlen@plt>
mov    %r12d,%ebp
sub    %eax,%ebp
cmp    $0x5,%ebp
jg     11d5 <micro_qr_m2+0x65>
test   %ebp,%ebp
jle    126b <micro_qr_m2+0xfb>
lea    0xe52(%rip),%r15
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rbx,%rdi
mov    %r15,%rsi
call   1050 <concat@plt>
add    $0xffffffff,%ebp
jne    11c0 <micro_qr_m2+0x50>
jmp    126b <micro_qr_m2+0xfb>
lea    0xe24(%rip),%rsi
mov    %rbx,%rdi
call   1050 <concat@plt>
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     121f <micro_qr_m2+0xaf>
add    $0xfffffff8,%ebp
lea    0xdfd(%rip),%r15
nopw   0x0(%rax,%rax,1)
mov    %rbx,%rdi
mov    %r15,%rsi
call   1050 <concat@plt>
inc    %ebp
jne    1210 <micro_qr_m2+0xa0>
mov    %rbx,%rdi
call   1040 <strlen@plt>
sub    %eax,%r12d
lea    0x7(%r12),%r15d
test   %r12d,%r12d
cmovns %r12d,%r15d
cmp    $0x8,%r12d
jl     126b <micro_qr_m2+0xfb>
sar    $0x3,%r15d
xor    %ebp,%ebp
lea    0xdc6(%rip),%r12
lea    0xdb6(%rip),%r13
test   $0x1,%bpl
mov    %r13,%rsi
cmove  %r12,%rsi
mov    %rbx,%rdi
call   1050 <concat@plt>
add    $0x1,%ebp
cmp    %ebp,%r15d
jne    1250 <micro_qr_m2+0xe0>
xor    %r15d,%r15d
cmp    $0x2,%r14d
sete   %r15b
xor    $0x5,%r15d
xor    %eax,%eax
jmp    128d <micro_qr_m2+0x11d>
xchg   %ax,%ax
add    $0x1,%rax
cmp    %rax,%r15
je     1334 <micro_qr_m2+0x1c4>
cmpb   $0x31,(%rbx,%rax,8)
sete   %cl
shl    $0x7,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x1(%rbx,%rax,8)
je     12d0 <micro_qr_m2+0x160>
cmpb   $0x31,0x2(%rbx,%rax,8)
je     12de <micro_qr_m2+0x16e>
cmpb   $0x31,0x3(%rbx,%rax,8)
je     12ec <micro_qr_m2+0x17c>
cmpb   $0x31,0x4(%rbx,%rax,8)
je     12fa <micro_qr_m2+0x18a>
cmpb   $0x31,0x5(%rbx,%rax,8)
je     1308 <micro_qr_m2+0x198>
cmpb   $0x31,0x6(%rbx,%rax,8)
je     1316 <micro_qr_m2+0x1a6>
cmpb   $0x31,0x7(%rbx,%rax,8)
jne    1280 <micro_qr_m2+0x110>
jmp    1328 <micro_qr_m2+0x1b8>
xchg   %ax,%ax
or     $0x40,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x2(%rbx,%rax,8)
jne    12a9 <micro_qr_m2+0x139>
add    $0x20,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x3(%rbx,%rax,8)
jne    12b0 <micro_qr_m2+0x140>
add    $0x10,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x4(%rbx,%rax,8)
jne    12b7 <micro_qr_m2+0x147>
add    $0x8,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x5(%rbx,%rax,8)
jne    12be <micro_qr_m2+0x14e>
add    $0x4,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x6(%rbx,%rax,8)
jne    12c5 <micro_qr_m2+0x155>
add    $0x2,%cl
mov    %cl,0xb(%rsp,%rax,1)
cmpb   $0x31,0x7(%rbx,%rax,8)
jne    1280 <micro_qr_m2+0x110>
add    $0x1,%cl
mov    %cl,0xb(%rsp,%rax,1)
jmp    1280 <micro_qr_m2+0x110>
xor    %ebp,%ebp
cmp    $0x2,%r14d
sete   %bpl
add    $0x5,%ebp
mov    $0x11d,%edi
call   1090 <rs_init_gf@plt>
mov    %ebp,%edi
xor    %esi,%esi
call   1070 <rs_init_code@plt>
lea    0xb(%rsp),%rsi
lea    0x11(%rsp),%rdx
mov    %r15d,%edi
call   1060 <rs_encode@plt>
xor    %eax,%eax
call   1030 <rs_free@plt>
nopl   (%rax)
movzbl 0x10(%rsp,%rbp,1),%esi
mov    %rbx,%rdi
mov    $0x80,%edx
call   1080 <qr_diran@plt>
add    $0xffffffffffffffff,%rbp
jne    1370 <micro_qr_m2+0x200>
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 = [6 x i8] c"00000\00"
@.str.2 = [9 x i8] c"00010001\00"
@.str.3 = [9 x i8] c"11101100\00"
define void @micro_qr_m2(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 [6 x i8]
%13 = alloca [7 x i8]
store i8* %0, i8** %3
store i32 %1, i32* %4
store i32 0, i32* %6
%14 = load i32, i32* %4
%15 = icmp eq i32 %14, 1
br i1 %15, label %16, label %17
16: ; preds = %2
store i32 40, i32* %7
br label %17
17: ; preds = %16, %2
%18 = load i32, i32* %4
%19 = icmp eq i32 %18, 2
br i1 %19, label %20, label %21
20: ; preds = %17
store i32 32, i32* %7
br label %21
21: ; preds = %20, %17
%22 = load i32, i32* %7
%23 = load i8*, i8** %3
%24 = call i32 @strlen(i8* %23)
%25 = sub nsw i32 %22, %24
store i32 %25, i32* %8
%26 = load i32, i32* %8
%27 = icmp sle i32 %26, 5
br i1 %27, label %28, label %40
28: ; preds = %21
store i32 0, i32* %5
br label %29
29: ; preds = %36, %28
%30 = load i32, i32* %5
%31 = load i32, i32* %8
%32 = icmp slt i32 %30, %31
br i1 %32, label %33, label %39
33: ; preds = %29
%34 = load i8*, i8** %3
%35 = call i32 @concat(i8* %34, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
br label %36
36: ; preds = %33
%37 = load i32, i32* %5
%38 = add nsw i32 %37, 1
store i32 %38, i32* %5
br label %29
39: ; preds = %29
store i32 1, i32* %6
br label %43
40: ; preds = %21
%41 = load i8*, i8** %3
%42 = call i32 @concat(i8* %41, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0))
br label %43
43: ; preds = %40, %39
%44 = load i32, i32* %6
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %88
46: ; preds = %43
%47 = load i8*, i8** %3
%48 = call i32 @strlen(i8* %47)
%49 = srem i32 %48, 8
%50 = sub nsw i32 8, %49
store i32 %50, i32* %9
%51 = load i32, i32* %9
%52 = icmp eq i32 %51, 8
br i1 %52, label %53, label %54
53: ; preds = %46
store i32 0, i32* %9
br label %54
54: ; preds = %53, %46
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 @concat(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
%66 = load i32, i32* %7
%67 = load i8*, i8** %3
%68 = call i32 @strlen(i8* %67)
%69 = sub nsw i32 %66, %68
store i32 %69, i32* %8
%70 = load i32, i32* %8
%71 = sdiv i32 %70, 8
store i32 %71, i32* %9
store i32 0, i32* %5
br label %72
72: ; preds = %84, %65
%73 = load i32, i32* %5
%74 = load i32, i32* %9
%75 = icmp slt i32 %73, %74
br i1 %75, label %76, label %87
76: ; preds = %72
%77 = load i8*, i8** %3
%78 = load i32, i32* %5
%79 = and i32 %78, 1
%80 = icmp ne i32 %79, 0
%81 = zext i1 %80 to i64
%82 = select i1 %80, 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)
%83 = call i32 @concat(i8* %77, i8* %82)
br label %84
84: ; preds = %76
%85 = load i32, i32* %5
%86 = add nsw i32 %85, 1
store i32 %86, i32* %5
br label %72
87: ; preds = %72
br label %88
88: ; preds = %87, %43
%89 = load i32, i32* %4
%90 = icmp eq i32 %89, 1
br i1 %90, label %91, label %92
91: ; preds = %88
store i32 5, i32* %10
store i32 5, i32* %11
br label %92
92: ; preds = %91, %88
%93 = load i32, i32* %4
%94 = icmp eq i32 %93, 2
br i1 %94, label %95, label %96
95: ; preds = %92
store i32 4, i32* %10
store i32 6, i32* %11
br label %96
96: ; preds = %95, %92
store i32 0, i32* %5
br label %97
97: ; preds = %248, %96
%98 = load i32, i32* %5
%99 = load i32, i32* %10
%100 = icmp slt i32 %98, %99
br i1 %100, label %101, label %251
101: ; preds = %97
%102 = load i32, i32* %5
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %103
store i8 0, i8* %104
%105 = load i8*, i8** %3
%106 = load i32, i32* %5
%107 = mul nsw i32 %106, 8
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %105, i64 %108
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp eq i32 %111, 49
br i1 %112, label %113, label %121
113: ; preds = %101
%114 = load i32, i32* %5
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %115
%117 = load i8, i8* %116
%118 = zext i8 %117 to i32
%119 = add nsw i32 %118, 128
%120 = trunc i32 %119 to i8
store i8 %120, i8* %116
br label %121
121: ; preds = %113, %101
%122 = load i8*, i8** %3
%123 = load i32, i32* %5
%124 = mul nsw i32 %123, 8
%125 = add nsw i32 %124, 1
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i8, i8* %122, i64 %126
%128 = load i8, i8* %127
%129 = sext i8 %128 to i32
%130 = icmp eq i32 %129, 49
br i1 %130, label %131, label %139
131: ; preds = %121
%132 = load i32, i32* %5
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %133
%135 = load i8, i8* %134
%136 = zext i8 %135 to i32
%137 = add nsw i32 %136, 64
%138 = trunc i32 %137 to i8
store i8 %138, i8* %134
br label %139
139: ; preds = %131, %121
%140 = load i8*, i8** %3
%141 = load i32, i32* %5
%142 = mul nsw i32 %141, 8
%143 = add nsw i32 %142, 2
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %140, i64 %144
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp eq i32 %147, 49
br i1 %148, label %149, label %157
149: ; preds = %139
%150 = load i32, i32* %5
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %151
%153 = load i8, i8* %152
%154 = zext i8 %153 to i32
%155 = add nsw i32 %154, 32
%156 = trunc i32 %155 to i8
store i8 %156, i8* %152
br label %157
157: ; preds = %149, %139
%158 = load i8*, i8** %3
%159 = load i32, i32* %5
%160 = mul nsw i32 %159, 8
%161 = add nsw i32 %160, 3
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds i8, i8* %158, 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 = %157
%168 = load i32, i32* %5
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %169
%171 = load i8, i8* %170
%172 = zext i8 %171 to i32
%173 = add nsw i32 %172, 16
%174 = trunc i32 %173 to i8
store i8 %174, i8* %170
br label %175
175: ; preds = %167, %157
%176 = load i8*, i8** %3
%177 = load i32, i32* %5
%178 = mul nsw i32 %177, 8
%179 = add nsw i32 %178, 4
%180 = sext i32 %179 to i64
%181 = getelementptr inbounds i8, i8* %176, i64 %180
%182 = load i8, i8* %181
%183 = sext i8 %182 to i32
%184 = icmp eq i32 %183, 49
br i1 %184, label %185, label %193
185: ; preds = %175
%186 = load i32, i32* %5
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %187
%189 = load i8, i8* %188
%190 = zext i8 %189 to i32
%191 = add nsw i32 %190, 8
%192 = trunc i32 %191 to i8
store i8 %192, i8* %188
br label %193
193: ; preds = %185, %175
%194 = load i8*, i8** %3
%195 = load i32, i32* %5
%196 = mul nsw i32 %195, 8
%197 = add nsw i32 %196, 5
%198 = sext i32 %197 to i64
%199 = getelementptr inbounds i8, i8* %194, i64 %198
%200 = load i8, i8* %199
%201 = sext i8 %200 to i32
%202 = icmp eq i32 %201, 49
br i1 %202, label %203, label %211
203: ; preds = %193
%204 = load i32, i32* %5
%205 = sext i32 %204 to i64
%206 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %205
%207 = load i8, i8* %206
%208 = zext i8 %207 to i32
%209 = add nsw i32 %208, 4
%210 = trunc i32 %209 to i8
store i8 %210, i8* %206
br label %211
211: ; preds = %203, %193
%212 = load i8*, i8** %3
%213 = load i32, i32* %5
%214 = mul nsw i32 %213, 8
%215 = add nsw i32 %214, 6
%216 = sext i32 %215 to i64
%217 = getelementptr inbounds i8, i8* %212, i64 %216
%218 = load i8, i8* %217
%219 = sext i8 %218 to i32
%220 = icmp eq i32 %219, 49
br i1 %220, label %221, label %229
221: ; preds = %211
%222 = load i32, i32* %5
%223 = sext i32 %222 to i64
%224 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %223
%225 = load i8, i8* %224
%226 = zext i8 %225 to i32
%227 = add nsw i32 %226, 2
%228 = trunc i32 %227 to i8
store i8 %228, i8* %224
br label %229
229: ; preds = %221, %211
%230 = load i8*, i8** %3
%231 = load i32, i32* %5
%232 = mul nsw i32 %231, 8
%233 = add nsw i32 %232, 7
%234 = sext i32 %233 to i64
%235 = getelementptr inbounds i8, i8* %230, i64 %234
%236 = load i8, i8* %235
%237 = sext i8 %236 to i32
%238 = icmp eq i32 %237, 49
br i1 %238, label %239, label %247
239: ; preds = %229
%240 = load i32, i32* %5
%241 = sext i32 %240 to i64
%242 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 %241
%243 = load i8, i8* %242
%244 = zext i8 %243 to i32
%245 = add nsw i32 %244, 1
%246 = trunc i32 %245 to i8
store i8 %246, i8* %242
br label %247
247: ; preds = %239, %229
br label %248
248: ; preds = %247
%249 = load i32, i32* %5
%250 = add nsw i32 %249, 1
store i32 %250, i32* %5
br label %97
251: ; preds = %97
%252 = call i32 @rs_init_gf(i32 285)
%253 = load i32, i32* %11
%254 = call i32 @rs_init_code(i32 %253, i32 0)
%255 = load i32, i32* %10
%256 = getelementptr inbounds [6 x i8], [6 x i8]* %12, i64 0, i64 0
%257 = getelementptr inbounds [7 x i8], [7 x i8]* %13, i64 0, i64 0
%258 = call i32 @rs_encode(i32 %255, i8* %256, i8* %257)
%259 = call i32 (...) @rs_free()
store i32 0, i32* %5
br label %260
260: ; preds = %274, %251
%261 = load i32, i32* %5
%262 = load i32, i32* %11
%263 = icmp slt i32 %261, %262
br i1 %263, label %264, label %277
264: ; preds = %260
%265 = load i8*, i8** %3
%266 = load i32, i32* %11
%267 = load i32, i32* %5
%268 = sub nsw i32 %266, %267
%269 = sub nsw i32 %268, 1
%270 = sext i32 %269 to i64
%271 = getelementptr inbounds [7 x i8], [7 x i8]* %13, i64 0, i64 %270
%272 = load i8, i8* %271
%273 = call i32 @qr_diran(i8* %265, i8 zeroext %272, i32 128)
br label %274
274: ; preds = %264
%275 = load i32, i32* %5
%276 = add nsw i32 %275, 1
store i32 %276, i32* %5
br label %260
277: ; preds = %260
ret void
}

LLVM IR (-O2):
@.str = [2 x i8] c"0\00"
@.str.1 = [6 x i8] c"00000\00"
@.str.2 = [9 x i8] c"00010001\00"
@.str.3 = [9 x i8] c"11101100\00"
define void @micro_qr_m2(i8* %0, i32 %1) {
%3 = alloca [6 x i8]
%4 = alloca [7 x i8]
%5 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 0
%6 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 0
%7 = icmp eq i32 %1, 2
%8 = select i1 %7, i32 32, i32 40
%9 = tail call i32 @strlen(i8* %0)
%10 = sub i32 %8, %9
%11 = icmp slt i32 %10, 6
br i1 %11, label %12, label %19
12: ; preds = %2
%13 = icmp sgt i32 %10, 0
br i1 %13, label %14, label %43
14: ; preds = %12, %14
%15 = phi i32 [ %17, %14 ], [ 0, %12 ]
%16 = tail call i32 @concat(i8* %0, 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, %10
br i1 %18, label %43, label %14
19: ; preds = %2
%20 = tail call i32 @concat(i8* %0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0))
%21 = tail call i32 @strlen(i8* %0)
%22 = srem i32 %21, 8
%23 = sub nsw i32 8, %22
%24 = icmp eq i32 %22, 0
br i1 %24, label %30, label %25
25: ; preds = %19, %25
%26 = phi i32 [ %28, %25 ], [ 0, %19 ]
%27 = tail call i32 @concat(i8* %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%28 = add nuw nsw i32 %26, 1
%29 = icmp eq i32 %28, %23
br i1 %29, label %30, label %25
30: ; preds = %25, %19
%31 = tail call i32 @strlen(i8* %0)
%32 = sub nsw i32 %8, %31
%33 = sdiv i32 %32, 8
%34 = icmp sgt i32 %32, 7
br i1 %34, label %35, label %43
35: ; preds = %30, %35
%36 = phi i32 [ %41, %35 ], [ 0, %30 ]
%37 = and i32 %36, 1
%38 = icmp eq i32 %37, 0
%39 = select i1 %38, 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)
%40 = tail call i32 @concat(i8* %0, i8* %39)
%41 = add nuw nsw i32 %36, 1
%42 = icmp eq i32 %41, %33
br i1 %42, label %43, label %35
43: ; preds = %35, %14, %12, %30
%44 = select i1 %7, i32 4, i32 5
%45 = zext i32 %44 to i64
br label %46
46: ; preds = %43, %108
%47 = phi i64 [ 0, %43 ], [ %109, %108 ]
%48 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 %47
%49 = shl nsw i64 %47, 3
%50 = getelementptr inbounds i8, i8* %0, i64 %49
%51 = load i8, i8* %50
%52 = icmp eq i8 %51, 49
%53 = select i1 %52, i8 -128, i8 0
store i8 %53, i8* %48
%54 = or i64 %49, 1
%55 = getelementptr inbounds i8, i8* %0, i64 %54
%56 = load i8, i8* %55
%57 = icmp eq i8 %56, 49
br i1 %57, label %58, label %60
58: ; preds = %46
%59 = or i8 %53, 64
store i8 %59, i8* %48
br label %60
60: ; preds = %58, %46
%61 = phi i8 [ %59, %58 ], [ %53, %46 ]
%62 = or i64 %49, 2
%63 = getelementptr inbounds i8, i8* %0, i64 %62
%64 = load i8, i8* %63
%65 = icmp eq i8 %64, 49
br i1 %65, label %66, label %68
66: ; preds = %60
%67 = add i8 %61, 32
store i8 %67, i8* %48
br label %68
68: ; preds = %66, %60
%69 = phi i8 [ %67, %66 ], [ %61, %60 ]
%70 = or i64 %49, 3
%71 = getelementptr inbounds i8, i8* %0, i64 %70
%72 = load i8, i8* %71
%73 = icmp eq i8 %72, 49
br i1 %73, label %74, label %76
74: ; preds = %68
%75 = add i8 %69, 16
store i8 %75, i8* %48
br label %76
76: ; preds = %74, %68
%77 = phi i8 [ %75, %74 ], [ %69, %68 ]
%78 = or i64 %49, 4
%79 = getelementptr inbounds i8, i8* %0, i64 %78
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 49
br i1 %81, label %82, label %84
82: ; preds = %76
%83 = add i8 %77, 8
store i8 %83, i8* %48
br label %84
84: ; preds = %82, %76
%85 = phi i8 [ %83, %82 ], [ %77, %76 ]
%86 = or i64 %49, 5
%87 = getelementptr inbounds i8, i8* %0, i64 %86
%88 = load i8, i8* %87
%89 = icmp eq i8 %88, 49
br i1 %89, label %90, label %92
90: ; preds = %84
%91 = add i8 %85, 4
store i8 %91, i8* %48
br label %92
92: ; preds = %90, %84
%93 = phi i8 [ %91, %90 ], [ %85, %84 ]
%94 = or i64 %49, 6
%95 = getelementptr inbounds i8, i8* %0, i64 %94
%96 = load i8, i8* %95
%97 = icmp eq i8 %96, 49
br i1 %97, label %98, label %100
98: ; preds = %92
%99 = add i8 %93, 2
store i8 %99, i8* %48
br label %100
100: ; preds = %98, %92
%101 = phi i8 [ %99, %98 ], [ %93, %92 ]
%102 = or i64 %49, 7
%103 = getelementptr inbounds i8, i8* %0, i64 %102
%104 = load i8, i8* %103
%105 = icmp eq i8 %104, 49
br i1 %105, label %106, label %108
106: ; preds = %100
%107 = add i8 %101, 1
store i8 %107, i8* %48
br label %108
108: ; preds = %100, %106
%109 = add nuw nsw i64 %47, 1
%110 = icmp eq i64 %109, %45
br i1 %110, label %111, label %46
111: ; preds = %108
%112 = select i1 %7, i32 6, i32 5
%113 = tail call i32 @rs_init_gf(i32 285)
%114 = tail call i32 @rs_init_code(i32 %112, i32 0)
%115 = call i32 @rs_encode(i32 %44, i8* %5, i8* %6)
%116 = call i32 (...) @rs_free()
%117 = zext i32 %112 to i64
%118 = zext i32 %112 to i64
br label %119
119: ; preds = %111, %119
%120 = phi i64 [ 0, %111 ], [ %126, %119 ]
%121 = xor i64 %120, -1
%122 = add nsw i64 %117, %121
%123 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 %122
%124 = load i8, i8* %123
%125 = call i32 @qr_diran(i8* %0, i8 zeroext %124, i32 128)
%126 = add nuw nsw i64 %120, 1
%127 = icmp eq i64 %126, %118
br i1 %127, label %128, label %119
128: ; preds = %119
ret void
}