Created
May 6, 2022 10:03
-
-
Save luc-tielen/df3b95a0d6531314345482c150f3b5e0 to your computer and use it in GitHub Desktop.
Eclair "hello world"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
clang-9 -g3 -O0 -o program main.c test.ll -Wno-override-module |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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