Created
March 17, 2011 17:46
-
-
Save kronos/874779 to your computer and use it in GitHub Desktop.
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
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Rubinius::Tuple#each@1"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%valid_flag = alloca i1 | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 13 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 8 | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 2 | |
%arg.total = load i32* %total_pos | |
%arg_cmp = icmp ne i32 %arg.total, 0 | |
br i1 %arg_cmp, label %arg_error, label %import_args | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
br label %return_pad | |
import_args: ; preds = %entry | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0 | |
%1 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%cm = bitcast %"struct.rubinius::Executable"* %msg.exec to %"struct.rubinius::CompiledMethod"* | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
%5 = bitcast %"struct.rubinius::Dispatch"* %msg to i8* | |
store i8* %5, i8** %4 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %1 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 80, i32* %6 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %7 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4341104672 to i8*), i8** %9 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2 | |
%stack_pos3 = getelementptr %"struct.rubinius::Object"** %stack, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3 | |
%10 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %10 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11 | |
%12 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %msg.module, %"struct.rubinius::Module"** %14 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %17 | |
%18 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
%local_pos4 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos4 | |
%arg_ary_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 3 | |
%arg_ary = load %"struct.rubinius::Object"*** %arg_ary_pos | |
%ci107 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%19 = icmp eq %"struct.rubinius::Object"* %ci107, null | |
br i1 %19, label %ret_null106, label %method_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %cont74, %dispatch73, %continue49, %dispatch, %continue, %bail_out | |
br label %return_pad | |
method_body: ; preds = %import_args | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%stack_pos5 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 1 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos5 | |
%local_pos6 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos7 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos7 | |
store %"struct.rubinius::Object"* %stack_load, %"struct.rubinius::Object"** %local_pos6 | |
%20 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %20 | |
%stack_pos8 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack_pos8 | |
%stack_pos9 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load10 = load %"struct.rubinius::Object"** %stack_pos9 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load10 to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
continue: ; preds = %fallback, %continue12 | |
%send_result = phi %"struct.rubinius::Object"* [ %prim_value, %continue12 ], [ %ic_send, %fallback ] | |
%null_check = icmp eq %"struct.rubinius::Object"* %send_result, null | |
br i1 %null_check, label %ret_null, label %check_active | |
check_class_id: ; preds = %method_body | |
%class_pos = getelementptr %"struct.rubinius::Object"* %stack_load10, i32 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i32 0, i32 4 | |
%class_id = load i32* %class_id_pos | |
%check_class_id11 = icmp eq i32 %class_id, 4 | |
br i1 %check_class_id11, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%prim_value = call %"struct.rubinius::Object"* @jit_stub_tuple_fields(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %stack_load10) | |
%ptr2int = ptrtoint %"struct.rubinius::Object"* %prim_value to i64 | |
%21 = icmp eq i64 %ptr2int, 34 | |
br i1 %21, label %fallback, label %continue12 | |
fallback: ; preds = %correct_class, %check_class_id, %method_body | |
%stack_pos13 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load14 = load %"struct.rubinius::Object"** %stack_pos13 | |
store %"struct.rubinius::Object"* %stack_load14, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 0, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337100992 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 5, i32* %ip_pos | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337100992 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
br label %continue | |
continue12: ; preds = %correct_class | |
br label %continue | |
continue15: ; preds = %check_active | |
%stack_pos16 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %send_result, %"struct.rubinius::Object"** %stack_pos16 | |
%local_pos17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%stack_pos18 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load19 = load %"struct.rubinius::Object"** %stack_pos18 | |
store %"struct.rubinius::Object"* %stack_load19, %"struct.rubinius::Object"** %local_pos17 | |
br label %ip10 | |
ip10: ; preds = %continue97, %continue15 | |
%local_pos20 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local = load %"struct.rubinius::Object"** %local_pos20 | |
%stack_pos21 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack_pos21 | |
%local_pos22 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%local23 = load %"struct.rubinius::Object"** %local_pos22 | |
%stack_pos24 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local23, %"struct.rubinius::Object"** %stack_pos24 | |
%stack_pos25 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load26 = load %"struct.rubinius::Object"** %stack_pos25 | |
%stack_pos27 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load28 = load %"struct.rubinius::Object"** %stack_pos27 | |
%cast29 = ptrtoint %"struct.rubinius::Object"* %stack_load26 to i64 | |
%cast30 = ptrtoint %"struct.rubinius::Object"* %stack_load28 to i64 | |
%both = and i64 %cast29, %cast30 | |
%masked31 = and i64 %both, 1 | |
%are_fixnums = icmp eq i64 %masked31, 1 | |
br i1 %are_fixnums, label %fast, label %dispatch | |
check_active: ; preds = %continue | |
br label %continue15 | |
fast: ; preds = %ip10 | |
%imm_cmp = icmp slt %"struct.rubinius::Object"* %stack_load26, %stack_load28 | |
%select_bool = select i1 %imm_cmp, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %cont | |
dispatch: ; preds = %ip10 | |
%stack_pos32 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load33 = load %"struct.rubinius::Object"** %stack_pos32 | |
store %"struct.rubinius::Object"* %stack_load33, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos34 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos34, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute35 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337101120 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 14, i32* %ip_pos | |
%ic_send36 = call %"struct.rubinius::Object"* %execute35(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337101120 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check38 = icmp eq %"struct.rubinius::Object"* %ic_send36, null | |
br i1 %null_check38, label %ret_null, label %check_active37 | |
cont: ; preds = %fast, %check_active37 | |
%addition = phi %"struct.rubinius::Object"* [ %ic_send36, %check_active37 ], [ %select_bool, %fast ] | |
%stack_pos39 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %stack_pos39 | |
%stack_pos40 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load41 = load %"struct.rubinius::Object"** %stack_pos40 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load41 to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip38, label %continue42 | |
check_active37: ; preds = %dispatch | |
br label %cont | |
continue42: ; preds = %cont | |
br label %ip18 | |
ip18: ; preds = %continue42 | |
%22 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self43 = load %"struct.rubinius::Object"** %22 | |
%stack_pos44 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self43, %"struct.rubinius::Object"** %stack_pos44 | |
%local_pos45 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local46 = load %"struct.rubinius::Object"** %local_pos45 | |
%stack_pos47 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local46, %"struct.rubinius::Object"** %stack_pos47 | |
%stack_pos50 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load51 = load %"struct.rubinius::Object"** %stack_pos50 | |
%word_pos = getelementptr %"struct.rubinius::Object"* %stack_load51, i32 0, i32 0, i32 0, i32 0 | |
%flags = load i8** %word_pos | |
%word2flags = ptrtoint i8* %flags to i32 | |
%mask = and i32 %word2flags, 511 | |
%is_type = icmp eq i32 %mask, 118 | |
br i1 %is_type, label %is_tuple, label %fallback48 | |
fallback48: ; preds = %is_tuple, %ip18 | |
store i32 21, i32* %ip_pos | |
%23 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 21, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
continue49: ; preds = %tuple_at | |
%24 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
%block = load %"struct.rubinius::Object"** %24 | |
%stack_pos59 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store i32 24, i32* %ip_pos | |
%ys = call %"struct.rubinius::Object"* @rbx_yield_stack(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %block, i32 1, %"struct.rubinius::Object"** %stack_pos59) | |
%null_check62 = icmp eq %"struct.rubinius::Object"* %ys, null | |
br i1 %null_check62, label %ret_null, label %check_active61 | |
is_tuple: ; preds = %ip18 | |
%stack_pos52 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load53 = load %"struct.rubinius::Object"** %stack_pos52 | |
%cast54 = ptrtoint %"struct.rubinius::Object"* %stack_load53 to i64 | |
%masked55 = and i64 %cast54, 1 | |
%is_fixnum = icmp eq i64 %masked55, 1 | |
%upcast = bitcast %"struct.rubinius::Object"* %stack_load51 to %"struct.rubinius::Tuple"* | |
%as_int56 = ptrtoint %"struct.rubinius::Object"* %stack_load53 to i64 | |
%lshr = lshr i64 %as_int56, 1 | |
%table_size_pos = getelementptr %"struct.rubinius::Tuple"* %upcast, i32 0, i32 1 | |
%table_size = load i32* %table_size_pos | |
%to_native_int = sext i32 %table_size to i64 | |
%25 = sub i64 %to_native_int, 32 | |
%26 = sdiv i64 %25, 8 | |
%is_in_bounds = icmp slt i64 %lshr, %26 | |
%access_cmp = and i1 %is_fixnum, %is_in_bounds | |
br i1 %access_cmp, label %tuple_at, label %fallback48 | |
tuple_at: ; preds = %is_tuple | |
%field_pos = getelementptr %"struct.rubinius::Tuple"* %upcast, i32 0, i32 2, i64 %lshr | |
%tuple_at57 = load %"struct.rubinius::Object"** %field_pos | |
%stack_pos58 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %tuple_at57, %"struct.rubinius::Object"** %stack_pos58 | |
br label %continue49 | |
continue60: ; preds = %check_active61 | |
%stack_pos63 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ys, %"struct.rubinius::Object"** %stack_pos63 | |
%local_pos64 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local65 = load %"struct.rubinius::Object"** %local_pos64 | |
%stack_pos66 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local65, %"struct.rubinius::Object"** %stack_pos66 | |
%stack_pos67 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 3 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos67 | |
%stack_pos68 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load69 = load %"struct.rubinius::Object"** %stack_pos68 | |
%stack_pos70 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load71 = load %"struct.rubinius::Object"** %stack_pos70 | |
%cast75 = ptrtoint %"struct.rubinius::Object"* %stack_load69 to i64 | |
%cast76 = ptrtoint %"struct.rubinius::Object"* %stack_load71 to i64 | |
%both77 = and i64 %cast75, %cast76 | |
%masked78 = and i64 %both77, 1 | |
%are_fixnums79 = icmp eq i64 %masked78, 1 | |
br i1 %are_fixnums79, label %fast72, label %dispatch73 | |
check_active61: ; preds = %continue49 | |
br label %continue60 | |
fast72: ; preds = %continue60 | |
%as_int87 = ptrtoint %"struct.rubinius::Object"* %stack_load69 to i64 | |
%lshr88 = lshr i64 %as_int87, 1 | |
%stripped = trunc i64 %lshr88 to i63 | |
%as_int89 = ptrtoint %"struct.rubinius::Object"* %stack_load71 to i64 | |
%lshr90 = lshr i64 %as_int89, 1 | |
%stripped91 = trunc i64 %lshr90 to i63 | |
%add.overflow = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped, i63 %stripped91) | |
%sum = extractvalue %0 %add.overflow, 0 | |
%did_overflow = extractvalue %0 %add.overflow, 1 | |
br i1 %did_overflow, label %dispatch73, label %tagnow | |
dispatch73: ; preds = %fast72, %continue60 | |
%stack_pos80 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load81 = load %"struct.rubinius::Object"** %stack_pos80 | |
store %"struct.rubinius::Object"* %stack_load81, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos82 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos82, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute83 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337101376 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 30, i32* %ip_pos | |
%ic_send84 = call %"struct.rubinius::Object"* %execute83(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337101376 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check86 = icmp eq %"struct.rubinius::Object"* %ic_send84, null | |
br i1 %null_check86, label %ret_null, label %check_active85 | |
tagnow: ; preds = %fast72 | |
%as_native_int = zext i63 %sum to i64 | |
%shl = shl i64 %as_native_int, 1 | |
%or = or i64 %shl, 1 | |
%as_obj = inttoptr i64 %or to %"struct.rubinius::Object"* | |
br label %cont74 | |
cont74: ; preds = %tagnow, %check_active85 | |
%addition92 = phi %"struct.rubinius::Object"* [ %ic_send84, %check_active85 ], [ %as_obj, %tagnow ] | |
%stack_pos93 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition92, %"struct.rubinius::Object"** %stack_pos93 | |
%local_pos94 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos95 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load96 = load %"struct.rubinius::Object"** %stack_pos95 | |
store %"struct.rubinius::Object"* %stack_load96, %"struct.rubinius::Object"** %local_pos94 | |
store i32 35, i32* %ip_pos | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check99 = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check99, label %ret_null, label %check_active98 | |
check_active85: ; preds = %dispatch73 | |
br label %cont74 | |
continue97: ; preds = %check_active98 | |
br label %ip10 | |
check_active98: ; preds = %cont74 | |
br label %continue97 | |
continue100: ; No predecessors! | |
br label %ip38 | |
ip38: ; preds = %continue100, %cont | |
%stack_pos101 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos101 | |
%27 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self102 = load %"struct.rubinius::Object"** %27 | |
%stack_pos103 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self102, %"struct.rubinius::Object"** %stack_pos103 | |
%stack_pos104 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load105 = load %"struct.rubinius::Object"** %stack_pos104 | |
br label %return_pad | |
return_pad: ; preds = %ip38, %fallback48, %ret_raise_val, %ret_null, %arg_error | |
%return_phi = phi %"struct.rubinius::Object"* [ %ret, %arg_error ], [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %23, %fallback48 ], [ %stack_load105, %ip38 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
ret_null106: ; preds = %import_args | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Optimized IR: each ]]] | |
define %"struct.rubinius::Object"* @"_X_Rubinius::Tuple#each@1"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%unwind_info108 = alloca [60 x i32], align 4 | |
%cfstk109 = alloca [13 x %"struct.rubinius::Object"*], align 8 | |
%var_mem110 = alloca [8 x %"struct.rubinius::Object"*], align 8 | |
%out_args = alloca %"struct.rubinius::Arguments", align 8 | |
%unwind_info108.sub = getelementptr inbounds [60 x i32]* %unwind_info108, i64 0, i64 0 | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 2 | |
%arg.total = load i32* %total_pos, align 4 | |
%arg_cmp = icmp eq i32 %arg.total, 0 | |
br i1 %arg_cmp, label %import_args, label %arg_error | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
ret %"struct.rubinius::Object"* %ret | |
import_args: ; preds = %entry | |
%call_frame = bitcast [13 x %"struct.rubinius::Object"*]* %cfstk109 to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 9 | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0, align 8 | |
%1 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 3 | |
%2 = getelementptr inbounds [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %3, align 8 | |
%4 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 2 | |
%.c = bitcast %"struct.rubinius::Dispatch"* %msg to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %4, align 8 | |
%cm.c = getelementptr inbounds %"struct.rubinius::Executable"* %msg.exec, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"** %1, align 8 | |
%5 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 4 | |
%6 = bitcast %"struct.rubinius::Object"** %5 to i32* | |
store i32 80, i32* %6, align 8 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %7, align 4 | |
%8 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 7 | |
%vars.c = bitcast [8 x %"struct.rubinius::Object"*]* %var_mem110 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %8, align 8 | |
%9 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4341104672 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %9, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%stack_pos1 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%stack_pos2 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2, align 8 | |
%stack_pos3 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk109, i64 0, i64 12 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3, align 8 | |
%10 = getelementptr inbounds [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %10, align 8 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12, align 8 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13, align 8 | |
%14 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 4 | |
%msg.module.c = getelementptr inbounds %"struct.rubinius::Module"* %msg.module, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %msg.module.c, %"struct.rubinius::Object"** %14, align 8 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 1 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18, align 8 | |
%19 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %19, align 8 | |
%20 = getelementptr [8 x %"struct.rubinius::Object"*]* %var_mem110, i64 0, i64 7 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %20, align 8 | |
%ci107 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%21 = icmp eq %"struct.rubinius::Object"* %ci107, null | |
br i1 %21, label %ret_null106, label %method_body | |
method_body: ; preds = %import_args | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 4 | |
store %"struct.rubinius::Object"* inttoptr (i64 1 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %19, align 8 | |
%self = load %"struct.rubinius::Object"** %12, align 8 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack, align 8 | |
%cast = ptrtoint %"struct.rubinius::Object"* %self to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
continue: ; preds = %correct_class, %fallback | |
%send_result = phi %"struct.rubinius::Object"* [ %ic_send, %fallback ], [ %prim_value, %correct_class ] | |
%null_check = icmp eq %"struct.rubinius::Object"* %send_result, null | |
br i1 %null_check, label %return_pad, label %check_active | |
check_class_id: ; preds = %method_body | |
%class_pos = getelementptr %"struct.rubinius::Object"* %self, i64 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos, align 8 | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i64 0, i32 4 | |
%class_id = load i32* %class_id_pos, align 4 | |
%check_class_id11 = icmp eq i32 %class_id, 4 | |
br i1 %check_class_id11, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%prim_value = call %"struct.rubinius::Object"* @jit_stub_tuple_fields(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %self) | |
%22 = icmp eq %"struct.rubinius::Object"* %prim_value, inttoptr (i64 34 to %"struct.rubinius::Object"*) | |
br i1 %22, label %correct_class.fallback_crit_edge, label %continue | |
correct_class.fallback_crit_edge: ; preds = %correct_class | |
%stack_load14.pre = load %"struct.rubinius::Object"** %stack, align 8 | |
br label %fallback | |
fallback: ; preds = %correct_class.fallback_crit_edge, %check_class_id, %method_body | |
%stack_load14 = phi %"struct.rubinius::Object"* [ %stack_load14.pre, %correct_class.fallback_crit_edge ], [ %self, %check_class_id ], [ %self, %method_body ] | |
store %"struct.rubinius::Object"* %stack_load14, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 0, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337101048 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 5, i32* %7, align 4 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337100992 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
br label %continue | |
ip10: ; preds = %check_active98, %check_active | |
%local23 = phi %"struct.rubinius::Object"* [ %local23.pre, %check_active98 ], [ %send_result, %check_active ] | |
%local = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %local23, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%cast29 = ptrtoint %"struct.rubinius::Object"* %local to i64 | |
%cast30 = ptrtoint %"struct.rubinius::Object"* %local23 to i64 | |
%both = and i64 %cast30, 1 | |
%masked31 = and i64 %both, %cast29 | |
%are_fixnums = icmp eq i64 %masked31, 0 | |
br i1 %are_fixnums, label %dispatch, label %fast | |
check_active: ; preds = %continue | |
store %"struct.rubinius::Object"* %send_result, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %send_result, %"struct.rubinius::Object"** %20, align 8 | |
br label %ip10 | |
fast: ; preds = %ip10 | |
%imm_cmp = icmp slt %"struct.rubinius::Object"* %local, %local23 | |
%select_bool = select i1 %imm_cmp, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %cont | |
dispatch: ; preds = %ip10 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute35 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337101176 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 14, i32* %7, align 4 | |
%ic_send36 = call %"struct.rubinius::Object"* %execute35(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337101120 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check38 = icmp eq %"struct.rubinius::Object"* %ic_send36, null | |
br i1 %null_check38, label %return_pad, label %cont | |
cont: ; preds = %dispatch, %fast | |
%addition = phi %"struct.rubinius::Object"* [ %select_bool, %fast ], [ %ic_send36, %dispatch ] | |
%as_int = ptrtoint %"struct.rubinius::Object"* %addition to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
%self102 = load %"struct.rubinius::Object"** %12, align 8 | |
store %"struct.rubinius::Object"* %self102, %"struct.rubinius::Object"** %stack, align 8 | |
br i1 %is_true, label %return_pad, label %continue42 | |
continue42: ; preds = %cont | |
%local46 = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local46, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%word_pos = getelementptr %"struct.rubinius::Object"* %self102, i64 0, i32 0, i32 0, i32 0 | |
%flags = load i8** %word_pos, align 8 | |
%tmp = ptrtoint i8* %flags to i64 | |
%mask111 = and i64 %tmp, 511 | |
%is_type = icmp eq i64 %mask111, 118 | |
br i1 %is_type, label %is_tuple, label %fallback48 | |
fallback48: ; preds = %is_tuple, %continue42 | |
store i32 21, i32* %7, align 4 | |
%23 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 21, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info108.sub) | |
ret %"struct.rubinius::Object"* %23 | |
is_tuple: ; preds = %continue42 | |
%cast54 = ptrtoint %"struct.rubinius::Object"* %local46 to i64 | |
%masked55 = and i64 %cast54, 1 | |
%is_fixnum = icmp ne i64 %masked55, 0 | |
%lshr = lshr i64 %cast54, 1 | |
%table_size_pos = getelementptr %"struct.rubinius::Object"* %self102, i64 1 | |
%24 = bitcast %"struct.rubinius::Object"* %table_size_pos to i32* | |
%table_size = load i32* %24, align 4 | |
%to_native_int = sext i32 %table_size to i64 | |
%25 = add i64 %to_native_int, -32 | |
%26 = sdiv i64 %25, 8 | |
%is_in_bounds = icmp slt i64 %lshr, %26 | |
%access_cmp = and i1 %is_fixnum, %is_in_bounds | |
br i1 %access_cmp, label %tuple_at, label %fallback48 | |
tuple_at: ; preds = %is_tuple | |
%upcast = bitcast %"struct.rubinius::Object"* %self102 to %"struct.rubinius::Tuple"* | |
%field_pos = getelementptr %"struct.rubinius::Tuple"* %upcast, i64 0, i32 2, i64 %lshr | |
%tuple_at57 = load %"struct.rubinius::Object"** %field_pos, align 8 | |
store %"struct.rubinius::Object"* %tuple_at57, %"struct.rubinius::Object"** %stack, align 8 | |
%block = load %"struct.rubinius::Object"** %16, align 8 | |
store i32 24, i32* %7, align 4 | |
%ys = call %"struct.rubinius::Object"* @rbx_yield_stack(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %block, i32 1, %"struct.rubinius::Object"** %stack) | |
%null_check62 = icmp eq %"struct.rubinius::Object"* %ys, null | |
br i1 %null_check62, label %return_pad, label %check_active61 | |
check_active61: ; preds = %tuple_at | |
%local65 = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local65, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 3 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%cast75 = ptrtoint %"struct.rubinius::Object"* %local65 to i64 | |
%masked78 = and i64 %cast75, 1 | |
%are_fixnums79 = icmp eq i64 %masked78, 0 | |
br i1 %are_fixnums79, label %dispatch73, label %fast72 | |
fast72: ; preds = %check_active61 | |
%lshr88 = lshr i64 %cast75, 1 | |
%stripped = trunc i64 %lshr88 to i63 | |
%add.overflow = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped, i63 1) | |
%did_overflow = extractvalue %0 %add.overflow, 1 | |
br i1 %did_overflow, label %dispatch73, label %tagnow | |
dispatch73: ; preds = %check_active61, %fast72 | |
store %"struct.rubinius::Object"* %local65, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute83 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337101432 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 30, i32* %7, align 4 | |
%ic_send84 = call %"struct.rubinius::Object"* %execute83(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337101376 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check86 = icmp eq %"struct.rubinius::Object"* %ic_send84, null | |
br i1 %null_check86, label %return_pad, label %cont74 | |
tagnow: ; preds = %fast72 | |
%sum = extractvalue %0 %add.overflow, 0 | |
%as_native_int = zext i63 %sum to i64 | |
%shl = shl i64 %as_native_int, 1 | |
%or = or i64 %shl, 1 | |
%as_obj = inttoptr i64 %or to %"struct.rubinius::Object"* | |
br label %cont74 | |
cont74: ; preds = %dispatch73, %tagnow | |
%addition92 = phi %"struct.rubinius::Object"* [ %as_obj, %tagnow ], [ %ic_send84, %dispatch73 ] | |
store %"struct.rubinius::Object"* %addition92, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %addition92, %"struct.rubinius::Object"** %19, align 8 | |
store i32 35, i32* %7, align 4 | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check99 = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check99, label %return_pad, label %check_active98 | |
check_active98: ; preds = %cont74 | |
%local23.pre = load %"struct.rubinius::Object"** %20, align 8 | |
br label %ip10 | |
return_pad: ; preds = %cont, %continue, %dispatch, %tuple_at, %dispatch73, %cont74 | |
%return_phi = phi %"struct.rubinius::Object"* [ null, %cont74 ], [ null, %dispatch73 ], [ null, %tuple_at ], [ null, %dispatch ], [ null, %continue ], [ %self102, %cont ] | |
ret %"struct.rubinius::Object"* %return_phi | |
ret_null106: ; preds = %import_args | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Enumerable#find_all$block@2"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::BlockEnvironment"* %env, %"struct.rubinius::Arguments"* %args, %"struct.rubinius::BlockInvocation"* %invocation) { | |
entry: | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%valid_flag = alloca i1 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 13 | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 7 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%1 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 4 | |
%env.method = load %"struct.rubinius::CompiledMethod"** %1 | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 2 | |
%invocation.static_scope = load %"struct.rubinius::StaticScope"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 1 | |
store %"struct.rubinius::StaticScope"* %invocation.static_scope, %"struct.rubinius::StaticScope"** %4 | |
%5 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %5 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
store i8* null, i8** %6 | |
store %"struct.rubinius::CompiledMethod"* %env.method, %"struct.rubinius::CompiledMethod"** %0 | |
%7 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 0 | |
%invocation.flags = load i32* %7 | |
%flags = or i32 %invocation.flags, 214 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 %flags, i32* %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %9 | |
%10 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %10 | |
%11 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 2 | |
%env.top_scope = load %"struct.rubinius::VariableScope"** %11 | |
%12 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 7 | |
store %"struct.rubinius::VariableScope"* %env.top_scope, %"struct.rubinius::VariableScope"** %12 | |
%13 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4339288128 to i8*), i8** %13 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2 | |
%stack_pos3 = getelementptr %"struct.rubinius::Object"** %stack, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %14 | |
%15 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 1 | |
%invocation.self = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %invocation.self, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 3 | |
%invocation.module = load %"struct.rubinius::Module"** %17 | |
%18 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 5 | |
%env.module = load %"struct.rubinius::Module"** %18 | |
%19 = icmp ne %"struct.rubinius::Module"* %invocation.module, null | |
%20 = select i1 %19, %"struct.rubinius::Module"* %invocation.module, %"struct.rubinius::Module"* %env.module | |
%21 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %20, %"struct.rubinius::Module"** %21 | |
%22 = getelementptr %"struct.rubinius::VariableScope"* %env.top_scope, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %22 | |
%23 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %23 | |
%24 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 1 | |
%env.scope = load %"struct.rubinius::VariableScope"** %24 | |
%25 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* %env.scope, %"struct.rubinius::VariableScope"** %25 | |
%26 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %26 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
%cfstk29 = alloca %"struct.rubinius::Object"*, i32 13 | |
%var_mem32 = alloca %"struct.rubinius::Object"*, i32 7 | |
br label %block_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %return_pad25, %ip10, %block_body, %bail_out | |
br label %return_pad | |
block_body: ; preds = %entry | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%cfsba = call %"struct.rubinius::Object"* @rbx_cast_for_single_block_arg(%"struct.rubinius::VM"* %state, %"struct.rubinius::Arguments"* %args) | |
%stack_pos4 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %stack_pos4 | |
%local_pos5 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos6 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos6 | |
store %"struct.rubinius::Object"* %stack_load, %"struct.rubinius::Object"** %local_pos5 | |
%local_pos7 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local = load %"struct.rubinius::Object"** %local_pos7 | |
%stack_pos8 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack_pos8 | |
%27 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
%block = load %"struct.rubinius::Object"** %27 | |
%stack_pos9 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store i32 6, i32* %ip_pos | |
%ys = call %"struct.rubinius::Object"* @rbx_yield_stack(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %block, i32 1, %"struct.rubinius::Object"** %stack_pos9) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ys, null | |
br i1 %null_check, label %ret_null, label %check_active | |
continue: ; preds = %check_active | |
%stack_pos10 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ys, %"struct.rubinius::Object"** %stack_pos10 | |
%stack_pos11 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load12 = load %"struct.rubinius::Object"** %stack_pos11 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load12 to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip20, label %continue13 | |
check_active: ; preds = %block_body | |
br label %continue | |
continue13: ; preds = %continue | |
br label %ip10 | |
ip10: ; preds = %continue13 | |
%pld = call %"struct.rubinius::Object"* @rbx_push_local_depth(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 1, i32 0) | |
%null_check16 = icmp eq %"struct.rubinius::Object"* %pld, null | |
br i1 %null_check16, label %ret_null, label %check_active15 | |
continue14: ; preds = %check_active15 | |
%stack_pos17 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %pld, %"struct.rubinius::Object"** %stack_pos17 | |
%local_pos18 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local19 = load %"struct.rubinius::Object"** %local_pos18 | |
%stack_pos20 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local19, %"struct.rubinius::Object"** %stack_pos20 | |
%stack_pos22 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load23 = load %"struct.rubinius::Object"** %stack_pos22 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load23 to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
check_active15: ; preds = %ip10 | |
br label %continue14 | |
continue21: ; preds = %continue77 | |
br label %ip21 | |
check_class_id: ; preds = %continue14 | |
%class_pos = getelementptr %"struct.rubinius::Object"* %stack_load23, i32 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i32 0, i32 4 | |
%class_id = load i32* %class_id_pos | |
%check_class_id24 = icmp eq i32 %class_id, 33 | |
br i1 %check_class_id24, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%stack_pos27 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load28 = load %"struct.rubinius::Object"** %stack_pos27 | |
br label %inline_entry | |
fallback: ; preds = %check_class_id, %continue14 | |
store i32 15, i32* %ip_pos | |
%28 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 15, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
inline_entry: ; preds = %correct_class | |
%call_frame30 = bitcast %"struct.rubinius::Object"** %cfstk29 to %"struct.rubinius::CallFrame"* | |
%stack31 = getelementptr %"struct.rubinius::Object"** %cfstk29, i32 9 | |
%vars33 = bitcast %"struct.rubinius::Object"** %var_mem32 to %"struct.rubinius::StackVariables"* | |
%29 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::CallFrame"** %29 | |
%30 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 2 | |
store i8* inttoptr (i64 4339780768 to i8*), i8** %30 | |
%cm = load %"struct.rubinius::CompiledMethod"** getelementptr (%"struct.rubinius::jit::RuntimeData"* inttoptr (i64 4339780768 to %"struct.rubinius::jit::RuntimeData"*), i32 0, i32 0) | |
%31 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 3 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %31 | |
%32 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 4 | |
store i32 24, i32* %32 | |
%33 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 5 | |
store i32 0, i32* %33 | |
%34 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars33, %"struct.rubinius::StackVariables"** %34 | |
%stack_pos34 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos34 | |
%stack_pos35 = getelementptr %"struct.rubinius::Object"** %stack31, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos35 | |
%stack_pos36 = getelementptr %"struct.rubinius::Object"** %stack31, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos36 | |
%stack_pos37 = getelementptr %"struct.rubinius::Object"** %stack31, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos37 | |
%module = load %"struct.rubinius::Module"** getelementptr (%"struct.rubinius::jit::RuntimeData"* inttoptr (i64 4339780768 to %"struct.rubinius::jit::RuntimeData"*), i32 0, i32 2) | |
%35 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %35 | |
%36 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %stack_load23, %"struct.rubinius::Object"** %36 | |
%37 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %module, %"struct.rubinius::Module"** %37 | |
%38 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %38 | |
%39 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %39 | |
%40 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %40 | |
%local_pos38 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos38 | |
%local_pos39 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* %stack_load28, %"struct.rubinius::Object"** %local_pos39 | |
br label %method_body | |
bail_out40: ; No predecessors! | |
%rth41 = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame30) | |
br i1 %rth41, label %ret_raise_val42, label %ret_null43 | |
ret_raise_val42: ; preds = %bail_out40 | |
%crv44 = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad25 | |
ret_null43: ; preds = %continue54, %method_body, %bail_out40 | |
br label %return_pad25 | |
method_body: ; preds = %inline_entry | |
%ip_pos45 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i32 0, i32 5 | |
%out_args_recv46 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block47 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total48 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments49 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container50 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%41 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %41 | |
%stack_pos51 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack_pos51 | |
%stack_pos52 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
%stack_load53 = load %"struct.rubinius::Object"** %stack_pos52 | |
%42 = call %"struct.rubinius::Object"* @rbx_check_frozen(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame30, %"struct.rubinius::Object"* %stack_load53) | |
%null_check56 = icmp eq %"struct.rubinius::Object"* %42, null | |
br i1 %null_check56, label %ret_null43, label %check_active55 | |
continue54: ; preds = %check_active55 | |
%43 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 2 | |
%self57 = load %"struct.rubinius::Object"** %43 | |
%stack_pos58 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
store %"struct.rubinius::Object"* %self57, %"struct.rubinius::Object"** %stack_pos58 | |
%self_pos = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 2 | |
%self59 = load %"struct.rubinius::Object"** %self_pos | |
%obj_array = bitcast %"struct.rubinius::Object"* %self59 to %"struct.rubinius::Object"** | |
%field_pos = getelementptr %"struct.rubinius::Object"** %obj_array, i32 3 | |
%field = load %"struct.rubinius::Object"** %field_pos | |
%stack_pos60 = getelementptr %"struct.rubinius::Object"** %stack31, i32 1 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack_pos60 | |
%local_pos61 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 6, i32 0 | |
%local62 = load %"struct.rubinius::Object"** %local_pos61 | |
%stack_pos63 = getelementptr %"struct.rubinius::Object"** %stack31, i32 2 | |
store %"struct.rubinius::Object"* %local62, %"struct.rubinius::Object"** %stack_pos63 | |
%stack_pos66 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
%stack_load67 = load %"struct.rubinius::Object"** %stack_pos66 | |
store %"struct.rubinius::Object"* %stack_load67, %"struct.rubinius::Object"** %out_args_recv46 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block47 | |
store i32 2, i32* %out_args_total48 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container50 | |
%stack_pos68 = getelementptr %"struct.rubinius::Object"** %stack31, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos68, %"struct.rubinius::Object"*** %out_args_arguments49 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337323824 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 9, i32* %ip_pos45 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337323824 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame30, %"struct.rubinius::Arguments"* %out_args) | |
%null_check71 = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check71, label %ret_null43, label %check_active70 | |
check_active55: ; preds = %method_body | |
br label %continue54 | |
fallback64: ; No predecessors! | |
continue65: ; No predecessors! | |
continue69: ; preds = %check_active70 | |
%stack_pos72 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
store %"struct.rubinius::Object"* %ic_send, %"struct.rubinius::Object"** %stack_pos72 | |
%44 = getelementptr %"struct.rubinius::StackVariables"* %vars33, i32 0, i32 2 | |
%self73 = load %"struct.rubinius::Object"** %44 | |
%stack_pos74 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
store %"struct.rubinius::Object"* %self73, %"struct.rubinius::Object"** %stack_pos74 | |
%stack_pos75 = getelementptr %"struct.rubinius::Object"** %stack31, i32 0 | |
%stack_load76 = load %"struct.rubinius::Object"** %stack_pos75 | |
br label %return_pad25 | |
return_pad25: ; preds = %continue69, %ret_raise_val42, %ret_null43 | |
%return_phi26 = phi %"struct.rubinius::Object"* [ null, %ret_null43 ], [ %crv44, %ret_raise_val42 ], [ %stack_load76, %continue69 ] | |
%null_check79 = icmp eq %"struct.rubinius::Object"* %return_phi26, null | |
br i1 %null_check79, label %ret_null, label %check_active78 | |
check_active70: ; preds = %continue54 | |
br label %continue69 | |
continue77: ; preds = %check_active78 | |
%stack_pos80 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %return_phi26, %"struct.rubinius::Object"** %stack_pos80 | |
br label %continue21 | |
check_active78: ; preds = %return_pad25 | |
br label %continue77 | |
continue81: ; No predecessors! | |
br label %ip20 | |
ip21: ; preds = %ip20, %continue21 | |
%stack_pos82 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load83 = load %"struct.rubinius::Object"** %stack_pos82 | |
br label %return_pad | |
ip20: ; preds = %continue81, %continue | |
%stack_pos84 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos84 | |
br label %ip21 | |
return_pad: ; preds = %ip21, %fallback, %ret_raise_val, %ret_null | |
%return_phi = phi %"struct.rubinius::Object"* [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %28, %fallback ], [ %stack_load83, %ip21 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
} | |
[[[ LLVM Optimized IR: find_all ]]] | |
define %"struct.rubinius::Object"* @"_X_Enumerable#find_all$block@2"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::BlockEnvironment"* %env, %"struct.rubinius::Arguments"* %args, %"struct.rubinius::BlockInvocation"* %invocation) { | |
entry: | |
%unwind_info85 = alloca [60 x i32], align 4 | |
%cfstk86 = alloca [13 x %"struct.rubinius::Object"*], align 8 | |
%unwind_info85.sub = getelementptr inbounds [60 x i32]* %unwind_info85, i64 0, i64 0 | |
%call_frame = bitcast [13 x %"struct.rubinius::Object"*]* %cfstk86 to %"struct.rubinius::CallFrame"* | |
%out_args = alloca %"struct.rubinius::Arguments", align 8 | |
%stack = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 9 | |
%var_mem87 = alloca [7 x %"struct.rubinius::Object"*], align 8 | |
%0 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 3 | |
%1 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 4 | |
%env.method = load %"struct.rubinius::CompiledMethod"** %1, align 8 | |
%2 = getelementptr inbounds [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 2 | |
%invocation.static_scope = load %"struct.rubinius::StaticScope"** %3, align 8 | |
%4 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 1 | |
%invocation.static_scope.c = bitcast %"struct.rubinius::StaticScope"* %invocation.static_scope to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %invocation.static_scope.c, %"struct.rubinius::Object"** %4, align 8 | |
%5 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %5, align 8 | |
%6 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 2 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %6, align 8 | |
%env.method.c = getelementptr inbounds %"struct.rubinius::CompiledMethod"* %env.method, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %env.method.c, %"struct.rubinius::Object"** %0, align 8 | |
%7 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 0 | |
%invocation.flags = load i32* %7, align 4 | |
%flags = or i32 %invocation.flags, 214 | |
%8 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 4 | |
%9 = bitcast %"struct.rubinius::Object"** %8 to i32* | |
store i32 %flags, i32* %9, align 8 | |
%10 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %10, align 4 | |
%11 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 7 | |
%vars.c = bitcast [7 x %"struct.rubinius::Object"*]* %var_mem87 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 2 | |
%env.top_scope = load %"struct.rubinius::VariableScope"** %12, align 8 | |
%13 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 6 | |
%env.top_scope.c = getelementptr inbounds %"struct.rubinius::VariableScope"* %env.top_scope, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %env.top_scope.c, %"struct.rubinius::Object"** %13, align 8 | |
%14 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4339288128 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %14, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%stack_pos1 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%stack_pos2 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2, align 8 | |
%stack_pos3 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk86, i64 0, i64 12 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3, align 8 | |
%15 = getelementptr inbounds [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 1 | |
%invocation.self = load %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %invocation.self, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 3 | |
%invocation.module = load %"struct.rubinius::Module"** %18, align 8 | |
%19 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 5 | |
%env.module = load %"struct.rubinius::Module"** %19, align 8 | |
%20 = icmp ne %"struct.rubinius::Module"* %invocation.module, null | |
%21 = select i1 %20, %"struct.rubinius::Module"* %invocation.module, %"struct.rubinius::Module"* %env.module | |
%22 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 4 | |
%.c = getelementptr inbounds %"struct.rubinius::Module"* %21, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %22, align 8 | |
%23 = getelementptr %"struct.rubinius::VariableScope"* %env.top_scope, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %23, align 8 | |
%24 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %24, align 8 | |
%25 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 1 | |
%env.scope = load %"struct.rubinius::VariableScope"** %25, align 8 | |
%26 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 1 | |
%env.scope.c = getelementptr inbounds %"struct.rubinius::VariableScope"* %env.scope, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %env.scope.c, %"struct.rubinius::Object"** %26, align 8 | |
%27 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %27, align 8 | |
%28 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem87, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %28, align 8 | |
%cfstk2988 = alloca [13 x %"struct.rubinius::Object"*], align 8 | |
%var_mem3289 = alloca [7 x %"struct.rubinius::Object"*], align 8 | |
%cfsba = call %"struct.rubinius::Object"* @rbx_cast_for_single_block_arg(%"struct.rubinius::VM"* %state, %"struct.rubinius::Arguments"* %args) | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %28, align 8 | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %stack, align 8 | |
%block = load %"struct.rubinius::Object"** %24, align 8 | |
store i32 6, i32* %10, align 4 | |
%ys = call %"struct.rubinius::Object"* @rbx_yield_stack(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %block, i32 1, %"struct.rubinius::Object"** %stack) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ys, null | |
br i1 %null_check, label %return_pad, label %check_active | |
check_active: ; preds = %entry | |
store %"struct.rubinius::Object"* %ys, %"struct.rubinius::Object"** %stack, align 8 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %ys to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip21, label %continue13 | |
continue13: ; preds = %check_active | |
%pld = call %"struct.rubinius::Object"* @rbx_push_local_depth(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 1, i32 0) | |
%null_check16 = icmp eq %"struct.rubinius::Object"* %pld, null | |
br i1 %null_check16, label %return_pad, label %check_active15 | |
check_active15: ; preds = %continue13 | |
store %"struct.rubinius::Object"* %pld, %"struct.rubinius::Object"** %stack, align 8 | |
%local19 = load %"struct.rubinius::Object"** %28, align 8 | |
store %"struct.rubinius::Object"* %local19, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%cast = ptrtoint %"struct.rubinius::Object"* %pld to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
check_class_id: ; preds = %check_active15 | |
%class_pos = getelementptr %"struct.rubinius::Object"* %pld, i64 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos, align 8 | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i64 0, i32 4 | |
%class_id = load i32* %class_id_pos, align 4 | |
%check_class_id24 = icmp eq i32 %class_id, 33 | |
br i1 %check_class_id24, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%call_frame30 = bitcast [13 x %"struct.rubinius::Object"*]* %cfstk2988 to %"struct.rubinius::CallFrame"* | |
%stack31 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 9 | |
%29 = getelementptr inbounds [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 0 | |
%call_frame.c = bitcast [13 x %"struct.rubinius::Object"*]* %cfstk86 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %call_frame.c, %"struct.rubinius::Object"** %29, align 8 | |
%30 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 4339780768 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %30, align 8 | |
%cm = load %"struct.rubinius::CompiledMethod"** inttoptr (i64 4339780768 to %"struct.rubinius::CompiledMethod"**), align 32 | |
%31 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 3 | |
%cm.c = getelementptr inbounds %"struct.rubinius::CompiledMethod"* %cm, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"** %31, align 8 | |
%32 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 4 | |
%33 = bitcast %"struct.rubinius::Object"** %32 to i32* | |
store i32 24, i32* %33, align 8 | |
%34 = getelementptr %"struct.rubinius::CallFrame"* %call_frame30, i64 0, i32 5 | |
store i32 0, i32* %34, align 4 | |
%35 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 7 | |
%vars33.c = bitcast [7 x %"struct.rubinius::Object"*]* %var_mem3289 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars33.c, %"struct.rubinius::Object"** %35, align 8 | |
%stack_pos35 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos35, align 8 | |
%stack_pos36 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos36, align 8 | |
%stack_pos37 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk2988, i64 0, i64 12 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos37, align 8 | |
%module = load %"struct.rubinius::Module"** inttoptr (i64 4339780784 to %"struct.rubinius::Module"**), align 16 | |
%36 = getelementptr inbounds [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %36, align 8 | |
%37 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %pld, %"struct.rubinius::Object"** %37, align 8 | |
%38 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 4 | |
%module.c = getelementptr inbounds %"struct.rubinius::Module"* %module, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %module.c, %"struct.rubinius::Object"** %38, align 8 | |
%39 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %39, align 8 | |
%40 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 1 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %40, align 8 | |
%41 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %41, align 8 | |
%42 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem3289, i64 0, i64 6 | |
store %"struct.rubinius::Object"* %local19, %"struct.rubinius::Object"** %42, align 8 | |
store %"struct.rubinius::Object"* %pld, %"struct.rubinius::Object"** %stack31, align 8 | |
%43 = call %"struct.rubinius::Object"* @rbx_check_frozen(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame30, %"struct.rubinius::Object"* %pld) | |
%null_check56 = icmp eq %"struct.rubinius::Object"* %43, null | |
br i1 %null_check56, label %return_pad25, label %check_active55 | |
fallback: ; preds = %check_class_id, %check_active15 | |
store i32 15, i32* %10, align 4 | |
%44 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 15, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info85.sub) | |
ret %"struct.rubinius::Object"* %44 | |
check_active55: ; preds = %correct_class | |
%out_args_container50 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 4 | |
%out_args_arguments49 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 3 | |
%out_args_total48 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 2 | |
%out_args_block47 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 1 | |
%out_args_recv46 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 0 | |
%self57 = load %"struct.rubinius::Object"** %37, align 8 | |
store %"struct.rubinius::Object"* %self57, %"struct.rubinius::Object"** %stack31, align 8 | |
%field_pos = getelementptr %"struct.rubinius::Object"* %self57, i64 1 | |
%45 = bitcast %"struct.rubinius::Object"* %field_pos to %"struct.rubinius::Object"** | |
%field = load %"struct.rubinius::Object"** %45, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack_pos35, align 8 | |
%local62 = load %"struct.rubinius::Object"** %42, align 8 | |
store %"struct.rubinius::Object"* %local62, %"struct.rubinius::Object"** %stack_pos36, align 8 | |
store %"struct.rubinius::Object"* %self57, %"struct.rubinius::Object"** %out_args_recv46, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block47, align 8 | |
store i32 2, i32* %out_args_total48, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container50, align 8 | |
store %"struct.rubinius::Object"** %stack_pos35, %"struct.rubinius::Object"*** %out_args_arguments49, align 8 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337323880 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 9, i32* %34, align 4 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337323824 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame30, %"struct.rubinius::Arguments"* %out_args) | |
%null_check71 = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check71, label %return_pad25, label %check_active70 | |
return_pad25: ; preds = %correct_class, %check_active55 | |
ret %"struct.rubinius::Object"* null | |
check_active70: ; preds = %check_active55 | |
%self73 = load %"struct.rubinius::Object"** %37, align 8 | |
store %"struct.rubinius::Object"* %self73, %"struct.rubinius::Object"** %stack31, align 8 | |
ret %"struct.rubinius::Object"* %self73 | |
ip21: ; preds = %check_active | |
ret %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*) | |
return_pad: ; preds = %entry, %continue13 | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Module#add_ivars$block@3"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::BlockEnvironment"* %env, %"struct.rubinius::Arguments"* %args, %"struct.rubinius::BlockInvocation"* %invocation) { | |
entry: | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%valid_flag = alloca i1 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 13 | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 7 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%1 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 4 | |
%env.method = load %"struct.rubinius::CompiledMethod"** %1 | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 2 | |
%invocation.static_scope = load %"struct.rubinius::StaticScope"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 1 | |
store %"struct.rubinius::StaticScope"* %invocation.static_scope, %"struct.rubinius::StaticScope"** %4 | |
%5 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %5 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
store i8* null, i8** %6 | |
store %"struct.rubinius::CompiledMethod"* %env.method, %"struct.rubinius::CompiledMethod"** %0 | |
%7 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 0 | |
%invocation.flags = load i32* %7 | |
%flags = or i32 %invocation.flags, 214 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 %flags, i32* %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %9 | |
%10 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %10 | |
%11 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 2 | |
%env.top_scope = load %"struct.rubinius::VariableScope"** %11 | |
%12 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 7 | |
store %"struct.rubinius::VariableScope"* %env.top_scope, %"struct.rubinius::VariableScope"** %12 | |
%13 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4339401872 to i8*), i8** %13 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2 | |
%stack_pos3 = getelementptr %"struct.rubinius::Object"** %stack, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %14 | |
%15 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 1 | |
%invocation.self = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %invocation.self, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 3 | |
%invocation.module = load %"struct.rubinius::Module"** %17 | |
%18 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 5 | |
%env.module = load %"struct.rubinius::Module"** %18 | |
%19 = icmp ne %"struct.rubinius::Module"* %invocation.module, null | |
%20 = select i1 %19, %"struct.rubinius::Module"* %invocation.module, %"struct.rubinius::Module"* %env.module | |
%21 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %20, %"struct.rubinius::Module"** %21 | |
%22 = getelementptr %"struct.rubinius::VariableScope"* %env.top_scope, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %22 | |
%23 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %23 | |
%24 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 1 | |
%env.scope = load %"struct.rubinius::VariableScope"** %24 | |
%25 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* %env.scope, %"struct.rubinius::VariableScope"** %25 | |
%26 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %26 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
br label %block_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %continue30, %continue, %use_call, %bail_out | |
br label %return_pad | |
block_body: ; preds = %entry | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%cfsba = call %"struct.rubinius::Object"* @rbx_cast_for_single_block_arg(%"struct.rubinius::VM"* %state, %"struct.rubinius::Arguments"* %args) | |
%stack_pos4 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %stack_pos4 | |
%local_pos5 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos6 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos6 | |
store %"struct.rubinius::Object"* %stack_load, %"struct.rubinius::Object"** %local_pos5 | |
%local_pos7 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local = load %"struct.rubinius::Object"** %local_pos7 | |
%stack_pos8 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack_pos8 | |
%global_serial = load i64* inttoptr (i64 4311769968 to i64*) | |
%serial = load i64* inttoptr (i64 4327308728 to i64*) | |
%use_cache = icmp eq i64 %global_serial, %serial | |
br i1 %use_cache, label %use_cache9, label %use_call | |
use_cache9: ; preds = %block_body | |
%cached_value = load %"struct.rubinius::Object"** inttoptr (i64 4327308712 to %"struct.rubinius::Object"**) | |
br label %continue | |
use_call: ; preds = %block_body | |
store i32 6, i32* %ip_pos | |
%push_const_fast = call %"struct.rubinius::Object"* @rbx_push_const_fast(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* inttoptr (i64 2590 to %"struct.rubinius::Object"*), i32 1) nounwind readonly | |
%null_check = icmp eq %"struct.rubinius::Object"* %push_const_fast, null | |
br i1 %null_check, label %ret_null, label %check_active | |
continue: ; preds = %continue10, %use_cache9 | |
%constant = phi %"struct.rubinius::Object"* [ %cached_value, %use_cache9 ], [ %push_const_fast, %continue10 ] | |
%stack_pos11 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %constant, %"struct.rubinius::Object"** %stack_pos11 | |
%stack_pos13 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load14 = load %"struct.rubinius::Object"** %stack_pos13 | |
store %"struct.rubinius::Object"* %stack_load14, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos15 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos15, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4339122784 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 9, i32* %ip_pos | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4339122784 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check18 = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check18, label %ret_null, label %check_active17 | |
continue10: ; preds = %check_active | |
br label %continue | |
check_active: ; preds = %use_call | |
br label %continue10 | |
fallback: ; No predecessors! | |
continue12: ; No predecessors! | |
continue16: ; preds = %check_active17 | |
%stack_pos19 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ic_send, %"struct.rubinius::Object"** %stack_pos19 | |
%stack_pos20 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load21 = load %"struct.rubinius::Object"** %stack_pos20 | |
%stack_pos22 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %stack_load21, %"struct.rubinius::Object"** %stack_pos22 | |
%stack_pos23 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load24 = load %"struct.rubinius::Object"** %stack_pos23 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load24 to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip21, label %continue25 | |
check_active17: ; preds = %continue | |
br label %continue16 | |
continue25: ; preds = %continue16 | |
br label %ip15 | |
ip15: ; preds = %continue25 | |
%local_pos26 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local27 = load %"struct.rubinius::Object"** %local_pos26 | |
%stack_pos28 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local27, %"struct.rubinius::Object"** %stack_pos28 | |
%stack_pos31 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load32 = load %"struct.rubinius::Object"** %stack_pos31 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load32 to i64 | |
%masked = and i64 %cast, 7 | |
%is_symbol = icmp eq i64 %masked, 6 | |
br i1 %is_symbol, label %guarded_body, label %fallback29 | |
continue30: ; preds = %fallback29, %continue33 | |
%send_result = phi %"struct.rubinius::Object"* [ %prim_value, %continue33 ], [ %ic_send37, %fallback29 ] | |
%null_check40 = icmp eq %"struct.rubinius::Object"* %send_result, null | |
br i1 %null_check40, label %ret_null, label %check_active39 | |
guarded_body: ; preds = %ip15 | |
%prim_value = call %"struct.rubinius::Object"* @jit_stub_symbol_is_ivar(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %stack_load32) | |
%ptr2int = ptrtoint %"struct.rubinius::Object"* %prim_value to i64 | |
%27 = icmp eq i64 %ptr2int, 34 | |
br i1 %27, label %fallback29, label %continue33 | |
fallback29: ; preds = %guarded_body, %ip15 | |
%stack_pos34 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load35 = load %"struct.rubinius::Object"** %stack_pos34 | |
store %"struct.rubinius::Object"* %stack_load35, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 0, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%execute36 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4339122912 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 18, i32* %ip_pos | |
%ic_send37 = call %"struct.rubinius::Object"* %execute36(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4339122912 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
br label %continue30 | |
continue33: ; preds = %guarded_body | |
br label %continue30 | |
continue38: ; preds = %check_active39 | |
%stack_pos41 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %send_result, %"struct.rubinius::Object"** %stack_pos41 | |
br label %ip21 | |
ip21: ; preds = %continue38, %continue16 | |
%stack_pos42 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load43 = load %"struct.rubinius::Object"** %stack_pos42 | |
br label %return_pad | |
return_pad: ; preds = %ip21, %ret_raise_val, %ret_null | |
%return_phi = phi %"struct.rubinius::Object"* [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %stack_load43, %ip21 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
check_active39: ; preds = %continue30 | |
br label %continue38 | |
} | |
[[[ LLVM Optimized IR: add_ivars ]]] | |
define %"struct.rubinius::Object"* @"_X_Module#add_ivars$block@3"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::BlockEnvironment"* %env, %"struct.rubinius::Arguments"* %args, %"struct.rubinius::BlockInvocation"* %invocation) { | |
entry: | |
%cfstk44 = alloca [13 x %"struct.rubinius::Object"*], align 8 | |
%call_frame = bitcast [13 x %"struct.rubinius::Object"*]* %cfstk44 to %"struct.rubinius::CallFrame"* | |
%out_args = alloca %"struct.rubinius::Arguments", align 8 | |
%stack = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 9 | |
%var_mem45 = alloca [7 x %"struct.rubinius::Object"*], align 8 | |
%0 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 3 | |
%1 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 4 | |
%env.method = load %"struct.rubinius::CompiledMethod"** %1, align 8 | |
%2 = getelementptr inbounds [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 2 | |
%invocation.static_scope = load %"struct.rubinius::StaticScope"** %3, align 8 | |
%4 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 1 | |
%invocation.static_scope.c = bitcast %"struct.rubinius::StaticScope"* %invocation.static_scope to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %invocation.static_scope.c, %"struct.rubinius::Object"** %4, align 8 | |
%5 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %5, align 8 | |
%6 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 2 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %6, align 8 | |
%env.method.c = getelementptr inbounds %"struct.rubinius::CompiledMethod"* %env.method, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %env.method.c, %"struct.rubinius::Object"** %0, align 8 | |
%7 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 0 | |
%invocation.flags = load i32* %7, align 4 | |
%flags = or i32 %invocation.flags, 214 | |
%8 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 4 | |
%9 = bitcast %"struct.rubinius::Object"** %8 to i32* | |
store i32 %flags, i32* %9, align 8 | |
%10 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %10, align 4 | |
%11 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 7 | |
%vars.c = bitcast [7 x %"struct.rubinius::Object"*]* %var_mem45 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 2 | |
%env.top_scope = load %"struct.rubinius::VariableScope"** %12, align 8 | |
%13 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 6 | |
%env.top_scope.c = getelementptr inbounds %"struct.rubinius::VariableScope"* %env.top_scope, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %env.top_scope.c, %"struct.rubinius::Object"** %13, align 8 | |
%14 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4339401872 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %14, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%stack_pos1 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%stack_pos2 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2, align 8 | |
%stack_pos3 = getelementptr [13 x %"struct.rubinius::Object"*]* %cfstk44, i64 0, i64 12 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3, align 8 | |
%15 = getelementptr inbounds [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 1 | |
%invocation.self = load %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %invocation.self, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 3 | |
%invocation.module = load %"struct.rubinius::Module"** %18, align 8 | |
%19 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 5 | |
%env.module = load %"struct.rubinius::Module"** %19, align 8 | |
%20 = icmp ne %"struct.rubinius::Module"* %invocation.module, null | |
%21 = select i1 %20, %"struct.rubinius::Module"* %invocation.module, %"struct.rubinius::Module"* %env.module | |
%22 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 4 | |
%.c = getelementptr inbounds %"struct.rubinius::Module"* %21, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %22, align 8 | |
%23 = getelementptr %"struct.rubinius::VariableScope"* %env.top_scope, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %23, align 8 | |
%24 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %24, align 8 | |
%25 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 1 | |
%env.scope = load %"struct.rubinius::VariableScope"** %25, align 8 | |
%26 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 1 | |
%env.scope.c = getelementptr inbounds %"struct.rubinius::VariableScope"* %env.scope, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %env.scope.c, %"struct.rubinius::Object"** %26, align 8 | |
%27 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %27, align 8 | |
%28 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem45, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %28, align 8 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 4 | |
%cfsba = call %"struct.rubinius::Object"* @rbx_cast_for_single_block_arg(%"struct.rubinius::VM"* %state, %"struct.rubinius::Arguments"* %args) | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %28, align 8 | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %stack, align 8 | |
%global_serial = load i64* inttoptr (i64 4311769968 to i64*), align 16 | |
%serial = load i64* inttoptr (i64 4327308728 to i64*), align 8 | |
%use_cache = icmp eq i64 %global_serial, %serial | |
br i1 %use_cache, label %use_cache9, label %use_call | |
use_cache9: ; preds = %entry | |
%cached_value = load %"struct.rubinius::Object"** inttoptr (i64 4327308712 to %"struct.rubinius::Object"**), align 8 | |
br label %continue | |
use_call: ; preds = %entry | |
store i32 6, i32* %10, align 4 | |
%push_const_fast = call %"struct.rubinius::Object"* @rbx_push_const_fast(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* inttoptr (i64 2590 to %"struct.rubinius::Object"*), i32 1) nounwind readonly | |
%null_check = icmp eq %"struct.rubinius::Object"* %push_const_fast, null | |
br i1 %null_check, label %return_pad, label %continue | |
continue: ; preds = %use_call, %use_cache9 | |
%constant = phi %"struct.rubinius::Object"* [ %cached_value, %use_cache9 ], [ %push_const_fast, %use_call ] | |
store %"struct.rubinius::Object"* %constant, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4339122840 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 9, i32* %10, align 4 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4339122784 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check18 = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check18, label %return_pad, label %check_active17 | |
check_active17: ; preds = %continue | |
store %"struct.rubinius::Object"* %ic_send, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %ic_send, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %ic_send to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %return_pad, label %continue25 | |
continue25: ; preds = %check_active17 | |
%local27 = load %"struct.rubinius::Object"** %28, align 8 | |
store %"struct.rubinius::Object"* %local27, %"struct.rubinius::Object"** %stack, align 8 | |
%cast = ptrtoint %"struct.rubinius::Object"* %local27 to i64 | |
%masked = and i64 %cast, 7 | |
%is_symbol = icmp eq i64 %masked, 6 | |
br i1 %is_symbol, label %guarded_body, label %fallback29 | |
continue30: ; preds = %guarded_body | |
ret %"struct.rubinius::Object"* %prim_value | |
guarded_body: ; preds = %continue25 | |
%prim_value = call %"struct.rubinius::Object"* @jit_stub_symbol_is_ivar(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %local27) | |
%29 = icmp eq %"struct.rubinius::Object"* %prim_value, inttoptr (i64 34 to %"struct.rubinius::Object"*) | |
br i1 %29, label %guarded_body.fallback29_crit_edge, label %continue30 | |
guarded_body.fallback29_crit_edge: ; preds = %guarded_body | |
%stack_load35.pre = load %"struct.rubinius::Object"** %stack, align 8 | |
br label %fallback29 | |
fallback29: ; preds = %guarded_body.fallback29_crit_edge, %continue25 | |
%stack_load35 = phi %"struct.rubinius::Object"* [ %stack_load35.pre, %guarded_body.fallback29_crit_edge ], [ %local27, %continue25 ] | |
store %"struct.rubinius::Object"* %stack_load35, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 0, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
%execute36 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4339122968 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 18, i32* %10, align 4 | |
%ic_send37 = call %"struct.rubinius::Object"* %execute36(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4339122912 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
ret %"struct.rubinius::Object"* %ic_send37 | |
return_pad: ; preds = %check_active17, %use_call, %continue | |
%return_phi = phi %"struct.rubinius::Object"* [ null, %continue ], [ null, %use_call ], [ %ic_send, %check_active17 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Rubinius::StaticScope#current_script@4"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%valid_flag = alloca i1 | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 12 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 7 | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 2 | |
%arg.total = load i32* %total_pos | |
%arg_cmp = icmp ne i32 %arg.total, 0 | |
br i1 %arg_cmp, label %arg_error, label %import_args | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
br label %return_pad | |
import_args: ; preds = %entry | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0 | |
%1 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%cm = bitcast %"struct.rubinius::Executable"* %msg.exec to %"struct.rubinius::CompiledMethod"* | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
%5 = bitcast %"struct.rubinius::Dispatch"* %msg to i8* | |
store i8* %5, i8** %4 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %1 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 80, i32* %6 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %7 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4363124736 to i8*), i8** %9 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2 | |
%10 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %10 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11 | |
%12 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %msg.module, %"struct.rubinius::Module"** %14 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %17 | |
%18 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
%arg_ary_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 3 | |
%arg_ary = load %"struct.rubinius::Object"*** %arg_ary_pos | |
%ci94 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%19 = icmp eq %"struct.rubinius::Object"* %ci94, null | |
br i1 %19, label %ret_null93, label %method_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %continue39, %bail_out | |
br label %return_pad | |
method_body: ; preds = %import_args | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%20 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %20 | |
%stack_pos3 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack_pos3 | |
%local_pos4 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos5 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos5 | |
store %"struct.rubinius::Object"* %stack_load, %"struct.rubinius::Object"** %local_pos4 | |
br label %ip4 | |
ip4: ; preds = %continue56, %method_body | |
%local_pos6 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local = load %"struct.rubinius::Object"** %local_pos6 | |
%stack_pos7 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack_pos7 | |
%stack_pos8 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load9 = load %"struct.rubinius::Object"** %stack_pos8 | |
%stack_pos10 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %stack_load9, %"struct.rubinius::Object"** %stack_pos10 | |
%stack_pos11 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load12 = load %"struct.rubinius::Object"** %stack_pos11 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load12 to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip21, label %continue | |
continue: ; preds = %ip4 | |
br label %ip9 | |
ip9: ; preds = %continue | |
%local_pos13 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local14 = load %"struct.rubinius::Object"** %local_pos13 | |
%stack_pos15 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local14, %"struct.rubinius::Object"** %stack_pos15 | |
%stack_pos17 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load18 = load %"struct.rubinius::Object"** %stack_pos17 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load18 to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
continue16: ; preds = %correct_class | |
%stack_pos21 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load22 = load %"struct.rubinius::Object"** %stack_pos21 | |
%as_int23 = ptrtoint %"struct.rubinius::Object"* %stack_load22 to i64 | |
%and24 = and i64 %as_int23, 15 | |
%is_true25 = icmp ne i64 %and24, 10 | |
br i1 %is_true25, label %ip20, label %continue26 | |
check_class_id: ; preds = %ip9 | |
%class_pos = getelementptr %"struct.rubinius::Object"* %stack_load18, i32 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i32 0, i32 4 | |
%class_id = load i32* %class_id_pos | |
%check_class_id19 = icmp eq i32 %class_id, 49 | |
br i1 %check_class_id19, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%ivar = call %"struct.rubinius::Object"* @rbx_get_ivar(%"struct.rubinius::VM"* %state, %"struct.rubinius::Object"* %stack_load18, %"struct.rubinius::Object"* inttoptr (i64 23558 to %"struct.rubinius::Object"*)) | |
%stack_pos20 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ivar, %"struct.rubinius::Object"** %stack_pos20 | |
br label %continue16 | |
fallback: ; preds = %check_class_id, %ip9 | |
store i32 12, i32* %ip_pos | |
%21 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 12, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
continue26: ; preds = %continue16 | |
br label %ip17 | |
ip17: ; preds = %continue26 | |
%stack_pos27 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos27 | |
br label %ip21 | |
continue28: ; No predecessors! | |
br label %ip20 | |
ip21: ; preds = %ip20, %ip17, %ip4 | |
%stack_pos29 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load30 = load %"struct.rubinius::Object"** %stack_pos29 | |
%as_int31 = ptrtoint %"struct.rubinius::Object"* %stack_load30 to i64 | |
%and32 = and i64 %as_int31, 15 | |
%is_true33 = icmp eq i64 %and32, 10 | |
br i1 %is_true33, label %ip34, label %continue34 | |
continue34: ; preds = %ip21 | |
br label %ip23 | |
ip23: ; preds = %continue34 | |
%local_pos35 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local36 = load %"struct.rubinius::Object"** %local_pos35 | |
%stack_pos37 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local36, %"struct.rubinius::Object"** %stack_pos37 | |
%stack_pos40 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load41 = load %"struct.rubinius::Object"** %stack_pos40 | |
%cast42 = ptrtoint %"struct.rubinius::Object"* %stack_load41 to i64 | |
%masked43 = and i64 %cast42, 3 | |
%is_reference44 = icmp eq i64 %masked43, 0 | |
br i1 %is_reference44, label %check_class_id45, label %fallback38 | |
continue39: ; preds = %correct_class46 | |
%local_pos53 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos54 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load55 = load %"struct.rubinius::Object"** %stack_pos54 | |
store %"struct.rubinius::Object"* %stack_load55, %"struct.rubinius::Object"** %local_pos53 | |
store i32 31, i32* %ip_pos | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check, label %ret_null, label %check_active | |
check_class_id45: ; preds = %ip23 | |
%class_pos47 = getelementptr %"struct.rubinius::Object"* %stack_load41, i32 0, i32 0, i32 1 | |
%ref_class48 = load %"struct.rubinius::Class"** %class_pos47 | |
%class_id_pos49 = getelementptr %"struct.rubinius::Class"* %ref_class48, i32 0, i32 4 | |
%class_id50 = load i32* %class_id_pos49 | |
%check_class_id51 = icmp eq i32 %class_id50, 49 | |
br i1 %check_class_id51, label %correct_class46, label %fallback38 | |
correct_class46: ; preds = %check_class_id45 | |
%obj_array = bitcast %"struct.rubinius::Object"* %stack_load41 to %"struct.rubinius::Object"** | |
%field_pos = getelementptr %"struct.rubinius::Object"** %obj_array, i32 5 | |
%field = load %"struct.rubinius::Object"** %field_pos | |
%stack_pos52 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack_pos52 | |
br label %continue39 | |
fallback38: ; preds = %check_class_id45, %ip23 | |
store i32 25, i32* %ip_pos | |
%22 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 25, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
continue56: ; preds = %check_active | |
br label %ip4 | |
check_active: ; preds = %continue39 | |
br label %continue56 | |
continue57: ; No predecessors! | |
br label %ip34 | |
ip34: ; preds = %continue57, %ip21 | |
%stack_pos58 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos58 | |
%local_pos59 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local60 = load %"struct.rubinius::Object"** %local_pos59 | |
%stack_pos61 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local60, %"struct.rubinius::Object"** %stack_pos61 | |
%stack_pos62 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load63 = load %"struct.rubinius::Object"** %stack_pos62 | |
%stack_pos64 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %stack_load63, %"struct.rubinius::Object"** %stack_pos64 | |
%stack_pos65 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load66 = load %"struct.rubinius::Object"** %stack_pos65 | |
%as_int67 = ptrtoint %"struct.rubinius::Object"* %stack_load66 to i64 | |
%and68 = and i64 %as_int67, 15 | |
%is_true69 = icmp eq i64 %and68, 10 | |
br i1 %is_true69, label %ip47, label %continue70 | |
continue70: ; preds = %ip34 | |
br label %ip41 | |
ip41: ; preds = %continue70 | |
%local_pos71 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local72 = load %"struct.rubinius::Object"** %local_pos71 | |
%stack_pos73 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local72, %"struct.rubinius::Object"** %stack_pos73 | |
%stack_pos76 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load77 = load %"struct.rubinius::Object"** %stack_pos76 | |
%cast78 = ptrtoint %"struct.rubinius::Object"* %stack_load77 to i64 | |
%masked79 = and i64 %cast78, 3 | |
%is_reference80 = icmp eq i64 %masked79, 0 | |
br i1 %is_reference80, label %check_class_id81, label %fallback74 | |
continue75: ; preds = %correct_class82 | |
br label %ip47 | |
ip47: ; preds = %continue75, %ip34 | |
%stack_pos90 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load91 = load %"struct.rubinius::Object"** %stack_pos90 | |
br label %return_pad | |
ip20: ; preds = %continue28, %continue16 | |
%stack_pos92 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos92 | |
br label %ip21 | |
return_pad: ; preds = %ip47, %fallback74, %fallback38, %fallback, %ret_raise_val, %ret_null, %arg_error | |
%return_phi = phi %"struct.rubinius::Object"* [ %ret, %arg_error ], [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %21, %fallback ], [ %22, %fallback38 ], [ %23, %fallback74 ], [ %stack_load91, %ip47 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
check_class_id81: ; preds = %ip41 | |
%class_pos83 = getelementptr %"struct.rubinius::Object"* %stack_load77, i32 0, i32 0, i32 1 | |
%ref_class84 = load %"struct.rubinius::Class"** %class_pos83 | |
%class_id_pos85 = getelementptr %"struct.rubinius::Class"* %ref_class84, i32 0, i32 4 | |
%class_id86 = load i32* %class_id_pos85 | |
%check_class_id87 = icmp eq i32 %class_id86, 49 | |
br i1 %check_class_id87, label %correct_class82, label %fallback74 | |
correct_class82: ; preds = %check_class_id81 | |
%ivar88 = call %"struct.rubinius::Object"* @rbx_get_ivar(%"struct.rubinius::VM"* %state, %"struct.rubinius::Object"* %stack_load77, %"struct.rubinius::Object"* inttoptr (i64 23558 to %"struct.rubinius::Object"*)) | |
%stack_pos89 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ivar88, %"struct.rubinius::Object"** %stack_pos89 | |
br label %continue75 | |
fallback74: ; preds = %check_class_id81, %ip41 | |
store i32 44, i32* %ip_pos | |
%23 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 44, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
ret_null93: ; preds = %import_args | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Optimized IR: current_script ]]] | |
define %"struct.rubinius::Object"* @"_X_Rubinius::StaticScope#current_script@4"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%unwind_info95 = alloca [60 x i32], align 4 | |
%cfstk96 = alloca [12 x %"struct.rubinius::Object"*], align 8 | |
%var_mem97 = alloca [7 x %"struct.rubinius::Object"*], align 8 | |
%unwind_info95.sub = getelementptr inbounds [60 x i32]* %unwind_info95, i64 0, i64 0 | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 2 | |
%arg.total = load i32* %total_pos, align 4 | |
%arg_cmp = icmp eq i32 %arg.total, 0 | |
br i1 %arg_cmp, label %import_args, label %arg_error | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
ret %"struct.rubinius::Object"* %ret | |
import_args: ; preds = %entry | |
%call_frame = bitcast [12 x %"struct.rubinius::Object"*]* %cfstk96 to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 9 | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0, align 8 | |
%1 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 3 | |
%2 = getelementptr inbounds [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %3, align 8 | |
%4 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 2 | |
%.c = bitcast %"struct.rubinius::Dispatch"* %msg to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %4, align 8 | |
%cm.c = getelementptr inbounds %"struct.rubinius::Executable"* %msg.exec, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"** %1, align 8 | |
%5 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 4 | |
%6 = bitcast %"struct.rubinius::Object"** %5 to i32* | |
store i32 80, i32* %6, align 8 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %7, align 4 | |
%8 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 7 | |
%vars.c = bitcast [7 x %"struct.rubinius::Object"*]* %var_mem97 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %8, align 8 | |
%9 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4363124736 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %9, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%stack_pos1 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%stack_pos2 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk96, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2, align 8 | |
%10 = getelementptr inbounds [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %10, align 8 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12, align 8 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13, align 8 | |
%14 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 4 | |
%msg.module.c = getelementptr inbounds %"struct.rubinius::Module"* %msg.module, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %msg.module.c, %"struct.rubinius::Object"** %14, align 8 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 1 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18, align 8 | |
%19 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem97, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %19, align 8 | |
%ci94 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%20 = icmp eq %"struct.rubinius::Object"* %ci94, null | |
br i1 %20, label %ret_null93, label %method_body | |
method_body: ; preds = %import_args | |
%self = load %"struct.rubinius::Object"** %12, align 8 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %19, align 8 | |
br label %ip4 | |
ip4: ; preds = %check_active, %method_body | |
%local14 = phi %"struct.rubinius::Object"* [ %local.pre, %check_active ], [ %self, %method_body ] | |
store %"struct.rubinius::Object"* %local14, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %local14, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %local14 to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip21, label %continue | |
continue: ; preds = %ip4 | |
store %"struct.rubinius::Object"* %local14, %"struct.rubinius::Object"** %stack, align 8 | |
%masked = and i64 %as_int, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
check_class_id: ; preds = %continue | |
%class_pos = getelementptr %"struct.rubinius::Object"* %local14, i64 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos, align 8 | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i64 0, i32 4 | |
%class_id = load i32* %class_id_pos, align 4 | |
%check_class_id19 = icmp eq i32 %class_id, 49 | |
br i1 %check_class_id19, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%ivar = call %"struct.rubinius::Object"* @rbx_get_ivar(%"struct.rubinius::VM"* %state, %"struct.rubinius::Object"* %local14, %"struct.rubinius::Object"* inttoptr (i64 23558 to %"struct.rubinius::Object"*)) | |
store %"struct.rubinius::Object"* %ivar, %"struct.rubinius::Object"** %stack, align 8 | |
%as_int23 = ptrtoint %"struct.rubinius::Object"* %ivar to i64 | |
%and24 = and i64 %as_int23, 15 | |
%is_true25 = icmp eq i64 %and24, 10 | |
br i1 %is_true25, label %continue26, label %ip20 | |
fallback: ; preds = %check_class_id, %continue | |
store i32 12, i32* %7, align 4 | |
%21 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 12, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info95.sub) | |
ret %"struct.rubinius::Object"* %21 | |
continue26: ; preds = %correct_class | |
store %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
br label %ip21 | |
ip21: ; preds = %ip20, %continue26, %ip4 | |
%stack_load30 = phi %"struct.rubinius::Object"* [ inttoptr (i64 10 to %"struct.rubinius::Object"*), %ip20 ], [ inttoptr (i64 18 to %"struct.rubinius::Object"*), %continue26 ], [ %local14, %ip4 ] | |
%as_int31 = ptrtoint %"struct.rubinius::Object"* %stack_load30 to i64 | |
%and32 = and i64 %as_int31, 15 | |
%is_true33 = icmp eq i64 %and32, 10 | |
%local60 = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local60, %"struct.rubinius::Object"** %stack, align 8 | |
br i1 %is_true33, label %ip34, label %continue34 | |
continue34: ; preds = %ip21 | |
%cast42 = ptrtoint %"struct.rubinius::Object"* %local60 to i64 | |
%masked43 = and i64 %cast42, 3 | |
%is_reference44 = icmp eq i64 %masked43, 0 | |
br i1 %is_reference44, label %check_class_id45, label %fallback38 | |
check_class_id45: ; preds = %continue34 | |
%class_pos47 = getelementptr %"struct.rubinius::Object"* %local60, i64 0, i32 0, i32 1 | |
%ref_class48 = load %"struct.rubinius::Class"** %class_pos47, align 8 | |
%class_id_pos49 = getelementptr %"struct.rubinius::Class"* %ref_class48, i64 0, i32 4 | |
%class_id50 = load i32* %class_id_pos49, align 4 | |
%check_class_id51 = icmp eq i32 %class_id50, 49 | |
br i1 %check_class_id51, label %correct_class46, label %fallback38 | |
correct_class46: ; preds = %check_class_id45 | |
%22 = getelementptr %"struct.rubinius::Object"* %local60, i64 1, i32 0, i32 2 | |
%field = load %"struct.rubinius::Object"** %22, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %19, align 8 | |
store i32 31, i32* %7, align 4 | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check, label %return_pad, label %check_active | |
fallback38: ; preds = %check_class_id45, %continue34 | |
store i32 25, i32* %7, align 4 | |
%23 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 25, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info95.sub) | |
ret %"struct.rubinius::Object"* %23 | |
check_active: ; preds = %correct_class46 | |
%local.pre = load %"struct.rubinius::Object"** %19, align 8 | |
br label %ip4 | |
ip34: ; preds = %ip21 | |
store %"struct.rubinius::Object"* %local60, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%as_int67 = ptrtoint %"struct.rubinius::Object"* %local60 to i64 | |
%and68 = and i64 %as_int67, 15 | |
%is_true69 = icmp eq i64 %and68, 10 | |
br i1 %is_true69, label %return_pad, label %continue70 | |
continue70: ; preds = %ip34 | |
store %"struct.rubinius::Object"* %local60, %"struct.rubinius::Object"** %stack, align 8 | |
%masked79 = and i64 %as_int67, 3 | |
%is_reference80 = icmp eq i64 %masked79, 0 | |
br i1 %is_reference80, label %check_class_id81, label %fallback74 | |
ip20: ; preds = %correct_class | |
store %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
br label %ip21 | |
return_pad: ; preds = %ip34, %correct_class46 | |
%return_phi = phi %"struct.rubinius::Object"* [ null, %correct_class46 ], [ %local60, %ip34 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
check_class_id81: ; preds = %continue70 | |
%class_pos83 = getelementptr %"struct.rubinius::Object"* %local60, i64 0, i32 0, i32 1 | |
%ref_class84 = load %"struct.rubinius::Class"** %class_pos83, align 8 | |
%class_id_pos85 = getelementptr %"struct.rubinius::Class"* %ref_class84, i64 0, i32 4 | |
%class_id86 = load i32* %class_id_pos85, align 4 | |
%check_class_id87 = icmp eq i32 %class_id86, 49 | |
br i1 %check_class_id87, label %correct_class82, label %fallback74 | |
correct_class82: ; preds = %check_class_id81 | |
%ivar88 = call %"struct.rubinius::Object"* @rbx_get_ivar(%"struct.rubinius::VM"* %state, %"struct.rubinius::Object"* %local60, %"struct.rubinius::Object"* inttoptr (i64 23558 to %"struct.rubinius::Object"*)) | |
ret %"struct.rubinius::Object"* %ivar88 | |
fallback74: ; preds = %check_class_id81, %continue70 | |
store i32 44, i32* %7, align 4 | |
%24 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 44, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info95.sub) | |
ret %"struct.rubinius::Object"* %24 | |
ret_null93: ; preds = %import_args | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Array#each@5"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%valid_flag = alloca i1 | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 14 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 9 | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 2 | |
%arg.total = load i32* %total_pos | |
%arg_cmp = icmp ne i32 %arg.total, 0 | |
br i1 %arg_cmp, label %arg_error, label %import_args | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
br label %return_pad | |
import_args: ; preds = %entry | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0 | |
%1 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%cm = bitcast %"struct.rubinius::Executable"* %msg.exec to %"struct.rubinius::CompiledMethod"* | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
%5 = bitcast %"struct.rubinius::Dispatch"* %msg to i8* | |
store i8* %5, i8** %4 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %1 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 80, i32* %6 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %7 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4363134016 to i8*), i8** %9 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2 | |
%stack_pos3 = getelementptr %"struct.rubinius::Object"** %stack, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3 | |
%stack_pos4 = getelementptr %"struct.rubinius::Object"** %stack, i32 4 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos4 | |
%10 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %10 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11 | |
%12 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %msg.module, %"struct.rubinius::Module"** %14 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %17 | |
%18 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
%local_pos5 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos5 | |
%local_pos6 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos6 | |
%arg_ary_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 3 | |
%arg_ary = load %"struct.rubinius::Object"*** %arg_ary_pos | |
%ci171 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%19 = icmp eq %"struct.rubinius::Object"* %ci171, null | |
br i1 %19, label %ret_null170, label %method_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %ip6, %cont116, %dispatch114, %continue88, %dispatch59, %dispatch, %bail_out | |
br label %return_pad | |
method_body: ; preds = %import_args | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%block_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
%20 = load %"struct.rubinius::Object"** %block_pos | |
%is_nil = icmp ne %"struct.rubinius::Object"* %20, inttoptr (i64 26 to %"struct.rubinius::Object"*) | |
%select_bool = select i1 %is_nil, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
%stack_pos7 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %select_bool, %"struct.rubinius::Object"** %stack_pos7 | |
%stack_pos8 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos8 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load to i64 | |
%and = and i64 %as_int, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip6, label %continue | |
continue: ; preds = %method_body | |
br label %ip3 | |
ip3: ; preds = %continue | |
%stack_pos9 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos9 | |
br label %ip14 | |
continue10: ; No predecessors! | |
br label %ip6 | |
ip14: ; preds = %ip3 | |
%self_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %self_pos | |
%obj_array = bitcast %"struct.rubinius::Object"* %self to %"struct.rubinius::Object"** | |
%field_pos = getelementptr %"struct.rubinius::Object"** %obj_array, i32 5 | |
%field = load %"struct.rubinius::Object"** %field_pos | |
%stack_pos11 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack_pos11 | |
%local_pos12 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos13 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load14 = load %"struct.rubinius::Object"** %stack_pos13 | |
store %"struct.rubinius::Object"* %stack_load14, %"struct.rubinius::Object"** %local_pos12 | |
%local_pos15 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local = load %"struct.rubinius::Object"** %local_pos15 | |
%stack_pos16 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack_pos16 | |
%self_pos17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self18 = load %"struct.rubinius::Object"** %self_pos17 | |
%obj_array19 = bitcast %"struct.rubinius::Object"* %self18 to %"struct.rubinius::Object"** | |
%field_pos20 = getelementptr %"struct.rubinius::Object"** %obj_array19, i32 3 | |
%field21 = load %"struct.rubinius::Object"** %field_pos20 | |
%stack_pos22 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %field21, %"struct.rubinius::Object"** %stack_pos22 | |
%stack_pos23 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load24 = load %"struct.rubinius::Object"** %stack_pos23 | |
%stack_pos25 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load26 = load %"struct.rubinius::Object"** %stack_pos25 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load24 to i64 | |
%cast27 = ptrtoint %"struct.rubinius::Object"* %stack_load26 to i64 | |
%both = and i64 %cast, %cast27 | |
%masked = and i64 %both, 1 | |
%are_fixnums = icmp eq i64 %masked, 1 | |
br i1 %are_fixnums, label %fast, label %dispatch | |
fast: ; preds = %ip14 | |
%as_int31 = ptrtoint %"struct.rubinius::Object"* %stack_load24 to i64 | |
%lshr = lshr i64 %as_int31, 1 | |
%stripped = trunc i64 %lshr to i63 | |
%as_int32 = ptrtoint %"struct.rubinius::Object"* %stack_load26 to i64 | |
%lshr33 = lshr i64 %as_int32, 1 | |
%stripped34 = trunc i64 %lshr33 to i63 | |
%add.overflow = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped, i63 %stripped34) | |
%sum = extractvalue %0 %add.overflow, 0 | |
%did_overflow = extractvalue %0 %add.overflow, 1 | |
br i1 %did_overflow, label %dispatch, label %tagnow | |
dispatch: ; preds = %fast, %ip14 | |
%stack_pos28 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load29 = load %"struct.rubinius::Object"** %stack_pos28 | |
store %"struct.rubinius::Object"* %stack_load29, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos30 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos30, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4311093296 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 24, i32* %ip_pos | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093296 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check, label %ret_null, label %check_active | |
tagnow: ; preds = %fast | |
%as_native_int = zext i63 %sum to i64 | |
%shl = shl i64 %as_native_int, 1 | |
%or = or i64 %shl, 1 | |
%as_obj = inttoptr i64 %or to %"struct.rubinius::Object"* | |
br label %cont | |
cont: ; preds = %tagnow, %check_active | |
%addition = phi %"struct.rubinius::Object"* [ %ic_send, %check_active ], [ %as_obj, %tagnow ] | |
%stack_pos35 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %stack_pos35 | |
%local_pos36 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%stack_pos37 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load38 = load %"struct.rubinius::Object"** %stack_pos37 | |
store %"struct.rubinius::Object"* %stack_load38, %"struct.rubinius::Object"** %local_pos36 | |
%self_pos39 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self40 = load %"struct.rubinius::Object"** %self_pos39 | |
%obj_array41 = bitcast %"struct.rubinius::Object"* %self40 to %"struct.rubinius::Object"** | |
%field_pos42 = getelementptr %"struct.rubinius::Object"** %obj_array41, i32 4 | |
%field43 = load %"struct.rubinius::Object"** %field_pos42 | |
%stack_pos44 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %field43, %"struct.rubinius::Object"** %stack_pos44 | |
%local_pos45 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 2 | |
%stack_pos46 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load47 = load %"struct.rubinius::Object"** %stack_pos46 | |
store %"struct.rubinius::Object"* %stack_load47, %"struct.rubinius::Object"** %local_pos45 | |
br label %ip34 | |
ip34: ; preds = %continue147, %cont | |
%local_pos48 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local49 = load %"struct.rubinius::Object"** %local_pos48 | |
%stack_pos50 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local49, %"struct.rubinius::Object"** %stack_pos50 | |
%local_pos51 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%local52 = load %"struct.rubinius::Object"** %local_pos51 | |
%stack_pos53 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local52, %"struct.rubinius::Object"** %stack_pos53 | |
%stack_pos54 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load55 = load %"struct.rubinius::Object"** %stack_pos54 | |
%stack_pos56 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load57 = load %"struct.rubinius::Object"** %stack_pos56 | |
%cast61 = ptrtoint %"struct.rubinius::Object"* %stack_load55 to i64 | |
%cast62 = ptrtoint %"struct.rubinius::Object"* %stack_load57 to i64 | |
%both63 = and i64 %cast61, %cast62 | |
%masked64 = and i64 %both63, 1 | |
%are_fixnums65 = icmp eq i64 %masked64, 1 | |
br i1 %are_fixnums65, label %fast58, label %dispatch59 | |
check_active: ; preds = %dispatch | |
br label %cont | |
fast58: ; preds = %ip34 | |
%imm_cmp = icmp slt %"struct.rubinius::Object"* %stack_load55, %stack_load57 | |
%select_bool73 = select i1 %imm_cmp, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %cont60 | |
dispatch59: ; preds = %ip34 | |
%stack_pos66 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load67 = load %"struct.rubinius::Object"** %stack_pos66 | |
store %"struct.rubinius::Object"* %stack_load67, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos68 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos68, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute69 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4311093424 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 38, i32* %ip_pos | |
%ic_send70 = call %"struct.rubinius::Object"* %execute69(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093424 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check72 = icmp eq %"struct.rubinius::Object"* %ic_send70, null | |
br i1 %null_check72, label %ret_null, label %check_active71 | |
cont60: ; preds = %fast58, %check_active71 | |
%addition74 = phi %"struct.rubinius::Object"* [ %ic_send70, %check_active71 ], [ %select_bool73, %fast58 ] | |
%stack_pos75 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition74, %"struct.rubinius::Object"** %stack_pos75 | |
%stack_pos76 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load77 = load %"struct.rubinius::Object"** %stack_pos76 | |
%as_int78 = ptrtoint %"struct.rubinius::Object"* %stack_load77 to i64 | |
%and79 = and i64 %as_int78, 15 | |
%is_true80 = icmp eq i64 %and79, 10 | |
br i1 %is_true80, label %ip63, label %continue81 | |
check_active71: ; preds = %dispatch59 | |
br label %cont60 | |
continue81: ; preds = %cont60 | |
br label %ip42 | |
ip42: ; preds = %continue81 | |
%local_pos82 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 2 | |
%local83 = load %"struct.rubinius::Object"** %local_pos82 | |
%stack_pos84 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local83, %"struct.rubinius::Object"** %stack_pos84 | |
%local_pos85 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local86 = load %"struct.rubinius::Object"** %local_pos85 | |
%stack_pos87 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local86, %"struct.rubinius::Object"** %stack_pos87 | |
%stack_pos89 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load90 = load %"struct.rubinius::Object"** %stack_pos89 | |
%word_pos = getelementptr %"struct.rubinius::Object"* %stack_load90, i32 0, i32 0, i32 0, i32 0 | |
%flags = load i8** %word_pos | |
%word2flags = ptrtoint i8* %flags to i32 | |
%mask = and i32 %word2flags, 511 | |
%is_type = icmp eq i32 %mask, 118 | |
br i1 %is_type, label %is_tuple, label %fallback | |
fallback: ; preds = %is_tuple, %ip42 | |
store i32 46, i32* %ip_pos | |
%21 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 46, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
continue88: ; preds = %tuple_at | |
%22 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
%block = load %"struct.rubinius::Object"** %22 | |
%stack_pos100 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store i32 49, i32* %ip_pos | |
%ys = call %"struct.rubinius::Object"* @rbx_yield_stack(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %block, i32 1, %"struct.rubinius::Object"** %stack_pos100) | |
%null_check103 = icmp eq %"struct.rubinius::Object"* %ys, null | |
br i1 %null_check103, label %ret_null, label %check_active102 | |
is_tuple: ; preds = %ip42 | |
%stack_pos91 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load92 = load %"struct.rubinius::Object"** %stack_pos91 | |
%cast93 = ptrtoint %"struct.rubinius::Object"* %stack_load92 to i64 | |
%masked94 = and i64 %cast93, 1 | |
%is_fixnum = icmp eq i64 %masked94, 1 | |
%upcast = bitcast %"struct.rubinius::Object"* %stack_load90 to %"struct.rubinius::Tuple"* | |
%as_int95 = ptrtoint %"struct.rubinius::Object"* %stack_load92 to i64 | |
%lshr96 = lshr i64 %as_int95, 1 | |
%table_size_pos = getelementptr %"struct.rubinius::Tuple"* %upcast, i32 0, i32 1 | |
%table_size = load i32* %table_size_pos | |
%to_native_int = sext i32 %table_size to i64 | |
%23 = sub i64 %to_native_int, 32 | |
%24 = sdiv i64 %23, 8 | |
%is_in_bounds = icmp slt i64 %lshr96, %24 | |
%access_cmp = and i1 %is_fixnum, %is_in_bounds | |
br i1 %access_cmp, label %tuple_at, label %fallback | |
tuple_at: ; preds = %is_tuple | |
%field_pos97 = getelementptr %"struct.rubinius::Tuple"* %upcast, i32 0, i32 2, i64 %lshr96 | |
%tuple_at98 = load %"struct.rubinius::Object"** %field_pos97 | |
%stack_pos99 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %tuple_at98, %"struct.rubinius::Object"** %stack_pos99 | |
br label %continue88 | |
continue101: ; preds = %check_active102 | |
%stack_pos104 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ys, %"struct.rubinius::Object"** %stack_pos104 | |
%local_pos105 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local106 = load %"struct.rubinius::Object"** %local_pos105 | |
%stack_pos107 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local106, %"struct.rubinius::Object"** %stack_pos107 | |
%stack_pos108 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 3 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos108 | |
%stack_pos109 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load110 = load %"struct.rubinius::Object"** %stack_pos109 | |
%stack_pos111 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load112 = load %"struct.rubinius::Object"** %stack_pos111 | |
%cast117 = ptrtoint %"struct.rubinius::Object"* %stack_load110 to i64 | |
%cast118 = ptrtoint %"struct.rubinius::Object"* %stack_load112 to i64 | |
%both119 = and i64 %cast117, %cast118 | |
%masked120 = and i64 %both119, 1 | |
%are_fixnums121 = icmp eq i64 %masked120, 1 | |
br i1 %are_fixnums121, label %fast113, label %dispatch114 | |
check_active102: ; preds = %continue88 | |
br label %continue101 | |
fast113: ; preds = %continue101 | |
%as_int129 = ptrtoint %"struct.rubinius::Object"* %stack_load110 to i64 | |
%lshr130 = lshr i64 %as_int129, 1 | |
%stripped131 = trunc i64 %lshr130 to i63 | |
%as_int132 = ptrtoint %"struct.rubinius::Object"* %stack_load112 to i64 | |
%lshr133 = lshr i64 %as_int132, 1 | |
%stripped134 = trunc i64 %lshr133 to i63 | |
%add.overflow135 = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped131, i63 %stripped134) | |
%sum136 = extractvalue %0 %add.overflow135, 0 | |
%did_overflow137 = extractvalue %0 %add.overflow135, 1 | |
br i1 %did_overflow137, label %dispatch114, label %tagnow115 | |
dispatch114: ; preds = %fast113, %continue101 | |
%stack_pos122 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load123 = load %"struct.rubinius::Object"** %stack_pos122 | |
store %"struct.rubinius::Object"* %stack_load123, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos124 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos124, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute125 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4311093680 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 55, i32* %ip_pos | |
%ic_send126 = call %"struct.rubinius::Object"* %execute125(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093680 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check128 = icmp eq %"struct.rubinius::Object"* %ic_send126, null | |
br i1 %null_check128, label %ret_null, label %check_active127 | |
tagnow115: ; preds = %fast113 | |
%as_native_int138 = zext i63 %sum136 to i64 | |
%shl139 = shl i64 %as_native_int138, 1 | |
%or140 = or i64 %shl139, 1 | |
%as_obj141 = inttoptr i64 %or140 to %"struct.rubinius::Object"* | |
br label %cont116 | |
cont116: ; preds = %tagnow115, %check_active127 | |
%addition142 = phi %"struct.rubinius::Object"* [ %ic_send126, %check_active127 ], [ %as_obj141, %tagnow115 ] | |
%stack_pos143 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition142, %"struct.rubinius::Object"** %stack_pos143 | |
%local_pos144 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos145 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load146 = load %"struct.rubinius::Object"** %stack_pos145 | |
store %"struct.rubinius::Object"* %stack_load146, %"struct.rubinius::Object"** %local_pos144 | |
store i32 60, i32* %ip_pos | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check149 = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check149, label %ret_null, label %check_active148 | |
check_active127: ; preds = %dispatch114 | |
br label %cont116 | |
continue147: ; preds = %check_active148 | |
br label %ip34 | |
check_active148: ; preds = %cont116 | |
br label %continue147 | |
continue150: ; No predecessors! | |
br label %ip63 | |
ip63: ; preds = %continue150, %cont60 | |
%stack_pos151 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos151 | |
%25 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self152 = load %"struct.rubinius::Object"** %25 | |
%stack_pos153 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self152, %"struct.rubinius::Object"** %stack_pos153 | |
%stack_pos154 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load155 = load %"struct.rubinius::Object"** %stack_pos154 | |
br label %return_pad | |
ip6: ; preds = %continue10, %method_body | |
%26 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self156 = load %"struct.rubinius::Object"** %26 | |
%stack_pos157 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self156, %"struct.rubinius::Object"** %stack_pos157 | |
%stack_pos158 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 9358 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos158 | |
%stack_pos159 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load160 = load %"struct.rubinius::Object"** %stack_pos159 | |
store %"struct.rubinius::Object"* %stack_load160, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos161 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos161, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute162 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4311093168 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 10, i32* %ip_pos | |
%ic_send163 = call %"struct.rubinius::Object"* %execute162(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093168 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check166 = icmp eq %"struct.rubinius::Object"* %ic_send163, null | |
br i1 %null_check166, label %ret_null, label %check_active165 | |
continue164: ; preds = %check_active165 | |
%stack_pos167 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %ic_send163, %"struct.rubinius::Object"** %stack_pos167 | |
%stack_pos168 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load169 = load %"struct.rubinius::Object"** %stack_pos168 | |
br label %return_pad | |
return_pad: ; preds = %continue164, %ip63, %fallback, %ret_raise_val, %ret_null, %arg_error | |
%return_phi = phi %"struct.rubinius::Object"* [ %ret, %arg_error ], [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %21, %fallback ], [ %stack_load155, %ip63 ], [ %stack_load169, %continue164 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
check_active165: ; preds = %ip6 | |
br label %continue164 | |
ret_null170: ; preds = %import_args | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Optimized IR: each ]]] | |
define %"struct.rubinius::Object"* @"_X_Array#each@5"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%unwind_info172 = alloca [60 x i32], align 4 | |
%cfstk173 = alloca [14 x %"struct.rubinius::Object"*], align 8 | |
%var_mem174 = alloca [9 x %"struct.rubinius::Object"*], align 8 | |
%out_args = alloca %"struct.rubinius::Arguments", align 8 | |
%unwind_info172.sub = getelementptr inbounds [60 x i32]* %unwind_info172, i64 0, i64 0 | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 2 | |
%arg.total = load i32* %total_pos, align 4 | |
%arg_cmp = icmp eq i32 %arg.total, 0 | |
br i1 %arg_cmp, label %import_args, label %arg_error | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
ret %"struct.rubinius::Object"* %ret | |
import_args: ; preds = %entry | |
%call_frame = bitcast [14 x %"struct.rubinius::Object"*]* %cfstk173 to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 9 | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0, align 8 | |
%1 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 3 | |
%2 = getelementptr inbounds [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %3, align 8 | |
%4 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 2 | |
%.c = bitcast %"struct.rubinius::Dispatch"* %msg to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %4, align 8 | |
%cm.c = getelementptr inbounds %"struct.rubinius::Executable"* %msg.exec, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"** %1, align 8 | |
%5 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 4 | |
%6 = bitcast %"struct.rubinius::Object"** %5 to i32* | |
store i32 80, i32* %6, align 8 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %7, align 4 | |
%8 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 7 | |
%vars.c = bitcast [9 x %"struct.rubinius::Object"*]* %var_mem174 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %8, align 8 | |
%9 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4363134016 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %9, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%stack_pos1 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%stack_pos2 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2, align 8 | |
%stack_pos3 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 12 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos3, align 8 | |
%stack_pos4 = getelementptr [14 x %"struct.rubinius::Object"*]* %cfstk173, i64 0, i64 13 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos4, align 8 | |
%10 = getelementptr inbounds [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %10, align 8 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12, align 8 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13, align 8 | |
%14 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 4 | |
%msg.module.c = getelementptr inbounds %"struct.rubinius::Module"* %msg.module, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %msg.module.c, %"struct.rubinius::Object"** %14, align 8 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 1 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18, align 8 | |
%19 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %19, align 8 | |
%20 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 7 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %20, align 8 | |
%21 = getelementptr [9 x %"struct.rubinius::Object"*]* %var_mem174, i64 0, i64 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %21, align 8 | |
%ci171 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%22 = icmp eq %"struct.rubinius::Object"* %ci171, null | |
br i1 %22, label %return_pad, label %method_body | |
method_body: ; preds = %import_args | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 4 | |
%23 = load %"struct.rubinius::Object"** %16, align 8 | |
%is_nil = icmp ne %"struct.rubinius::Object"* %23, inttoptr (i64 26 to %"struct.rubinius::Object"*) | |
%select_bool = select i1 %is_nil, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
store %"struct.rubinius::Object"* %select_bool, %"struct.rubinius::Object"** %stack, align 8 | |
%as_int = ptrtoint %"struct.rubinius::Object"* %select_bool to i64 | |
%and = and i64 %as_int, 10 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip6, label %continue | |
continue: ; preds = %method_body | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%self = load %"struct.rubinius::Object"** %12, align 8 | |
%24 = getelementptr %"struct.rubinius::Object"* %self, i64 1, i32 0, i32 2 | |
%field = load %"struct.rubinius::Object"** %24, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack, align 8 | |
%field_pos20 = getelementptr %"struct.rubinius::Object"* %self, i64 1 | |
%25 = bitcast %"struct.rubinius::Object"* %field_pos20 to %"struct.rubinius::Object"** | |
%field21 = load %"struct.rubinius::Object"** %25, align 8 | |
store %"struct.rubinius::Object"* %field21, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%cast = ptrtoint %"struct.rubinius::Object"* %field to i64 | |
%cast27 = ptrtoint %"struct.rubinius::Object"* %field21 to i64 | |
%both = and i64 %cast27, 1 | |
%masked = and i64 %both, %cast | |
%are_fixnums = icmp eq i64 %masked, 0 | |
br i1 %are_fixnums, label %dispatch, label %fast | |
fast: ; preds = %continue | |
%lshr = lshr i64 %cast, 1 | |
%stripped = trunc i64 %lshr to i63 | |
%lshr33 = lshr i64 %cast27, 1 | |
%stripped34 = trunc i64 %lshr33 to i63 | |
%add.overflow = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped, i63 %stripped34) | |
%did_overflow = extractvalue %0 %add.overflow, 1 | |
br i1 %did_overflow, label %dispatch, label %tagnow | |
dispatch: ; preds = %continue, %fast | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4311093352 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 24, i32* %7, align 4 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093296 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check, label %return_pad, label %check_active | |
tagnow: ; preds = %fast | |
%sum = extractvalue %0 %add.overflow, 0 | |
%as_native_int = zext i63 %sum to i64 | |
%shl = shl i64 %as_native_int, 1 | |
%or = or i64 %shl, 1 | |
%as_obj = inttoptr i64 %or to %"struct.rubinius::Object"* | |
br label %cont | |
cont: ; preds = %tagnow, %check_active | |
%self40 = phi %"struct.rubinius::Object"* [ %self40.pre, %check_active ], [ %self, %tagnow ] | |
%addition = phi %"struct.rubinius::Object"* [ %ic_send, %check_active ], [ %as_obj, %tagnow ] | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %20, align 8 | |
%field_pos42 = getelementptr %"struct.rubinius::Object"* %self40, i64 1, i32 0, i32 1 | |
%26 = load %"struct.rubinius::Class"** %field_pos42, align 8 | |
%field43 = getelementptr inbounds %"struct.rubinius::Class"* %26, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %field43, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %field43, %"struct.rubinius::Object"** %21, align 8 | |
br label %ip34 | |
ip34: ; preds = %check_active148, %cont | |
%local52 = phi %"struct.rubinius::Object"* [ %local52.pre, %check_active148 ], [ %addition, %cont ] | |
%local49 = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local49, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %local52, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%cast61 = ptrtoint %"struct.rubinius::Object"* %local49 to i64 | |
%cast62 = ptrtoint %"struct.rubinius::Object"* %local52 to i64 | |
%both63 = and i64 %cast62, 1 | |
%masked64 = and i64 %both63, %cast61 | |
%are_fixnums65 = icmp eq i64 %masked64, 0 | |
br i1 %are_fixnums65, label %dispatch59, label %fast58 | |
check_active: ; preds = %dispatch | |
%self40.pre = load %"struct.rubinius::Object"** %12, align 8 | |
br label %cont | |
fast58: ; preds = %ip34 | |
%imm_cmp = icmp slt %"struct.rubinius::Object"* %local49, %local52 | |
%select_bool73 = select i1 %imm_cmp, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %cont60 | |
dispatch59: ; preds = %ip34 | |
store %"struct.rubinius::Object"* %local49, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute69 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4311093480 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 38, i32* %7, align 4 | |
%ic_send70 = call %"struct.rubinius::Object"* %execute69(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093424 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check72 = icmp eq %"struct.rubinius::Object"* %ic_send70, null | |
br i1 %null_check72, label %return_pad, label %cont60 | |
cont60: ; preds = %dispatch59, %fast58 | |
%addition74 = phi %"struct.rubinius::Object"* [ %select_bool73, %fast58 ], [ %ic_send70, %dispatch59 ] | |
store %"struct.rubinius::Object"* %addition74, %"struct.rubinius::Object"** %stack, align 8 | |
%as_int78 = ptrtoint %"struct.rubinius::Object"* %addition74 to i64 | |
%and79 = and i64 %as_int78, 15 | |
%is_true80 = icmp eq i64 %and79, 10 | |
br i1 %is_true80, label %ip63, label %continue81 | |
continue81: ; preds = %cont60 | |
%local83 = load %"struct.rubinius::Object"** %21, align 8 | |
store %"struct.rubinius::Object"* %local83, %"struct.rubinius::Object"** %stack, align 8 | |
%local86 = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local86, %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%word_pos = getelementptr %"struct.rubinius::Object"* %local83, i64 0, i32 0, i32 0, i32 0 | |
%flags = load i8** %word_pos, align 8 | |
%tmp = ptrtoint i8* %flags to i64 | |
%mask175 = and i64 %tmp, 511 | |
%is_type = icmp eq i64 %mask175, 118 | |
br i1 %is_type, label %is_tuple, label %fallback | |
fallback: ; preds = %is_tuple, %continue81 | |
store i32 46, i32* %7, align 4 | |
%27 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 46, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info172.sub) | |
ret %"struct.rubinius::Object"* %27 | |
is_tuple: ; preds = %continue81 | |
%cast93 = ptrtoint %"struct.rubinius::Object"* %local86 to i64 | |
%masked94 = and i64 %cast93, 1 | |
%is_fixnum = icmp ne i64 %masked94, 0 | |
%lshr96 = lshr i64 %cast93, 1 | |
%table_size_pos = getelementptr %"struct.rubinius::Object"* %local83, i64 1 | |
%28 = bitcast %"struct.rubinius::Object"* %table_size_pos to i32* | |
%table_size = load i32* %28, align 4 | |
%to_native_int = sext i32 %table_size to i64 | |
%29 = add i64 %to_native_int, -32 | |
%30 = sdiv i64 %29, 8 | |
%is_in_bounds = icmp slt i64 %lshr96, %30 | |
%access_cmp = and i1 %is_fixnum, %is_in_bounds | |
br i1 %access_cmp, label %tuple_at, label %fallback | |
tuple_at: ; preds = %is_tuple | |
%upcast = bitcast %"struct.rubinius::Object"* %local83 to %"struct.rubinius::Tuple"* | |
%field_pos97 = getelementptr %"struct.rubinius::Tuple"* %upcast, i64 0, i32 2, i64 %lshr96 | |
%tuple_at98 = load %"struct.rubinius::Object"** %field_pos97, align 8 | |
store %"struct.rubinius::Object"* %tuple_at98, %"struct.rubinius::Object"** %stack, align 8 | |
%block = load %"struct.rubinius::Object"** %16, align 8 | |
store i32 49, i32* %7, align 4 | |
%ys = call %"struct.rubinius::Object"* @rbx_yield_stack(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Object"* %block, i32 1, %"struct.rubinius::Object"** %stack) | |
%null_check103 = icmp eq %"struct.rubinius::Object"* %ys, null | |
br i1 %null_check103, label %return_pad, label %check_active102 | |
check_active102: ; preds = %tuple_at | |
%local106 = load %"struct.rubinius::Object"** %19, align 8 | |
store %"struct.rubinius::Object"* %local106, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 3 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%cast117 = ptrtoint %"struct.rubinius::Object"* %local106 to i64 | |
%masked120 = and i64 %cast117, 1 | |
%are_fixnums121 = icmp eq i64 %masked120, 0 | |
br i1 %are_fixnums121, label %dispatch114, label %fast113 | |
fast113: ; preds = %check_active102 | |
%lshr130 = lshr i64 %cast117, 1 | |
%stripped131 = trunc i64 %lshr130 to i63 | |
%add.overflow135 = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped131, i63 1) | |
%did_overflow137 = extractvalue %0 %add.overflow135, 1 | |
br i1 %did_overflow137, label %dispatch114, label %tagnow115 | |
dispatch114: ; preds = %check_active102, %fast113 | |
store %"struct.rubinius::Object"* %local106, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute125 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4311093736 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 55, i32* %7, align 4 | |
%ic_send126 = call %"struct.rubinius::Object"* %execute125(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093680 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check128 = icmp eq %"struct.rubinius::Object"* %ic_send126, null | |
br i1 %null_check128, label %return_pad, label %cont116 | |
tagnow115: ; preds = %fast113 | |
%sum136 = extractvalue %0 %add.overflow135, 0 | |
%as_native_int138 = zext i63 %sum136 to i64 | |
%shl139 = shl i64 %as_native_int138, 1 | |
%or140 = or i64 %shl139, 1 | |
%as_obj141 = inttoptr i64 %or140 to %"struct.rubinius::Object"* | |
br label %cont116 | |
cont116: ; preds = %dispatch114, %tagnow115 | |
%addition142 = phi %"struct.rubinius::Object"* [ %as_obj141, %tagnow115 ], [ %ic_send126, %dispatch114 ] | |
store %"struct.rubinius::Object"* %addition142, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %addition142, %"struct.rubinius::Object"** %19, align 8 | |
store i32 60, i32* %7, align 4 | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check149 = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check149, label %return_pad, label %check_active148 | |
check_active148: ; preds = %cont116 | |
%local52.pre = load %"struct.rubinius::Object"** %20, align 8 | |
br label %ip34 | |
ip63: ; preds = %cont60 | |
%self152 = load %"struct.rubinius::Object"** %12, align 8 | |
ret %"struct.rubinius::Object"* %self152 | |
ip6: ; preds = %method_body | |
%self156 = load %"struct.rubinius::Object"** %12, align 8 | |
store %"struct.rubinius::Object"* %self156, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 9358 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
store %"struct.rubinius::Object"* %self156, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos1, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute162 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4311093224 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 10, i32* %7, align 4 | |
%ic_send163 = call %"struct.rubinius::Object"* %execute162(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4311093168 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
ret %"struct.rubinius::Object"* %ic_send163 | |
return_pad: ; preds = %import_args, %dispatch, %dispatch59, %tuple_at, %dispatch114, %cont116 | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Array#include?@6"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%valid_flag = alloca i1 | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 15 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 10 | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 2 | |
%arg.total = load i32* %total_pos | |
%arg_cmp = icmp ne i32 %arg.total, 1 | |
br i1 %arg_cmp, label %arg_error, label %import_args | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 1) | |
br label %return_pad | |
import_args: ; preds = %entry | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0 | |
%1 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%cm = bitcast %"struct.rubinius::Executable"* %msg.exec to %"struct.rubinius::CompiledMethod"* | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
%5 = bitcast %"struct.rubinius::Dispatch"* %msg to i8* | |
store i8* %5, i8** %4 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %1 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 80, i32* %6 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %7 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4341108736 to i8*), i8** %9 | |
store i32 0, i32* %counter_alloca | |
br label %stack_nil | |
stack_nil: ; preds = %stack_nil, %import_args | |
%counter = load i32* %counter_alloca | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 %counter | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%added = add i32 %counter, 1 | |
store i32 %added, i32* %counter_alloca | |
%loop_check = icmp eq i32 %added, 6 | |
br i1 %loop_check, label %bottom, label %stack_nil | |
bottom: ; preds = %stack_nil | |
%10 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %10 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11 | |
%12 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %msg.module, %"struct.rubinius::Module"** %14 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %17 | |
%18 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
%local_pos1 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos1 | |
%local_pos2 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos2 | |
%local_pos3 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos3 | |
%arg_ary_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 3 | |
%arg_ary = load %"struct.rubinius::Object"*** %arg_ary_pos | |
%arg_val_offset = getelementptr %"struct.rubinius::Object"** %arg_ary, i32 0 | |
%arg_val = load %"struct.rubinius::Object"** %arg_val_offset | |
%var_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* %arg_val, %"struct.rubinius::Object"** %var_pos | |
%ci173 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%19 = icmp eq %"struct.rubinius::Object"* %ci173, null | |
br i1 %19, label %ret_null172, label %method_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %cont133, %dispatch131, %dispatch95, %dispatch50, %dispatch, %bail_out | |
br label %return_pad | |
method_body: ; preds = %bottom | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%self_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %self_pos | |
%obj_array = bitcast %"struct.rubinius::Object"* %self to %"struct.rubinius::Object"** | |
%field_pos = getelementptr %"struct.rubinius::Object"** %obj_array, i32 5 | |
%field = load %"struct.rubinius::Object"** %field_pos | |
%stack_pos4 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack_pos4 | |
%local_pos5 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%stack_pos6 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos6 | |
store %"struct.rubinius::Object"* %stack_load, %"struct.rubinius::Object"** %local_pos5 | |
%local_pos7 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%local = load %"struct.rubinius::Object"** %local_pos7 | |
%stack_pos8 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local, %"struct.rubinius::Object"** %stack_pos8 | |
%self_pos9 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self10 = load %"struct.rubinius::Object"** %self_pos9 | |
%obj_array11 = bitcast %"struct.rubinius::Object"* %self10 to %"struct.rubinius::Object"** | |
%field_pos12 = getelementptr %"struct.rubinius::Object"** %obj_array11, i32 3 | |
%field13 = load %"struct.rubinius::Object"** %field_pos12 | |
%stack_pos14 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %field13, %"struct.rubinius::Object"** %stack_pos14 | |
%stack_pos15 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load16 = load %"struct.rubinius::Object"** %stack_pos15 | |
%stack_pos17 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load18 = load %"struct.rubinius::Object"** %stack_pos17 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load16 to i64 | |
%cast19 = ptrtoint %"struct.rubinius::Object"* %stack_load18 to i64 | |
%both = and i64 %cast, %cast19 | |
%masked = and i64 %both, 1 | |
%are_fixnums = icmp eq i64 %masked, 1 | |
br i1 %are_fixnums, label %fast, label %dispatch | |
fast: ; preds = %method_body | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load16 to i64 | |
%lshr = lshr i64 %as_int, 1 | |
%stripped = trunc i64 %lshr to i63 | |
%as_int23 = ptrtoint %"struct.rubinius::Object"* %stack_load18 to i64 | |
%lshr24 = lshr i64 %as_int23, 1 | |
%stripped25 = trunc i64 %lshr24 to i63 | |
%add.overflow = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped, i63 %stripped25) | |
%sum = extractvalue %0 %add.overflow, 0 | |
%did_overflow = extractvalue %0 %add.overflow, 1 | |
br i1 %did_overflow, label %dispatch, label %tagnow | |
dispatch: ; preds = %fast, %method_body | |
%stack_pos20 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load21 = load %"struct.rubinius::Object"** %stack_pos20 | |
store %"struct.rubinius::Object"* %stack_load21, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos22 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos22, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337368208 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 9, i32* %ip_pos | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368208 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check, label %ret_null, label %check_active | |
tagnow: ; preds = %fast | |
%as_native_int = zext i63 %sum to i64 | |
%shl = shl i64 %as_native_int, 1 | |
%or = or i64 %shl, 1 | |
%as_obj = inttoptr i64 %or to %"struct.rubinius::Object"* | |
br label %cont | |
cont: ; preds = %tagnow, %check_active | |
%addition = phi %"struct.rubinius::Object"* [ %ic_send, %check_active ], [ %as_obj, %tagnow ] | |
%stack_pos26 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %stack_pos26 | |
%local_pos27 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 2 | |
%stack_pos28 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load29 = load %"struct.rubinius::Object"** %stack_pos28 | |
store %"struct.rubinius::Object"* %stack_load29, %"struct.rubinius::Object"** %local_pos27 | |
%self_pos30 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self31 = load %"struct.rubinius::Object"** %self_pos30 | |
%obj_array32 = bitcast %"struct.rubinius::Object"* %self31 to %"struct.rubinius::Object"** | |
%field_pos33 = getelementptr %"struct.rubinius::Object"** %obj_array32, i32 4 | |
%field34 = load %"struct.rubinius::Object"** %field_pos33 | |
%stack_pos35 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %field34, %"struct.rubinius::Object"** %stack_pos35 | |
%local_pos36 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 3 | |
%stack_pos37 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load38 = load %"struct.rubinius::Object"** %stack_pos37 | |
store %"struct.rubinius::Object"* %stack_load38, %"struct.rubinius::Object"** %local_pos36 | |
br label %ip19 | |
ip19: ; preds = %continue164, %cont | |
%local_pos39 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%local40 = load %"struct.rubinius::Object"** %local_pos39 | |
%stack_pos41 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local40, %"struct.rubinius::Object"** %stack_pos41 | |
%local_pos42 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 2 | |
%local43 = load %"struct.rubinius::Object"** %local_pos42 | |
%stack_pos44 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local43, %"struct.rubinius::Object"** %stack_pos44 | |
%stack_pos45 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load46 = load %"struct.rubinius::Object"** %stack_pos45 | |
%stack_pos47 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load48 = load %"struct.rubinius::Object"** %stack_pos47 | |
%cast52 = ptrtoint %"struct.rubinius::Object"* %stack_load46 to i64 | |
%cast53 = ptrtoint %"struct.rubinius::Object"* %stack_load48 to i64 | |
%both54 = and i64 %cast52, %cast53 | |
%masked55 = and i64 %both54, 1 | |
%are_fixnums56 = icmp eq i64 %masked55, 1 | |
br i1 %are_fixnums56, label %fast49, label %dispatch50 | |
check_active: ; preds = %dispatch | |
br label %cont | |
fast49: ; preds = %ip19 | |
%imm_cmp = icmp slt %"struct.rubinius::Object"* %stack_load46, %stack_load48 | |
%select_bool = select i1 %imm_cmp, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %cont51 | |
dispatch50: ; preds = %ip19 | |
%stack_pos57 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load58 = load %"struct.rubinius::Object"** %stack_pos57 | |
store %"struct.rubinius::Object"* %stack_load58, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos59 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos59, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute60 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337368336 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 23, i32* %ip_pos | |
%ic_send61 = call %"struct.rubinius::Object"* %execute60(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368336 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check63 = icmp eq %"struct.rubinius::Object"* %ic_send61, null | |
br i1 %null_check63, label %ret_null, label %check_active62 | |
cont51: ; preds = %fast49, %check_active62 | |
%addition64 = phi %"struct.rubinius::Object"* [ %ic_send61, %check_active62 ], [ %select_bool, %fast49 ] | |
%stack_pos65 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition64, %"struct.rubinius::Object"** %stack_pos65 | |
%stack_pos66 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load67 = load %"struct.rubinius::Object"** %stack_pos66 | |
%as_int68 = ptrtoint %"struct.rubinius::Object"* %stack_load67 to i64 | |
%and = and i64 %as_int68, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip57, label %continue | |
check_active62: ; preds = %dispatch50 | |
br label %cont51 | |
continue: ; preds = %cont51 | |
br label %ip27 | |
ip27: ; preds = %continue | |
%local_pos69 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 3 | |
%local70 = load %"struct.rubinius::Object"** %local_pos69 | |
%stack_pos71 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local70, %"struct.rubinius::Object"** %stack_pos71 | |
%local_pos72 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%local73 = load %"struct.rubinius::Object"** %local_pos72 | |
%stack_pos74 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local73, %"struct.rubinius::Object"** %stack_pos74 | |
%stack_pos76 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load77 = load %"struct.rubinius::Object"** %stack_pos76 | |
%word_pos = getelementptr %"struct.rubinius::Object"* %stack_load77, i32 0, i32 0, i32 0, i32 0 | |
%flags = load i8** %word_pos | |
%word2flags = ptrtoint i8* %flags to i32 | |
%mask = and i32 %word2flags, 511 | |
%is_type = icmp eq i32 %mask, 118 | |
br i1 %is_type, label %is_tuple, label %fallback | |
fallback: ; preds = %is_tuple, %ip27 | |
store i32 31, i32* %ip_pos | |
%20 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 31, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
continue75: ; preds = %tuple_at | |
%local_pos87 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%local88 = load %"struct.rubinius::Object"** %local_pos87 | |
%stack_pos89 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* %local88, %"struct.rubinius::Object"** %stack_pos89 | |
%stack_pos90 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load91 = load %"struct.rubinius::Object"** %stack_pos90 | |
%stack_pos92 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load93 = load %"struct.rubinius::Object"** %stack_pos92 | |
%cast97 = ptrtoint %"struct.rubinius::Object"* %stack_load91 to i64 | |
%mask98 = and i64 %cast97, 3 | |
%check_mask = icmp ne i64 %mask98, 0 | |
br i1 %check_mask, label %ref_check, label %dispatch95 | |
ref_check: ; preds = %continue75 | |
%cast99 = ptrtoint %"struct.rubinius::Object"* %stack_load93 to i64 | |
%mask100 = and i64 %cast99, 3 | |
%check_mask101 = icmp ne i64 %mask100, 0 | |
br i1 %check_mask101, label %fast94, label %dispatch95 | |
is_tuple: ; preds = %ip27 | |
%stack_pos78 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load79 = load %"struct.rubinius::Object"** %stack_pos78 | |
%cast80 = ptrtoint %"struct.rubinius::Object"* %stack_load79 to i64 | |
%masked81 = and i64 %cast80, 1 | |
%is_fixnum = icmp eq i64 %masked81, 1 | |
%upcast = bitcast %"struct.rubinius::Object"* %stack_load77 to %"struct.rubinius::Tuple"* | |
%as_int82 = ptrtoint %"struct.rubinius::Object"* %stack_load79 to i64 | |
%lshr83 = lshr i64 %as_int82, 1 | |
%table_size_pos = getelementptr %"struct.rubinius::Tuple"* %upcast, i32 0, i32 1 | |
%table_size = load i32* %table_size_pos | |
%to_native_int = sext i32 %table_size to i64 | |
%21 = sub i64 %to_native_int, 32 | |
%22 = sdiv i64 %21, 8 | |
%is_in_bounds = icmp slt i64 %lshr83, %22 | |
%access_cmp = and i1 %is_fixnum, %is_in_bounds | |
br i1 %access_cmp, label %tuple_at, label %fallback | |
tuple_at: ; preds = %is_tuple | |
%field_pos84 = getelementptr %"struct.rubinius::Tuple"* %upcast, i32 0, i32 2, i64 %lshr83 | |
%tuple_at85 = load %"struct.rubinius::Object"** %field_pos84 | |
%stack_pos86 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %tuple_at85, %"struct.rubinius::Object"** %stack_pos86 | |
br label %continue75 | |
fast94: ; preds = %ref_check | |
%imm_cmp109 = icmp eq %"struct.rubinius::Object"* %stack_load91, %stack_load93 | |
%select_bool110 = select i1 %imm_cmp109, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %continue96 | |
dispatch95: ; preds = %ref_check, %continue75 | |
%stack_pos102 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load103 = load %"struct.rubinius::Object"** %stack_pos102 | |
store %"struct.rubinius::Object"* %stack_load103, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos104 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos104, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute105 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337368592 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 36, i32* %ip_pos | |
%ic_send106 = call %"struct.rubinius::Object"* %execute105(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368592 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check108 = icmp eq %"struct.rubinius::Object"* %ic_send106, null | |
br i1 %null_check108, label %ret_null, label %check_active107 | |
continue96: ; preds = %fast94, %check_active107 | |
%equal_value = phi %"struct.rubinius::Object"* [ %ic_send106, %check_active107 ], [ %select_bool110, %fast94 ] | |
%stack_pos111 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %equal_value, %"struct.rubinius::Object"** %stack_pos111 | |
%stack_pos112 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load113 = load %"struct.rubinius::Object"** %stack_pos112 | |
%as_int114 = ptrtoint %"struct.rubinius::Object"* %stack_load113 to i64 | |
%and115 = and i64 %as_int114, 15 | |
%is_true116 = icmp eq i64 %and115, 10 | |
br i1 %is_true116, label %ip44, label %continue117 | |
check_active107: ; preds = %dispatch95 | |
br label %continue96 | |
continue117: ; preds = %continue96 | |
br label %ip40 | |
ip40: ; preds = %continue117 | |
%stack_pos118 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos118 | |
%stack_pos119 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load120 = load %"struct.rubinius::Object"** %stack_pos119 | |
br label %return_pad | |
ip44: ; preds = %continue96 | |
%stack_pos121 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos121 | |
%local_pos122 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%local123 = load %"struct.rubinius::Object"** %local_pos122 | |
%stack_pos124 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %local123, %"struct.rubinius::Object"** %stack_pos124 | |
%stack_pos125 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 3 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos125 | |
%stack_pos126 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load127 = load %"struct.rubinius::Object"** %stack_pos126 | |
%stack_pos128 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
%stack_load129 = load %"struct.rubinius::Object"** %stack_pos128 | |
%cast134 = ptrtoint %"struct.rubinius::Object"* %stack_load127 to i64 | |
%cast135 = ptrtoint %"struct.rubinius::Object"* %stack_load129 to i64 | |
%both136 = and i64 %cast134, %cast135 | |
%masked137 = and i64 %both136, 1 | |
%are_fixnums138 = icmp eq i64 %masked137, 1 | |
br i1 %are_fixnums138, label %fast130, label %dispatch131 | |
fast130: ; preds = %ip44 | |
%as_int146 = ptrtoint %"struct.rubinius::Object"* %stack_load127 to i64 | |
%lshr147 = lshr i64 %as_int146, 1 | |
%stripped148 = trunc i64 %lshr147 to i63 | |
%as_int149 = ptrtoint %"struct.rubinius::Object"* %stack_load129 to i64 | |
%lshr150 = lshr i64 %as_int149, 1 | |
%stripped151 = trunc i64 %lshr150 to i63 | |
%add.overflow152 = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped148, i63 %stripped151) | |
%sum153 = extractvalue %0 %add.overflow152, 0 | |
%did_overflow154 = extractvalue %0 %add.overflow152, 1 | |
br i1 %did_overflow154, label %dispatch131, label %tagnow132 | |
dispatch131: ; preds = %fast130, %ip44 | |
%stack_pos139 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load140 = load %"struct.rubinius::Object"** %stack_pos139 | |
store %"struct.rubinius::Object"* %stack_load140, %"struct.rubinius::Object"** %out_args_recv | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block | |
store i32 1, i32* %out_args_total | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container | |
%stack_pos141 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos141, %"struct.rubinius::Object"*** %out_args_arguments | |
%execute142 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4337368720 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 49, i32* %ip_pos | |
%ic_send143 = call %"struct.rubinius::Object"* %execute142(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368720 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check145 = icmp eq %"struct.rubinius::Object"* %ic_send143, null | |
br i1 %null_check145, label %ret_null, label %check_active144 | |
tagnow132: ; preds = %fast130 | |
%as_native_int155 = zext i63 %sum153 to i64 | |
%shl156 = shl i64 %as_native_int155, 1 | |
%or157 = or i64 %shl156, 1 | |
%as_obj158 = inttoptr i64 %or157 to %"struct.rubinius::Object"* | |
br label %cont133 | |
cont133: ; preds = %tagnow132, %check_active144 | |
%addition159 = phi %"struct.rubinius::Object"* [ %ic_send143, %check_active144 ], [ %as_obj158, %tagnow132 ] | |
%stack_pos160 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %addition159, %"struct.rubinius::Object"** %stack_pos160 | |
%local_pos161 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 1 | |
%stack_pos162 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load163 = load %"struct.rubinius::Object"** %stack_pos162 | |
store %"struct.rubinius::Object"* %stack_load163, %"struct.rubinius::Object"** %local_pos161 | |
store i32 54, i32* %ip_pos | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check166 = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check166, label %ret_null, label %check_active165 | |
check_active144: ; preds = %dispatch131 | |
br label %cont133 | |
continue164: ; preds = %check_active165 | |
br label %ip19 | |
check_active165: ; preds = %cont133 | |
br label %continue164 | |
continue167: ; No predecessors! | |
br label %ip57 | |
ip57: ; preds = %continue167, %cont51 | |
%stack_pos168 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos168 | |
%stack_pos169 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos169 | |
%stack_pos170 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load171 = load %"struct.rubinius::Object"** %stack_pos170 | |
br label %return_pad | |
return_pad: ; preds = %ip57, %ip40, %fallback, %ret_raise_val, %ret_null, %arg_error | |
%return_phi = phi %"struct.rubinius::Object"* [ %ret, %arg_error ], [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %20, %fallback ], [ %stack_load120, %ip40 ], [ %stack_load171, %ip57 ] | |
ret %"struct.rubinius::Object"* %return_phi | |
ret_null172: ; preds = %bottom | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Optimized IR: include? ]]] | |
define %"struct.rubinius::Object"* @"_X_Array#include?@6"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%unwind_info174 = alloca [60 x i32], align 4 | |
%cfstk175 = alloca [15 x %"struct.rubinius::Object"*], align 8 | |
%var_mem176 = alloca [10 x %"struct.rubinius::Object"*], align 8 | |
%out_args = alloca %"struct.rubinius::Arguments", align 8 | |
%unwind_info174.sub = getelementptr inbounds [60 x i32]* %unwind_info174, i64 0, i64 0 | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 2 | |
%arg.total = load i32* %total_pos, align 4 | |
%arg_cmp = icmp eq i32 %arg.total, 1 | |
br i1 %arg_cmp, label %import_args, label %arg_error | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 1) | |
ret %"struct.rubinius::Object"* %ret | |
import_args: ; preds = %entry | |
%call_frame = bitcast [15 x %"struct.rubinius::Object"*]* %cfstk175 to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 9 | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0, align 8 | |
%1 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 3 | |
%2 = getelementptr inbounds [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %3, align 8 | |
%4 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 2 | |
%.c = bitcast %"struct.rubinius::Dispatch"* %msg to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %4, align 8 | |
%cm.c = getelementptr inbounds %"struct.rubinius::Executable"* %msg.exec, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"** %1, align 8 | |
%5 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 4 | |
%6 = bitcast %"struct.rubinius::Object"** %5 to i32* | |
store i32 80, i32* %6, align 8 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %7, align 4 | |
%8 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 7 | |
%vars.c = bitcast [10 x %"struct.rubinius::Object"*]* %var_mem176 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %8, align 8 | |
%9 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4341108736 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %9, align 8 | |
br label %stack_nil | |
stack_nil: ; preds = %stack_nil, %import_args | |
%counter_alloca.0 = phi i32 [ 0, %import_args ], [ %added, %stack_nil ] | |
%10 = sext i32 %counter_alloca.0 to i64 | |
%stack.sum = add i64 %10, 9 | |
%stack_pos = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 %stack.sum | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos, align 8 | |
%added = add i32 %counter_alloca.0, 1 | |
%loop_check = icmp eq i32 %added, 6 | |
br i1 %loop_check, label %bottom, label %stack_nil | |
bottom: ; preds = %stack_nil | |
%11 = getelementptr inbounds [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %12, align 8 | |
%13 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %13, align 8 | |
%14 = getelementptr %"struct.rubinius::Dispatch"* %msg, i64 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %14, align 8 | |
%15 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 4 | |
%msg.module.c = getelementptr inbounds %"struct.rubinius::Module"* %msg.module, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %msg.module.c, %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 1 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %18, align 8 | |
%19 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %19, align 8 | |
%20 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %20, align 8 | |
%21 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 7 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %21, align 8 | |
%22 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %22, align 8 | |
%23 = getelementptr [10 x %"struct.rubinius::Object"*]* %var_mem176, i64 0, i64 9 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %23, align 8 | |
%arg_ary_pos = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 3 | |
%arg_ary = load %"struct.rubinius::Object"*** %arg_ary_pos, align 8 | |
%arg_val = load %"struct.rubinius::Object"** %arg_ary, align 8 | |
store %"struct.rubinius::Object"* %arg_val, %"struct.rubinius::Object"** %20, align 8 | |
%ci173 = call %"struct.rubinius::Object"* @rbx_prologue_check(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%24 = icmp eq %"struct.rubinius::Object"* %ci173, null | |
br i1 %24, label %ret_null172, label %method_body | |
method_body: ; preds = %bottom | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 4 | |
%self = load %"struct.rubinius::Object"** %13, align 8 | |
%25 = getelementptr %"struct.rubinius::Object"* %self, i64 1, i32 0, i32 2 | |
%field = load %"struct.rubinius::Object"** %25, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %21, align 8 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack, align 8 | |
%field_pos12 = getelementptr %"struct.rubinius::Object"* %self, i64 1 | |
%26 = bitcast %"struct.rubinius::Object"* %field_pos12 to %"struct.rubinius::Object"** | |
%field13 = load %"struct.rubinius::Object"** %26, align 8 | |
%stack_pos14 = getelementptr [15 x %"struct.rubinius::Object"*]* %cfstk175, i64 0, i64 10 | |
store %"struct.rubinius::Object"* %field13, %"struct.rubinius::Object"** %stack_pos14, align 8 | |
%cast = ptrtoint %"struct.rubinius::Object"* %field to i64 | |
%cast19 = ptrtoint %"struct.rubinius::Object"* %field13 to i64 | |
%both = and i64 %cast19, 1 | |
%masked = and i64 %both, %cast | |
%are_fixnums = icmp eq i64 %masked, 0 | |
br i1 %are_fixnums, label %dispatch, label %fast | |
fast: ; preds = %method_body | |
%lshr = lshr i64 %cast, 1 | |
%stripped = trunc i64 %lshr to i63 | |
%lshr24 = lshr i64 %cast19, 1 | |
%stripped25 = trunc i64 %lshr24 to i63 | |
%add.overflow = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped, i63 %stripped25) | |
%did_overflow = extractvalue %0 %add.overflow, 1 | |
br i1 %did_overflow, label %dispatch, label %tagnow | |
dispatch: ; preds = %method_body, %fast | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos14, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337368264 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 9, i32* %7, align 4 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368208 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check = icmp eq %"struct.rubinius::Object"* %ic_send, null | |
br i1 %null_check, label %return_pad, label %check_active | |
tagnow: ; preds = %fast | |
%sum = extractvalue %0 %add.overflow, 0 | |
%as_native_int = zext i63 %sum to i64 | |
%shl = shl i64 %as_native_int, 1 | |
%or = or i64 %shl, 1 | |
%as_obj = inttoptr i64 %or to %"struct.rubinius::Object"* | |
br label %cont | |
cont: ; preds = %tagnow, %check_active | |
%self31 = phi %"struct.rubinius::Object"* [ %self31.pre, %check_active ], [ %self, %tagnow ] | |
%addition = phi %"struct.rubinius::Object"* [ %ic_send, %check_active ], [ %as_obj, %tagnow ] | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %addition, %"struct.rubinius::Object"** %22, align 8 | |
%field_pos33 = getelementptr %"struct.rubinius::Object"* %self31, i64 1, i32 0, i32 1 | |
%27 = load %"struct.rubinius::Class"** %field_pos33, align 8 | |
%field34 = getelementptr inbounds %"struct.rubinius::Class"* %27, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %field34, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %field34, %"struct.rubinius::Object"** %23, align 8 | |
br label %ip19 | |
ip19: ; preds = %check_active165, %cont | |
%local43 = phi %"struct.rubinius::Object"* [ %local43.pre, %check_active165 ], [ %addition, %cont ] | |
%local40 = load %"struct.rubinius::Object"** %21, align 8 | |
store %"struct.rubinius::Object"* %local40, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %local43, %"struct.rubinius::Object"** %stack_pos14, align 8 | |
%cast52 = ptrtoint %"struct.rubinius::Object"* %local40 to i64 | |
%cast53 = ptrtoint %"struct.rubinius::Object"* %local43 to i64 | |
%both54 = and i64 %cast53, 1 | |
%masked55 = and i64 %both54, %cast52 | |
%are_fixnums56 = icmp eq i64 %masked55, 0 | |
br i1 %are_fixnums56, label %dispatch50, label %fast49 | |
check_active: ; preds = %dispatch | |
%self31.pre = load %"struct.rubinius::Object"** %13, align 8 | |
br label %cont | |
fast49: ; preds = %ip19 | |
%imm_cmp = icmp slt %"struct.rubinius::Object"* %local40, %local43 | |
%select_bool = select i1 %imm_cmp, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %cont51 | |
dispatch50: ; preds = %ip19 | |
store %"struct.rubinius::Object"* %local40, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos14, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute60 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337368392 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 23, i32* %7, align 4 | |
%ic_send61 = call %"struct.rubinius::Object"* %execute60(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368336 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check63 = icmp eq %"struct.rubinius::Object"* %ic_send61, null | |
br i1 %null_check63, label %return_pad, label %cont51 | |
cont51: ; preds = %dispatch50, %fast49 | |
%addition64 = phi %"struct.rubinius::Object"* [ %select_bool, %fast49 ], [ %ic_send61, %dispatch50 ] | |
store %"struct.rubinius::Object"* %addition64, %"struct.rubinius::Object"** %stack, align 8 | |
%as_int68 = ptrtoint %"struct.rubinius::Object"* %addition64 to i64 | |
%and = and i64 %as_int68, 15 | |
%is_true = icmp eq i64 %and, 10 | |
br i1 %is_true, label %ip57, label %continue | |
continue: ; preds = %cont51 | |
%local70 = load %"struct.rubinius::Object"** %23, align 8 | |
store %"struct.rubinius::Object"* %local70, %"struct.rubinius::Object"** %stack, align 8 | |
%local73 = load %"struct.rubinius::Object"** %21, align 8 | |
store %"struct.rubinius::Object"* %local73, %"struct.rubinius::Object"** %stack_pos14, align 8 | |
%word_pos = getelementptr %"struct.rubinius::Object"* %local70, i64 0, i32 0, i32 0, i32 0 | |
%flags = load i8** %word_pos, align 8 | |
%tmp = ptrtoint i8* %flags to i64 | |
%mask177 = and i64 %tmp, 511 | |
%is_type = icmp eq i64 %mask177, 118 | |
br i1 %is_type, label %is_tuple, label %fallback | |
fallback: ; preds = %is_tuple, %continue | |
store i32 31, i32* %7, align 4 | |
%28 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 31, i64 1, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info174.sub) | |
ret %"struct.rubinius::Object"* %28 | |
ref_check: ; preds = %tuple_at | |
%cast99 = ptrtoint %"struct.rubinius::Object"* %local88 to i64 | |
%mask100 = and i64 %cast99, 3 | |
%check_mask101 = icmp eq i64 %mask100, 0 | |
br i1 %check_mask101, label %dispatch95, label %fast94 | |
is_tuple: ; preds = %continue | |
%cast80 = ptrtoint %"struct.rubinius::Object"* %local73 to i64 | |
%masked81 = and i64 %cast80, 1 | |
%is_fixnum = icmp ne i64 %masked81, 0 | |
%lshr83 = lshr i64 %cast80, 1 | |
%table_size_pos = getelementptr %"struct.rubinius::Object"* %local70, i64 1 | |
%29 = bitcast %"struct.rubinius::Object"* %table_size_pos to i32* | |
%table_size = load i32* %29, align 4 | |
%to_native_int = sext i32 %table_size to i64 | |
%30 = add i64 %to_native_int, -32 | |
%31 = sdiv i64 %30, 8 | |
%is_in_bounds = icmp slt i64 %lshr83, %31 | |
%access_cmp = and i1 %is_fixnum, %is_in_bounds | |
br i1 %access_cmp, label %tuple_at, label %fallback | |
tuple_at: ; preds = %is_tuple | |
%upcast = bitcast %"struct.rubinius::Object"* %local70 to %"struct.rubinius::Tuple"* | |
%field_pos84 = getelementptr %"struct.rubinius::Tuple"* %upcast, i64 0, i32 2, i64 %lshr83 | |
%tuple_at85 = load %"struct.rubinius::Object"** %field_pos84, align 8 | |
store %"struct.rubinius::Object"* %tuple_at85, %"struct.rubinius::Object"** %stack, align 8 | |
%local88 = load %"struct.rubinius::Object"** %20, align 8 | |
store %"struct.rubinius::Object"* %local88, %"struct.rubinius::Object"** %stack_pos14, align 8 | |
%cast97 = ptrtoint %"struct.rubinius::Object"* %tuple_at85 to i64 | |
%mask98 = and i64 %cast97, 3 | |
%check_mask = icmp eq i64 %mask98, 0 | |
br i1 %check_mask, label %dispatch95, label %ref_check | |
fast94: ; preds = %ref_check | |
%imm_cmp109 = icmp eq %"struct.rubinius::Object"* %tuple_at85, %local88 | |
%select_bool110 = select i1 %imm_cmp109, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %continue96 | |
dispatch95: ; preds = %ref_check, %tuple_at | |
store %"struct.rubinius::Object"* %tuple_at85, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos14, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute105 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337368648 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 36, i32* %7, align 4 | |
%ic_send106 = call %"struct.rubinius::Object"* %execute105(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368592 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check108 = icmp eq %"struct.rubinius::Object"* %ic_send106, null | |
br i1 %null_check108, label %return_pad, label %continue96 | |
continue96: ; preds = %dispatch95, %fast94 | |
%equal_value = phi %"struct.rubinius::Object"* [ %select_bool110, %fast94 ], [ %ic_send106, %dispatch95 ] | |
store %"struct.rubinius::Object"* %equal_value, %"struct.rubinius::Object"** %stack, align 8 | |
%as_int114 = ptrtoint %"struct.rubinius::Object"* %equal_value to i64 | |
%and115 = and i64 %as_int114, 15 | |
%is_true116 = icmp eq i64 %and115, 10 | |
br i1 %is_true116, label %ip44, label %continue117 | |
continue117: ; preds = %continue96 | |
ret %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*) | |
ip44: ; preds = %continue96 | |
%local123 = load %"struct.rubinius::Object"** %21, align 8 | |
store %"struct.rubinius::Object"* %local123, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 3 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos14, align 8 | |
%cast134 = ptrtoint %"struct.rubinius::Object"* %local123 to i64 | |
%masked137 = and i64 %cast134, 1 | |
%are_fixnums138 = icmp eq i64 %masked137, 0 | |
br i1 %are_fixnums138, label %dispatch131, label %fast130 | |
fast130: ; preds = %ip44 | |
%lshr147 = lshr i64 %cast134, 1 | |
%stripped148 = trunc i64 %lshr147 to i63 | |
%add.overflow152 = call %0 @llvm.sadd.with.overflow.i63(i63 %stripped148, i63 1) | |
%did_overflow154 = extractvalue %0 %add.overflow152, 1 | |
br i1 %did_overflow154, label %dispatch131, label %tagnow132 | |
dispatch131: ; preds = %ip44, %fast130 | |
store %"struct.rubinius::Object"* %local123, %"struct.rubinius::Object"** %out_args_recv, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block, align 8 | |
store i32 1, i32* %out_args_total, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container, align 8 | |
store %"struct.rubinius::Object"** %stack_pos14, %"struct.rubinius::Object"*** %out_args_arguments, align 8 | |
%execute142 = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4337368776 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 49, i32* %7, align 4 | |
%ic_send143 = call %"struct.rubinius::Object"* %execute142(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4337368720 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::Arguments"* %out_args) | |
%null_check145 = icmp eq %"struct.rubinius::Object"* %ic_send143, null | |
br i1 %null_check145, label %return_pad, label %cont133 | |
tagnow132: ; preds = %fast130 | |
%sum153 = extractvalue %0 %add.overflow152, 0 | |
%as_native_int155 = zext i63 %sum153 to i64 | |
%shl156 = shl i64 %as_native_int155, 1 | |
%or157 = or i64 %shl156, 1 | |
%as_obj158 = inttoptr i64 %or157 to %"struct.rubinius::Object"* | |
br label %cont133 | |
cont133: ; preds = %dispatch131, %tagnow132 | |
%addition159 = phi %"struct.rubinius::Object"* [ %as_obj158, %tagnow132 ], [ %ic_send143, %dispatch131 ] | |
store %"struct.rubinius::Object"* %addition159, %"struct.rubinius::Object"** %stack, align 8 | |
store %"struct.rubinius::Object"* %addition159, %"struct.rubinius::Object"** %21, align 8 | |
store i32 54, i32* %7, align 4 | |
%ci = call %"struct.rubinius::Object"* @rbx_check_interrupts(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
%null_check166 = icmp eq %"struct.rubinius::Object"* %ci, null | |
br i1 %null_check166, label %return_pad, label %check_active165 | |
check_active165: ; preds = %cont133 | |
%local43.pre = load %"struct.rubinius::Object"** %22, align 8 | |
br label %ip19 | |
ip57: ; preds = %cont51 | |
ret %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
return_pad: ; preds = %dispatch, %dispatch50, %dispatch95, %dispatch131, %cont133 | |
ret %"struct.rubinius::Object"* null | |
ret_null172: ; preds = %bottom | |
ret %"struct.rubinius::Object"* null | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Module#method_table@7"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%valid_flag = alloca i1 | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 10 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 6 | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 2 | |
%arg.total = load i32* %total_pos | |
%arg_cmp = icmp ne i32 %arg.total, 0 | |
br i1 %arg_cmp, label %arg_error, label %import_args | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
br label %return_pad | |
import_args: ; preds = %entry | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 2 | |
%msg.exec = load %"struct.rubinius::Executable"** %0 | |
%1 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%cm = bitcast %"struct.rubinius::Executable"* %msg.exec to %"struct.rubinius::CompiledMethod"* | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
%5 = bitcast %"struct.rubinius::Dispatch"* %msg to i8* | |
store i8* %5, i8** %4 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %1 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 80, i32* %6 | |
%7 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %7 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4341236144 to i8*), i8** %9 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%10 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %10 | |
%11 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %11 | |
%12 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %args.recv, %"struct.rubinius::Object"** %12 | |
%13 = getelementptr %"struct.rubinius::Dispatch"* %msg, i32 0, i32 1 | |
%msg.module = load %"struct.rubinius::Module"** %13 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %msg.module, %"struct.rubinius::Module"** %14 | |
%15 = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %17 | |
%18 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %18 | |
%arg_ary_pos = getelementptr %"struct.rubinius::Arguments"* %args, i32 0, i32 3 | |
%arg_ary = load %"struct.rubinius::Object"*** %arg_ary_pos | |
br label %method_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %bail_out | |
br label %return_pad | |
method_body: ; preds = %import_args | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%self_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %self_pos | |
%obj_array = bitcast %"struct.rubinius::Object"* %self to %"struct.rubinius::Object"** | |
%field_pos = getelementptr %"struct.rubinius::Object"** %obj_array, i32 3 | |
%field = load %"struct.rubinius::Object"** %field_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %field, %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos2 | |
br label %return_pad | |
return_pad: ; preds = %method_body, %ret_raise_val, %ret_null, %arg_error | |
%return_phi = phi %"struct.rubinius::Object"* [ %ret, %arg_error ], [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %stack_load, %method_body ] | |
ret %"struct.rubinius::Object"* %return_phi | |
} | |
[[[ LLVM Optimized IR: method_table ]]] | |
define %"struct.rubinius::Object"* @"_X_Module#method_table@7"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args) { | |
entry: | |
%total_pos = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 2 | |
%arg.total = load i32* %total_pos, align 4 | |
%arg_cmp = icmp eq i32 %arg.total, 0 | |
br i1 %arg_cmp, label %import_args, label %arg_error | |
arg_error: ; preds = %entry | |
%ret = call %"struct.rubinius::Object"* @rbx_arg_error(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::Dispatch"* %msg, %"struct.rubinius::Arguments"* %args, i32 0) | |
ret %"struct.rubinius::Object"* %ret | |
import_args: ; preds = %entry | |
%0 = getelementptr %"struct.rubinius::Arguments"* %args, i64 0, i32 0 | |
%args.recv = load %"struct.rubinius::Object"** %0, align 8 | |
%field_pos = getelementptr %"struct.rubinius::Object"* %args.recv, i64 1 | |
%1 = bitcast %"struct.rubinius::Object"* %field_pos to %"struct.rubinius::Object"** | |
%field = load %"struct.rubinius::Object"** %1, align 8 | |
ret %"struct.rubinius::Object"* %field | |
} | |
[[[ LLVM Simple IR ]]] | |
define %"struct.rubinius::Object"* @"_X_Object#__block__$block@8"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::BlockEnvironment"* %env, %"struct.rubinius::Arguments"* %args, %"struct.rubinius::BlockInvocation"* %invocation) { | |
entry: | |
%counter_alloca = alloca i32 | |
%unwind_info = alloca i32, i32 60 | |
%valid_flag = alloca i1 | |
%cfstk = alloca %"struct.rubinius::Object"*, i32 12 | |
%call_frame = bitcast %"struct.rubinius::Object"** %cfstk to %"struct.rubinius::CallFrame"* | |
%out_args = alloca %"struct.rubinius::Arguments" | |
%stack = getelementptr %"struct.rubinius::Object"** %cfstk, i32 9 | |
%var_mem = alloca %"struct.rubinius::Object"*, i32 7 | |
%vars = bitcast %"struct.rubinius::Object"** %var_mem to %"struct.rubinius::StackVariables"* | |
%0 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 3 | |
%1 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 4 | |
%env.method = load %"struct.rubinius::CompiledMethod"** %1 | |
%2 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::CallFrame"** %2 | |
%3 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 2 | |
%invocation.static_scope = load %"struct.rubinius::StaticScope"** %3 | |
%4 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 1 | |
store %"struct.rubinius::StaticScope"* %invocation.static_scope, %"struct.rubinius::StaticScope"** %4 | |
%5 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 9 | |
store %"struct.rubinius::Arguments"* %args, %"struct.rubinius::Arguments"** %5 | |
%6 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 2 | |
store i8* null, i8** %6 | |
store %"struct.rubinius::CompiledMethod"* %env.method, %"struct.rubinius::CompiledMethod"** %0 | |
%7 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 0 | |
%invocation.flags = load i32* %7 | |
%flags = or i32 %invocation.flags, 214 | |
%8 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 4 | |
store i32 %flags, i32* %8 | |
%9 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
store i32 0, i32* %9 | |
%10 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars, %"struct.rubinius::StackVariables"** %10 | |
%11 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 2 | |
%env.top_scope = load %"struct.rubinius::VariableScope"** %11 | |
%12 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 7 | |
store %"struct.rubinius::VariableScope"* %env.top_scope, %"struct.rubinius::VariableScope"** %12 | |
%13 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 6 | |
store i8* inttoptr (i64 4341151792 to i8*), i8** %13 | |
%stack_pos = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos | |
%stack_pos1 = getelementptr %"struct.rubinius::Object"** %stack, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1 | |
%stack_pos2 = getelementptr %"struct.rubinius::Object"** %stack, i32 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2 | |
%14 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %14 | |
%15 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 1 | |
%invocation.self = load %"struct.rubinius::Object"** %15 | |
%16 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %invocation.self, %"struct.rubinius::Object"** %16 | |
%17 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i32 0, i32 3 | |
%invocation.module = load %"struct.rubinius::Module"** %17 | |
%18 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 5 | |
%env.module = load %"struct.rubinius::Module"** %18 | |
%19 = icmp ne %"struct.rubinius::Module"* %invocation.module, null | |
%20 = select i1 %19, %"struct.rubinius::Module"* %invocation.module, %"struct.rubinius::Module"* %env.module | |
%21 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %20, %"struct.rubinius::Module"** %21 | |
%22 = getelementptr %"struct.rubinius::VariableScope"* %env.top_scope, i32 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %22 | |
%23 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %23 | |
%24 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i32 0, i32 1 | |
%env.scope = load %"struct.rubinius::VariableScope"** %24 | |
%25 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* %env.scope, %"struct.rubinius::VariableScope"** %25 | |
%26 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %26 | |
%local_pos = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %local_pos | |
%cfstk12 = alloca %"struct.rubinius::Object"*, i32 11 | |
%var_mem15 = alloca %"struct.rubinius::Object"*, i32 6 | |
br label %block_body | |
bail_out: ; No predecessors! | |
%rth = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame) | |
br i1 %rth, label %ret_raise_val, label %ret_null | |
ret_raise_val: ; preds = %bail_out | |
%crv = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad | |
ret_null: ; preds = %return_pad10, %bail_out | |
br label %return_pad | |
block_body: ; preds = %entry | |
%ip_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32 5 | |
%out_args_recv = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%cfsba = call %"struct.rubinius::Object"* @rbx_cast_for_single_block_arg(%"struct.rubinius::VM"* %state, %"struct.rubinius::Arguments"* %args) | |
%stack_pos3 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %stack_pos3 | |
%local_pos4 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 6, i32 0 | |
%stack_pos5 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load = load %"struct.rubinius::Object"** %stack_pos5 | |
store %"struct.rubinius::Object"* %stack_load, %"struct.rubinius::Object"** %local_pos4 | |
%27 = getelementptr %"struct.rubinius::StackVariables"* %vars, i32 0, i32 2 | |
%self = load %"struct.rubinius::Object"** %27 | |
%stack_pos6 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack_pos6 | |
%stack_pos7 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load8 = load %"struct.rubinius::Object"** %stack_pos7 | |
%cast = ptrtoint %"struct.rubinius::Object"* %stack_load8 to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
continue: ; preds = %continue74 | |
%stack_pos78 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
%stack_load79 = load %"struct.rubinius::Object"** %stack_pos78 | |
br label %return_pad | |
return_pad: ; preds = %continue, %fallback, %ret_raise_val, %ret_null | |
%return_phi = phi %"struct.rubinius::Object"* [ null, %ret_null ], [ %crv, %ret_raise_val ], [ %28, %fallback ], [ %stack_load79, %continue ] | |
ret %"struct.rubinius::Object"* %return_phi | |
check_class_id: ; preds = %block_body | |
%class_pos = getelementptr %"struct.rubinius::Object"* %stack_load8, i32 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i32 0, i32 4 | |
%class_id = load i32* %class_id_pos | |
%check_class_id9 = icmp eq i32 %class_id, 524 | |
br i1 %check_class_id9, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
br label %inline_entry | |
fallback: ; preds = %check_class_id, %block_body | |
store i32 5, i32* %ip_pos | |
%28 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 5, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info) | |
br label %return_pad | |
inline_entry: ; preds = %correct_class | |
%call_frame13 = bitcast %"struct.rubinius::Object"** %cfstk12 to %"struct.rubinius::CallFrame"* | |
%stack14 = getelementptr %"struct.rubinius::Object"** %cfstk12, i32 9 | |
%vars16 = bitcast %"struct.rubinius::Object"** %var_mem15 to %"struct.rubinius::StackVariables"* | |
%29 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 0 | |
store %"struct.rubinius::CallFrame"* %call_frame, %"struct.rubinius::CallFrame"** %29 | |
%30 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 2 | |
store i8* inttoptr (i64 4341176528 to i8*), i8** %30 | |
%cm = load %"struct.rubinius::CompiledMethod"** getelementptr (%"struct.rubinius::jit::RuntimeData"* inttoptr (i64 4341176528 to %"struct.rubinius::jit::RuntimeData"*), i32 0, i32 0) | |
%31 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 3 | |
store %"struct.rubinius::CompiledMethod"* %cm, %"struct.rubinius::CompiledMethod"** %31 | |
%32 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 4 | |
store i32 24, i32* %32 | |
%33 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 5 | |
store i32 0, i32* %33 | |
%34 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 8 | |
store %"struct.rubinius::StackVariables"* %vars16, %"struct.rubinius::StackVariables"** %34 | |
%stack_pos17 = getelementptr %"struct.rubinius::Object"** %stack14, i32 0 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos17 | |
%stack_pos18 = getelementptr %"struct.rubinius::Object"** %stack14, i32 1 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos18 | |
%module = load %"struct.rubinius::Module"** getelementptr (%"struct.rubinius::jit::RuntimeData"* inttoptr (i64 4341176528 to %"struct.rubinius::jit::RuntimeData"*), i32 0, i32 2) | |
%35 = getelementptr %"struct.rubinius::StackVariables"* %vars16, i32 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %35 | |
%36 = getelementptr %"struct.rubinius::StackVariables"* %vars16, i32 0, i32 2 | |
store %"struct.rubinius::Object"* %stack_load8, %"struct.rubinius::Object"** %36 | |
%37 = getelementptr %"struct.rubinius::StackVariables"* %vars16, i32 0, i32 4 | |
store %"struct.rubinius::Module"* %module, %"struct.rubinius::Module"** %37 | |
%38 = getelementptr %"struct.rubinius::StackVariables"* %vars16, i32 0, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %38 | |
%39 = getelementptr %"struct.rubinius::StackVariables"* %vars16, i32 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %39 | |
%40 = getelementptr %"struct.rubinius::StackVariables"* %vars16, i32 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %40 | |
br label %method_body | |
bail_out19: ; No predecessors! | |
%rth20 = call i1 @rbx_return_to_here(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame13) | |
br i1 %rth20, label %ret_raise_val21, label %ret_null22 | |
ret_raise_val21: ; preds = %bail_out19 | |
%crv23 = call %"struct.rubinius::Object"* @rbx_clear_raise_value(%"struct.rubinius::VM"* %state) | |
br label %return_pad10 | |
ret_null22: ; preds = %continue40, %bail_out19 | |
br label %return_pad10 | |
method_body: ; preds = %inline_entry | |
%ip_pos24 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 5 | |
%out_args_recv25 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 0 | |
%out_args_block26 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 1 | |
%out_args_total27 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 2 | |
%out_args_arguments28 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 3 | |
%out_args_container29 = getelementptr %"struct.rubinius::Arguments"* %out_args, i32 0, i32 4 | |
%cm_pos = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 3 | |
%cm30 = load %"struct.rubinius::CompiledMethod"** %cm_pos | |
%literals_pos = getelementptr %"struct.rubinius::CompiledMethod"* %cm30, i32 0, i32 16 | |
%literals = load %"struct.rubinius::Tuple"** %literals_pos | |
%literal_pos = getelementptr %"struct.rubinius::Tuple"* %literals, i32 0, i32 2, i32 0 | |
%literal = load %"struct.rubinius::Object"** %literal_pos | |
%stack_pos31 = getelementptr %"struct.rubinius::Object"** %stack14, i32 0 | |
store %"struct.rubinius::Object"* %literal, %"struct.rubinius::Object"** %stack_pos31 | |
%cm_pos32 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i32 0, i32 3 | |
%cm33 = load %"struct.rubinius::CompiledMethod"** %cm_pos32 | |
%literals_pos34 = getelementptr %"struct.rubinius::CompiledMethod"* %cm33, i32 0, i32 16 | |
%literals35 = load %"struct.rubinius::Tuple"** %literals_pos34 | |
%literal_pos36 = getelementptr %"struct.rubinius::Tuple"* %literals35, i32 0, i32 2, i32 1 | |
%literal37 = load %"struct.rubinius::Object"** %literal_pos36 | |
%stack_pos38 = getelementptr %"struct.rubinius::Object"** %stack14, i32 1 | |
store %"struct.rubinius::Object"* %literal37, %"struct.rubinius::Object"** %stack_pos38 | |
%stack_pos41 = getelementptr %"struct.rubinius::Object"** %stack14, i32 0 | |
%stack_load42 = load %"struct.rubinius::Object"** %stack_pos41 | |
%cast43 = ptrtoint %"struct.rubinius::Object"* %stack_load42 to i64 | |
%masked44 = and i64 %cast43, 3 | |
%is_reference45 = icmp eq i64 %masked44, 0 | |
br i1 %is_reference45, label %check_class_id46, label %fallback39 | |
continue40: ; preds = %fallback39, %float_compare | |
%send_result = phi %"struct.rubinius::Object"* [ %select_bool, %float_compare ], [ %ic_send, %fallback39 ] | |
%null_check = icmp eq %"struct.rubinius::Object"* %send_result, null | |
br i1 %null_check, label %ret_null22, label %check_active | |
check_class_id46: ; preds = %method_body | |
%class_pos48 = getelementptr %"struct.rubinius::Object"* %stack_load42, i32 0, i32 0, i32 1 | |
%ref_class49 = load %"struct.rubinius::Class"** %class_pos48 | |
%class_id_pos50 = getelementptr %"struct.rubinius::Class"* %ref_class49, i32 0, i32 4 | |
%class_id51 = load i32* %class_id_pos50 | |
%check_class_id52 = icmp eq i32 %class_id51, 63 | |
br i1 %check_class_id52, label %correct_class47, label %fallback39 | |
correct_class47: ; preds = %check_class_id46 | |
%stack_pos53 = getelementptr %"struct.rubinius::Object"** %stack14, i32 1 | |
%stack_load54 = load %"struct.rubinius::Object"** %stack_pos53 | |
%cast55 = ptrtoint %"struct.rubinius::Object"* %stack_load54 to i64 | |
%masked56 = and i64 %cast55, 3 | |
%is_reference57 = icmp eq i64 %masked56, 0 | |
br i1 %is_reference57, label %check_class_id58, label %check_fixnum | |
check_class_id58: ; preds = %correct_class47 | |
%class_pos60 = getelementptr %"struct.rubinius::Object"* %stack_load54, i32 0, i32 0, i32 1 | |
%ref_class61 = load %"struct.rubinius::Class"** %class_pos60 | |
%class_id_pos62 = getelementptr %"struct.rubinius::Class"* %ref_class61, i32 0, i32 4 | |
%class_id63 = load i32* %class_id_pos62 | |
%check_class_id64 = icmp eq i32 %class_id63, 63 | |
br i1 %check_class_id64, label %correct_class59, label %check_fixnum | |
correct_class59: ; preds = %check_class_id58 | |
%arg_float = bitcast %"struct.rubinius::Object"* %stack_load54 to %"struct.rubinius::Float"* | |
%arg.value_pos = getelementptr %"struct.rubinius::Float"* %arg_float, i32 0, i32 1 | |
%farg = load double* %arg.value_pos | |
br label %float_compare | |
check_fixnum: ; preds = %check_class_id58, %correct_class47 | |
%cast65 = ptrtoint %"struct.rubinius::Object"* %stack_load54 to i64 | |
%masked66 = and i64 %cast65, 1 | |
%is_fixnum = icmp eq i64 %masked66, 1 | |
br i1 %is_fixnum, label %guarded_body, label %fallback39 | |
guarded_body: ; preds = %check_fixnum | |
%as_int = ptrtoint %"struct.rubinius::Object"* %stack_load54 to i64 | |
%lshr = lshr i64 %as_int, 1 | |
%41 = uitofp i64 %lshr to double | |
br label %float_compare | |
float_compare: ; preds = %guarded_body, %correct_class59 | |
%float_rhs = phi double [ %farg, %correct_class59 ], [ %41, %guarded_body ] | |
%self_float = bitcast %"struct.rubinius::Object"* %stack_load42 to %"struct.rubinius::Float"* | |
%self.value_pos = getelementptr %"struct.rubinius::Float"* %self_float, i32 0, i32 1 | |
%fself = load double* %self.value_pos | |
%float.ge = fcmp uge double %fself, %float_rhs | |
%select_bool = select i1 %float.ge, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %continue40 | |
fallback39: ; preds = %check_fixnum, %check_class_id46, %method_body | |
%stack_pos67 = getelementptr %"struct.rubinius::Object"** %stack14, i32 0 | |
%stack_load68 = load %"struct.rubinius::Object"** %stack_pos67 | |
store %"struct.rubinius::Object"* %stack_load68, %"struct.rubinius::Object"** %out_args_recv25 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block26 | |
store i32 1, i32* %out_args_total27 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container29 | |
%stack_pos69 = getelementptr %"struct.rubinius::Object"** %stack14, i32 1 | |
store %"struct.rubinius::Object"** %stack_pos69, %"struct.rubinius::Object"*** %out_args_arguments28 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** getelementptr (%"struct.rubinius::InlineCache"* inttoptr (i64 4340530800 to %"struct.rubinius::InlineCache"*), i32 0, i32 4) | |
store i32 4, i32* %ip_pos24 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4340530800 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame13, %"struct.rubinius::Arguments"* %out_args) | |
br label %continue40 | |
continue70: ; preds = %check_active | |
%stack_pos71 = getelementptr %"struct.rubinius::Object"** %stack14, i32 0 | |
store %"struct.rubinius::Object"* %send_result, %"struct.rubinius::Object"** %stack_pos71 | |
%stack_pos72 = getelementptr %"struct.rubinius::Object"** %stack14, i32 0 | |
%stack_load73 = load %"struct.rubinius::Object"** %stack_pos72 | |
br label %return_pad10 | |
return_pad10: ; preds = %continue70, %ret_raise_val21, %ret_null22 | |
%return_phi11 = phi %"struct.rubinius::Object"* [ null, %ret_null22 ], [ %crv23, %ret_raise_val21 ], [ %stack_load73, %continue70 ] | |
%null_check76 = icmp eq %"struct.rubinius::Object"* %return_phi11, null | |
br i1 %null_check76, label %ret_null, label %check_active75 | |
check_active: ; preds = %continue40 | |
br label %continue70 | |
continue74: ; preds = %check_active75 | |
%stack_pos77 = getelementptr %"struct.rubinius::Object"** %stack, i32 0 | |
store %"struct.rubinius::Object"* %return_phi11, %"struct.rubinius::Object"** %stack_pos77 | |
br label %continue | |
check_active75: ; preds = %return_pad10 | |
br label %continue74 | |
} | |
[[[ LLVM Optimized IR: __block__ ]]] | |
define %"struct.rubinius::Object"* @"_X_Object#__block__$block@8"(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %previous, %"struct.rubinius::BlockEnvironment"* %env, %"struct.rubinius::Arguments"* %args, %"struct.rubinius::BlockInvocation"* %invocation) { | |
entry: | |
%unwind_info80 = alloca [60 x i32], align 4 | |
%cfstk81 = alloca [12 x %"struct.rubinius::Object"*], align 8 | |
%unwind_info80.sub = getelementptr inbounds [60 x i32]* %unwind_info80, i64 0, i64 0 | |
%call_frame = bitcast [12 x %"struct.rubinius::Object"*]* %cfstk81 to %"struct.rubinius::CallFrame"* | |
%out_args = alloca %"struct.rubinius::Arguments", align 8 | |
%stack = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 9 | |
%var_mem82 = alloca [7 x %"struct.rubinius::Object"*], align 8 | |
%0 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 3 | |
%1 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 4 | |
%env.method = load %"struct.rubinius::CompiledMethod"** %1, align 8 | |
%2 = getelementptr inbounds [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 0 | |
%previous.c = bitcast %"struct.rubinius::CallFrame"* %previous to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %previous.c, %"struct.rubinius::Object"** %2, align 8 | |
%3 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 2 | |
%invocation.static_scope = load %"struct.rubinius::StaticScope"** %3, align 8 | |
%4 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 1 | |
%invocation.static_scope.c = bitcast %"struct.rubinius::StaticScope"* %invocation.static_scope to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %invocation.static_scope.c, %"struct.rubinius::Object"** %4, align 8 | |
%5 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 8 | |
%args.c = bitcast %"struct.rubinius::Arguments"* %args to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %args.c, %"struct.rubinius::Object"** %5, align 8 | |
%6 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 2 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %6, align 8 | |
%env.method.c = getelementptr inbounds %"struct.rubinius::CompiledMethod"* %env.method, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %env.method.c, %"struct.rubinius::Object"** %0, align 8 | |
%7 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 0 | |
%invocation.flags = load i32* %7, align 4 | |
%flags = or i32 %invocation.flags, 214 | |
%8 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 4 | |
%9 = bitcast %"struct.rubinius::Object"** %8 to i32* | |
store i32 %flags, i32* %9, align 8 | |
%10 = getelementptr %"struct.rubinius::CallFrame"* %call_frame, i64 0, i32 5 | |
store i32 0, i32* %10, align 4 | |
%11 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 7 | |
%vars.c = bitcast [7 x %"struct.rubinius::Object"*]* %var_mem82 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars.c, %"struct.rubinius::Object"** %11, align 8 | |
%12 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 2 | |
%env.top_scope = load %"struct.rubinius::VariableScope"** %12, align 8 | |
%13 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 6 | |
%env.top_scope.c = getelementptr inbounds %"struct.rubinius::VariableScope"* %env.top_scope, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %env.top_scope.c, %"struct.rubinius::Object"** %13, align 8 | |
%14 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 4341151792 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %14, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack, align 8 | |
%stack_pos1 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos1, align 8 | |
%stack_pos2 = getelementptr [12 x %"struct.rubinius::Object"*]* %cfstk81, i64 0, i64 11 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos2, align 8 | |
%15 = getelementptr inbounds [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 0 | |
store %"struct.rubinius::Object"* null, %"struct.rubinius::Object"** %15, align 8 | |
%16 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 1 | |
%invocation.self = load %"struct.rubinius::Object"** %16, align 8 | |
%17 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 2 | |
store %"struct.rubinius::Object"* %invocation.self, %"struct.rubinius::Object"** %17, align 8 | |
%18 = getelementptr %"struct.rubinius::BlockInvocation"* %invocation, i64 0, i32 3 | |
%invocation.module = load %"struct.rubinius::Module"** %18, align 8 | |
%19 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 5 | |
%env.module = load %"struct.rubinius::Module"** %19, align 8 | |
%20 = icmp ne %"struct.rubinius::Module"* %invocation.module, null | |
%21 = select i1 %20, %"struct.rubinius::Module"* %invocation.module, %"struct.rubinius::Module"* %env.module | |
%22 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 4 | |
%.c = getelementptr inbounds %"struct.rubinius::Module"* %21, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %.c, %"struct.rubinius::Object"** %22, align 8 | |
%23 = getelementptr %"struct.rubinius::VariableScope"* %env.top_scope, i64 0, i32 1 | |
%args.block = load %"struct.rubinius::Object"** %23, align 8 | |
%24 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 3 | |
store %"struct.rubinius::Object"* %args.block, %"struct.rubinius::Object"** %24, align 8 | |
%25 = getelementptr %"struct.rubinius::BlockEnvironment"* %env, i64 0, i32 1 | |
%env.scope = load %"struct.rubinius::VariableScope"** %25, align 8 | |
%26 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 1 | |
%env.scope.c = getelementptr inbounds %"struct.rubinius::VariableScope"* %env.scope, i64 0, i32 0 | |
store %"struct.rubinius::Object"* %env.scope.c, %"struct.rubinius::Object"** %26, align 8 | |
%27 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %27, align 8 | |
%28 = getelementptr [7 x %"struct.rubinius::Object"*]* %var_mem82, i64 0, i64 6 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %28, align 8 | |
%cfstk1283 = alloca [11 x %"struct.rubinius::Object"*], align 8 | |
%var_mem1584 = alloca %"struct.rubinius::StackVariables", align 8 | |
%cfsba = call %"struct.rubinius::Object"* @rbx_cast_for_single_block_arg(%"struct.rubinius::VM"* %state, %"struct.rubinius::Arguments"* %args) | |
store %"struct.rubinius::Object"* %cfsba, %"struct.rubinius::Object"** %28, align 8 | |
%self = load %"struct.rubinius::Object"** %17, align 8 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %stack, align 8 | |
%cast = ptrtoint %"struct.rubinius::Object"* %self to i64 | |
%masked = and i64 %cast, 3 | |
%is_reference = icmp eq i64 %masked, 0 | |
br i1 %is_reference, label %check_class_id, label %fallback | |
check_class_id: ; preds = %entry | |
%class_pos = getelementptr %"struct.rubinius::Object"* %self, i64 0, i32 0, i32 1 | |
%ref_class = load %"struct.rubinius::Class"** %class_pos, align 8 | |
%class_id_pos = getelementptr %"struct.rubinius::Class"* %ref_class, i64 0, i32 4 | |
%class_id = load i32* %class_id_pos, align 4 | |
%check_class_id9 = icmp eq i32 %class_id, 524 | |
br i1 %check_class_id9, label %correct_class, label %fallback | |
correct_class: ; preds = %check_class_id | |
%call_frame13 = bitcast [11 x %"struct.rubinius::Object"*]* %cfstk1283 to %"struct.rubinius::CallFrame"* | |
%stack14 = getelementptr [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 9 | |
%29 = getelementptr inbounds [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 0 | |
%call_frame.c = bitcast [12 x %"struct.rubinius::Object"*]* %cfstk81 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %call_frame.c, %"struct.rubinius::Object"** %29, align 8 | |
%30 = getelementptr [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 2 | |
store %"struct.rubinius::Object"* inttoptr (i64 4341176528 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %30, align 8 | |
%cm = load %"struct.rubinius::CompiledMethod"** inttoptr (i64 4341176528 to %"struct.rubinius::CompiledMethod"**), align 16 | |
%31 = getelementptr [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 3 | |
%cm.c = getelementptr inbounds %"struct.rubinius::CompiledMethod"* %cm, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %cm.c, %"struct.rubinius::Object"** %31, align 8 | |
%32 = getelementptr [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 4 | |
%33 = bitcast %"struct.rubinius::Object"** %32 to i32* | |
store i32 24, i32* %33, align 8 | |
%34 = getelementptr %"struct.rubinius::CallFrame"* %call_frame13, i64 0, i32 5 | |
store i32 0, i32* %34, align 4 | |
%35 = getelementptr [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 7 | |
%vars16.c = bitcast %"struct.rubinius::StackVariables"* %var_mem1584 to %"struct.rubinius::Object"* | |
store %"struct.rubinius::Object"* %vars16.c, %"struct.rubinius::Object"** %35, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack14, align 8 | |
%stack_pos18 = getelementptr [11 x %"struct.rubinius::Object"*]* %cfstk1283, i64 0, i64 10 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %stack_pos18, align 8 | |
%module = load %"struct.rubinius::Module"** inttoptr (i64 4341176544 to %"struct.rubinius::Module"**), align 32 | |
%36 = getelementptr %"struct.rubinius::StackVariables"* %var_mem1584, i64 0, i32 0 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %36, align 8 | |
%37 = getelementptr %"struct.rubinius::StackVariables"* %var_mem1584, i64 0, i32 2 | |
store %"struct.rubinius::Object"* %self, %"struct.rubinius::Object"** %37, align 8 | |
%38 = getelementptr %"struct.rubinius::StackVariables"* %var_mem1584, i64 0, i32 4 | |
store %"struct.rubinius::Module"* %module, %"struct.rubinius::Module"** %38, align 8 | |
%39 = getelementptr %"struct.rubinius::StackVariables"* %var_mem1584, i64 0, i32 3 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %39, align 8 | |
%40 = getelementptr %"struct.rubinius::StackVariables"* %var_mem1584, i64 0, i32 1 | |
store %"struct.rubinius::VariableScope"* null, %"struct.rubinius::VariableScope"** %40, align 8 | |
%41 = getelementptr %"struct.rubinius::StackVariables"* %var_mem1584, i64 0, i32 5 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %41, align 8 | |
%out_args_recv25 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 0 | |
%out_args_block26 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 1 | |
%out_args_total27 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 2 | |
%out_args_arguments28 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 3 | |
%out_args_container29 = getelementptr %"struct.rubinius::Arguments"* %out_args, i64 0, i32 4 | |
%literals_pos = getelementptr %"struct.rubinius::Object"* %cm.c, i64 7, i32 0, i32 2 | |
%42 = load %"struct.rubinius::Object"** %literals_pos, align 8 | |
%literal_pos = getelementptr %"struct.rubinius::Object"* %42, i64 1, i32 0, i32 1 | |
%43 = load %"struct.rubinius::Class"** %literal_pos, align 8 | |
%literal = getelementptr inbounds %"struct.rubinius::Class"* %43, i64 0, i32 0, i32 0 | |
store %"struct.rubinius::Object"* %literal, %"struct.rubinius::Object"** %stack14, align 8 | |
%44 = load %"struct.rubinius::Object"** %literals_pos, align 8 | |
%45 = getelementptr %"struct.rubinius::Object"* %44, i64 1, i32 0, i32 2 | |
%literal37 = load %"struct.rubinius::Object"** %45, align 8 | |
store %"struct.rubinius::Object"* %literal37, %"struct.rubinius::Object"** %stack_pos18, align 8 | |
%cast43 = ptrtoint %"struct.rubinius::Class"* %43 to i64 | |
%masked44 = and i64 %cast43, 3 | |
%is_reference45 = icmp eq i64 %masked44, 0 | |
br i1 %is_reference45, label %check_class_id46, label %fallback39 | |
fallback: ; preds = %check_class_id, %entry | |
store i32 5, i32* %10, align 4 | |
%46 = call %"struct.rubinius::Object"* @rbx_continue_uncommon(%"struct.rubinius::VM"* %state, %"struct.rubinius::CallFrame"* %call_frame, i32 5, i64 0, %"struct.rubinius::CallFrame"* %call_frame, i32 0, i32* %unwind_info80.sub) | |
ret %"struct.rubinius::Object"* %46 | |
continue40: ; preds = %fallback39, %float_compare | |
%send_result = phi %"struct.rubinius::Object"* [ %select_bool, %float_compare ], [ %ic_send, %fallback39 ] | |
%null_check = icmp eq %"struct.rubinius::Object"* %send_result, null | |
br i1 %null_check, label %return_pad10, label %check_active | |
check_class_id46: ; preds = %correct_class | |
%class_pos48 = getelementptr %"struct.rubinius::Class"* %43, i64 0, i32 0, i32 0, i32 0, i32 1 | |
%ref_class49 = load %"struct.rubinius::Class"** %class_pos48, align 8 | |
%class_id_pos50 = getelementptr %"struct.rubinius::Class"* %ref_class49, i64 0, i32 4 | |
%class_id51 = load i32* %class_id_pos50, align 4 | |
%check_class_id52 = icmp eq i32 %class_id51, 63 | |
br i1 %check_class_id52, label %correct_class47, label %fallback39 | |
correct_class47: ; preds = %check_class_id46 | |
%cast55 = ptrtoint %"struct.rubinius::Object"* %literal37 to i64 | |
%masked56 = and i64 %cast55, 3 | |
%is_reference57 = icmp eq i64 %masked56, 0 | |
br i1 %is_reference57, label %check_class_id58, label %check_fixnum | |
check_class_id58: ; preds = %correct_class47 | |
%class_pos60 = getelementptr %"struct.rubinius::Object"* %literal37, i64 0, i32 0, i32 1 | |
%ref_class61 = load %"struct.rubinius::Class"** %class_pos60, align 8 | |
%class_id_pos62 = getelementptr %"struct.rubinius::Class"* %ref_class61, i64 0, i32 4 | |
%class_id63 = load i32* %class_id_pos62, align 4 | |
%check_class_id64 = icmp eq i32 %class_id63, 63 | |
br i1 %check_class_id64, label %correct_class59, label %check_fixnum | |
correct_class59: ; preds = %check_class_id58 | |
%arg.value_pos = getelementptr %"struct.rubinius::Object"* %literal37, i64 1 | |
%47 = bitcast %"struct.rubinius::Object"* %arg.value_pos to double* | |
%farg = load double* %47, align 8 | |
br label %float_compare | |
check_fixnum: ; preds = %check_class_id58, %correct_class47 | |
%masked66 = and i64 %cast55, 1 | |
%is_fixnum = icmp eq i64 %masked66, 0 | |
br i1 %is_fixnum, label %fallback39, label %guarded_body | |
guarded_body: ; preds = %check_fixnum | |
%lshr = lshr i64 %cast55, 1 | |
%48 = uitofp i64 %lshr to double | |
br label %float_compare | |
float_compare: ; preds = %guarded_body, %correct_class59 | |
%float_rhs = phi double [ %farg, %correct_class59 ], [ %48, %guarded_body ] | |
%self.value_pos = getelementptr %"struct.rubinius::Object"* %literal, i64 1 | |
%49 = bitcast %"struct.rubinius::Object"* %self.value_pos to double* | |
%fself = load double* %49, align 8 | |
%float.ge = fcmp uge double %fself, %float_rhs | |
%select_bool = select i1 %float.ge, %"struct.rubinius::Object"* inttoptr (i64 18 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"* inttoptr (i64 10 to %"struct.rubinius::Object"*) | |
br label %continue40 | |
fallback39: ; preds = %check_fixnum, %check_class_id46, %correct_class | |
store %"struct.rubinius::Object"* %literal, %"struct.rubinius::Object"** %out_args_recv25, align 8 | |
store %"struct.rubinius::Object"* inttoptr (i64 26 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %out_args_block26, align 8 | |
store i32 1, i32* %out_args_total27, align 8 | |
store %"struct.rubinius::Tuple"* null, %"struct.rubinius::Tuple"** %out_args_container29, align 8 | |
store %"struct.rubinius::Object"** %stack_pos18, %"struct.rubinius::Object"*** %out_args_arguments28, align 8 | |
%execute = load %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)** inttoptr (i64 4340530856 to %"struct.rubinius::Object"* (%"struct.rubinius::VM"*, %"struct.rubinius::InlineCache"*, %"struct.rubinius::CallFrame"*, %"struct.rubinius::Arguments"*)**), align 8 | |
store i32 4, i32* %34, align 4 | |
%ic_send = call %"struct.rubinius::Object"* %execute(%"struct.rubinius::VM"* %state, %"struct.rubinius::InlineCache"* inttoptr (i64 4340530800 to %"struct.rubinius::InlineCache"*), %"struct.rubinius::CallFrame"* %call_frame13, %"struct.rubinius::Arguments"* %out_args) | |
br label %continue40 | |
return_pad10: ; preds = %continue40 | |
ret %"struct.rubinius::Object"* null | |
check_active: ; preds = %continue40 | |
store %"struct.rubinius::Object"* %send_result, %"struct.rubinius::Object"** %stack14, align 8 | |
ret %"struct.rubinius::Object"* %send_result | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment