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