Skip to content

Instantly share code, notes, and snippets.

@kronos
Created March 17, 2011 17:51
Show Gist options
  • Save kronos/874789 to your computer and use it in GitHub Desktop.
Save kronos/874789 to your computer and use it in GitHub Desktop.
Last login: Thu Mar 17 20:31:33 on ttys006
kronos:~$ cd /Developer/ruby/rubinius/
kronos:rubinius:[master]$ bin/rbx -Xjit.dump_code=3 -Xjit.inline.debug x.rb
JIT: target search from each
JIT: queueing method: each
JIT: compiling Rubinius::Tuple#each (1300384256.600059)
| inlining: Rubinius::Tuple#fields into each. generic primitive: jit_stub_tuple_fields
| inlining: Rubinius::Tuple#at into each. primitive tuple_at
[[[ 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 4353687632 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 4337101136 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 4337101136 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 4337101264 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 4337101264 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 4337101520 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 4337101520 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 4353687632 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 4337101192 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 4337101136 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 4337101320 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 4337101264 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 4337101576 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 4337101520 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
}
JIT: queueing block inside: find_all
JIT: queueing block inside: add_ivars
JIT: compiling block in find_all near kernel/common/enumerable.rb:436 (1300384256.629818)
| inlining: Array#<< into find_all
|| NOT inlining: set_index. Cache contains 2 entries
|| class: Array 1040
|| class: Rubinius::LoadedFeatures 0
[[[ 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 4340138752 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 4340181888 to i8*), i8** %30
%cm = load %"struct.rubinius::CompiledMethod"** getelementptr (%"struct.rubinius::jit::RuntimeData"* inttoptr (i64 4340181888 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 4340181888 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 4337323968 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 4337323968 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 4340138752 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 4340181888 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %30, align 8
%cm = load %"struct.rubinius::CompiledMethod"** inttoptr (i64 4340181888 to %"struct.rubinius::CompiledMethod"**), align 128
%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 4340181904 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 4337324024 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 4337323968 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
}
JIT: compiling block in add_ivars near kernel/common/module.rb:746 (1300384256.651052)
| NOT inlining: kind_of?. Cache contains 3 entries
| class: Symbol 4521
| class: NilClass 506
| class: String 407
| inlining: Symbol#is_ivar? into add_ivars. generic primitive: jit_stub_symbol_is_ivar
[[[ 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 4354744144 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 4339122928 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 4339122928 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 4339123056 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 4339123056 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
}
JIT: target search from current_script
JIT: queueing method: current_script
JIT: target search from each
JIT: queueing method: each
JIT: target search from include?
JIT: queueing method: include?
[[[ 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 4354744144 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 4339122984 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 4339122928 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 4339123112 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 4339123056 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
}
JIT: compiling Rubinius::StaticScope#current_script (1300384256.662873)
| inlining: read to '@script' on Rubinius::StaticScope in #current_script
| inlining: read to '@parent' on Rubinius::StaticScope in #current_script (slot: 2)
| inlining: read to '@script' on Rubinius::StaticScope in #current_script
[[[ 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 4341104640 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 JIT: target search from 0, method_tablei32*
%JIT: queueing method: unwind_infomethod_table)
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 4341104640 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"*), JIT: queueing block inside: %"struct.rubinius::Object"** __block__%
19, align 8JIT: target search from
x
%ci94JIT: queueing method: = xcall
%"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
}
JIT: compiling Array#each (1300384256.676589)
| inlining: Rubinius::Tuple#at into each. primitive tuple_at
[[[ 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 4341105120 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 4311093440 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 4311093440 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 4311093568 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 4311093568 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 4311093824 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 4311093824 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 4311093312 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 4311093312 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 4341105120 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 4311093496 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 4311093440 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 4311093624 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 4311093568 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 4311093880 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 4311093824 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 4311093368 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 4311093312 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
}
JIT: compiling Array#include? (1300384256.699787)
| inlining: Rubinius::Tuple#at into include?. primitive tuple_at
[[[ 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 4353827504 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 4337368352 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 4337368352 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 4337368480 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 4337368480 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 4337368736 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 4337368736 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 4337368864 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 4337368864 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 4353827504 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 4337368408 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 4337368352 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 4337368536 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 4337368480 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 4337368792 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 4337368736 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 4337368920 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 4337368864 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
}
JIT: compiling Module#method_table (1300384256.721281)
[[[ 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 4353810208 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
}
JIT: compiling block in __block__ near /Developer/ruby/rubinius/x.rb:5 (1300384256.724409)
| inlining: Object#x into __block__
|| inlining: Float#>= into x. primitive float_ge
[[[ 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 4353820736 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 4353723776 to i8*), i8** %30
%cm = load %"struct.rubinius::CompiledMethod"** getelementptr (%"struct.rubinius::jit::RuntimeData"* inttoptr (i64 4353723776 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 4353723776 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 4355874160 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 4355874160 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 4353820736 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 4353723776 to %"struct.rubinius::Object"*), %"struct.rubinius::Object"** %30, align 8
%cm = load %"struct.rubinius::CompiledMethod"** inttoptr (i64 4353723776 to %"struct.rubinius::CompiledMethod"**), align 128
%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 4353723792 to %"struct.rubinius::Module"**), align 16
%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 4355874216 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 4355874160 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
}
LLVM ERROR: Cannot yet select: 0x10402fe10: f64 = sint_to_fp 0x104808410 [ID=6]
0x104808410: i64 = srl 0x10402e210, 0x10402e710 [ORD=1529] [ID=5]
0x10402e210: i64,ch = CopyFromReg 0x102a91148, 0x10402de10 [ORD=1528] [ID=4]
0x102a91148: ch = EntryToken [ORD=1528] [ID=0]
0x10402de10: i64 = Register %reg16388 [ORD=1528] [ID=1]
0x10402e710: i8 = Constant<1> [ORD=1529] [ID=2]
kronos:rubinius:[master]$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment