#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ fprintf(int /*<<< orphan*/ *, char *, ...);
unsigned int prepare_selector(int, int);
int /*<<< orphan*/ recurse_other(int /*<<< orphan*/ *, unsigned int,
                                 unsigned int *, int, int /*<<< orphan*/,
                                 int /*<<< orphan*/, int);
int print_verilog_line(FILE *out, const char bits[(8 + 3)],
                       const char vbits[(8 + 3)],
                       const int codes[512][7 - 0 + 1]) {
  int i;
  int n_bits[4] = {0, 0, 0, 0};
  int common_vals[(8 + 3)], common_inds[(8 + 3)];
  int other_inds[(8 + 3)];
  unsigned other_mask = 0, m;
  unsigned other_codes[512 * (7 - 0 + 1)];
  int n_other;
  for (i = 0, m = 1; i < (8 + 3); ++i, m <<= 1) {
    int n = n_bits[bits[i]]++;
    switch (bits[i]) {
    case 0:
      common_vals[n] = (vbits[i] == 0) ? 0 : 1;
      common_inds[n] = i;
      break;
    case 1:
      other_inds[n] = i;
      other_mask |= m;
      break;
    }
  }
  if (n_bits[1]) {
    int j, t;
    n_other = 0;
    for (j = 0; j < 512; ++j) {
      for (t = 0; t <= 7; ++t) {
        unsigned int val = prepare_selector(j, t) & other_mask;
        int r = -1;
        if (codes[j][t] != 1)
          continue;
        for (i = 0; i < n_other; ++i) {
          if (other_codes[i] == val) {
            r = i;
            break;
          }
        }
        if (r == -1)
          other_codes[n_other++] = val;
      }
    }
    if (n_other == (1 << n_bits[1]))
      n_bits[1] = 0;
  }
  if (!n_bits[0] && !n_bits[1]) {
    fprintf(out, "1'b1");
    return 0;
  }
  if (n_bits[0]) {
    fprintf(out, "({");
    for (i = 0; i < n_bits[0]; ++i) {
      fprintf(out, "L[%i]", common_inds[i]);
      if (i < n_bits[0] - 1)
        fprintf(out, ",");
    }
    fprintf(out, "} == %i'b", n_bits[0]);
    for (i = 0; i < n_bits[0]; ++i) {
      fprintf(out, "%i", common_vals[i]);
    }
    fprintf(out, ")");
    if (n_bits[1])
      fprintf(out, " && (");
  }
  if (n_bits[1]) {
    recurse_other(out, other_mask, other_codes, n_other, 0, 0, 1);
  }
  if (n_bits[0]) {
    if (n_bits[1])
      fprintf(out, ")");
  }
  return 0;
}


