Skip to content

Instantly share code, notes, and snippets.

@luc-tielen
Created May 6, 2022 10:03
Show Gist options
  • Save luc-tielen/df3b95a0d6531314345482c150f3b5e0 to your computer and use it in GitHub Desktop.
Save luc-tielen/df3b95a0d6531314345482c150f3b5e0 to your computer and use it in GitHub Desktop.
Eclair "hello world"
#!/bin/bash
clang-9 -g3 -O0 -o program main.c test.ll -Wno-override-module
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
struct program;
extern struct program* eclair_program_init();
extern void eclair_program_destroy(struct program*);
extern void eclair_program_run(struct program*);
extern void eclair_add_facts(struct program*, uint16_t fact_type, uint32_t* data, size_t fact_count);
extern void eclair_add_fact(struct program*, uint16_t fact_type, uint32_t* data);
extern uint32_t* eclair_get_facts(struct program*, uint16_t fact_type);
extern void eclair_free_buffer(uint32_t* data);
int main(int argc, char** argv)
{
struct program* prog = eclair_program_init();
// edge(1,2), edge(2,3)
uint32_t data[] = {
1, 2,
2, 3
};
eclair_add_facts(prog, 0, data, 2);
eclair_program_run(prog);
// NOTE: normally you call btree_size here to figure out the size, but I know there are only 3 facts
uint32_t* data_out = eclair_get_facts(prog, 1);
printf("PATH: (%d, %d)\n", data_out[0], data_out[1]); // (1,2)
printf("PATH: (%d, %d)\n", data_out[2], data_out[3]); // (2,3)
printf("PATH: (%d, %d)\n", data_out[4], data_out[5]); // (1,3)
eclair_free_buffer(data_out);
eclair_program_destroy(prog);
return 0;
}
; ModuleID = 'eclair_code'
declare external ccc i8* @malloc(i32)
declare external ccc void @free(i8*)
declare external ccc void @llvm.memset.p0i8.i64(i8*, i8, i64, i1)
%column_t_0 = type i32
%value_t_0 = type [2 x %column_t_0]
%position_t_0 = type i16
%node_size_t_0 = type i16
%node_type_t_0 = type i1
%node_data_t_0 = type {%node_t_0*, %position_t_0, %node_size_t_0, %node_type_t_0}
%node_t_0 = type {%node_data_t_0, [30 x %value_t_0]}
%leaf_node_t_0 = type %node_t_0
%inner_node_t_0 = type {%node_t_0, [31 x %node_t_0*]}
%btree_iterator_t_0 = type {%node_t_0*, %position_t_0}
%btree_t_0 = type {%node_t_0*, %node_t_0*}
define external ccc i8 @btree_value_compare_0(%column_t_0 %lhs_0, %column_t_0 %rhs_0) {
; <label>:0:
%1 = icmp ult %column_t_0 %lhs_0, %rhs_0
br i1 %1, label %if_0, label %end_if_0
if_0:
ret i8 -1
end_if_0:
%2 = icmp ugt %column_t_0 %lhs_0, %rhs_0
%3 = select i1 %2, i8 1, i8 0
ret i8 %3
}
define external ccc i8 @btree_value_compare_values_0(%value_t_0* %lhs_0, %value_t_0* %rhs_0) {
comparison_0:
%0 = getelementptr %value_t_0, %value_t_0* %lhs_0, i32 0, i32 0
%1 = getelementptr %value_t_0, %value_t_0* %rhs_0, i32 0, i32 0
%2 = load %column_t_0, %column_t_0* %0
%3 = load %column_t_0, %column_t_0* %1
%4 = call ccc i8 @btree_value_compare_0(%column_t_0 %2, %column_t_0 %3)
%5 = icmp eq i8 %4, 0
br i1 %5, label %comparison_1, label %end_0
comparison_1:
%6 = getelementptr %value_t_0, %value_t_0* %lhs_0, i32 0, i32 1
%7 = getelementptr %value_t_0, %value_t_0* %rhs_0, i32 0, i32 1
%8 = load %column_t_0, %column_t_0* %6
%9 = load %column_t_0, %column_t_0* %7
%10 = call ccc i8 @btree_value_compare_0(%column_t_0 %8, %column_t_0 %9)
br label %end_0
end_0:
%11 = phi i8 [%4, %comparison_0], [%10, %comparison_1]
ret i8 %11
}
define external ccc %node_t_0* @btree_node_new_0(%node_type_t_0 %type_0) {
; <label>:0:
%1 = select %node_type_t_0 %type_0, i32 256, i32 504
%2 = call ccc i8* @malloc(i32 %1)
%3 = bitcast i8* %2 to %node_t_0*
%4 = getelementptr %node_t_0, %node_t_0* %3, i32 0, i32 0, i32 0
store %node_t_0* zeroinitializer, %node_t_0** %4
%5 = getelementptr %node_t_0, %node_t_0* %3, i32 0, i32 0, i32 1
store i16 0, %position_t_0* %5
%6 = getelementptr %node_t_0, %node_t_0* %3, i32 0, i32 0, i32 2
store i16 0, %node_size_t_0* %6
%7 = getelementptr %node_t_0, %node_t_0* %3, i32 0, i32 0, i32 3
store %node_type_t_0 %type_0, %node_type_t_0* %7
%8 = getelementptr %node_t_0, %node_t_0* %3, i32 0, i32 1
%9 = bitcast [30 x %value_t_0]* %8 to i8*
call ccc void @llvm.memset.p0i8.i64(i8* %9, i8 0, i64 240, i1 0)
%10 = icmp eq %node_type_t_0 %type_0, 1
br i1 %10, label %if_0, label %end_if_0
if_0:
%11 = bitcast %node_t_0* %3 to %inner_node_t_0*
%12 = getelementptr %inner_node_t_0, %inner_node_t_0* %11, i32 0, i32 1
%13 = bitcast [31 x %node_t_0*]* %12 to i8*
call ccc void @llvm.memset.p0i8.i64(i8* %13, i8 0, i64 248, i1 0)
br label %end_if_0
end_if_0:
ret %node_t_0* %3
}
define external ccc void @btree_node_delete_0(%node_t_0* %node_0) {
; <label>:0:
%1 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 3
%2 = load %node_type_t_0, %node_type_t_0* %1
%3 = icmp eq %node_type_t_0 %2, 1
br i1 %3, label %if_0, label %end_if_1
if_0:
%4 = bitcast %node_t_0* %node_0 to %inner_node_t_0*
%5 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%6 = load %node_size_t_0, %node_size_t_0* %5
br label %for_begin_0
for_begin_0:
%7 = phi i16 [0, %if_0], [%12, %end_if_0]
%8 = icmp ule i16 %7, %6
br i1 %8, label %for_body_0, label %for_end_0
for_body_0:
%9 = getelementptr %inner_node_t_0, %inner_node_t_0* %4, i32 0, i32 1, i16 %7
%10 = load %node_t_0*, %node_t_0** %9
%11 = icmp ne %node_t_0* %10, zeroinitializer
br i1 %11, label %if_1, label %end_if_0
if_1:
call ccc void @btree_node_delete_0(%node_t_0* %10)
br label %end_if_0
end_if_0:
%12 = add i16 1, %7
br label %for_begin_0
for_end_0:
br label %end_if_1
end_if_1:
%13 = bitcast %node_t_0* %node_0 to i8*
call ccc void @free(i8* %13)
ret void
}
define external ccc i64 @node_count_entries_0(%node_t_0* %node_0) {
; <label>:0:
%1 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%2 = load %node_size_t_0, %node_size_t_0* %1
%3 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 3
%4 = load %node_type_t_0, %node_type_t_0* %3
%5 = icmp eq %node_type_t_0 %4, 0
%6 = zext %node_size_t_0 %2 to i64
br i1 %5, label %if_0, label %end_if_0
if_0:
ret i64 %6
end_if_0:
%7 = bitcast %node_t_0* %node_0 to %inner_node_t_0*
%8 = alloca i64, i32 1
store i64 %6, i64* %8
%9 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%10 = load %node_size_t_0, %node_size_t_0* %9
br label %for_begin_0
for_begin_0:
%11 = phi i16 [0, %end_if_0], [%18, %for_body_0]
%12 = icmp ule i16 %11, %10
br i1 %12, label %for_body_0, label %for_end_0
for_body_0:
%13 = load i64, i64* %8
%14 = getelementptr %inner_node_t_0, %inner_node_t_0* %7, i32 0, i32 1, i16 %11
%15 = load %node_t_0*, %node_t_0** %14
%16 = call ccc i64 @node_count_entries_0(%node_t_0* %15)
%17 = add i64 %13, %16
store i64 %17, i64* %8
%18 = add i16 1, %11
br label %for_begin_0
for_end_0:
%19 = load i64, i64* %8
ret i64 %19
}
define external ccc %node_size_t_0 @btree_node_split_point_0() {
%1 = mul i16 3, 30
%2 = udiv i16 %1, 4
%3 = sub i16 30, 2
%4 = icmp ult i16 %2, %3
%5 = select i1 %4, i16 %2, i16 %3
ret i16 %5
}
define external ccc void @btree_node_split_0(%node_t_0* %node_0, %node_t_0** %root_0) {
; <label>:0:
%1 = call ccc %node_size_t_0 @btree_node_split_point_0()
%2 = add i16 1, %1
%3 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 3
%4 = load %node_type_t_0, %node_type_t_0* %3
%5 = call ccc %node_t_0* @btree_node_new_0(%node_type_t_0 %4)
%6 = alloca i16, i32 1
store i16 0, i16* %6
br label %for_begin_0
for_begin_0:
%7 = phi i16 [%2, %0], [%14, %for_body_0]
%8 = icmp ult i16 %7, 30
br i1 %8, label %for_body_0, label %for_end_0
for_body_0:
%9 = load i16, i16* %6
%10 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, i16 %7
%11 = load %value_t_0, %value_t_0* %10
%12 = getelementptr %node_t_0, %node_t_0* %5, i32 0, i32 1, i16 %9
store %value_t_0 %11, %value_t_0* %12
%13 = add i16 1, %9
store i16 %13, i16* %6
%14 = add i16 1, %7
br label %for_begin_0
for_end_0:
%15 = icmp eq %node_type_t_0 %4, 1
br i1 %15, label %if_0, label %end_if_0
if_0:
%16 = bitcast %node_t_0* %5 to %inner_node_t_0*
%17 = bitcast %node_t_0* %node_0 to %inner_node_t_0*
store i16 0, i16* %6
br label %for_begin_1
for_begin_1:
%18 = phi i16 [%2, %if_0], [%27, %for_body_1]
%19 = icmp ult i16 %18, 30
br i1 %19, label %for_body_1, label %for_end_1
for_body_1:
%20 = load i16, i16* %6
%21 = getelementptr %inner_node_t_0, %inner_node_t_0* %17, i32 0, i32 1, i16 %18
%22 = load %node_t_0*, %node_t_0** %21
%23 = getelementptr %node_t_0, %node_t_0* %22, i32 0, i32 0, i32 0
store %node_t_0* %5, %node_t_0** %23
%24 = getelementptr %node_t_0, %node_t_0* %22, i32 0, i32 0, i32 2
store i16 %20, %node_size_t_0* %24
%25 = getelementptr %inner_node_t_0, %inner_node_t_0* %16, i32 0, i32 1, i16 %20
store %node_t_0* %22, %node_t_0** %25
%26 = add i16 1, %20
store i16 %26, i16* %6
%27 = add i16 1, %18
br label %for_begin_1
for_end_1:
br label %end_if_0
end_if_0:
%28 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
store %node_size_t_0 %1, %node_size_t_0* %28
%29 = sub i16 30, %1
%30 = sub i16 %29, 1
%31 = getelementptr %node_t_0, %node_t_0* %5, i32 0, i32 0, i32 2
store i16 %30, %node_size_t_0* %31
call ccc void @btree_node_grow_parent_0(%node_t_0* %node_0, %node_t_0** %root_0, %node_t_0* %5)
ret void
}
define external ccc void @btree_node_grow_parent_0(%node_t_0* %node_0, %node_t_0** %root_0, %node_t_0* %sibling_0) {
; <label>:0:
%1 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = icmp eq %node_t_0* %2, zeroinitializer
%4 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%5 = load %node_size_t_0, %node_size_t_0* %4
br i1 %3, label %create_new_root_0, label %insert_new_node_in_parent_0
create_new_root_0:
%6 = call ccc %node_t_0* @btree_node_new_0(i1 1)
%7 = bitcast %node_t_0* %6 to %inner_node_t_0*
%8 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 0, i32 2
store i16 1, %node_size_t_0* %8
%9 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, %node_size_t_0 %5
%10 = load %value_t_0, %value_t_0* %9
%11 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 1, i16 0
store %value_t_0 %10, %value_t_0* %11
%12 = getelementptr %inner_node_t_0, %inner_node_t_0* %7, i32 0, i32 1, i16 0
store %node_t_0* %node_0, %node_t_0** %12
%13 = getelementptr %inner_node_t_0, %inner_node_t_0* %7, i32 0, i32 1, i16 1
store %node_t_0* %sibling_0, %node_t_0** %13
%14 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 0
store %node_t_0* %6, %node_t_0** %14
%15 = getelementptr %node_t_0, %node_t_0* %sibling_0, i32 0, i32 0, i32 0
store %node_t_0* %6, %node_t_0** %15
%16 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 1
store i16 0, %position_t_0* %16
%17 = getelementptr %node_t_0, %node_t_0* %sibling_0, i32 0, i32 0, i32 1
store i16 1, %position_t_0* %17
store %node_t_0* %6, %node_t_0** %root_0
ret void
insert_new_node_in_parent_0:
%18 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 1
%19 = load %position_t_0, %position_t_0* %18
%20 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, %node_size_t_0 %5
call ccc void @btree_node_insert_inner_0(%node_t_0* %2, %node_t_0** %root_0, %position_t_0 %19, %node_t_0* %node_0, %value_t_0* %20, %node_t_0* %sibling_0)
ret void
}
define external ccc void @btree_node_insert_inner_0(%node_t_0* %node_0, %node_t_0** %root_0, %node_size_t_0 %pos_0, %node_t_0* %predecessor_0, %value_t_0* %key_0, %node_t_0* %new_node_0) {
; <label>:0:
%1 = alloca %node_size_t_0, i32 1
store %node_size_t_0 %pos_0, %node_size_t_0* %1
%2 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%3 = load %node_size_t_0, %node_size_t_0* %2
%4 = icmp uge %node_size_t_0 %3, 30
br i1 %4, label %if_0, label %end_if_1
if_0:
%5 = load %node_size_t_0, %node_size_t_0* %1
%6 = call ccc %node_size_t_0 @btree_node_rebalance_or_split_0(%node_t_0* %node_0, %node_t_0** %root_0, %node_size_t_0 %pos_0)
%7 = sub %node_size_t_0 %5, %6
store %node_size_t_0 %7, %node_size_t_0* %1
%8 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%9 = load %node_size_t_0, %node_size_t_0* %8
%10 = icmp ugt %node_size_t_0 %7, %9
br i1 %10, label %if_1, label %end_if_0
if_1:
%11 = sub %node_size_t_0 %7, %9
%12 = sub %node_size_t_0 %11, 1
store %node_size_t_0 %12, %node_size_t_0* %1
%13 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 0
%14 = load %node_t_0*, %node_t_0** %13
%15 = bitcast %node_t_0* %14 to %inner_node_t_0*
%16 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 1
%17 = load %position_t_0, %position_t_0* %16
%18 = add i16 1, %17
%19 = getelementptr %inner_node_t_0, %inner_node_t_0* %15, i32 0, i32 1, i16 %18
%20 = load %node_t_0*, %node_t_0** %19
call ccc void @btree_node_insert_inner_0(%node_t_0* %20, %node_t_0** %root_0, %node_size_t_0 %12, %node_t_0* %predecessor_0, %value_t_0* %key_0, %node_t_0* %new_node_0)
ret void
end_if_0:
br label %end_if_1
end_if_1:
%21 = bitcast %node_t_0* %node_0 to %inner_node_t_0*
%22 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%23 = load %node_size_t_0, %node_size_t_0* %22
%24 = sub %node_size_t_0 %23, 1
%25 = load %node_size_t_0, %node_size_t_0* %1
br label %for_begin_0
for_begin_0:
%26 = phi %node_size_t_0 [%24, %end_if_1], [%41, %for_body_0]
%27 = icmp uge %node_size_t_0 %26, %25
br i1 %27, label %for_body_0, label %for_end_0
for_body_0:
%28 = add %node_size_t_0 %26, 1
%29 = add %node_size_t_0 %26, 2
%30 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, %node_size_t_0 %26
%31 = load %value_t_0, %value_t_0* %30
%32 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, %node_size_t_0 %28
store %value_t_0 %31, %value_t_0* %32
%33 = getelementptr %inner_node_t_0, %inner_node_t_0* %21, i32 0, i32 1, %node_size_t_0 %28
%34 = load %node_t_0*, %node_t_0** %33
%35 = getelementptr %inner_node_t_0, %inner_node_t_0* %21, i32 0, i32 1, %node_size_t_0 %29
store %node_t_0* %34, %node_t_0** %35
%36 = getelementptr %inner_node_t_0, %inner_node_t_0* %21, i32 0, i32 1, %node_size_t_0 %29
%37 = load %node_t_0*, %node_t_0** %36
%38 = getelementptr %node_t_0, %node_t_0* %37, i32 0, i32 0, i32 1
%39 = load %position_t_0, %position_t_0* %38
%40 = add i16 1, %39
store i16 %40, %position_t_0* %38
%41 = sub %node_size_t_0 %26, 1
br label %for_begin_0
for_end_0:
%42 = load %value_t_0, %value_t_0* %key_0
%43 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, %node_size_t_0 %25
store %value_t_0 %42, %value_t_0* %43
%44 = add %node_size_t_0 %25, 1
%45 = getelementptr %inner_node_t_0, %inner_node_t_0* %21, i32 0, i32 1, %node_size_t_0 %44
store %node_t_0* %new_node_0, %node_t_0** %45
%46 = getelementptr %node_t_0, %node_t_0* %new_node_0, i32 0, i32 0, i32 0
store %node_t_0* %node_0, %node_t_0** %46
%47 = getelementptr %node_t_0, %node_t_0* %new_node_0, i32 0, i32 0, i32 1
store %node_size_t_0 %44, %position_t_0* %47
%48 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%49 = load %node_size_t_0, %node_size_t_0* %48
%50 = add i16 1, %49
store i16 %50, %node_size_t_0* %48
ret void
}
define external ccc %node_size_t_0 @btree_node_rebalance_or_split_0(%node_t_0* %node_0, %node_t_0** %root_0, %node_size_t_0 %idx_0) {
; <label>:0:
%1 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = bitcast %node_t_0* %2 to %inner_node_t_0*
%4 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 1
%5 = load %position_t_0, %position_t_0* %4
%6 = icmp ne %inner_node_t_0* %3, zeroinitializer
%7 = icmp ugt %position_t_0 %5, 0
%8 = and i1 %6, %7
br i1 %8, label %rebalance_0, label %split_0
rebalance_0:
%9 = sub %position_t_0 %5, 1
%10 = getelementptr %inner_node_t_0, %inner_node_t_0* %3, i32 0, i32 1, %position_t_0 %9
%11 = load %node_t_0*, %node_t_0** %10
%12 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%13 = load %node_size_t_0, %node_size_t_0* %12
%14 = sub i16 30, %13
%15 = icmp slt i16 %14, %idx_0
%16 = select i1 %15, i16 %14, %node_size_t_0 %idx_0
%17 = icmp ugt i16 %16, 0
br i1 %17, label %if_0, label %end_if_1
if_0:
%18 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 1
%19 = load %position_t_0, %position_t_0* %18
%20 = sub %position_t_0 %19, 1
%21 = getelementptr %inner_node_t_0, %inner_node_t_0* %3, i32 0, i32 0, i32 1, %position_t_0 %20
%22 = load %value_t_0, %value_t_0* %21
%23 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%24 = load %node_size_t_0, %node_size_t_0* %23
%25 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, %node_size_t_0 %24
store %value_t_0 %22, %value_t_0* %25
%26 = sub i16 %16, 1
br label %for_begin_0
for_begin_0:
%27 = phi i16 [0, %if_0], [%34, %for_body_0]
%28 = icmp ult i16 %27, %26
br i1 %28, label %for_body_0, label %for_end_0
for_body_0:
%29 = add %node_size_t_0 %24, 1
%30 = add i16 %27, %29
%31 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, i16 %27
%32 = load %value_t_0, %value_t_0* %31
%33 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, i16 %30
store %value_t_0 %32, %value_t_0* %33
%34 = add i16 1, %27
br label %for_begin_0
for_end_0:
%35 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, i16 %26
%36 = load %value_t_0, %value_t_0* %35
store %value_t_0 %36, %value_t_0* %21
%37 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%38 = load %node_size_t_0, %node_size_t_0* %37
%39 = sub %node_size_t_0 %38, %16
br label %for_begin_1
for_begin_1:
%40 = phi i16 [0, %for_end_0], [%46, %for_body_1]
%41 = icmp ult i16 %40, %39
br i1 %41, label %for_body_1, label %for_end_1
for_body_1:
%42 = add i16 %40, %16
%43 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, i16 %42
%44 = load %value_t_0, %value_t_0* %43
%45 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 1, i16 %40
store %value_t_0 %44, %value_t_0* %45
%46 = add i16 1, %40
br label %for_begin_1
for_end_1:
%47 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 3
%48 = load %node_type_t_0, %node_type_t_0* %47
%49 = icmp eq %node_type_t_0 %48, 1
br i1 %49, label %if_1, label %end_if_0
if_1:
%50 = bitcast %node_t_0* %node_0 to %inner_node_t_0*
%51 = bitcast %node_t_0* %11 to %inner_node_t_0*
br label %for_begin_2
for_begin_2:
%52 = phi i16 [0, %if_1], [%65, %for_body_2]
%53 = icmp ult i16 %52, %16
br i1 %53, label %for_body_2, label %for_end_2
for_body_2:
%54 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%55 = load %node_size_t_0, %node_size_t_0* %54
%56 = add %node_size_t_0 %55, 1
%57 = add i16 %52, %56
%58 = getelementptr %inner_node_t_0, %inner_node_t_0* %50, i32 0, i32 1, i16 %52
%59 = load %node_t_0*, %node_t_0** %58
%60 = getelementptr %inner_node_t_0, %inner_node_t_0* %51, i32 0, i32 1, i16 %57
store %node_t_0* %59, %node_t_0** %60
%61 = getelementptr %inner_node_t_0, %inner_node_t_0* %51, i32 0, i32 1, i16 %57
%62 = load %node_t_0*, %node_t_0** %61
%63 = getelementptr %node_t_0, %node_t_0* %62, i32 0, i32 0, i32 0
store %node_t_0* %11, %node_t_0** %63
%64 = getelementptr %node_t_0, %node_t_0* %62, i32 0, i32 0, i32 1
store i16 %57, %position_t_0* %64
%65 = add i16 1, %52
br label %for_begin_2
for_end_2:
%66 = sub %node_size_t_0 %38, %16
%67 = add i16 1, %66
br label %for_begin_3
for_begin_3:
%68 = phi i16 [0, %for_end_2], [%77, %for_body_3]
%69 = icmp ult i16 %68, %67
br i1 %69, label %for_body_3, label %for_end_3
for_body_3:
%70 = add i16 %68, %16
%71 = getelementptr %inner_node_t_0, %inner_node_t_0* %50, i32 0, i32 1, i16 %70
%72 = load %node_t_0*, %node_t_0** %71
%73 = getelementptr %inner_node_t_0, %inner_node_t_0* %50, i32 0, i32 1, i16 %68
store %node_t_0* %72, %node_t_0** %73
%74 = getelementptr %inner_node_t_0, %inner_node_t_0* %50, i32 0, i32 1, i16 %68
%75 = load %node_t_0*, %node_t_0** %74
%76 = getelementptr %node_t_0, %node_t_0* %75, i32 0, i32 0, i32 1
store i16 %68, %position_t_0* %76
%77 = add i16 1, %68
br label %for_begin_3
for_end_3:
br label %end_if_0
end_if_0:
%78 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%79 = load %node_size_t_0, %node_size_t_0* %78
%80 = add %node_size_t_0 %79, %16
store %node_size_t_0 %80, %node_size_t_0* %78
%81 = getelementptr %node_t_0, %node_t_0* %node_0, i32 0, i32 0, i32 2
%82 = load %node_size_t_0, %node_size_t_0* %81
%83 = sub %node_size_t_0 %82, %16
store %node_size_t_0 %83, %node_size_t_0* %81
ret i16 %16
end_if_1:
br label %split_0
split_0:
call ccc void @btree_node_split_0(%node_t_0* %node_0, %node_t_0** %root_0)
ret i16 0
}
define external ccc void @btree_iterator_init_0(%btree_iterator_t_0* %iter_0, %node_t_0* %cur_0, %node_size_t_0 %pos_0) {
%1 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
store %node_t_0* %cur_0, %node_t_0** %1
%2 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
store %node_size_t_0 %pos_0, %position_t_0* %2
ret void
}
define external ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %iter_0) {
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %iter_0, %node_t_0* zeroinitializer, i16 0)
ret void
}
define external ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %lhs_0, %btree_iterator_t_0* %rhs_0) {
; <label>:0:
%1 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %lhs_0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %rhs_0, i32 0, i32 0
%4 = load %node_t_0*, %node_t_0** %3
%5 = icmp ne %node_t_0* %2, %4
br i1 %5, label %if_0, label %end_if_0
if_0:
ret i1 0
end_if_0:
%6 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %lhs_0, i32 0, i32 1
%7 = load %position_t_0, %position_t_0* %6
%8 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %rhs_0, i32 0, i32 1
%9 = load %position_t_0, %position_t_0* %8
%10 = icmp eq %position_t_0 %7, %9
ret i1 %10
}
define external ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %iter_0) {
%1 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
%2 = load %position_t_0, %position_t_0* %1
%3 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%4 = load %node_t_0*, %node_t_0** %3
%5 = getelementptr %node_t_0, %node_t_0* %4, i32 0, i32 1, %position_t_0 %2
ret %value_t_0* %5
}
define external ccc void @btree_iterator_next_0(%btree_iterator_t_0* %iter_0) {
; <label>:0:
%1 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = getelementptr %node_t_0, %node_t_0* %2, i32 0, i32 0, i32 3
%4 = load %node_type_t_0, %node_type_t_0* %3
%5 = icmp eq %node_type_t_0 %4, 0
br i1 %5, label %if_0, label %end_if_1
if_0:
%6 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
%7 = load %position_t_0, %position_t_0* %6
%8 = add i16 1, %7
store i16 %8, %position_t_0* %6
%9 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
%10 = load %position_t_0, %position_t_0* %9
%11 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%12 = load %node_t_0*, %node_t_0** %11
%13 = getelementptr %node_t_0, %node_t_0* %12, i32 0, i32 0, i32 2
%14 = load %node_size_t_0, %node_size_t_0* %13
%15 = icmp ult %position_t_0 %10, %14
br i1 %15, label %if_1, label %end_if_0
if_1:
ret void
end_if_0:
br label %while_begin_0
while_begin_0:
%16 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%17 = load %node_t_0*, %node_t_0** %16
%18 = icmp eq %node_t_0* %17, zeroinitializer
br i1 %18, label %leaf.no_parent_0, label %leaf.has_parent_0
leaf.no_parent_0:
br label %loop.condition.end_0
leaf.has_parent_0:
%19 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
%20 = load %position_t_0, %position_t_0* %19
%21 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%22 = load %node_t_0*, %node_t_0** %21
%23 = getelementptr %node_t_0, %node_t_0* %22, i32 0, i32 0, i32 2
%24 = load %node_size_t_0, %node_size_t_0* %23
%25 = icmp eq %position_t_0 %20, %24
br label %loop.condition.end_0
loop.condition.end_0:
%26 = phi i1 [0, %leaf.no_parent_0], [%25, %leaf.has_parent_0]
br i1 %26, label %while_body_0, label %while_end_0
while_body_0:
%27 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%28 = load %node_t_0*, %node_t_0** %27
%29 = getelementptr %node_t_0, %node_t_0* %28, i32 0, i32 0, i32 1
%30 = load %position_t_0, %position_t_0* %29
%31 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
store %position_t_0 %30, %position_t_0* %31
%32 = getelementptr %node_t_0, %node_t_0* %28, i32 0, i32 0, i32 0
%33 = load %node_t_0*, %node_t_0** %32
%34 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
store %node_t_0* %33, %node_t_0** %34
br label %while_begin_0
while_end_0:
ret void
end_if_1:
%35 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
%36 = load %position_t_0, %position_t_0* %35
%37 = add i16 1, %36
%38 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
%39 = load %node_t_0*, %node_t_0** %38
%40 = bitcast %node_t_0* %39 to %inner_node_t_0*
%41 = getelementptr %inner_node_t_0, %inner_node_t_0* %40, i32 0, i32 1, i16 %37
%42 = load %node_t_0*, %node_t_0** %41
%43 = alloca %node_t_0*, i32 1
store %node_t_0* %42, %node_t_0** %43
br label %while_begin_1
while_begin_1:
%44 = load %node_t_0*, %node_t_0** %43
%45 = getelementptr %node_t_0, %node_t_0* %44, i32 0, i32 0, i32 3
%46 = load %node_type_t_0, %node_type_t_0* %45
%47 = icmp eq %node_type_t_0 %46, 1
br i1 %47, label %while_body_1, label %while_end_1
while_body_1:
%48 = load %node_t_0*, %node_t_0** %43
%49 = bitcast %node_t_0* %48 to %inner_node_t_0*
%50 = getelementptr %inner_node_t_0, %inner_node_t_0* %49, i32 0, i32 1, i16 0
%51 = load %node_t_0*, %node_t_0** %50
store %node_t_0* %51, %node_t_0** %43
br label %while_begin_1
while_end_1:
%52 = load %node_t_0*, %node_t_0** %43
%53 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 0
store %node_t_0* %52, %node_t_0** %53
%54 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %iter_0, i32 0, i32 1
store i16 0, %position_t_0* %54
ret void
}
define external ccc %value_t_0* @btree_linear_search_lower_bound_0(%value_t_0* %val_0, %value_t_0* %current_0, %value_t_0* %end_0) {
; <label>:0:
%1 = alloca %value_t_0*, i32 1
store %value_t_0* %current_0, %value_t_0** %1
br label %while_begin_0
while_begin_0:
%2 = load %value_t_0*, %value_t_0** %1
%3 = icmp ne %value_t_0* %2, %end_0
br i1 %3, label %while_body_0, label %while_end_0
while_body_0:
%4 = load %value_t_0*, %value_t_0** %1
%5 = call ccc i8 @btree_value_compare_values_0(%value_t_0* %4, %value_t_0* %val_0)
%6 = icmp ne i8 %5, -1
br i1 %6, label %if_0, label %end_if_0
if_0:
ret %value_t_0* %4
end_if_0:
%7 = getelementptr %value_t_0, %value_t_0* %4, i32 1
store %value_t_0* %7, %value_t_0** %1
br label %while_begin_0
while_end_0:
ret %value_t_0* %end_0
}
define external ccc %value_t_0* @btree_linear_search_upper_bound_0(%value_t_0* %val_0, %value_t_0* %current_0, %value_t_0* %end_0) {
; <label>:0:
%1 = alloca %value_t_0*, i32 1
store %value_t_0* %current_0, %value_t_0** %1
br label %while_begin_0
while_begin_0:
%2 = load %value_t_0*, %value_t_0** %1
%3 = icmp ne %value_t_0* %2, %end_0
br i1 %3, label %while_body_0, label %while_end_0
while_body_0:
%4 = load %value_t_0*, %value_t_0** %1
%5 = call ccc i8 @btree_value_compare_values_0(%value_t_0* %4, %value_t_0* %val_0)
%6 = icmp eq i8 %5, 1
br i1 %6, label %if_0, label %end_if_0
if_0:
ret %value_t_0* %4
end_if_0:
%7 = getelementptr %value_t_0, %value_t_0* %4, i32 1
store %value_t_0* %7, %value_t_0** %1
br label %while_begin_0
while_end_0:
ret %value_t_0* %end_0
}
define external ccc void @btree_init_empty_0(%btree_t_0* %tree_0) {
%1 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
store %node_t_0* zeroinitializer, %node_t_0** %1
%2 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 1
store %node_t_0* zeroinitializer, %node_t_0** %2
ret void
}
define external ccc void @btree_init_0(%btree_t_0* %tree_0, %btree_iterator_t_0* %start_0, %btree_iterator_t_0* %end_0) {
call ccc void @btree_insert_range_0(%btree_t_0* %tree_0, %btree_iterator_t_0* %start_0, %btree_iterator_t_0* %end_0)
ret void
}
define external ccc void @btree_destroy_0(%btree_t_0* %tree_0) {
call ccc void @btree_clear_0(%btree_t_0* %tree_0)
ret void
}
define external ccc i1 @btree_is_empty_0(%btree_t_0* %tree_0) {
%1 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = icmp eq %node_t_0* %2, zeroinitializer
ret i1 %3
}
define external ccc i64 @btree_size_0(%btree_t_0* %tree_0) {
; <label>:0:
%1 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = icmp eq %node_t_0* %2, zeroinitializer
br i1 %3, label %null_0, label %not_null_0
null_0:
ret i64 0
not_null_0:
%4 = call ccc i64 @node_count_entries_0(%node_t_0* %2)
ret i64 %4
}
define external ccc i1 @btree_insert_value_0(%btree_t_0* %tree_0, %value_t_0* %val_0) {
; <label>:0:
%1 = call ccc i1 @btree_is_empty_0(%btree_t_0* %tree_0)
br i1 %1, label %empty_0, label %non_empty_0
empty_0:
%2 = call ccc %node_t_0* @btree_node_new_0(i1 0)
%3 = getelementptr %node_t_0, %node_t_0* %2, i32 0, i32 0, i32 2
store i16 1, %node_size_t_0* %3
%4 = load %value_t_0, %value_t_0* %val_0
%5 = getelementptr %node_t_0, %node_t_0* %2, i32 0, i32 1, i16 0
store %value_t_0 %4, %value_t_0* %5
%6 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
store %node_t_0* %2, %node_t_0** %6
%7 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 1
store %node_t_0* %2, %node_t_0** %7
br label %inserted_new_value_0
non_empty_0:
%8 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%9 = load %node_t_0*, %node_t_0** %8
%10 = alloca %node_t_0*, i32 1
store %node_t_0* %9, %node_t_0** %10
br label %loop_0
loop_0:
%11 = load %node_t_0*, %node_t_0** %10
%12 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 3
%13 = load %node_type_t_0, %node_type_t_0* %12
%14 = icmp eq %node_type_t_0 %13, 1
br i1 %14, label %inner_0, label %leaf_0
inner_0:
%15 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%16 = load %node_size_t_0, %node_size_t_0* %15
%17 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, i16 0
%18 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, %node_size_t_0 %16
%19 = call ccc %value_t_0* @btree_linear_search_lower_bound_0(%value_t_0* %val_0, %value_t_0* %17, %value_t_0* %18)
%20 = ptrtoint %value_t_0* %19 to i64
%21 = ptrtoint %value_t_0* %17 to i64
%22 = sub i64 %20, %21
%23 = trunc i64 %22 to i16
%24 = udiv i16 %23, 8
%25 = icmp ne %value_t_0* %19, %18
%26 = getelementptr %value_t_0, %value_t_0* %19, i32 0
%27 = call ccc i8 @btree_value_compare_values_0(%value_t_0* %26, %value_t_0* %val_0)
%28 = icmp eq i8 0, %27
%29 = and i1 %25, %28
br i1 %29, label %no_insert_0, label %inner_continue_insert_0
inner_continue_insert_0:
%30 = bitcast %node_t_0* %11 to %inner_node_t_0*
%31 = getelementptr %inner_node_t_0, %inner_node_t_0* %30, i32 0, i32 1, i16 %24
%32 = load %node_t_0*, %node_t_0** %31
store %node_t_0* %32, %node_t_0** %10
br label %loop_0
leaf_0:
%33 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%34 = load %node_size_t_0, %node_size_t_0* %33
%35 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, i16 0
%36 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, %node_size_t_0 %34
%37 = call ccc %value_t_0* @btree_linear_search_upper_bound_0(%value_t_0* %val_0, %value_t_0* %35, %value_t_0* %36)
%38 = ptrtoint %value_t_0* %37 to i64
%39 = ptrtoint %value_t_0* %35 to i64
%40 = sub i64 %38, %39
%41 = trunc i64 %40 to i16
%42 = udiv i16 %41, 8
%43 = alloca i16, i32 1
store i16 %42, i16* %43
%44 = icmp ne %value_t_0* %37, %35
%45 = getelementptr %value_t_0, %value_t_0* %37, i32 -1
%46 = call ccc i8 @btree_value_compare_values_0(%value_t_0* %45, %value_t_0* %val_0)
%47 = icmp eq i8 0, %46
%48 = and i1 %44, %47
br i1 %48, label %no_insert_0, label %leaf_continue_insert_0
leaf_continue_insert_0:
%49 = icmp uge %node_size_t_0 %34, 30
br i1 %49, label %split_0, label %no_split_0
split_0:
%50 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%51 = load i16, i16* %43
%52 = call ccc %node_size_t_0 @btree_node_rebalance_or_split_0(%node_t_0* %11, %node_t_0** %50, i16 %51)
%53 = sub i16 %51, %52
store i16 %53, i16* %43
%54 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%55 = load %node_size_t_0, %node_size_t_0* %54
%56 = icmp ugt i16 %53, %55
br i1 %56, label %if_0, label %end_if_0
if_0:
%57 = add %node_size_t_0 %55, 1
%58 = sub i16 %53, %57
store i16 %58, i16* %43
%59 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 0
%60 = load %node_t_0*, %node_t_0** %59
%61 = bitcast %node_t_0* %60 to %inner_node_t_0*
%62 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 1
%63 = load %position_t_0, %position_t_0* %62
%64 = add i16 1, %63
%65 = getelementptr %inner_node_t_0, %inner_node_t_0* %61, i32 0, i32 1, i16 %64
%66 = load %node_t_0*, %node_t_0** %65
store %node_t_0* %66, %node_t_0** %10
br label %end_if_0
end_if_0:
br label %no_split_0
no_split_0:
%67 = load i16, i16* %43
%68 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%69 = load %node_size_t_0, %node_size_t_0* %68
br label %for_begin_0
for_begin_0:
%70 = phi %node_size_t_0 [%69, %no_split_0], [%76, %for_body_0]
%71 = icmp ugt %node_size_t_0 %70, %67
br i1 %71, label %for_body_0, label %for_end_0
for_body_0:
%72 = sub %node_size_t_0 %70, 1
%73 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, %node_size_t_0 %72
%74 = load %value_t_0, %value_t_0* %73
%75 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, %node_size_t_0 %70
store %value_t_0 %74, %value_t_0* %75
%76 = sub %node_size_t_0 %70, 1
br label %for_begin_0
for_end_0:
%77 = load %value_t_0, %value_t_0* %val_0
%78 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 1, i16 %67
store %value_t_0 %77, %value_t_0* %78
%79 = getelementptr %node_t_0, %node_t_0* %11, i32 0, i32 0, i32 2
%80 = load %node_size_t_0, %node_size_t_0* %79
%81 = add i16 1, %80
store i16 %81, %node_size_t_0* %79
br label %inserted_new_value_0
no_insert_0:
ret i1 0
inserted_new_value_0:
ret i1 1
}
define external ccc void @btree_insert_range_0(%btree_t_0* %tree_0, %btree_iterator_t_0* %begin_0, %btree_iterator_t_0* %end_0) {
; <label>:0:
br label %while_begin_0
while_begin_0:
%1 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %begin_0, %btree_iterator_t_0* %end_0)
%2 = select i1 %1, i1 0, i1 1
br i1 %2, label %while_body_0, label %while_end_0
while_body_0:
%3 = call ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %begin_0)
%4 = call ccc i1 @btree_insert_value_0(%btree_t_0* %tree_0, %value_t_0* %3)
call ccc void @btree_iterator_next_0(%btree_iterator_t_0* %begin_0)
br label %while_begin_0
while_end_0:
ret void
}
define external ccc void @btree_begin_0(%btree_t_0* %tree_0, %btree_iterator_t_0* %result_0) {
%1 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 1
%2 = load %node_t_0*, %node_t_0** %1
%3 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %result_0, i32 0, i32 0
store %node_t_0* %2, %node_t_0** %3
%4 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %result_0, i32 0, i32 1
store i16 0, %position_t_0* %4
ret void
}
define external ccc void @btree_end_0(%btree_t_0* %tree_0, %btree_iterator_t_0* %result_0) {
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %result_0)
ret void
}
define external ccc i1 @btree_contains_0(%btree_t_0* %tree_0, %value_t_0* %val_0) {
%1 = alloca %btree_iterator_t_0, i32 1
%2 = alloca %btree_iterator_t_0, i32 1
call ccc void @btree_find_0(%btree_t_0* %tree_0, %value_t_0* %val_0, %btree_iterator_t_0* %1)
call ccc void @btree_end_0(%btree_t_0* %tree_0, %btree_iterator_t_0* %2)
%3 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %1, %btree_iterator_t_0* %2)
%4 = select i1 %3, i1 0, i1 1
ret i1 %4
}
define external ccc void @btree_find_0(%btree_t_0* %tree_0, %value_t_0* %val_0, %btree_iterator_t_0* %result_0) {
; <label>:0:
%1 = call ccc i1 @btree_is_empty_0(%btree_t_0* %tree_0)
br i1 %1, label %if_0, label %end_if_0
if_0:
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %result_0)
ret void
end_if_0:
%2 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%3 = load %node_t_0*, %node_t_0** %2
%4 = alloca %node_t_0*, i32 1
store %node_t_0* %3, %node_t_0** %4
br label %loop_0
loop_0:
%5 = load %node_t_0*, %node_t_0** %4
%6 = getelementptr %node_t_0, %node_t_0* %5, i32 0, i32 0, i32 2
%7 = load %node_size_t_0, %node_size_t_0* %6
%8 = getelementptr %node_t_0, %node_t_0* %5, i32 0, i32 1, i16 0
%9 = getelementptr %node_t_0, %node_t_0* %5, i32 0, i32 1, %node_size_t_0 %7
%10 = call ccc %value_t_0* @btree_linear_search_lower_bound_0(%value_t_0* %val_0, %value_t_0* %8, %value_t_0* %9)
%11 = ptrtoint %value_t_0* %10 to i64
%12 = ptrtoint %value_t_0* %8 to i64
%13 = sub i64 %11, %12
%14 = trunc i64 %13 to i16
%15 = udiv i16 %14, 8
%16 = icmp ult %value_t_0* %10, %9
%17 = call ccc i8 @btree_value_compare_values_0(%value_t_0* %10, %value_t_0* %val_0)
%18 = icmp eq i8 0, %17
%19 = and i1 %16, %18
br i1 %19, label %if_1, label %end_if_1
if_1:
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %result_0, %node_t_0* %5, i16 %15)
ret void
end_if_1:
%20 = getelementptr %node_t_0, %node_t_0* %5, i32 0, i32 0, i32 3
%21 = load %node_type_t_0, %node_type_t_0* %20
%22 = icmp eq %node_type_t_0 %21, 0
br i1 %22, label %if_2, label %end_if_2
if_2:
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %result_0)
ret void
end_if_2:
%23 = bitcast %node_t_0* %5 to %inner_node_t_0*
%24 = getelementptr %inner_node_t_0, %inner_node_t_0* %23, i32 0, i32 1, i16 %15
%25 = load %node_t_0*, %node_t_0** %24
store %node_t_0* %25, %node_t_0** %4
br label %loop_0
}
define external ccc void @btree_lower_bound_0(%btree_t_0* %tree_0, %value_t_0* %val_0, %btree_iterator_t_0* %result_0) {
; <label>:0:
%1 = call ccc i1 @btree_is_empty_0(%btree_t_0* %tree_0)
br i1 %1, label %if_0, label %end_if_0
if_0:
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %result_0)
ret void
end_if_0:
%2 = alloca %btree_iterator_t_0, i32 1
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %2)
%3 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%4 = load %node_t_0*, %node_t_0** %3
%5 = alloca %node_t_0*, i32 1
store %node_t_0* %4, %node_t_0** %5
br label %loop_0
loop_0:
%6 = load %node_t_0*, %node_t_0** %5
%7 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 0, i32 2
%8 = load %node_size_t_0, %node_size_t_0* %7
%9 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 1, i16 0
%10 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 1, %node_size_t_0 %8
%11 = call ccc %value_t_0* @btree_linear_search_lower_bound_0(%value_t_0* %val_0, %value_t_0* %9, %value_t_0* %10)
%12 = ptrtoint %value_t_0* %11 to i64
%13 = ptrtoint %value_t_0* %9 to i64
%14 = sub i64 %12, %13
%15 = trunc i64 %14 to i16
%16 = udiv i16 %15, 8
%17 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 0, i32 3
%18 = load %node_type_t_0, %node_type_t_0* %17
%19 = icmp eq %node_type_t_0 %18, 0
br i1 %19, label %if_1, label %end_if_1
if_1:
%20 = icmp eq %value_t_0* %11, %10
br i1 %20, label %handle_last_0, label %handle_not_last_0
handle_last_0:
%21 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %2, i32 0, i32 0
%22 = load %node_t_0*, %node_t_0** %21
%23 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %result_0, i32 0, i32 0
store %node_t_0* %22, %node_t_0** %23
%24 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %2, i32 0, i32 1
%25 = load %position_t_0, %position_t_0* %24
%26 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %result_0, i32 0, i32 1
store %position_t_0 %25, %position_t_0* %26
ret void
handle_not_last_0:
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %result_0, %node_t_0* %6, i16 %16)
ret void
end_if_1:
%27 = icmp ne %value_t_0* %11, %10
%28 = call ccc i8 @btree_value_compare_values_0(%value_t_0* %11, %value_t_0* %val_0)
%29 = icmp eq i8 0, %28
%30 = and i1 %27, %29
br i1 %30, label %if_2, label %end_if_2
if_2:
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %result_0, %node_t_0* %6, i16 %16)
ret void
end_if_2:
br i1 %27, label %if_3, label %end_if_3
if_3:
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %2, %node_t_0* %6, i16 %16)
br label %end_if_3
end_if_3:
%31 = bitcast %node_t_0* %6 to %inner_node_t_0*
%32 = getelementptr %inner_node_t_0, %inner_node_t_0* %31, i32 0, i32 1, i16 %16
%33 = load %node_t_0*, %node_t_0** %32
store %node_t_0* %33, %node_t_0** %5
br label %loop_0
}
define external ccc void @btree_upper_bound_0(%btree_t_0* %tree_0, %value_t_0* %val_0, %btree_iterator_t_0* %result_0) {
; <label>:0:
%1 = call ccc i1 @btree_is_empty_0(%btree_t_0* %tree_0)
br i1 %1, label %if_0, label %end_if_0
if_0:
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %result_0)
ret void
end_if_0:
%2 = alloca %btree_iterator_t_0, i32 1
call ccc void @btree_iterator_end_init_0(%btree_iterator_t_0* %2)
%3 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%4 = load %node_t_0*, %node_t_0** %3
%5 = alloca %node_t_0*, i32 1
store %node_t_0* %4, %node_t_0** %5
br label %loop_0
loop_0:
%6 = load %node_t_0*, %node_t_0** %5
%7 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 0, i32 2
%8 = load %node_size_t_0, %node_size_t_0* %7
%9 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 1, i16 0
%10 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 1, %node_size_t_0 %8
%11 = call ccc %value_t_0* @btree_linear_search_upper_bound_0(%value_t_0* %val_0, %value_t_0* %9, %value_t_0* %10)
%12 = ptrtoint %value_t_0* %11 to i64
%13 = ptrtoint %value_t_0* %9 to i64
%14 = sub i64 %12, %13
%15 = trunc i64 %14 to i16
%16 = udiv i16 %15, 8
%17 = getelementptr %node_t_0, %node_t_0* %6, i32 0, i32 0, i32 3
%18 = load %node_type_t_0, %node_type_t_0* %17
%19 = icmp eq %node_type_t_0 %18, 0
br i1 %19, label %if_1, label %end_if_1
if_1:
%20 = icmp eq %value_t_0* %11, %10
br i1 %20, label %handle_last_0, label %handle_not_last_0
handle_last_0:
%21 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %2, i32 0, i32 0
%22 = load %node_t_0*, %node_t_0** %21
%23 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %result_0, i32 0, i32 0
store %node_t_0* %22, %node_t_0** %23
%24 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %2, i32 0, i32 1
%25 = load %position_t_0, %position_t_0* %24
%26 = getelementptr %btree_iterator_t_0, %btree_iterator_t_0* %result_0, i32 0, i32 1
store %position_t_0 %25, %position_t_0* %26
ret void
handle_not_last_0:
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %result_0, %node_t_0* %6, i16 %16)
ret void
end_if_1:
%27 = icmp ne %value_t_0* %11, %10
br i1 %27, label %if_2, label %end_if_2
if_2:
call ccc void @btree_iterator_init_0(%btree_iterator_t_0* %result_0, %node_t_0* %6, i16 %16)
br label %end_if_2
end_if_2:
%28 = bitcast %node_t_0* %6 to %inner_node_t_0*
%29 = getelementptr %inner_node_t_0, %inner_node_t_0* %28, i32 0, i32 1, i16 %16
%30 = load %node_t_0*, %node_t_0** %29
store %node_t_0* %30, %node_t_0** %5
br label %loop_0
}
define external ccc void @btree_clear_0(%btree_t_0* %tree_0) {
; <label>:0:
%1 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = icmp ne %node_t_0* %2, zeroinitializer
br i1 %3, label %if_0, label %end_if_0
if_0:
call ccc void @btree_node_delete_0(%node_t_0* %2)
%4 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 0
store %node_t_0* zeroinitializer, %node_t_0** %4
%5 = getelementptr %btree_t_0, %btree_t_0* %tree_0, i32 0, i32 1
store %node_t_0* zeroinitializer, %node_t_0** %5
br label %end_if_0
end_if_0:
ret void
}
define external ccc void @btree_swap_0(%btree_t_0* %lhs_0, %btree_t_0* %rhs_0) {
%1 = getelementptr %btree_t_0, %btree_t_0* %lhs_0, i32 0, i32 0
%2 = load %node_t_0*, %node_t_0** %1
%3 = getelementptr %btree_t_0, %btree_t_0* %rhs_0, i32 0, i32 0
%4 = load %node_t_0*, %node_t_0** %3
%5 = getelementptr %btree_t_0, %btree_t_0* %lhs_0, i32 0, i32 0
store %node_t_0* %4, %node_t_0** %5
%6 = getelementptr %btree_t_0, %btree_t_0* %rhs_0, i32 0, i32 0
store %node_t_0* %2, %node_t_0** %6
%7 = getelementptr %btree_t_0, %btree_t_0* %lhs_0, i32 0, i32 1
%8 = load %node_t_0*, %node_t_0** %7
%9 = getelementptr %btree_t_0, %btree_t_0* %rhs_0, i32 0, i32 1
%10 = load %node_t_0*, %node_t_0** %9
%11 = getelementptr %btree_t_0, %btree_t_0* %lhs_0, i32 0, i32 1
store %node_t_0* %10, %node_t_0** %11
%12 = getelementptr %btree_t_0, %btree_t_0* %rhs_0, i32 0, i32 1
store %node_t_0* %8, %node_t_0** %12
ret void
}
@specialize_debug_info.btree__2__0_1__256__linear = global i32 0
%program = type {%btree_t_0, %btree_t_0, %btree_t_0, %btree_t_0}
define external ccc %program* @eclair_program_init() {
%byte_count_0 = trunc i64 ptrtoint (%program* getelementptr inbounds (%program, %program* inttoptr (i64 0 to %program*), i64 1) to i64) to i32
%memory_0 = call ccc i8* @malloc(i32 %byte_count_0)
%program_0 = bitcast i8* %memory_0 to %program*
%1 = getelementptr %program, %program* %program_0, i32 0, i32 0
call ccc void @btree_init_empty_0(%btree_t_0* %1)
%2 = getelementptr %program, %program* %program_0, i32 0, i32 1
call ccc void @btree_init_empty_0(%btree_t_0* %2)
%3 = getelementptr %program, %program* %program_0, i32 0, i32 2
call ccc void @btree_init_empty_0(%btree_t_0* %3)
%4 = getelementptr %program, %program* %program_0, i32 0, i32 3
call ccc void @btree_init_empty_0(%btree_t_0* %4)
ret %program* %program_0
}
define external ccc void @eclair_program_destroy(%program* %arg_0) {
%1 = getelementptr %program, %program* %arg_0, i32 0, i32 0
call ccc void @btree_destroy_0(%btree_t_0* %1)
%2 = getelementptr %program, %program* %arg_0, i32 0, i32 1
call ccc void @btree_destroy_0(%btree_t_0* %2)
%3 = getelementptr %program, %program* %arg_0, i32 0, i32 2
call ccc void @btree_destroy_0(%btree_t_0* %3)
%4 = getelementptr %program, %program* %arg_0, i32 0, i32 3
call ccc void @btree_destroy_0(%btree_t_0* %4)
%memory_0 = bitcast %program* %arg_0 to i8*
call ccc void @free(i8* %memory_0)
ret void
}
define external ccc void @eclair_program_run(%program* %arg_0) {
; <label>:0:
%value_0 = alloca %value_t_0, i32 1
%1 = getelementptr %value_t_0, %value_t_0* %value_0, i32 0, i32 0
store i32 0, %column_t_0* %1
%2 = getelementptr %value_t_0, %value_t_0* %value_0, i32 0, i32 1
store i32 0, %column_t_0* %2
%value_1_0 = alloca %value_t_0, i32 1
%3 = getelementptr %value_t_0, %value_t_0* %value_1_0, i32 0, i32 0
store i32 4294967295, %column_t_0* %3
%4 = getelementptr %value_t_0, %value_t_0* %value_1_0, i32 0, i32 1
store i32 4294967295, %column_t_0* %4
%begin_iter_0 = alloca %btree_iterator_t_0, i32 1
%end_iter_0 = alloca %btree_iterator_t_0, i32 1
%5 = getelementptr %program, %program* %arg_0, i32 0, i32 1
call ccc void @btree_lower_bound_0(%btree_t_0* %5, %value_t_0* %value_0, %btree_iterator_t_0* %begin_iter_0)
%6 = getelementptr %program, %program* %arg_0, i32 0, i32 1
call ccc void @btree_upper_bound_0(%btree_t_0* %6, %value_t_0* %value_1_0, %btree_iterator_t_0* %end_iter_0)
br label %loop_0
loop_0:
%condition_0 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %begin_iter_0, %btree_iterator_t_0* %end_iter_0)
br i1 %condition_0, label %if_0, label %end_if_0
if_0:
br label %range_query.end
end_if_0:
%current_0 = call ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %begin_iter_0)
%value_2_0 = alloca %value_t_0, i32 1
%7 = getelementptr %value_t_0, %value_t_0* %value_2_0, i32 0, i32 0
%8 = getelementptr %value_t_0, %value_t_0* %current_0, i32 0, i32 0
%9 = load %column_t_0, %column_t_0* %8
store %column_t_0 %9, %column_t_0* %7
%10 = getelementptr %value_t_0, %value_t_0* %value_2_0, i32 0, i32 1
%11 = getelementptr %value_t_0, %value_t_0* %current_0, i32 0, i32 1
%12 = load %column_t_0, %column_t_0* %11
store %column_t_0 %12, %column_t_0* %10
%13 = getelementptr %program, %program* %arg_0, i32 0, i32 3
%14 = call ccc i1 @btree_insert_value_0(%btree_t_0* %13, %value_t_0* %value_2_0)
call ccc void @btree_iterator_next_0(%btree_iterator_t_0* %begin_iter_0)
br label %loop_0
range_query.end:
%begin_iter_1_0 = alloca %btree_iterator_t_0, i32 1
%end_iter_1_0 = alloca %btree_iterator_t_0, i32 1
%15 = getelementptr %program, %program* %arg_0, i32 0, i32 3
call ccc void @btree_begin_0(%btree_t_0* %15, %btree_iterator_t_0* %begin_iter_1_0)
%16 = getelementptr %program, %program* %arg_0, i32 0, i32 3
call ccc void @btree_end_0(%btree_t_0* %16, %btree_iterator_t_0* %end_iter_1_0)
%17 = getelementptr %program, %program* %arg_0, i32 0, i32 0
call ccc void @btree_insert_range_0(%btree_t_0* %17, %btree_iterator_t_0* %begin_iter_1_0, %btree_iterator_t_0* %end_iter_1_0)
br label %loop_1
loop_1:
%18 = getelementptr %program, %program* %arg_0, i32 0, i32 2
call ccc void @btree_clear_0(%btree_t_0* %18)
%value_3_0 = alloca %value_t_0, i32 1
%19 = getelementptr %value_t_0, %value_t_0* %value_3_0, i32 0, i32 0
store i32 0, %column_t_0* %19
%20 = getelementptr %value_t_0, %value_t_0* %value_3_0, i32 0, i32 1
store i32 0, %column_t_0* %20
%value_4_0 = alloca %value_t_0, i32 1
%21 = getelementptr %value_t_0, %value_t_0* %value_4_0, i32 0, i32 0
store i32 4294967295, %column_t_0* %21
%22 = getelementptr %value_t_0, %value_t_0* %value_4_0, i32 0, i32 1
store i32 4294967295, %column_t_0* %22
%begin_iter_2_0 = alloca %btree_iterator_t_0, i32 1
%end_iter_2_0 = alloca %btree_iterator_t_0, i32 1
%23 = getelementptr %program, %program* %arg_0, i32 0, i32 1
call ccc void @btree_lower_bound_0(%btree_t_0* %23, %value_t_0* %value_3_0, %btree_iterator_t_0* %begin_iter_2_0)
%24 = getelementptr %program, %program* %arg_0, i32 0, i32 1
call ccc void @btree_upper_bound_0(%btree_t_0* %24, %value_t_0* %value_4_0, %btree_iterator_t_0* %end_iter_2_0)
br label %loop_2
loop_2:
%condition_1_0 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %begin_iter_2_0, %btree_iterator_t_0* %end_iter_2_0)
br i1 %condition_1_0, label %if_1, label %end_if_1
if_1:
br label %range_query.end_1
end_if_1:
%current_1_0 = call ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %begin_iter_2_0)
%value_5_0 = alloca %value_t_0, i32 1
%25 = getelementptr %value_t_0, %value_t_0* %value_5_0, i32 0, i32 0
%26 = getelementptr %value_t_0, %value_t_0* %current_1_0, i32 0, i32 1
%27 = load %column_t_0, %column_t_0* %26
store %column_t_0 %27, %column_t_0* %25
%28 = getelementptr %value_t_0, %value_t_0* %value_5_0, i32 0, i32 1
store i32 0, %column_t_0* %28
%value_6_0 = alloca %value_t_0, i32 1
%29 = getelementptr %value_t_0, %value_t_0* %value_6_0, i32 0, i32 0
%30 = getelementptr %value_t_0, %value_t_0* %current_1_0, i32 0, i32 1
%31 = load %column_t_0, %column_t_0* %30
store %column_t_0 %31, %column_t_0* %29
%32 = getelementptr %value_t_0, %value_t_0* %value_6_0, i32 0, i32 1
store i32 4294967295, %column_t_0* %32
%begin_iter_3_0 = alloca %btree_iterator_t_0, i32 1
%end_iter_3_0 = alloca %btree_iterator_t_0, i32 1
%33 = getelementptr %program, %program* %arg_0, i32 0, i32 0
call ccc void @btree_lower_bound_0(%btree_t_0* %33, %value_t_0* %value_5_0, %btree_iterator_t_0* %begin_iter_3_0)
%34 = getelementptr %program, %program* %arg_0, i32 0, i32 0
call ccc void @btree_upper_bound_0(%btree_t_0* %34, %value_t_0* %value_6_0, %btree_iterator_t_0* %end_iter_3_0)
br label %loop_3
loop_3:
%condition_2_0 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %begin_iter_3_0, %btree_iterator_t_0* %end_iter_3_0)
br i1 %condition_2_0, label %if_2, label %end_if_2
if_2:
br label %range_query.end_2
end_if_2:
%current_2_0 = call ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %begin_iter_3_0)
%value_7_0 = alloca %value_t_0, i32 1
%35 = getelementptr %value_t_0, %value_t_0* %value_7_0, i32 0, i32 0
%36 = getelementptr %value_t_0, %value_t_0* %current_1_0, i32 0, i32 0
%37 = load %column_t_0, %column_t_0* %36
store %column_t_0 %37, %column_t_0* %35
%38 = getelementptr %value_t_0, %value_t_0* %value_7_0, i32 0, i32 1
%39 = getelementptr %value_t_0, %value_t_0* %current_2_0, i32 0, i32 1
%40 = load %column_t_0, %column_t_0* %39
store %column_t_0 %40, %column_t_0* %38
%contains_result_0 = getelementptr %program, %program* %arg_0, i32 0, i32 3
%contains_result_1 = call ccc i1 @btree_contains_0(%btree_t_0* %contains_result_0, %value_t_0* %value_7_0)
%condition_3_0 = select i1 %contains_result_1, i1 0, i1 1
br i1 %condition_3_0, label %if_3, label %end_if_3
if_3:
%value_8_0 = alloca %value_t_0, i32 1
%41 = getelementptr %value_t_0, %value_t_0* %value_8_0, i32 0, i32 0
%42 = getelementptr %value_t_0, %value_t_0* %current_1_0, i32 0, i32 0
%43 = load %column_t_0, %column_t_0* %42
store %column_t_0 %43, %column_t_0* %41
%44 = getelementptr %value_t_0, %value_t_0* %value_8_0, i32 0, i32 1
%45 = getelementptr %value_t_0, %value_t_0* %current_2_0, i32 0, i32 1
%46 = load %column_t_0, %column_t_0* %45
store %column_t_0 %46, %column_t_0* %44
%47 = getelementptr %program, %program* %arg_0, i32 0, i32 2
%48 = call ccc i1 @btree_insert_value_0(%btree_t_0* %47, %value_t_0* %value_8_0)
br label %end_if_3
end_if_3:
call ccc void @btree_iterator_next_0(%btree_iterator_t_0* %begin_iter_3_0)
br label %loop_3
range_query.end_2:
call ccc void @btree_iterator_next_0(%btree_iterator_t_0* %begin_iter_2_0)
br label %loop_2
range_query.end_1:
%condition_4_0 = getelementptr %program, %program* %arg_0, i32 0, i32 2
%condition_4_1 = call ccc i1 @btree_is_empty_0(%btree_t_0* %condition_4_0)
br i1 %condition_4_1, label %if_4, label %end_if_4
if_4:
br label %loop.end
end_if_4:
%begin_iter_4_0 = alloca %btree_iterator_t_0, i32 1
%end_iter_4_0 = alloca %btree_iterator_t_0, i32 1
%49 = getelementptr %program, %program* %arg_0, i32 0, i32 2
call ccc void @btree_begin_0(%btree_t_0* %49, %btree_iterator_t_0* %begin_iter_4_0)
%50 = getelementptr %program, %program* %arg_0, i32 0, i32 2
call ccc void @btree_end_0(%btree_t_0* %50, %btree_iterator_t_0* %end_iter_4_0)
%51 = getelementptr %program, %program* %arg_0, i32 0, i32 3
call ccc void @btree_insert_range_0(%btree_t_0* %51, %btree_iterator_t_0* %begin_iter_4_0, %btree_iterator_t_0* %end_iter_4_0)
%52 = getelementptr %program, %program* %arg_0, i32 0, i32 2
%53 = getelementptr %program, %program* %arg_0, i32 0, i32 0
call ccc void @btree_swap_0(%btree_t_0* %52, %btree_t_0* %53)
br label %loop_1
loop.end:
ret void
}
define external ccc void @eclair_add_facts(%program* %eclair_program_0, i16 %fact_type_0, i32* %memory_0, i32 %fact_count_0) {
; <label>:0:
switch i16 %fact_type_0, label %eclair_add_facts.end_0 [i16 0, label %edge_0 i16 1, label %path_0]
edge_0:
%1 = getelementptr %program, %program* %eclair_program_0, i32 0, i32 1
%2 = bitcast i32* %memory_0 to [2 x i32]*
br label %for_begin_0
for_begin_0:
%3 = phi i32 [0, %edge_0], [%7, %for_body_0]
%4 = icmp ult i32 %3, %fact_count_0
br i1 %4, label %for_body_0, label %for_end_0
for_body_0:
%5 = getelementptr [2 x i32], [2 x i32]* %2, i32 %3
%6 = call ccc i1 @btree_insert_value_0(%btree_t_0* %1, [2 x i32]* %5)
%7 = add i32 1, %3
br label %for_begin_0
for_end_0:
ret void
path_0:
%8 = getelementptr %program, %program* %eclair_program_0, i32 0, i32 3
%9 = bitcast i32* %memory_0 to [2 x i32]*
br label %for_begin_1
for_begin_1:
%10 = phi i32 [0, %path_0], [%14, %for_body_1]
%11 = icmp ult i32 %10, %fact_count_0
br i1 %11, label %for_body_1, label %for_end_1
for_body_1:
%12 = getelementptr [2 x i32], [2 x i32]* %9, i32 %10
%13 = call ccc i1 @btree_insert_value_0(%btree_t_0* %8, [2 x i32]* %12)
%14 = add i32 1, %10
br label %for_begin_1
for_end_1:
ret void
eclair_add_facts.end_0:
ret void
}
define external ccc void @eclair_add_fact(%program* %eclair_program_0, i16 %fact_type_0, i32* %memory_0) {
call ccc void @eclair_add_facts(%program* %eclair_program_0, i16 %fact_type_0, i32* %memory_0, i32 1)
ret void
}
define external ccc i32* @eclair_get_facts(%program* %eclair_program_0, i16 %fact_type_0) {
; <label>:0:
switch i16 %fact_type_0, label %eclair_get_facts.end_0 [i16 0, label %edge_0 i16 1, label %path_0]
edge_0:
%1 = getelementptr %program, %program* %eclair_program_0, i32 0, i32 1
%fact_count_0 = call ccc i64 @btree_size_0(%btree_t_0* %1)
%fact_count_1 = trunc i64 %fact_count_0 to i32
%byte_count_0 = mul i32 %fact_count_1, 8
%memory_0 = call ccc i8* @malloc(i32 %byte_count_0)
%array_0 = bitcast i8* %memory_0 to [2 x i32]*
%i_0 = alloca i32, i32 1
store i32 0, i32* %i_0
%current_iter_0 = alloca %btree_iterator_t_0, i32 1
%end_iter_0 = alloca %btree_iterator_t_0, i32 1
call ccc void @btree_begin_0(%btree_t_0* %1, %btree_iterator_t_0* %current_iter_0)
call ccc void @btree_end_0(%btree_t_0* %1, %btree_iterator_t_0* %end_iter_0)
br label %while_begin_0
while_begin_0:
%2 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %current_iter_0, %btree_iterator_t_0* %end_iter_0)
%3 = select i1 %2, i1 0, i1 1
br i1 %3, label %while_body_0, label %while_end_0
while_body_0:
%4 = load i32, i32* %i_0
%value_0 = getelementptr [2 x i32], [2 x i32]* %array_0, i32 %4
%current_0 = call ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %current_iter_0)
%5 = getelementptr %value_t_0, %value_t_0* %current_0, i32 0
%6 = load %value_t_0, %value_t_0* %5
%7 = getelementptr [2 x i32], [2 x i32]* %value_0, i32 0
store %value_t_0 %6, [2 x i32]* %7
%8 = add i32 %4, 1
store i32 %8, i32* %i_0
call ccc void @btree_iterator_next_0(%btree_iterator_t_0* %current_iter_0)
br label %while_begin_0
while_end_0:
%9 = bitcast i8* %memory_0 to i32*
ret i32* %9
path_0:
%10 = getelementptr %program, %program* %eclair_program_0, i32 0, i32 3
%fact_count_2 = call ccc i64 @btree_size_0(%btree_t_0* %10)
%fact_count_3 = trunc i64 %fact_count_2 to i32
%byte_count_1 = mul i32 %fact_count_3, 8
%memory_1 = call ccc i8* @malloc(i32 %byte_count_1)
%array_1 = bitcast i8* %memory_1 to [2 x i32]*
%i_1 = alloca i32, i32 1
store i32 0, i32* %i_1
%current_iter_1 = alloca %btree_iterator_t_0, i32 1
%end_iter_1 = alloca %btree_iterator_t_0, i32 1
call ccc void @btree_begin_0(%btree_t_0* %10, %btree_iterator_t_0* %current_iter_1)
call ccc void @btree_end_0(%btree_t_0* %10, %btree_iterator_t_0* %end_iter_1)
br label %while_begin_1
while_begin_1:
%11 = call ccc i1 @btree_iterator_is_equal_0(%btree_iterator_t_0* %current_iter_1, %btree_iterator_t_0* %end_iter_1)
%12 = select i1 %11, i1 0, i1 1
br i1 %12, label %while_body_1, label %while_end_1
while_body_1:
%13 = load i32, i32* %i_1
%value_1 = getelementptr [2 x i32], [2 x i32]* %array_1, i32 %13
%current_1 = call ccc %value_t_0* @btree_iterator_current_0(%btree_iterator_t_0* %current_iter_1)
%14 = getelementptr %value_t_0, %value_t_0* %current_1, i32 0
%15 = load %value_t_0, %value_t_0* %14
%16 = getelementptr [2 x i32], [2 x i32]* %value_1, i32 0
store %value_t_0 %15, [2 x i32]* %16
%17 = add i32 %13, 1
store i32 %17, i32* %i_1
call ccc void @btree_iterator_next_0(%btree_iterator_t_0* %current_iter_1)
br label %while_begin_1
while_end_1:
%18 = bitcast i8* %memory_1 to i32*
ret i32* %18
eclair_get_facts.end_0:
ret i32* zeroinitializer
}
define external ccc void @eclair_free_buffer(i32* %buffer_0) {
%memory_0 = bitcast i32* %buffer_0 to i8*
call ccc void @free(i8* %memory_0)
ret void
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment