void normal(void) {
  struct ic_labeller *labeller_1 = 0;
  struct ic_labeller *labeller_2 = 0;
  char *ch = 0;
  puts("testing labeller");
  labeller_1 = ic_labeller_new("foo_");
  assert(labeller_1);
  labeller_2 = ic_labeller_new("bar_");
  assert(labeller_2);
  ch = ic_labeller_generate(labeller_1);
  assert(ch);
  assert(!strcmp("foo_0", ch));
  free(ch);
  ch = ic_labeller_generate(labeller_2);
  assert(ch);
  assert(!strcmp("bar_0", ch));
  free(ch);
  ch = ic_labeller_generate(labeller_1);
  assert(ch);
  assert(!strcmp("foo_1", ch));
  free(ch);
  ch = ic_labeller_generate(labeller_2);
  assert(ch);
  assert(!strcmp("bar_1", ch));
  free(ch);
  ch = ic_labeller_generate(labeller_1);
  assert(ch);
  assert(!strcmp("foo_2", ch));
  free(ch);
  ch = ic_labeller_generate(labeller_2);
  assert(ch);
  assert(!strcmp("bar_2", ch));
  free(ch);
  assert(ic_labeller_destroy(labeller_1, 1));
  assert(ic_labeller_destroy(labeller_2, 1));
  puts("success");
}


x86 assembly (clang, -O0):
<normal>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movq   $0x0,-0x8(%rbp)
movq   $0x0,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
lea    0xe69(%rip),%rdi
mov    $0x0,%al
call   1040 <puts@plt>
lea    0xe6c(%rip),%rdi
mov    $0x0,%al
call   1080 <ic_labeller_new@plt>
cltq
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
lea    0xe52(%rip),%rdi
mov    $0x0,%al
call   1080 <ic_labeller_new@plt>
cltq
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   1090 <ic_labeller_generate@plt>
cltq
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rsi
lea    0xe18(%rip),%rdi
call   1060 <strcmp@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1090 <ic_labeller_generate@plt>
cltq
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rsi
lea    0xdd5(%rip),%rdi
call   1060 <strcmp@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   1090 <ic_labeller_generate@plt>
cltq
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rsi
lea    0xd92(%rip),%rdi
call   1060 <strcmp@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1090 <ic_labeller_generate@plt>
cltq
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rsi
lea    0xd4f(%rip),%rdi
call   1060 <strcmp@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   1090 <ic_labeller_generate@plt>
cltq
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rsi
lea    0xd0c(%rip),%rdi
call   1060 <strcmp@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1090 <ic_labeller_generate@plt>
cltq
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rsi
lea    0xcc9(%rip),%rdi
call   1060 <strcmp@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x8(%rbp),%rdi
mov    $0x1,%esi
mov    $0x0,%al
call   1050 <ic_labeller_destroy@plt>
mov    %eax,%edi
mov    $0x0,%al
call   1070 <assert@plt>
mov    -0x10(%rbp),%rdi
mov    $0x1,%esi
mov    $0x0,%al
call   1050 <ic_labeller_destroy@plt>
mov    %eax,%edi
mov    $0x0,%al
call   1070 <assert@plt>
lea    0xc74(%rip),%rdi
mov    $0x0,%al
call   1040 <puts@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<normal>:
push   %r15
push   %r14
push   %rbx
lea    0xe84(%rip),%rdi
xor    %eax,%eax
call   1040 <puts@plt>
lea    0xe87(%rip),%rdi
xor    %eax,%eax
call   1080 <ic_labeller_new@plt>
movslq %eax,%r14
mov    %r14,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xe71(%rip),%rdi
xor    %eax,%eax
call   1080 <ic_labeller_new@plt>
movslq %eax,%r15
mov    %r15,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
mov    %r14,%rdi
xor    %eax,%eax
call   1090 <ic_labeller_generate@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xe44(%rip),%rdi
mov    %rbx,%rsi
call   1060 <strcmp@plt>
xor    %edi,%edi
test   %eax,%eax
sete   %dil
xor    %eax,%eax
call   1070 <assert@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %r15,%rdi
xor    %eax,%eax
call   1090 <ic_labeller_generate@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xe0d(%rip),%rdi
mov    %rbx,%rsi
call   1060 <strcmp@plt>
xor    %edi,%edi
test   %eax,%eax
sete   %dil
xor    %eax,%eax
call   1070 <assert@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %r14,%rdi
xor    %eax,%eax
call   1090 <ic_labeller_generate@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xdd6(%rip),%rdi
mov    %rbx,%rsi
call   1060 <strcmp@plt>
xor    %edi,%edi
test   %eax,%eax
sete   %dil
xor    %eax,%eax
call   1070 <assert@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %r15,%rdi
xor    %eax,%eax
call   1090 <ic_labeller_generate@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xd9f(%rip),%rdi
mov    %rbx,%rsi
call   1060 <strcmp@plt>
xor    %edi,%edi
test   %eax,%eax
sete   %dil
xor    %eax,%eax
call   1070 <assert@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %r14,%rdi
xor    %eax,%eax
call   1090 <ic_labeller_generate@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xd68(%rip),%rdi
mov    %rbx,%rsi
call   1060 <strcmp@plt>
xor    %edi,%edi
test   %eax,%eax
sete   %dil
xor    %eax,%eax
call   1070 <assert@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %r15,%rdi
xor    %eax,%eax
call   1090 <ic_labeller_generate@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xd31(%rip),%rdi
mov    %rbx,%rsi
call   1060 <strcmp@plt>
xor    %edi,%edi
test   %eax,%eax
sete   %dil
xor    %eax,%eax
call   1070 <assert@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %r14,%rdi
mov    $0x1,%esi
xor    %eax,%eax
call   1050 <ic_labeller_destroy@plt>
mov    %eax,%edi
xor    %eax,%eax
call   1070 <assert@plt>
mov    %r15,%rdi
mov    $0x1,%esi
xor    %eax,%eax
call   1050 <ic_labeller_destroy@plt>
mov    %eax,%edi
xor    %eax,%eax
call   1070 <assert@plt>
lea    0xce1(%rip),%rdi
xor    %eax,%eax
pop    %rbx
pop    %r14
pop    %r15
jmp    1040 <puts@plt>

LLVM IR (-O0):
%struct.ic_labeller = type opaque
@.str = [17 x i8] c"testing labeller\00"
@.str.1 = [5 x i8] c"foo_\00"
@.str.2 = [5 x i8] c"bar_\00"
@.str.3 = [6 x i8] c"foo_0\00"
@.str.4 = [6 x i8] c"bar_0\00"
@.str.5 = [6 x i8] c"foo_1\00"
@.str.6 = [6 x i8] c"bar_1\00"
@.str.7 = [6 x i8] c"foo_2\00"
@.str.8 = [6 x i8] c"bar_2\00"
@.str.9 = [8 x i8] c"success\00"
define void @normal() {
%1 = alloca %struct.ic_labeller*
%2 = alloca %struct.ic_labeller*
%3 = alloca i8*
store %struct.ic_labeller* null, %struct.ic_labeller** %1
store %struct.ic_labeller* null, %struct.ic_labeller** %2
store i8* null, i8** %3
%4 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i64 0, i64 0))
%5 = call i32 (i8*, ...) bitcast (i32 (...)* @ic_labeller_new to i32 (i8*, ...)*)(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0))
%6 = sext i32 %5 to i64
%7 = inttoptr i64 %6 to %struct.ic_labeller*
store %struct.ic_labeller* %7, %struct.ic_labeller** %1
%8 = load %struct.ic_labeller*, %struct.ic_labeller** %1
%9 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @assert to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %8)
%10 = call i32 (i8*, ...) bitcast (i32 (...)* @ic_labeller_new to i32 (i8*, ...)*)(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0))
%11 = sext i32 %10 to i64
%12 = inttoptr i64 %11 to %struct.ic_labeller*
store %struct.ic_labeller* %12, %struct.ic_labeller** %2
%13 = load %struct.ic_labeller*, %struct.ic_labeller** %2
%14 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @assert to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %13)
%15 = load %struct.ic_labeller*, %struct.ic_labeller** %1
%16 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %15)
%17 = sext i32 %16 to i64
%18 = inttoptr i64 %17 to i8*
store i8* %18, i8** %3
%19 = load i8*, i8** %3
%20 = call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %19)
%21 = load i8*, i8** %3
%22 = call i32 @strcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i64 0, i64 0), i8* %21)
%23 = icmp ne i32 %22, 0
%24 = xor i1 %23, true
%25 = zext i1 %24 to i32
%26 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %25)
%27 = load i8*, i8** %3
%28 = load %struct.ic_labeller*, %struct.ic_labeller** %2
%29 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %28)
%30 = sext i32 %29 to i64
%31 = inttoptr i64 %30 to i8*
store i8* %31, i8** %3
%32 = load i8*, i8** %3
%33 = call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %32)
%34 = load i8*, i8** %3
%35 = call i32 @strcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i64 0, i64 0), i8* %34)
%36 = icmp ne i32 %35, 0
%37 = xor i1 %36, true
%38 = zext i1 %37 to i32
%39 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %38)
%40 = load i8*, i8** %3
%41 = load %struct.ic_labeller*, %struct.ic_labeller** %1
%42 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %41)
%43 = sext i32 %42 to i64
%44 = inttoptr i64 %43 to i8*
store i8* %44, i8** %3
%45 = load i8*, i8** %3
%46 = call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %45)
%47 = load i8*, i8** %3
%48 = call i32 @strcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i64 0, i64 0), i8* %47)
%49 = icmp ne i32 %48, 0
%50 = xor i1 %49, true
%51 = zext i1 %50 to i32
%52 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %51)
%53 = load i8*, i8** %3
%54 = load %struct.ic_labeller*, %struct.ic_labeller** %2
%55 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %54)
%56 = sext i32 %55 to i64
%57 = inttoptr i64 %56 to i8*
store i8* %57, i8** %3
%58 = load i8*, i8** %3
%59 = call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %58)
%60 = load i8*, i8** %3
%61 = call i32 @strcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0), i8* %60)
%62 = icmp ne i32 %61, 0
%63 = xor i1 %62, true
%64 = zext i1 %63 to i32
%65 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %64)
%66 = load i8*, i8** %3
%67 = load %struct.ic_labeller*, %struct.ic_labeller** %1
%68 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %67)
%69 = sext i32 %68 to i64
%70 = inttoptr i64 %69 to i8*
store i8* %70, i8** %3
%71 = load i8*, i8** %3
%72 = call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %71)
%73 = load i8*, i8** %3
%74 = call i32 @strcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0), i8* %73)
%75 = icmp ne i32 %74, 0
%76 = xor i1 %75, true
%77 = zext i1 %76 to i32
%78 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %77)
%79 = load i8*, i8** %3
%80 = load %struct.ic_labeller*, %struct.ic_labeller** %2
%81 = call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %80)
%82 = sext i32 %81 to i64
%83 = inttoptr i64 %82 to i8*
store i8* %83, i8** %3
%84 = load i8*, i8** %3
%85 = call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %84)
%86 = load i8*, i8** %3
%87 = call i32 @strcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.8, i64 0, i64 0), i8* %86)
%88 = icmp ne i32 %87, 0
%89 = xor i1 %88, true
%90 = zext i1 %89 to i32
%91 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %90)
%92 = load i8*, i8** %3
%93 = load %struct.ic_labeller*, %struct.ic_labeller** %1
%94 = call i32 (%struct.ic_labeller*, i32, ...) bitcast (i32 (...)* @ic_labeller_destroy to i32 (%struct.ic_labeller*, i32, ...)*)(%struct.ic_labeller* %93, i32 1)
%95 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %94)
%96 = load %struct.ic_labeller*, %struct.ic_labeller** %2
%97 = call i32 (%struct.ic_labeller*, i32, ...) bitcast (i32 (...)* @ic_labeller_destroy to i32 (%struct.ic_labeller*, i32, ...)*)(%struct.ic_labeller* %96, i32 1)
%98 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %97)
%99 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.9, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
%struct.ic_labeller = type opaque
@.str = [17 x i8] c"testing labeller\00"
@.str.1 = [5 x i8] c"foo_\00"
@.str.2 = [5 x i8] c"bar_\00"
@.str.3 = [6 x i8] c"foo_0\00"
@.str.4 = [6 x i8] c"bar_0\00"
@.str.5 = [6 x i8] c"foo_1\00"
@.str.6 = [6 x i8] c"bar_1\00"
@.str.7 = [6 x i8] c"foo_2\00"
@.str.8 = [6 x i8] c"bar_2\00"
@.str.9 = [8 x i8] c"success\00"
define void @normal() {
%1 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i64 0, i64 0))
%2 = tail call i32 (i8*, ...) bitcast (i32 (...)* @ic_labeller_new to i32 (i8*, ...)*)(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0))
%3 = sext i32 %2 to i64
%4 = inttoptr i64 %3 to %struct.ic_labeller*
%5 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @assert to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %4)
%6 = tail call i32 (i8*, ...) bitcast (i32 (...)* @ic_labeller_new to i32 (i8*, ...)*)(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0))
%7 = sext i32 %6 to i64
%8 = inttoptr i64 %7 to %struct.ic_labeller*
%9 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @assert to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %8)
%10 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %4)
%11 = sext i32 %10 to i64
%12 = inttoptr i64 %11 to i8*
%13 = tail call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %12)
%14 = tail call i32 @strcmp(i8* dereferenceable(6) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i64 0, i64 0), i8* dereferenceable(1) %12)
%15 = icmp eq i32 %14, 0
%16 = zext i1 %15 to i32
%17 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %16)
tail call void @free(i8* %12)
%18 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %8)
%19 = sext i32 %18 to i64
%20 = inttoptr i64 %19 to i8*
%21 = tail call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %20)
%22 = tail call i32 @strcmp(i8* dereferenceable(6) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i64 0, i64 0), i8* dereferenceable(1) %20)
%23 = icmp eq i32 %22, 0
%24 = zext i1 %23 to i32
%25 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %24)
tail call void @free(i8* %20)
%26 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %4)
%27 = sext i32 %26 to i64
%28 = inttoptr i64 %27 to i8*
%29 = tail call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %28)
%30 = tail call i32 @strcmp(i8* dereferenceable(6) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i64 0, i64 0), i8* dereferenceable(1) %28)
%31 = icmp eq i32 %30, 0
%32 = zext i1 %31 to i32
%33 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %32)
tail call void @free(i8* %28)
%34 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %8)
%35 = sext i32 %34 to i64
%36 = inttoptr i64 %35 to i8*
%37 = tail call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %36)
%38 = tail call i32 @strcmp(i8* dereferenceable(6) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0), i8* dereferenceable(1) %36)
%39 = icmp eq i32 %38, 0
%40 = zext i1 %39 to i32
%41 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %40)
tail call void @free(i8* %36)
%42 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %4)
%43 = sext i32 %42 to i64
%44 = inttoptr i64 %43 to i8*
%45 = tail call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %44)
%46 = tail call i32 @strcmp(i8* dereferenceable(6) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0), i8* dereferenceable(1) %44)
%47 = icmp eq i32 %46, 0
%48 = zext i1 %47 to i32
%49 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %48)
tail call void @free(i8* %44)
%50 = tail call i32 (%struct.ic_labeller*, ...) bitcast (i32 (...)* @ic_labeller_generate to i32 (%struct.ic_labeller*, ...)*)(%struct.ic_labeller* %8)
%51 = sext i32 %50 to i64
%52 = inttoptr i64 %51 to i8*
%53 = tail call i32 (i8*, ...) bitcast (i32 (...)* @assert to i32 (i8*, ...)*)(i8* %52)
%54 = tail call i32 @strcmp(i8* dereferenceable(6) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.8, i64 0, i64 0), i8* dereferenceable(1) %52)
%55 = icmp eq i32 %54, 0
%56 = zext i1 %55 to i32
%57 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %56)
tail call void @free(i8* %52)
%58 = tail call i32 (%struct.ic_labeller*, i32, ...) bitcast (i32 (...)* @ic_labeller_destroy to i32 (%struct.ic_labeller*, i32, ...)*)(%struct.ic_labeller* %4, i32 1)
%59 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %58)
%60 = tail call i32 (%struct.ic_labeller*, i32, ...) bitcast (i32 (...)* @ic_labeller_destroy to i32 (%struct.ic_labeller*, i32, ...)*)(%struct.ic_labeller* %8, i32 1)
%61 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %60)
%62 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.9, i64 0, i64 0))
ret void
}