x86 assembly (clang, -O0):
<print_verilog_line>:
push   %rbp
mov    %rsp,%rbp
sub    $0x4110,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
lea    -0x40(%rbp),%rdi
xor    %esi,%esi
mov    $0x10,%edx
call   1040 <memset@plt>
movl   $0x0,-0xd4(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x1,-0xd8(%rbp)
cmpl   $0xb,-0x2c(%rbp)
jge    1262 <print_verilog_line+0x122>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbq (%rax,%rcx,1),%rcx
mov    -0x40(%rbp,%rcx,4),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x40(%rbp,%rcx,4)
mov    %eax,-0x40e8(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x40fc(%rbp)
test   %eax,%eax
je     11e3 <print_verilog_line+0xa3>
jmp    11cf <print_verilog_line+0x8f>
mov    -0x40fc(%rbp),%eax
sub    $0x1,%eax
je     121d <print_verilog_line+0xdd>
jmp    1240 <print_verilog_line+0x100>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
mov    $0x1,%ecx
xor    %eax,%eax
cmp    $0x0,%edx
cmove  %eax,%ecx
movslq -0x40e8(%rbp),%rax
mov    %ecx,-0x70(%rbp,%rax,4)
mov    -0x2c(%rbp),%ecx
movslq -0x40e8(%rbp),%rax
mov    %ecx,-0xa0(%rbp,%rax,4)
jmp    1240 <print_verilog_line+0x100>
mov    -0x2c(%rbp),%ecx
movslq -0x40e8(%rbp),%rax
mov    %ecx,-0xd0(%rbp,%rax,4)
mov    -0xd8(%rbp),%eax
or     -0xd4(%rbp),%eax
mov    %eax,-0xd4(%rbp)
jmp    1245 <print_verilog_line+0x105>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xd8(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0xd8(%rbp)
jmp    1186 <print_verilog_line+0x46>
cmpl   $0x0,-0x3c(%rbp)
je     13c9 <print_verilog_line+0x289>
movl   $0x0,-0x40e4(%rbp)
movl   $0x0,-0x40ec(%rbp)
cmpl   $0x200,-0x40ec(%rbp)
jge    13a3 <print_verilog_line+0x263>
movl   $0x0,-0x40f0(%rbp)
cmpl   $0x7,-0x40f0(%rbp)
jg     138a <print_verilog_line+0x24a>
mov    -0x40ec(%rbp),%edi
mov    -0x40f0(%rbp),%esi
call   1050 <prepare_selector@plt>
and    -0xd4(%rbp),%eax
mov    %eax,-0x40f4(%rbp)
movl   $0xffffffff,-0x40f8(%rbp)
ff ff ff
mov    -0x28(%rbp),%rax
movslq -0x40ec(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
movslq -0x40f0(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
je     12f6 <print_verilog_line+0x1b6>
jmp    1376 <print_verilog_line+0x236>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x40e4(%rbp),%eax
jge    1344 <print_verilog_line+0x204>
movslq -0x2c(%rbp),%rax
mov    -0x40e0(%rbp,%rax,4),%eax
cmp    -0x40f4(%rbp),%eax
jne    1331 <print_verilog_line+0x1f1>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x40f8(%rbp)
jmp    1344 <print_verilog_line+0x204>
jmp    1336 <print_verilog_line+0x1f6>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12fd <print_verilog_line+0x1bd>
cmpl   $0xffffffff,-0x40f8(%rbp)
jne    1371 <print_verilog_line+0x231>
mov    -0x40f4(%rbp),%ecx
mov    -0x40e4(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x40e4(%rbp)
cltq
mov    %ecx,-0x40e0(%rbp,%rax,4)
jmp    1376 <print_verilog_line+0x236>
mov    -0x40f0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40f0(%rbp)
jmp    129a <print_verilog_line+0x15a>
jmp    138f <print_verilog_line+0x24f>
mov    -0x40ec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40ec(%rbp)
jmp    1280 <print_verilog_line+0x140>
mov    -0x40e4(%rbp),%eax
mov    -0x3c(%rbp),%ecx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
cmp    %ecx,%eax
jne    13c4 <print_verilog_line+0x284>
movl   $0x0,-0x3c(%rbp)
jmp    13c9 <print_verilog_line+0x289>
cmpl   $0x0,-0x40(%rbp)
jne    13fb <print_verilog_line+0x2bb>
cmpl   $0x0,-0x3c(%rbp)
jne    13fb <print_verilog_line+0x2bb>
mov    -0x10(%rbp),%rdi
lea    0xc18(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
movl   $0x0,-0x4(%rbp)
jmp    1565 <print_verilog_line+0x425>
cmpl   $0x0,-0x40(%rbp)
je     1500 <print_verilog_line+0x3c0>
mov    -0x10(%rbp),%rdi
lea    0xbf5(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    147d <print_verilog_line+0x33d>
mov    -0x10(%rbp),%rdi
movslq -0x2c(%rbp),%rax
mov    -0xa0(%rbp,%rax,4),%edx
lea    0xbc8(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
mov    -0x2c(%rbp),%eax
mov    -0x40(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    146a <print_verilog_line+0x32a>
mov    -0x10(%rbp),%rdi
lea    0xbab(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
jmp    146f <print_verilog_line+0x32f>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    141e <print_verilog_line+0x2de>
mov    -0x10(%rbp),%rdi
mov    -0x40(%rbp),%edx
lea    0xb85(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    14cd <print_verilog_line+0x38d>
mov    -0x10(%rbp),%rdi
movslq -0x2c(%rbp),%rax
mov    -0x70(%rbp,%rax,4),%edx
lea    0xb62(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1499 <print_verilog_line+0x359>
mov    -0x10(%rbp),%rdi
lea    0xb45(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
cmpl   $0x0,-0x3c(%rbp)
je     14fb <print_verilog_line+0x3bb>
mov    -0x10(%rbp),%rdi
lea    0xb2b(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
jmp    1500 <print_verilog_line+0x3c0>
cmpl   $0x0,-0x3c(%rbp)
je     1533 <print_verilog_line+0x3f3>
mov    -0x10(%rbp),%rdi
mov    -0xd4(%rbp),%esi
lea    -0x40e0(%rbp),%rdx
mov    -0x40e4(%rbp),%ecx
xor    %r9d,%r9d
mov    %r9d,%r8d
movl   $0x1,(%rsp)
call   1030 <recurse_other@plt>
cmpl   $0x0,-0x40(%rbp)
je     155e <print_verilog_line+0x41e>
cmpl   $0x0,-0x3c(%rbp)
je     1559 <print_verilog_line+0x419>
mov    -0x10(%rbp),%rdi
lea    0xacb(%rip),%rsi
mov    $0x0,%al
call   1060 <fprintf@plt>
jmp    155e <print_verilog_line+0x41e>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x4110,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_verilog_line>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x4098,%rsp
mov    %rcx,%r13
mov    %rdi,0x10(%rsp)
xorps  %xmm0,%xmm0
movaps %xmm0,0x20(%rsp)
xor    %eax,%eax
mov    $0x1,%ecx
xor    %r12d,%r12d
jmp    118f <print_verilog_line+0x3f>
nopl   (%rax)
or     %ecx,%r12d
add    $0x1,%rax
add    %ecx,%ecx
cmp    $0xb,%rax
je     11c2 <print_verilog_line+0x72>
movsbl (%rsi,%rax,1),%ebp
movslq %ebp,%rbx
movslq 0x20(%rsp,%rbx,4),%r8
lea    0x1(%r8),%edi
mov    %edi,0x20(%rsp,%rbx,4)
cmp    $0x1,%ebx
je     1180 <print_verilog_line+0x30>
test   %ebp,%ebp
jne    1183 <print_verilog_line+0x33>
xor    %edi,%edi
cmpb   $0x0,(%rdx,%rax,1)
setne  %dil
mov    %edi,0x60(%rsp,%r8,4)
mov    %eax,0x30(%rsp,%r8,4)
jmp    1183 <print_verilog_line+0x33>
mov    0x24(%rsp),%r14d
test   %r14d,%r14d
je     1268 <print_verilog_line+0x118>
xor    %ebp,%ebp
xor    %ebx,%ebx
jmp    11ed <print_verilog_line+0x9d>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%rbp
cmp    $0x200,%rbp
je     1254 <print_verilog_line+0x104>
xor    %r15d,%r15d
jmp    1217 <print_verilog_line+0xc7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq %ebx,%rcx
add    $0x1,%ebx
mov    %eax,0x90(%rsp,%rcx,4)
add    $0x1,%r15
cmp    $0x8,%r15
je     11e0 <print_verilog_line+0x90>
mov    %ebp,%edi
mov    %r15d,%esi
call   1040 <prepare_selector@plt>
mov    %rbp,%rcx
shl    $0x5,%rcx
add    %r13,%rcx
cmpl   $0x1,(%rcx,%r15,4)
jne    120d <print_verilog_line+0xbd>
and    %r12d,%eax
test   %ebx,%ebx
jle    1200 <print_verilog_line+0xb0>
mov    %ebx,%ecx
xor    %edx,%edx
nopl   (%rax)
cmp    %eax,0x90(%rsp,%rdx,4)
je     120d <print_verilog_line+0xbd>
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    1240 <print_verilog_line+0xf0>
jmp    1200 <print_verilog_line+0xb0>
mov    $0x1,%eax
mov    %r14d,%ecx
shl    %cl,%eax
xor    %ebp,%ebp
cmp    %eax,%ebx
cmovne %r14d,%ebp
jmp    126a <print_verilog_line+0x11a>
xor    %ebp,%ebp
mov    0x10(%rsp),%r13
mov    0x20(%rsp),%r15d
mov    %r15d,%eax
or     %ebp,%eax
je     12f3 <print_verilog_line+0x1a3>
test   %r15,%r15
je     135c <print_verilog_line+0x20c>
mov    %ebp,0x1c(%rsp)
lea    0xd76(%rip),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
mov    %r13,%rcx
call   1070 <fwrite@plt>
test   %r15d,%r15d
jle    1362 <print_verilog_line+0x212>
lea    -0x1(%r15),%r13d
lea    0xd53(%rip),%rbp
xor    %r14d,%r14d
jmp    12c9 <print_verilog_line+0x179>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r14
cmp    %r14,%r15
je     1311 <print_verilog_line+0x1c1>
mov    0x30(%rsp,%r14,4),%edx
mov    0x10(%rsp),%rdi
mov    %rbp,%rsi
xor    %eax,%eax
call   1060 <fprintf@plt>
cmp    %r13,%r14
jae    12c0 <print_verilog_line+0x170>
mov    $0x2c,%edi
mov    0x10(%rsp),%rsi
call   1050 <fputc@plt>
jmp    12c0 <print_verilog_line+0x170>
lea    0xd06(%rip),%rdi
mov    $0x4,%esi
mov    $0x1,%edx
mov    %r13,%rcx
call   1070 <fwrite@plt>
jmp    13dc <print_verilog_line+0x28c>
lea    0xcf6(%rip),%rsi
mov    0x10(%rsp),%r13
mov    %r13,%rdi
mov    %r15d,%edx
xor    %eax,%eax
call   1060 <fprintf@plt>
test   %r15d,%r15d
jle    1376 <print_verilog_line+0x226>
lea    0xce2(%rip),%r14
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
mov    0x60(%rsp,%rbp,4),%edx
mov    %r13,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1060 <fprintf@plt>
add    $0x1,%rbp
cmp    %rbp,%r15
jne    1340 <print_verilog_line+0x1f0>
jmp    1376 <print_verilog_line+0x226>
test   %ebp,%ebp
jne    13a4 <print_verilog_line+0x254>
jmp    13dc <print_verilog_line+0x28c>
lea    0xca5(%rip),%rsi
mov    %r13,%rdi
mov    %r15d,%edx
xor    %eax,%eax
call   1060 <fprintf@plt>
mov    $0x29,%edi
mov    %r13,%rsi
call   1050 <fputc@plt>
mov    0x1c(%rsp),%ebp
test   %ebp,%ebp
je     13c6 <print_verilog_line+0x276>
lea    0xc89(%rip),%rdi
mov    $0x5,%esi
mov    $0x1,%edx
mov    %r13,%rcx
call   1070 <fwrite@plt>
movl   $0x1,(%rsp)
lea    0x90(%rsp),%rdx
mov    %r13,%rdi
mov    %r12d,%esi
mov    %ebx,%ecx
xor    %r8d,%r8d
xor    %r9d,%r9d
call   1030 <recurse_other@plt>
test   %r15,%r15
je     13dc <print_verilog_line+0x28c>
test   %ebp,%ebp
je     13dc <print_verilog_line+0x28c>
mov    $0x29,%edi
mov    %r13,%rsi
call   1050 <fputc@plt>
xor    %eax,%eax
add    $0x4098,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [5 x i8] c"1'b1\00"
@.str.1 = [3 x i8] c"({\00"
@.str.2 = [6 x i8] c"L[%i]\00"
@.str.4 = [10 x i8] c"} == %i'b\00"
@.str.5 = [3 x i8] c"%i\00"
@.str.7 = [6 x i8] c" && (\00"
define i32 @print_verilog_line(i32* %0, i8* nocapture %1, i8* nocapture %2, [8 x i32]* nocapture %3) {
%5 = alloca [4 x i32]
%6 = alloca [11 x i32]
%7 = alloca [11 x i32]
%8 = alloca [4096 x i32]
%9 = bitcast [4 x i32]* %5 to i8*
%10 = bitcast [11 x i32]* %6 to i8*
%11 = bitcast [11 x i32]* %7 to i8*
%12 = bitcast [4096 x i32]* %8 to i8*
br label %13
13: ; preds = %4, %35
%14 = phi i64 [ 0, %4 ], [ %37, %35 ]
%15 = phi i32 [ 1, %4 ], [ %38, %35 ]
%16 = phi i32 [ 0, %4 ], [ %36, %35 ]
%17 = getelementptr inbounds i8, i8* %1, i64 %14
%18 = load i8, i8* %17
%19 = sext i8 %18 to i64
%20 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 %19
%21 = load i32, i32* %20
%22 = add nsw i32 %21, 1
store i32 %22, i32* %20
%23 = sext i8 %18 to i32
switch i32 %23, label %35 [
i32 0, label %24
i32 1, label %33
]
24: ; preds = %13
%25 = getelementptr inbounds i8, i8* %2, i64 %14
%26 = load i8, i8* %25
%27 = icmp ne i8 %26, 0
%28 = zext i1 %27 to i32
%29 = sext i32 %21 to i64
%30 = getelementptr inbounds [11 x i32], [11 x i32]* %6, i64 0, i64 %29
store i32 %28, i32* %30
%31 = getelementptr inbounds [11 x i32], [11 x i32]* %7, i64 0, i64 %29
%32 = trunc i64 %14 to i32
store i32 %32, i32* %31
br label %35
33: ; preds = %13
%34 = or i32 %15, %16
br label %35
35: ; preds = %13, %33, %24
%36 = phi i32 [ %16, %13 ], [ %34, %33 ], [ %16, %24 ]
%37 = add nuw nsw i64 %14, 1
%38 = shl i32 %15, 1
%39 = icmp eq i64 %37, 11
br i1 %39, label %40, label %13
40: ; preds = %35
%41 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 1
%42 = load i32, i32* %41
%43 = icmp eq i32 %42, 0
br i1 %43, label %84, label %44
44: ; preds = %40, %77
%45 = phi i64 [ %78, %77 ], [ 0, %40 ]
%46 = phi i32 [ %74, %77 ], [ 0, %40 ]
%47 = trunc i64 %45 to i32
br label %48
48: ; preds = %44, %73
%49 = phi i64 [ 0, %44 ], [ %75, %73 ]
%50 = phi i32 [ %46, %44 ], [ %74, %73 ]
%51 = trunc i64 %49 to i32
%52 = tail call i32 @prepare_selector(i32 %47, i32 %51)
%53 = and i32 %52, %36
%54 = getelementptr inbounds [8 x i32], [8 x i32]* %3, i64 %45, i64 %49
%55 = load i32, i32* %54
%56 = icmp eq i32 %55, 1
br i1 %56, label %57, label %73
57: ; preds = %48
%58 = icmp sgt i32 %50, 0
br i1 %58, label %59, label %69
59: ; preds = %57
%60 = zext i32 %50 to i64
br label %63
61: ; preds = %63
%62 = icmp eq i64 %68, %60
br i1 %62, label %69, label %63
63: ; preds = %59, %61
%64 = phi i64 [ 0, %59 ], [ %68, %61 ]
%65 = getelementptr inbounds [4096 x i32], [4096 x i32]* %8, i64 0, i64 %64
%66 = load i32, i32* %65
%67 = icmp eq i32 %66, %53
%68 = add nuw nsw i64 %64, 1
br i1 %67, label %73, label %61
69: ; preds = %61, %57
%70 = add nsw i32 %50, 1
%71 = sext i32 %50 to i64
%72 = getelementptr inbounds [4096 x i32], [4096 x i32]* %8, i64 0, i64 %71
store i32 %53, i32* %72
br label %73
73: ; preds = %63, %69, %48
%74 = phi i32 [ %50, %48 ], [ %70, %69 ], [ %50, %63 ]
%75 = add nuw nsw i64 %49, 1
%76 = icmp eq i64 %75, 8
br i1 %76, label %77, label %48
77: ; preds = %73
%78 = add nuw nsw i64 %45, 1
%79 = icmp eq i64 %78, 512
br i1 %79, label %80, label %44
80: ; preds = %77
%81 = shl nuw i32 1, %42
%82 = icmp eq i32 %74, %81
%83 = select i1 %82, i32 0, i32 %42
br label %84
84: ; preds = %80, %40
%85 = phi i32 [ %83, %80 ], [ 0, %40 ]
%86 = phi i32 [ %74, %80 ], [ undef, %40 ]
%87 = getelementptr inbounds [4 x i32], [4 x i32]* %5, i64 0, i64 0
%88 = load i32, i32* %87
%89 = icmp ne i32 %88, 0
%90 = icmp ne i32 %85, 0
%91 = select i1 %89, i1 true, i1 %90
br i1 %91, label %94, label %92
92: ; preds = %84
%93 = tail call i64 @fwrite(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i64 4, i64 1, i32* %0)
br label %140
94: ; preds = %84
br i1 %89, label %95, label %131
95: ; preds = %94
%96 = tail call i64 @fwrite(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0), i64 2, i64 1, i32* %0)
%97 = icmp sgt i32 %88, 0
br i1 %97, label %100, label %98
98: ; preds = %95
%99 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i64 0, i64 0), i32 %88)
br label %126
100: ; preds = %95
%101 = add nsw i32 %88, -1
%102 = zext i32 %101 to i64
%103 = zext i32 %88 to i64
br label %104
104: ; preds = %100, %112
%105 = phi i64 [ 0, %100 ], [ %113, %112 ]
%106 = getelementptr inbounds [11 x i32], [11 x i32]* %7, i64 0, i64 %105
%107 = load i32, i32* %106
%108 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0), i32 %107)
%109 = icmp ult i64 %105, %102
br i1 %109, label %110, label %112
110: ; preds = %104
%111 = tail call i32 @fputc(i32 44, i32* %0)
br label %112
112: ; preds = %104, %110
%113 = add nuw nsw i64 %105, 1
%114 = icmp eq i64 %113, %103
br i1 %114, label %115, label %104
115: ; preds = %112
%116 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i64 0, i64 0), i32 %88)
br i1 %97, label %117, label %126
117: ; preds = %115
%118 = zext i32 %88 to i64
br label %119
119: ; preds = %117, %119
%120 = phi i64 [ 0, %117 ], [ %124, %119 ]
%121 = getelementptr inbounds [11 x i32], [11 x i32]* %6, i64 0, i64 %120
%122 = load i32, i32* %121
%123 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i64 0, i64 0), i32 %122)
%124 = add nuw nsw i64 %120, 1
%125 = icmp eq i64 %124, %118
br i1 %125, label %126, label %119
126: ; preds = %119, %98, %115
%127 = tail call i32 @fputc(i32 41, i32* %0)
%128 = icmp eq i32 %85, 0
br i1 %128, label %136, label %129
129: ; preds = %126
%130 = tail call i64 @fwrite(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0), i64 5, i64 1, i32* %0)
br label %133
131: ; preds = %94
%132 = icmp eq i32 %85, 0
br i1 %132, label %140, label %133
133: ; preds = %129, %131
%134 = getelementptr inbounds [4096 x i32], [4096 x i32]* %8, i64 0, i64 0
%135 = call i32 @recurse_other(i32* %0, i32 %36, i32* %134, i32 %86, i32 0, i32 0, i32 1)
br label %136
136: ; preds = %126, %133
%137 = select i1 %89, i1 %90, i1 false
br i1 %137, label %138, label %140
138: ; preds = %136
%139 = call i32 @fputc(i32 41, i32* %0)
br label %140
140: ; preds = %131, %136, %138, %92
ret i32 0
}