diff --git a/compiler/Core/CompilerState.cc b/compiler/Core/CompilerState.cc index 3a913150d88..3c6e96d8966 100644 --- a/compiler/Core/CompilerState.cc +++ b/compiler/Core/CompilerState.cc @@ -56,7 +56,6 @@ llvm::FunctionType *CompilerState::getRubyBlockFFIType() { llvm::FunctionType *CompilerState::getRubyExceptionFFIType() { llvm::Type *args[] = { llvm::Type::getInt64PtrTy(lctx)->getPointerTo(), // VALUE **pc - llvm::Type::getInt64PtrTy(lctx), // VALUE *iseq_encoded llvm::Type::getInt64Ty(lctx), // VALUE captures }; return llvm::FunctionType::get(llvm::Type::getInt64Ty(lctx), args, false /*not varargs*/); diff --git a/compiler/IREmitter/Exceptions.cc b/compiler/IREmitter/Exceptions.cc index ffb1c4777cf..5b832e5631b 100644 --- a/compiler/IREmitter/Exceptions.cc +++ b/compiler/IREmitter/Exceptions.cc @@ -82,28 +82,26 @@ class ExceptionState { return irctx.rubyBlocks2Functions[handlersRubyBlockId]; } - // Fetch the pc, iseq_encoded, and closure values that are used when calling an exception function. - tuple getExceptionArgs() { + // Fetch the pc, and closure values that are used when calling an exception function. + tuple getExceptionArgs() { auto *pc = builder.CreateLoad(irctx.lineNumberPtrsByFunction[rubyBlockId]); - auto *iseq_encoded = builder.CreateLoad(irctx.iseqEncodedPtrsByFunction[rubyBlockId]); auto *closure = Payload::buildLocalsOffset(cs); - return {pc, iseq_encoded, closure}; + return {pc, closure}; } // Run a function that may raiase exceptions. tuple sorbetTry(llvm::Function *fun, llvm::Value *exceptionContext) { - auto [pc, iseq_encoded, closure] = getExceptionArgs(); - auto *result = - builder.CreateCall(cs.getFunction("sorbet_try"), - {fun, pc, iseq_encoded, closure, exceptionContext, exceptionResultPtr}, "result"); + auto [pc, closure] = getExceptionArgs(); + auto *result = builder.CreateCall(cs.getFunction("sorbet_try"), + {fun, pc, closure, exceptionContext, exceptionResultPtr}, "result"); return {result, exceptionResultPtr}; } // Run the ensure clause, overwriting the previous return value that was passed in if it's present. llvm::Value *sorbetEnsure(llvm::Value *previousReturnValue) { - auto [pc, iseq_encoded, closure] = getExceptionArgs(); - auto *res = builder.CreateCall(getEnsure(), {pc, iseq_encoded, closure}, "ensureResult"); + auto [pc, closure] = getExceptionArgs(); + auto *res = builder.CreateCall(getEnsure(), {pc, closure}, "ensureResult"); auto *notUndef = builder.CreateICmpNE(res, Payload::rubyUndef(cs, builder), "ensureReturnValue"); return builder.CreateSelect(notUndef, res, previousReturnValue); } diff --git a/compiler/IREmitter/IREmitter.cc b/compiler/IREmitter/IREmitter.cc index 914622e48b7..45da0b3586b 100644 --- a/compiler/IREmitter/IREmitter.cc +++ b/compiler/IREmitter/IREmitter.cc @@ -58,9 +58,8 @@ void setupStackFrame(CompilerState &cs, const ast::MethodDef &md, const IREmitte case FunctionType::Rescue: case FunctionType::Ensure: { // Switch the current control frame from a C frame to a Ruby-esque one - auto [pc, iseq_encoded] = Payload::setRubyStackFrame(cs, builder, irctx, md, rubyBlockId); + auto pc = Payload::setRubyStackFrame(cs, builder, irctx, md, rubyBlockId); builder.CreateStore(pc, irctx.lineNumberPtrsByFunction[rubyBlockId]); - builder.CreateStore(iseq_encoded, irctx.iseqEncodedPtrsByFunction[rubyBlockId]); break; } @@ -68,9 +67,7 @@ void setupStackFrame(CompilerState &cs, const ast::MethodDef &md, const IREmitte // Exception functions get their pc and iseq_encoded values as arguments auto func = irctx.rubyBlocks2Functions[rubyBlockId]; auto *pc = func->arg_begin(); - auto *iseq_encoded = func->arg_begin() + 1; builder.CreateStore(pc, irctx.lineNumberPtrsByFunction[rubyBlockId]); - builder.CreateStore(iseq_encoded, irctx.iseqEncodedPtrsByFunction[rubyBlockId]); break; } @@ -112,9 +109,8 @@ void setupStackFrames(CompilerState &base, const ast::MethodDef &md, const IREmi setupStackFrame(cs, md, irctx, builder, rubyBlockId); auto lastLoc = core::Loc::none(); - auto startLoc = IREmitterHelpers::getMethodStart(cs, md.symbol); + auto startLoc = md.symbol.data(base)->loc(); Payload::setLineNumber(cs, builder, core::Loc(cs.file, md.loc), startLoc, lastLoc, - irctx.iseqEncodedPtrsByFunction[rubyBlockId], irctx.lineNumberPtrsByFunction[rubyBlockId]); } } @@ -500,7 +496,7 @@ llvm::BasicBlock *resolveJumpTarget(cfg::CFG &cfg, const IREmitterContext &irctx void emitUserBody(CompilerState &base, cfg::CFG &cfg, const IREmitterContext &irctx) { llvm::IRBuilder<> builder(base); UnorderedSet loadYieldParamsResults; // methods calls on these are ignored - auto startLoc = IREmitterHelpers::getMethodStart(base, cfg.symbol); + auto startLoc = cfg.symbol.data(base)->loc(); auto &arguments = cfg.symbol.data(base)->arguments(); for (auto it = cfg.forwardsTopoSort.rbegin(); it != cfg.forwardsTopoSort.rend(); ++it) { cfg::BasicBlock *bb = *it; @@ -521,7 +517,6 @@ void emitUserBody(CompilerState &base, cfg::CFG &cfg, const IREmitterContext &ir auto loc = core::Loc(cs.file, bind.loc); lastLoc = Payload::setLineNumber(cs, builder, loc, startLoc, lastLoc, - irctx.iseqEncodedPtrsByFunction[bb->rubyBlockId], irctx.lineNumberPtrsByFunction[bb->rubyBlockId]); IREmitterHelpers::emitDebugLoc(cs, builder, irctx, bb->rubyBlockId, loc); diff --git a/compiler/IREmitter/IREmitterContext.h b/compiler/IREmitter/IREmitterContext.h index e065473c729..dd8f1bafd8a 100644 --- a/compiler/IREmitter/IREmitterContext.h +++ b/compiler/IREmitter/IREmitterContext.h @@ -197,9 +197,6 @@ struct IREmitterContext { // TODO(jez) document lineNumberPtrsByFunction std::vector lineNumberPtrsByFunction; - // TODO(jez) document iseqEncodedPtrsByFunction - std::vector iseqEncodedPtrsByFunction; - // TODO(jez) usesBlockArgs bool usesBlockArgs; diff --git a/compiler/IREmitter/IREmitterHelpers.cc b/compiler/IREmitter/IREmitterHelpers.cc index 7795be8a785..33f96782339 100644 --- a/compiler/IREmitter/IREmitterHelpers.cc +++ b/compiler/IREmitter/IREmitterHelpers.cc @@ -359,8 +359,7 @@ void getRubyBlocks2FunctionsMapping(CompilerState &cs, cfg::CFG &cfg, llvm::Func // argument names fp->arg_begin()->setName("pc"); - (fp->arg_begin() + 1)->setName("iseq_encoded"); - (fp->arg_begin() + 2)->setName("localsOffset"); + (fp->arg_begin() + 1)->setName("localsOffset"); funcs[i] = fp; break; @@ -552,11 +551,9 @@ IREmitterContext IREmitterHelpers::getSorbetBlocks2LLVMBlockMapping(CompilerStat vector userEntryBlockByFunction(rubyBlock2Function.size()); vector sendArgArrayByBlock; vector lineNumberPtrsByFunction; - vector iseqEncodedPtrsByFunction; int i = 0; auto lineNumberPtrType = llvm::PointerType::getUnqual(llvm::Type::getInt64PtrTy(cs)); - auto iseqEncodedPtrType = llvm::Type::getInt64PtrTy(cs); for (auto &fun : rubyBlock2Function) { auto inits = functionInitializersByFunction.emplace_back(llvm::BasicBlock::Create( cs, "functionEntryInitializers", @@ -567,8 +564,6 @@ IREmitterContext IREmitterHelpers::getSorbetBlocks2LLVMBlockMapping(CompilerStat sendArgArrayByBlock.emplace_back(sendArgArray); auto lineNumberPtr = builder.CreateAlloca(lineNumberPtrType, nullptr, "lineCountStore"); lineNumberPtrsByFunction.emplace_back(lineNumberPtr); - auto iseqEncodedPtr = builder.CreateAlloca(iseqEncodedPtrType, nullptr, "iseqEncodedStore"); - iseqEncodedPtrsByFunction.emplace_back(iseqEncodedPtr); argumentSetupBlocksByFunction.emplace_back(llvm::BasicBlock::Create(cs, "argumentSetup", fun)); i++; } @@ -718,7 +713,6 @@ IREmitterContext IREmitterHelpers::getSorbetBlocks2LLVMBlockMapping(CompilerStat move(blockParents), move(blockLevels), move(lineNumberPtrsByFunction), - move(iseqEncodedPtrsByFunction), usesBlockArgs, move(exceptionHandlingBlockHeaders), move(deadBlocks), @@ -791,15 +785,6 @@ bool IREmitterHelpers::isFileOrClassStaticInit(const core::GlobalState &gs, core return isFileStaticInit(gs, sym) || isClassStaticInit(gs, sym); } -core::Loc IREmitterHelpers::getMethodLineBounds(const core::GlobalState &gs, core::SymbolRef sym, core::FileRef file, - core::LocOffsets offsets) { - if (IREmitterHelpers::isFileStaticInit(gs, sym)) { - return core::Loc(file, core::LocOffsets{0, offsets.endLoc}); - } else { - return core::Loc(file, offsets); - } -} - namespace { llvm::GlobalValue::LinkageTypes getFunctionLinkageType(CompilerState &cs, core::SymbolRef sym) { if (IREmitterHelpers::isFileOrClassStaticInit(cs, sym)) { diff --git a/compiler/IREmitter/IREmitterHelpers.h b/compiler/IREmitter/IREmitterHelpers.h index 4cc32ed7b45..14adbb21ec6 100644 --- a/compiler/IREmitter/IREmitterHelpers.h +++ b/compiler/IREmitter/IREmitterHelpers.h @@ -62,16 +62,6 @@ class IREmitterHelpers { static bool isFileStaticInit(const core::GlobalState &gs, core::SymbolRef sym); static bool isFileOrClassStaticInit(const core::GlobalState &gs, core::SymbolRef sym); - // Returns a core::Loc whose start and end positions containt the bounds of the method sym. - static core::Loc getMethodLineBounds(const core::GlobalState &gs, core::SymbolRef sym, core::FileRef file, - core::LocOffsets offsets); - - // Returns a core::Loc whose begin pos contains the start line of the method. - static core::Loc getMethodStart(const core::GlobalState &gs, core::SymbolRef sym) { - auto loc = sym.data(gs)->loc(); - return getMethodLineBounds(gs, sym, loc.file(), loc.offsets()); - } - static std::string getFunctionName(CompilerState &cs, core::SymbolRef sym); static llvm::Function *lookupFunction(CompilerState &cs, core::SymbolRef sym); static llvm::Function *getOrCreateFunctionWeak(CompilerState &cs, core::SymbolRef sym); diff --git a/compiler/IREmitter/Payload.cc b/compiler/IREmitter/Payload.cc index 928656bd051..92f5d30b413 100644 --- a/compiler/IREmitter/Payload.cc +++ b/compiler/IREmitter/Payload.cc @@ -583,30 +583,19 @@ llvm::Function *allocateRubyStackFramesImpl(CompilerState &cs, const IREmitterCo // We are building a new function. We should redefine where do function initializers go auto cs1 = cs.withFunctionEntry(bei); - auto loc = IREmitterHelpers::getMethodLineBounds(cs, md.symbol, cs.file, md.loc); + auto file = cs.file; auto *iseqType = getIseqType(cs1, builder, irctx, rubyBlockId); auto [funcName, parent] = getIseqInfo(cs1, builder, irctx, md, rubyBlockId); auto funcNameId = Payload::idIntern(cs1, builder, funcName); auto funcNameValue = Payload::cPtrToRubyString(cs1, builder, funcName, true); - auto filename = loc.file().data(cs).path(); + auto filename = file.data(cs).path(); auto filenameValue = Payload::cPtrToRubyString(cs1, builder, filename, true); - // The method might have been synthesized by Sorbet (e.g. in the case of packages). - // Give such methods line numbers of 0. - unsigned startLine, endLine; - if (loc.exists()) { - startLine = loc.position(cs).first.line; - endLine = loc.position(cs).second.line; - } else { - startLine = 0; - endLine = 0; - } auto [locals, numLocals] = getLocals(cs1, builder, irctx, md, rubyBlockId); auto sendMax = llvm::ConstantInt::get(cs, llvm::APInt(32, irctx.maxSendArgCount, true)); + auto *fileLineNumberInfo = Payload::getFileLineNumberInfo(cs, builder, file); auto *fn = cs.getFunction("sorbet_allocateRubyStackFrame"); - auto ret = - builder.CreateCall(fn, {funcNameValue, funcNameId, filenameValue, realpath, parent, iseqType, - llvm::ConstantInt::get(cs, llvm::APInt(32, startLine)), - llvm::ConstantInt::get(cs, llvm::APInt(32, endLine)), locals, numLocals, sendMax}); + auto ret = builder.CreateCall(fn, {funcNameValue, funcNameId, filenameValue, realpath, parent, iseqType, + fileLineNumberInfo, locals, numLocals, sendMax}); auto zero = llvm::ConstantInt::get(cs, llvm::APInt(64, 0)); llvm::Constant *indices[] = {zero}; builder.CreateStore(ret, llvm::ConstantExpr::getInBoundsGetElementPtr(store->getValueType(), store, indices)); @@ -689,9 +678,8 @@ llvm::Value *Payload::rubyStackFrameVar(CompilerState &cs, llvm::IRBuilderBase & return ::sorbet::compiler::rubyStackFrameVar(cs, build, irctx, methodSym, 0); } -std::pair Payload::setRubyStackFrame(CompilerState &cs, llvm::IRBuilderBase &build, - const IREmitterContext &irctx, - const ast::MethodDef &md, int rubyBlockId) { +llvm::Value *Payload::setRubyStackFrame(CompilerState &cs, llvm::IRBuilderBase &build, const IREmitterContext &irctx, + const ast::MethodDef &md, int rubyBlockId) { auto &builder = builderCast(build); auto stackFrame = allocateRubyStackFrames(cs, builder, irctx, md, rubyBlockId); auto *iseqType = getIseqType(cs, builder, irctx, rubyBlockId); @@ -700,8 +688,7 @@ std::pair Payload::setRubyStackFrame(CompilerState irctx.rubyBlockType[rubyBlockId] == FunctionType::StaticInitModule))); auto cfp = builder.CreateCall(cs.getFunction("sorbet_setRubyStackFrame"), {isStaticInit, iseqType, stackFrame}); auto pc = builder.CreateCall(cs.getFunction("sorbet_getPc"), {cfp}); - auto iseq_encoded = builder.CreateCall(cs.getFunction("sorbet_getIseqEncoded"), {cfp}); - return {pc, iseq_encoded}; + return pc; } // Ensure that the retry singleton is present during module initialization, and store it in a module-local global. @@ -751,8 +738,62 @@ llvm::Value *Payload::voidSingleton(CompilerState &cs, llvm::IRBuilderBase &buil return builderCast(build).CreateLoad(global, rawName); } +// Lazily initialize a global that contains enough noops to represent all the lines in the file as an iseq_encoded +// array. +llvm::Value *Payload::getFileLineNumberInfo(CompilerState &cs, llvm::IRBuilderBase &build, core::FileRef file) { + auto *iseqEncodedInitFn = cs.module->getFunction("sorbet_initLineNumberInfo"); + auto *infoPointerTy = iseqEncodedInitFn->getFunctionType()->params()[0]; + ENFORCE(infoPointerTy != nullptr); + + auto *globalTy = llvm::cast(infoPointerTy)->getElementType(); + + auto *iseqEncoded = getIseqEncodedPointer(cs, build, file); + const string rawName = "fileLineNumberInfo"; + auto *global = cs.module->getOrInsertGlobal( + rawName, globalTy, [&cs, &rawName, &iseqEncoded, file, globalTy, iseqEncodedInitFn]() { + auto globalInitBuilder = llvm::IRBuilder<>(cs); + + bool isConstant = false; + auto *zero = llvm::ConstantAggregateZero::get(globalTy); + auto *fileLineNumberInfo = new llvm::GlobalVariable(*cs.module, globalTy, isConstant, + llvm::GlobalVariable::InternalLinkage, zero, rawName); + + globalInitBuilder.SetInsertPoint(cs.globalConstructorsEntry); + + auto *numLines = llvm::ConstantInt::get(cs, llvm::APInt(32, file.data(cs).lineCount(), true)); + auto *intzero = llvm::ConstantInt::get(cs, llvm::APInt(32, 0)); + llvm::Value *indices[] = {intzero, intzero}; + globalInitBuilder.CreateCall( + iseqEncodedInitFn, {fileLineNumberInfo, globalInitBuilder.CreateGEP(iseqEncoded, indices), numLines}); + + return fileLineNumberInfo; + }); + + return global; +} + +llvm::Value *Payload::getIseqEncodedPointer(CompilerState &cs, llvm::IRBuilderBase &builder, core::FileRef file) { + auto *int64Ty = llvm::Type::getInt64Ty(cs); + uint32_t lineCount = file.data(cs).lineCount(); + auto *globalTy = llvm::ArrayType::get(int64Ty, lineCount); + + const string rawName = "iseqEncodedArray"; + auto *global = cs.module->getOrInsertGlobal(rawName, globalTy, [&cs, &rawName, globalTy]() { + auto globalInitBuilder = llvm::IRBuilder<>(cs); + + bool isConstant = false; + auto *zero = llvm::ConstantAggregateZero::get(globalTy); + auto *iseqEncodedArray = new llvm::GlobalVariable(*cs.module, globalTy, isConstant, + llvm::GlobalVariable::InternalLinkage, zero, rawName); + + return iseqEncodedArray; + }); + + return global; +} + core::Loc Payload::setLineNumber(CompilerState &cs, llvm::IRBuilderBase &build, core::Loc loc, core::Loc methodStart, - core::Loc lastLoc, llvm::AllocaInst *iseqEncodedPtr, llvm::AllocaInst *lineNumberPtr) { + core::Loc lastLoc, llvm::AllocaInst *lineNumberPtr) { if (!loc.exists()) { return lastLoc; } @@ -764,10 +805,15 @@ core::Loc Payload::setLineNumber(CompilerState &cs, llvm::IRBuilderBase &build, if (!methodStart.exists()) { return lastLoc; } - auto offset = lineno - methodStart.position(cs).first.line; + + // turn the line number into an offset into the iseq_encoded global array + auto *offset = llvm::ConstantInt::get(cs, llvm::APInt(32, lineno - 1)); + + auto *encoded = Payload::getIseqEncodedPointer(cs, builder, loc.file()); + auto *intzero = llvm::ConstantInt::get(cs, llvm::APInt(32, 0)); + llvm::Value *indices[] = {intzero, intzero}; builder.CreateCall(cs.getFunction("sorbet_setLineNumber"), - {llvm::ConstantInt::get(cs, llvm::APInt(32, offset)), builder.CreateLoad(iseqEncodedPtr), - builder.CreateLoad(lineNumberPtr)}); + {offset, builder.CreateGEP(encoded, indices), builder.CreateLoad(lineNumberPtr)}); return loc; } diff --git a/compiler/IREmitter/Payload.h b/compiler/IREmitter/Payload.h index c2e97ce0868..75499f3dce5 100644 --- a/compiler/IREmitter/Payload.h +++ b/compiler/IREmitter/Payload.h @@ -62,9 +62,8 @@ class Payload { static llvm::Value *typeTestForBlock(CompilerState &cs, llvm::IRBuilderBase &builder, llvm::Value *val, const core::TypePtr &type); static llvm::Value *boolToRuby(CompilerState &cs, llvm::IRBuilderBase &builder, llvm::Value *u1); - static std::pair setRubyStackFrame(CompilerState &cs, llvm::IRBuilderBase &builder, - const IREmitterContext &irctx, - const ast::MethodDef &md, int rubyBlockId); + static llvm::Value *setRubyStackFrame(CompilerState &cs, llvm::IRBuilderBase &builder, + const IREmitterContext &irctx, const ast::MethodDef &md, int rubyBlockId); static llvm::Value *readKWRestArg(CompilerState &cs, llvm::IRBuilderBase &builder, llvm::Value *maybeHash); static llvm::Value *assertNoExtraKWArg(CompilerState &cs, llvm::IRBuilderBase &builder, llvm::Value *maybeHash); @@ -73,8 +72,7 @@ class Payload { static llvm::Value *readRestArgs(CompilerState &cs, llvm::IRBuilderBase &builder, int maxPositionalArgCount, llvm::Value *argCountRaw, llvm::Value *argArrayRaw); static core::Loc setLineNumber(CompilerState &cs, llvm::IRBuilderBase &builder, core::Loc loc, - core::Loc methodStart, core::Loc lastLoc, llvm::AllocaInst *iseqEncodedPtr, - llvm::AllocaInst *lineNumberPtr); + core::Loc methodStart, core::Loc lastLoc, llvm::AllocaInst *lineNumberPtr); static llvm::Value *varGet(CompilerState &cs, cfg::LocalRef local, llvm::IRBuilderBase &builder, const IREmitterContext &irctx, int rubyBlockId); static void varSet(CompilerState &cs, cfg::LocalRef local, llvm::Value *var, llvm::IRBuilderBase &builder, @@ -100,6 +98,9 @@ class Payload { static llvm::Value *rubyStackFrameVar(CompilerState &cs, llvm::IRBuilderBase &builder, const IREmitterContext &irctx, core::SymbolRef methodSym); + static llvm::Value *getFileLineNumberInfo(CompilerState &gs, llvm::IRBuilderBase &builder, core::FileRef file); + static llvm::Value *getIseqEncodedPointer(CompilerState &gs, llvm::IRBuilderBase &builder, core::FileRef file); + static const VMFlag VM_CALL_ARGS_SIMPLE; static const VMFlag VM_CALL_ARGS_SPLAT; static const VMFlag VM_CALL_KWARG; diff --git a/compiler/IREmitter/Payload/codegen-payload.c b/compiler/IREmitter/Payload/codegen-payload.c index f9dc5fe419e..6526812118c 100644 --- a/compiler/IREmitter/Payload/codegen-payload.c +++ b/compiler/IREmitter/Payload/codegen-payload.c @@ -19,7 +19,7 @@ #define SORBET_INLINE __attribute__((always_inline)) typedef VALUE (*BlockFFIType)(VALUE firstYieldedArg, VALUE closure, int argCount, const VALUE *args, VALUE blockArg); -typedef VALUE (*ExceptionFFIType)(VALUE **pc, VALUE *iseq_encoded, VALUE closure); +typedef VALUE (*ExceptionFFIType)(VALUE **pc, VALUE closure); typedef VALUE (*BlockConsumerFFIType)(VALUE recv, ID fun, int argc, VALUE *argv, BlockFFIType blk, const struct rb_captured_block *captured, VALUE closure); @@ -37,6 +37,12 @@ struct sorbet_iterMethodArg { struct FunctionInlineCache *cache; }; +struct SorbetLineNumberInfo { + int iseq_size; + struct iseq_insn_info_entry *insns_info; + VALUE *iseq_encoded; +}; + // Functions known to the compiler. // // We have to be a little tricky here, as LLVM will eliminate declarations that are unused @@ -58,8 +64,9 @@ SORBET_ALIVE(void, sorbet_raiseExtraKeywords, (VALUE hash) __attribute__((__nore SORBET_ALIVE(VALUE, sorbet_t_absurd, (VALUE val) __attribute__((__cold__))); SORBET_ALIVE(rb_iseq_t *, sorbet_allocateRubyStackFrame, - (VALUE funcName, ID func, VALUE filename, VALUE realpath, rb_iseq_t *parent, int iseqType, int startline, - int endline, ID *locals, int numLocals, int stackMax)); + (VALUE funcName, ID func, VALUE filename, VALUE realpath, rb_iseq_t *parent, int iseqType, + struct SorbetLineNumberInfo *info, ID *locals, int numLocals, int stackMax)); +SORBET_ALIVE(void, sorbet_initLineNumberInfo, (struct SorbetLineNumberInfo * info, VALUE *, int numLines)); SORBET_ALIVE(VALUE, sorbet_getConstant, (const char *path, long pathLen)); SORBET_ALIVE(VALUE, sorbet_setConstant, (VALUE mod, const char *name, long nameLen, VALUE value)); @@ -81,7 +88,7 @@ SORBET_ALIVE(void, sorbet_setMethodStackFrame, SORBET_ALIVE(void, sorbet_setExceptionStackFrame, (rb_execution_context_t * ec, rb_control_frame_t *cfp, const rb_iseq_t *iseq)); -SORBET_ALIVE(VALUE, sorbet_blockReturnUndef, (VALUE * *pc, VALUE *iseq_encoded, VALUE closure)); +SORBET_ALIVE(VALUE, sorbet_blockReturnUndef, (VALUE * *pc, VALUE closure)); SORBET_ALIVE(VALUE, sorbet_vm_expandSplatIntrinsic, (VALUE thing, VALUE before, VALUE after)); SORBET_ALIVE(VALUE, sorbet_vm_check_match_array, (rb_execution_context_t * ec, VALUE target, VALUE pattern)); @@ -1127,14 +1134,9 @@ const VALUE **sorbet_getPc(rb_control_frame_t *cfp) { } SORBET_INLINE -const VALUE *sorbet_getIseqEncoded(rb_control_frame_t *cfp) { - return cfp->iseq->body->iseq_encoded; -} - -SORBET_INLINE -void sorbet_setLineNumber(int offset, VALUE *iseq_encoded, VALUE **storeLocation) { +void sorbet_setLineNumber(int offset, VALUE *encoded, VALUE **storeLocation) { // use pos+1 because PC should point at the next instruction - (*storeLocation) = iseq_encoded + offset + 1; + (*storeLocation) = encoded + offset + 1; } SORBET_INLINE @@ -1517,14 +1519,13 @@ extern void rb_set_errinfo(VALUE); struct ExceptionClosure { ExceptionFFIType body; VALUE **pc; - VALUE *iseq_encoded; VALUE methodClosure; VALUE *returnValue; }; static VALUE sorbet_applyExceptionClosure(VALUE arg) { struct ExceptionClosure *closure = (struct ExceptionClosure *)arg; - VALUE res = closure->body(closure->pc, closure->iseq_encoded, closure->methodClosure); + VALUE res = closure->body(closure->pc, closure->methodClosure); if (res != sorbet_rubyUndef()) { *closure->returnValue = res; } @@ -1541,14 +1542,13 @@ static VALUE sorbet_rescueStoreException(VALUE exceptionValuePtr, VALUE errinfo) } // Run a function with a closure, and populate an exceptionValue pointer if an exception is raised. -VALUE sorbet_try(ExceptionFFIType body, VALUE **pc, VALUE *iseq_encoded, VALUE methodClosure, VALUE exceptionContext, +VALUE sorbet_try(ExceptionFFIType body, VALUE **pc, VALUE methodClosure, VALUE exceptionContext, VALUE *exceptionValue) { VALUE returnValue = sorbet_rubyUndef(); struct ExceptionClosure closure; closure.body = body; closure.pc = pc; - closure.iseq_encoded = iseq_encoded; closure.methodClosure = methodClosure; closure.returnValue = &returnValue; diff --git a/compiler/IREmitter/Payload/vm-payload.c b/compiler/IREmitter/Payload/vm-payload.c index 791d0bb100c..c4bd263dfe6 100644 --- a/compiler/IREmitter/Payload/vm-payload.c +++ b/compiler/IREmitter/Payload/vm-payload.c @@ -38,7 +38,7 @@ void abort(void) __attribute__((__cold__)) __attribute__((__noreturn__)); typedef VALUE (*BlockFFIType)(VALUE firstYieldedArg, VALUE closure, int argCount, const VALUE *args, VALUE blockArg); -typedef VALUE (*ExceptionFFIType)(VALUE **pc, VALUE *iseq_encoded, VALUE closure); +typedef VALUE (*ExceptionFFIType)(VALUE **pc, VALUE closure); // **** // **** Internal Helper Functions @@ -162,13 +162,38 @@ struct iseq_insn_info_entry { void rb_iseq_insns_info_encode_positions(const rb_iseq_t *iseq); /* End from inseq.h */ +struct SorbetLineNumberInfo { + int iseq_size; + struct iseq_insn_info_entry *insns_info; + VALUE *iseq_encoded; +}; + +void sorbet_initLineNumberInfo(struct SorbetLineNumberInfo *info, VALUE *iseq_encoded, int numLines) { + // This is the table that tells us the hash entry for instruction types + const void *const *table = rb_vm_get_insns_address_table(); + VALUE nop = (VALUE)(table[YARVINSN_nop]); + + info->iseq_size = numLines; + info->insns_info = ALLOC_N(struct iseq_insn_info_entry, numLines); + info->iseq_encoded = iseq_encoded; + + for (int i = 0; i < numLines; i++) { + int lineno = i + 1; + info->insns_info[i].line_no = lineno; + + // we fill iseq_encoded with NOP instructions; it only exists because it + // has to match the length of insns_info. + info->iseq_encoded[i] = nop; + } +} + // NOTE: parent is the immediate parent frame, so for the rescue clause of a // top-level method the parent would be the method iseq, but for a rescue clause // nested within a rescue clause, it would be the outer rescue iseq. // // https://github.com/ruby/ruby/blob/a9a48e6a741f048766a2a287592098c4f6c7b7c7/compile.c#L5669-L5671 rb_iseq_t *sorbet_allocateRubyStackFrame(VALUE funcName, ID func, VALUE filename, VALUE realpath, unsigned char *parent, - int iseqType, int startline, int endline, ID *locals, int numLocals, + int iseqType, struct SorbetLineNumberInfo *info, ID *locals, int numLocals, int stackMax) { // DO NOT ALLOCATE RUBY LEVEL OBJECTS HERE. All objects that are passed to // this function should be retained (for GC purposes) by something else. @@ -178,33 +203,20 @@ rb_iseq_t *sorbet_allocateRubyStackFrame(VALUE funcName, ID func, VALUE filename rb_iseq_t *iseq = rb_iseq_new(0, funcName, filename, realpath, (rb_iseq_t *)parent, iseqType); rb_gc_register_mark_object((VALUE)iseq); - // This is the table that tells us the hash entry for instruction types - const void *const *table = rb_vm_get_insns_address_table(); - VALUE nop = (VALUE)table[YARVINSN_nop]; - - // Even if start and end are on the same line, we still want one insns_info made - int insn_num = endline - startline + 1; - struct iseq_insn_info_entry *insns_info = ALLOC_N(struct iseq_insn_info_entry, insn_num); - unsigned int *positions = ALLOC_N(unsigned int, insn_num); - VALUE *iseq_encoded = ALLOC_N(VALUE, insn_num); - for (int i = 0; i < insn_num; i++) { - int lineno = i + startline; - positions[i] = i; - insns_info[i].line_no = lineno; + // NOTE: positions is freed by rb_iseq_insns_info_encode_positions + unsigned int *positions = ALLOC_N(unsigned int, info->iseq_size); - // we fill iseq_encoded with NOP instructions; it only exists because it - // has to match the length of insns_info. - iseq_encoded[i] = nop; + for (int i = 0; i < info->iseq_size; i++) { + positions[i] = i; } - iseq->body->insns_info.body = insns_info; + + iseq->body->insns_info.body = info->insns_info; iseq->body->insns_info.positions = positions; - // One iseq per line - iseq->body->iseq_size = insn_num; - iseq->body->insns_info.size = insn_num; + iseq->body->iseq_size = info->iseq_size; + iseq->body->insns_info.size = info->iseq_size; rb_iseq_insns_info_encode_positions(iseq); - // One NOP per line, to match insns_info - iseq->body->iseq_encoded = iseq_encoded; + iseq->body->iseq_encoded = info->iseq_encoded; // if this is a rescue frame, we need to set up some local storage for // exception values ($!). @@ -315,6 +327,6 @@ VALUE sorbet_stringInterpolate(VALUE recv, ID fun, int argc, VALUE *argv, BlockF // **** // This is a function that can be used in place of any exception function, and does nothing except for return nil. -VALUE sorbet_blockReturnUndef(VALUE **pc, VALUE *iseq_encoded, VALUE closure) { +VALUE sorbet_blockReturnUndef(VALUE **pc, VALUE closure) { return RUBY_Qundef; } diff --git a/test/testdata/compiler/abstract_static_methods.llo.exp b/test/testdata/compiler/abstract_static_methods.llo.exp index 389d72650c6..7229d5b1721 100644 --- a/test/testdata/compiler/abstract_static_methods.llo.exp +++ b/test/testdata/compiler/abstract_static_methods.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -93,6 +95,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/abstract_static_methods.rb" = private unnamed_addr constant [50 x i8] c"test/testdata/compiler/abstract_static_methods.rb\00", align 1 +@iseqEncodedArray = internal global [23 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_IFoo = private unnamed_addr constant [5 x i8] c"IFoo\00", align 1 @str_Foo = private unnamed_addr constant [4 x i8] c"Foo\00", align 1 @ic_foo = internal global %struct.FunctionInlineCache zeroinitializer @@ -158,7 +162,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -257,9 +263,11 @@ entry: %13 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([50 x i8], [50 x i8]* @"str_test/testdata/compiler/abstract_static_methods.rb", i64 0, i64 0), i64 noundef 49) #13 tail call void @rb_gc_register_mark_object(i64 %13) #13 store i64 %13, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 23) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %13, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 22, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !8 @@ -270,14 +278,14 @@ entry: store i64 %15, i64* @rubyStrFrozen_foo, align 8 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i26.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 11, i32 noundef 11, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 1) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 1) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @stackFramePrecomputed_func_IFoo.foo, align 8 %17 = call i64 @sorbet_getConstant(i8* noundef getelementptr inbounds ([30 x i8], [30 x i8]* @sorbet_getVoidSingleton.name, i64 0, i64 0), i64 noundef 30) #13 store i64 %17, i64* @"", align 8 %"rubyId_.i28.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i29.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i30.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i29.i", i64 %"rubyId_.i28.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i31.i, i32 noundef 0, i32 noundef 4) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i29.i", i64 %"rubyId_.i28.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i31.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.", align 8 %19 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #13 call void @rb_gc_register_mark_object(i64 %19) #13 @@ -285,7 +293,7 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i32.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 - %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i32.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i32.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %20, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.$block_1", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !14 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !14 @@ -304,7 +312,7 @@ entry: %rubyId_foo.i33.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %rubyStr_foo.i34.i = load i64, i64* @rubyStrFrozen_foo, align 8 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i35.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 - %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i34.i, i64 %rubyId_foo.i33.i, i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i35.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 17, i32 noundef 19, i64* noundef nonnull %locals.i36.i, i32 noundef 0, i32 noundef 2) + %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i34.i, i64 %rubyId_foo.i33.i, i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i35.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i36.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %21, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Foo.foo, align 8 %22 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_Override!", i64 0, i64 0), i64 noundef 9) #13 call void @rb_gc_register_mark_object(i64 %22) #13 @@ -314,12 +322,12 @@ entry: %"rubyId_.i37.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i38.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i39.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 - %23 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i38.i", i64 %"rubyId_.i37.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i39.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 14, i32 noundef 14, i64* noundef nonnull %locals.i40.i, i32 noundef 0, i32 noundef 4) + %23 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i38.i", i64 %"rubyId_.i37.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i39.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i40.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %23, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 %"rubyId_block for.i42.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i43.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i44.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/abstract_static_methods.rb", align 8 - %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i43.i", i64 %"rubyId_block for.i42.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i44.i", i64 %realpath, %struct.rb_iseq_struct* %23, i32 noundef 2, i32 noundef 14, i32 noundef 14, i64* noundef null, i32 noundef 0, i32 noundef 4) + %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i43.i", i64 %"rubyId_block for.i42.i", i64 %"rubyStr_test/testdata/compiler/abstract_static_methods.rb.i44.i", i64 %realpath, %struct.rb_iseq_struct* %23, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %24, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.$block_1", align 8 %rubyId_sig17.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !24 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.3, i64 %rubyId_sig17.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 @@ -345,275 +353,237 @@ entry: store i64 %35, i64* %33, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %28, %struct.rb_control_frame_struct* align 8 %30, %struct.rb_iseq_struct* %stackFrame.i) #13 %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 0 - %37 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %31, align 8, !tbaa !44 - %38 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %37, i64 0, i32 2 - %39 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %38, align 8, !tbaa !47 - %40 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %39, i64 0, i32 2 - %41 = load i64*, i64** %40, align 8, !tbaa !49 - %42 = getelementptr inbounds i64, i64* %41, i64 4 - %43 = getelementptr inbounds i64, i64* %42, i64 1 - store i64* %43, i64** %36, align 8, !dbg !58, !tbaa !29 - %44 = load i64, i64* @rb_cObject, align 8, !dbg !59 - %45 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_IFoo, i64 0, i64 0), i64 %44) #13, !dbg !59 - call void @sorbet_pushStaticInitFrame(i64 %45) #13, !dbg !59 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %36, align 8, !dbg !47, !tbaa !29 + %37 = load i64, i64* @rb_cObject, align 8, !dbg !48 + %38 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_IFoo, i64 0, i64 0), i64 %37) #13, !dbg !48 + call void @sorbet_pushStaticInitFrame(i64 %38) #13, !dbg !48 %stackFrame.i1.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.", align 8 - %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !29 - %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2 - %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !tbaa !41 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %49, align 8, !tbaa !44 - %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 4 - %51 = load i64*, i64** %50, align 8, !tbaa !46 - %52 = load i64, i64* %51, align 8, !tbaa !4 - %53 = and i64 %52, -33 - store i64 %53, i64* %51, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %46, %struct.rb_control_frame_struct* align 8 %48, %struct.rb_iseq_struct* %stackFrame.i1.i) #13 - %54 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 0 - %55 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %49, align 8, !tbaa !44 - %56 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %55, i64 0, i32 2 - %57 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %56, align 8, !tbaa !47 - %58 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %57, i64 0, i32 2 - %59 = load i64*, i64** %58, align 8, !tbaa !49 - %60 = getelementptr inbounds i64, i64* %59, i64 1 - %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !60 - store i64* %61, i64** %54, align 8, !dbg !60, !tbaa !29 - %62 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !62 - %63 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !62, !tbaa !63 - %needTakeSlowPath = icmp ne i64 %62, %63, !dbg !62 - br i1 %needTakeSlowPath, label %64, label %65, !dbg !62, !prof !64 - -64: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !62 - br label %65, !dbg !62 - -65: ; preds = %entry, %64 - %66 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !62 - %67 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !62 - %68 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !62, !tbaa !63 - %guardUpdated = icmp eq i64 %67, %68, !dbg !62 - call void @llvm.assume(i1 %guardUpdated), !dbg !62 - %69 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !62, !tbaa !29 - %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2, !dbg !62 - %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !dbg !62, !tbaa !41 - %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 1, !dbg !62 - %73 = load i64*, i64** %72, align 8, !dbg !62, !tbaa !65 - %74 = getelementptr inbounds i64, i64* %73, i64 1, !dbg !62 - store i64 %45, i64* %73, align 8, !dbg !62, !tbaa !4 - %75 = getelementptr inbounds i64, i64* %74, i64 1, !dbg !62 - store i64* %75, i64** %72, align 8, !dbg !62, !tbaa !65 - store i64 %66, i64* %74, align 8, !dbg !62, !tbaa !4 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #13, !dbg !62 - %76 = getelementptr inbounds i64, i64* %59, i64 2, !dbg !62 - %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !62 - store i64* %77, i64** %54, align 8, !dbg !62, !tbaa !29 - %78 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !66 - %79 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !66, !tbaa !63 - %needTakeSlowPath3 = icmp ne i64 %78, %79, !dbg !66 - br i1 %needTakeSlowPath3, label %80, label %81, !dbg !66, !prof !64 - -80: ; preds = %65 - call void @"const_recompute_T::Helpers"(), !dbg !66 - br label %81, !dbg !66 - -81: ; preds = %65, %80 - %82 = load i64, i64* @"guarded_const_T::Helpers", align 8, !dbg !66 - %83 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !66 - %84 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !66, !tbaa !63 - %guardUpdated4 = icmp eq i64 %83, %84, !dbg !66 - call void @llvm.assume(i1 %guardUpdated4), !dbg !66 - %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !66, !tbaa !29 - %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2, !dbg !66 - %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !dbg !66, !tbaa !41 - %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 1, !dbg !66 - %89 = load i64*, i64** %88, align 8, !dbg !66, !tbaa !65 - %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !66 - store i64 %45, i64* %89, align 8, !dbg !66, !tbaa !4 - %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !66 - store i64* %91, i64** %88, align 8, !dbg !66, !tbaa !65 - store i64 %82, i64* %90, align 8, !dbg !66, !tbaa !4 - %send42.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend.1, i64 0) #13, !dbg !66 - %92 = getelementptr inbounds i64, i64* %59, i64 3, !dbg !66 - %93 = getelementptr inbounds i64, i64* %92, i64 1, !dbg !66 - store i64* %93, i64** %54, align 8, !dbg !66, !tbaa !29 - %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !67, !tbaa !29 - %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2, !dbg !67 - %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !dbg !67, !tbaa !41 - %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 1, !dbg !67 - %98 = load i64*, i64** %97, align 8, !dbg !67, !tbaa !65 - %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !67 - store i64* %99, i64** %97, align 8, !dbg !67, !tbaa !65 - store i64 %45, i64* %98, align 8, !dbg !67, !tbaa !4 - %send47.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_abstract!", i64 0) #13, !dbg !67 - %100 = getelementptr inbounds i64, i64* %59, i64 6, !dbg !67 - %101 = getelementptr inbounds i64, i64* %100, i64 1, !dbg !67 - store i64* %101, i64** %54, align 8, !dbg !67, !tbaa !29 - %rubyId_foo.i2.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !68 - %rawSym.i3.i = call i64 @rb_id2sym(i64 %rubyId_foo.i2.i) #13, !dbg !68 - %rubyId_normal.i4.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !68 - %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i4.i) #13, !dbg !68 - %102 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !68 - %103 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !68, !tbaa !63 - %needTakeSlowPath5 = icmp ne i64 %102, %103, !dbg !68 - br i1 %needTakeSlowPath5, label %104, label %105, !dbg !68, !prof !64 - -104: ; preds = %81 - call void @const_recompute_IFoo(), !dbg !68 - br label %105, !dbg !68 - -105: ; preds = %81, %104 - %106 = load i64, i64* @guarded_const_IFoo, align 8, !dbg !68 - %107 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !68 - %108 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !68, !tbaa !63 - %guardUpdated6 = icmp eq i64 %107, %108, !dbg !68 - call void @llvm.assume(i1 %guardUpdated6), !dbg !68 - %stackFrame50.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_IFoo.foo, align 8, !dbg !68 - %109 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !68 - %110 = bitcast i8* %109 to i16*, !dbg !68 - %111 = load i16, i16* %110, align 8, !dbg !68 - %112 = and i16 %111, -384, !dbg !68 - store i16 %112, i16* %110, align 8, !dbg !68 - %113 = getelementptr inbounds i8, i8* %109, i64 4, !dbg !68 - %114 = bitcast %struct.rb_iseq_struct* %stackFrame50.i.i to i8*, !dbg !68 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %113, i8 0, i64 28, i1 false) #13, !dbg !68 - call void @rb_define_singleton_sorbet_method(i64 %106, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_IFoo.foo, i8* nonnull %109, i8* %114) #13, !dbg !68 - call void @sorbet_popRubyStack() #13, !dbg !59 - %115 = getelementptr inbounds i64, i64* %41, i64 13, !dbg !59 - %116 = getelementptr inbounds i64, i64* %115, i64 1, !dbg !59 - store i64* %116, i64** %36, align 8, !dbg !59, !tbaa !29 - %117 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 %106) #13, !dbg !69 - call void @sorbet_pushStaticInitFrame(i64 %117) #13, !dbg !69 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !29 + %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !tbaa !41 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %42, align 8, !tbaa !44 + %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 4 + %44 = load i64*, i64** %43, align 8, !tbaa !46 + %45 = load i64, i64* %44, align 8, !tbaa !4 + %46 = and i64 %45, -33 + store i64 %46, i64* %44, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %39, %struct.rb_control_frame_struct* align 8 %41, %struct.rb_iseq_struct* %stackFrame.i1.i) #13 + %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 0 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %47, align 8, !dbg !49, !tbaa !29 + %48 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !51 + %49 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !51, !tbaa !52 + %needTakeSlowPath = icmp ne i64 %48, %49, !dbg !51 + br i1 %needTakeSlowPath, label %50, label %51, !dbg !51, !prof !53 + +50: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !51 + br label %51, !dbg !51 + +51: ; preds = %entry, %50 + %52 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !51 + %53 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !51 + %54 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !51, !tbaa !52 + %guardUpdated = icmp eq i64 %53, %54, !dbg !51 + call void @llvm.assume(i1 %guardUpdated), !dbg !51 + %55 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !51, !tbaa !29 + %56 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %55, i64 0, i32 2, !dbg !51 + %57 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %56, align 8, !dbg !51, !tbaa !41 + %58 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 1, !dbg !51 + %59 = load i64*, i64** %58, align 8, !dbg !51, !tbaa !54 + %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !51 + store i64 %38, i64* %59, align 8, !dbg !51, !tbaa !4 + %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !51 + store i64* %61, i64** %58, align 8, !dbg !51, !tbaa !54 + store i64 %52, i64* %60, align 8, !dbg !51, !tbaa !4 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #13, !dbg !51 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %47, align 8, !dbg !51, !tbaa !29 + %62 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !55 + %63 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !55, !tbaa !52 + %needTakeSlowPath3 = icmp ne i64 %62, %63, !dbg !55 + br i1 %needTakeSlowPath3, label %64, label %65, !dbg !55, !prof !53 + +64: ; preds = %51 + call void @"const_recompute_T::Helpers"(), !dbg !55 + br label %65, !dbg !55 + +65: ; preds = %51, %64 + %66 = load i64, i64* @"guarded_const_T::Helpers", align 8, !dbg !55 + %67 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !55 + %68 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !55, !tbaa !52 + %guardUpdated4 = icmp eq i64 %67, %68, !dbg !55 + call void @llvm.assume(i1 %guardUpdated4), !dbg !55 + %69 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !55, !tbaa !29 + %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2, !dbg !55 + %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !dbg !55, !tbaa !41 + %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 1, !dbg !55 + %73 = load i64*, i64** %72, align 8, !dbg !55, !tbaa !54 + %74 = getelementptr inbounds i64, i64* %73, i64 1, !dbg !55 + store i64 %38, i64* %73, align 8, !dbg !55, !tbaa !4 + %75 = getelementptr inbounds i64, i64* %74, i64 1, !dbg !55 + store i64* %75, i64** %72, align 8, !dbg !55, !tbaa !54 + store i64 %66, i64* %74, align 8, !dbg !55, !tbaa !4 + %send42.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend.1, i64 0) #13, !dbg !55 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %47, align 8, !dbg !55, !tbaa !29 + %76 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !56, !tbaa !29 + %77 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %76, i64 0, i32 2, !dbg !56 + %78 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %77, align 8, !dbg !56, !tbaa !41 + %79 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %78, i64 0, i32 1, !dbg !56 + %80 = load i64*, i64** %79, align 8, !dbg !56, !tbaa !54 + %81 = getelementptr inbounds i64, i64* %80, i64 1, !dbg !56 + store i64* %81, i64** %79, align 8, !dbg !56, !tbaa !54 + store i64 %38, i64* %80, align 8, !dbg !56, !tbaa !4 + %send47.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_abstract!", i64 0) #13, !dbg !56 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %47, align 8, !dbg !56, !tbaa !29 + %rubyId_foo.i2.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !57 + %rawSym.i3.i = call i64 @rb_id2sym(i64 %rubyId_foo.i2.i) #13, !dbg !57 + %rubyId_normal.i4.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !57 + %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i4.i) #13, !dbg !57 + %82 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !57 + %83 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !57, !tbaa !52 + %needTakeSlowPath5 = icmp ne i64 %82, %83, !dbg !57 + br i1 %needTakeSlowPath5, label %84, label %85, !dbg !57, !prof !53 + +84: ; preds = %65 + call void @const_recompute_IFoo(), !dbg !57 + br label %85, !dbg !57 + +85: ; preds = %65, %84 + %86 = load i64, i64* @guarded_const_IFoo, align 8, !dbg !57 + %87 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !57 + %88 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !57, !tbaa !52 + %guardUpdated6 = icmp eq i64 %87, %88, !dbg !57 + call void @llvm.assume(i1 %guardUpdated6), !dbg !57 + %stackFrame50.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_IFoo.foo, align 8, !dbg !57 + %89 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !57 + %90 = bitcast i8* %89 to i16*, !dbg !57 + %91 = load i16, i16* %90, align 8, !dbg !57 + %92 = and i16 %91, -384, !dbg !57 + store i16 %92, i16* %90, align 8, !dbg !57 + %93 = getelementptr inbounds i8, i8* %89, i64 4, !dbg !57 + %94 = bitcast %struct.rb_iseq_struct* %stackFrame50.i.i to i8*, !dbg !57 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %93, i8 0, i64 28, i1 false) #13, !dbg !57 + call void @rb_define_singleton_sorbet_method(i64 %86, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_IFoo.foo, i8* nonnull %89, i8* %94) #13, !dbg !57 + call void @sorbet_popRubyStack() #13, !dbg !48 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %36, align 8, !dbg !48, !tbaa !29 + %95 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 %86) #13, !dbg !58 + call void @sorbet_pushStaticInitFrame(i64 %95) #13, !dbg !58 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 - %118 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !29 - %119 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %118, i64 0, i32 2 - %120 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %119, align 8, !tbaa !41 - %121 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %121, align 8, !tbaa !44 - %122 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 4 - %123 = load i64*, i64** %122, align 8, !tbaa !46 - %124 = load i64, i64* %123, align 8, !tbaa !4 - %125 = and i64 %124, -33 - store i64 %125, i64* %123, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %118, %struct.rb_control_frame_struct* align 8 %120, %struct.rb_iseq_struct* %stackFrame.i.i1) #13 - %126 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 0 - %127 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %121, align 8, !tbaa !44 - %128 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %127, i64 0, i32 2 - %129 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %128, align 8, !tbaa !47 - %130 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %129, i64 0, i32 2 - %131 = load i64*, i64** %130, align 8, !tbaa !49 - %132 = getelementptr inbounds i64, i64* %131, i64 3, !dbg !70 - %133 = getelementptr inbounds i64, i64* %132, i64 1, !dbg !70 - store i64* %133, i64** %126, align 8, !dbg !70, !tbaa !29 - %rubyId_foo.i.i2 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !72 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i2) #13, !dbg !72 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !72 - %rawSym20.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !72 - %134 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !72 - %135 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !72, !tbaa !63 - %needTakeSlowPath7 = icmp ne i64 %134, %135, !dbg !72 - br i1 %needTakeSlowPath7, label %136, label %137, !dbg !72, !prof !64 - -136: ; preds = %105 - call void @const_recompute_Foo(), !dbg !72 - br label %137, !dbg !72 - -137: ; preds = %105, %136 - %138 = load i64, i64* @guarded_const_Foo, align 8, !dbg !72 - %139 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !72 - %140 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !72, !tbaa !63 - %guardUpdated8 = icmp eq i64 %139, %140, !dbg !72 - call void @llvm.assume(i1 %guardUpdated8), !dbg !72 - %stackFrame22.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Foo.foo, align 8, !dbg !72 - %141 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !72 - %142 = bitcast i8* %141 to i16*, !dbg !72 - %143 = load i16, i16* %142, align 8, !dbg !72 - %144 = and i16 %143, -384, !dbg !72 - store i16 %144, i16* %142, align 8, !dbg !72 - %145 = getelementptr inbounds i8, i8* %141, i64 4, !dbg !72 - %146 = bitcast %struct.rb_iseq_struct* %stackFrame22.i.i to i8*, !dbg !72 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %145, i8 0, i64 28, i1 false) #13, !dbg !72 - call void @rb_define_singleton_sorbet_method(i64 %138, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Foo.foo, i8* nonnull %141, i8* %146) #13, !dbg !72 - call void @sorbet_popRubyStack() #13, !dbg !69 - %147 = getelementptr inbounds i64, i64* %41, i64 21, !dbg !69 - %148 = getelementptr inbounds i64, i64* %147, i64 1, !dbg !69 - store i64* %148, i64** %36, align 8, !dbg !69, !tbaa !29 - %149 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !29 - %150 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %149, i64 0, i32 2, !dbg !8 - %151 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %150, align 8, !dbg !8, !tbaa !41 - %152 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %151, i64 0, i32 1, !dbg !8 - %153 = load i64*, i64** %152, align 8, !dbg !8, !tbaa !65 - %154 = getelementptr inbounds i64, i64* %153, i64 1, !dbg !8 - store i64* %154, i64** %152, align 8, !dbg !8, !tbaa !65 - store i64 %138, i64* %153, align 8, !dbg !8, !tbaa !4 + %96 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !29 + %97 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %96, i64 0, i32 2 + %98 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %97, align 8, !tbaa !41 + %99 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %98, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %99, align 8, !tbaa !44 + %100 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %98, i64 0, i32 4 + %101 = load i64*, i64** %100, align 8, !tbaa !46 + %102 = load i64, i64* %101, align 8, !tbaa !4 + %103 = and i64 %102, -33 + store i64 %103, i64* %101, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %96, %struct.rb_control_frame_struct* align 8 %98, %struct.rb_iseq_struct* %stackFrame.i.i1) #13 + %104 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %98, i64 0, i32 0 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %104, align 8, !dbg !59, !tbaa !29 + %rubyId_foo.i.i2 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !61 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i2) #13, !dbg !61 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !61 + %rawSym20.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !61 + %105 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !61 + %106 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !61, !tbaa !52 + %needTakeSlowPath7 = icmp ne i64 %105, %106, !dbg !61 + br i1 %needTakeSlowPath7, label %107, label %108, !dbg !61, !prof !53 + +107: ; preds = %85 + call void @const_recompute_Foo(), !dbg !61 + br label %108, !dbg !61 + +108: ; preds = %85, %107 + %109 = load i64, i64* @guarded_const_Foo, align 8, !dbg !61 + %110 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !61 + %111 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !61, !tbaa !52 + %guardUpdated8 = icmp eq i64 %110, %111, !dbg !61 + call void @llvm.assume(i1 %guardUpdated8), !dbg !61 + %stackFrame22.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Foo.foo, align 8, !dbg !61 + %112 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !61 + %113 = bitcast i8* %112 to i16*, !dbg !61 + %114 = load i16, i16* %113, align 8, !dbg !61 + %115 = and i16 %114, -384, !dbg !61 + store i16 %115, i16* %113, align 8, !dbg !61 + %116 = getelementptr inbounds i8, i8* %112, i64 4, !dbg !61 + %117 = bitcast %struct.rb_iseq_struct* %stackFrame22.i.i to i8*, !dbg !61 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %116, i8 0, i64 28, i1 false) #13, !dbg !61 + call void @rb_define_singleton_sorbet_method(i64 %109, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Foo.foo, i8* nonnull %112, i8* %117) #13, !dbg !61 + call void @sorbet_popRubyStack() #13, !dbg !58 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 22), i64** %36, align 8, !dbg !58, !tbaa !29 + %118 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !29 + %119 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %118, i64 0, i32 2, !dbg !8 + %120 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %119, align 8, !dbg !8, !tbaa !41 + %121 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 1, !dbg !8 + %122 = load i64*, i64** %121, align 8, !dbg !8, !tbaa !54 + %123 = getelementptr inbounds i64, i64* %122, i64 1, !dbg !8 + store i64* %123, i64** %121, align 8, !dbg !8, !tbaa !54 + store i64 %109, i64* %122, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #13, !dbg !8 - %155 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !29 - %156 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %155, i64 0, i32 2, !dbg !13 - %157 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %156, align 8, !dbg !13, !tbaa !41 - %158 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %157, i64 0, i32 1, !dbg !13 - %159 = load i64*, i64** %158, align 8, !dbg !13, !tbaa !65 - %160 = getelementptr inbounds i64, i64* %159, i64 1, !dbg !13 - store i64 %27, i64* %159, align 8, !dbg !13, !tbaa !4 - %161 = getelementptr inbounds i64, i64* %160, i64 1, !dbg !13 - store i64* %161, i64** %158, align 8, !dbg !13, !tbaa !65 - store i64 %send.i, i64* %160, align 8, !dbg !13, !tbaa !4 + %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !29 + %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !13 + %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !13, !tbaa !41 + %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 1, !dbg !13 + %128 = load i64*, i64** %127, align 8, !dbg !13, !tbaa !54 + %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !13 + store i64 %27, i64* %128, align 8, !dbg !13, !tbaa !4 + %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !13 + store i64* %130, i64** %127, align 8, !dbg !13, !tbaa !54 + store i64 %send.i, i64* %129, align 8, !dbg !13, !tbaa !4 %send29.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p, i64 0) #13, !dbg !13 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @func_IFoo.foo(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !73 { +define i64 @func_IFoo.foo(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !62 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !29 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !41 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !44 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !47 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !49 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !29 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !74 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !74, !prof !75 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %3, align 8, !tbaa !29 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !63 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !63, !prof !64 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !74 - unreachable, !dbg !74 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !63 + unreachable, !dbg !63 fillRequiredArgs: ; preds = %functionEntryInitializers - tail call void @llvm.experimental.noalias.scope.decl(metadata !76), !dbg !74 - %11 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !74, !tbaa !29, !noalias !76 - %12 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %11, i64 0, i32 2, !dbg !74 - %13 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %12, align 8, !dbg !74, !tbaa !41, !noalias !76 - %14 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %13, i64 0, i32 3, !dbg !74 - %15 = load i64, i64* %14, align 8, !dbg !74, !tbaa !79, !noalias !76 - %16 = tail call %struct.rb_callable_method_entry_struct* @rb_vm_frame_method_entry(%struct.rb_control_frame_struct* %13) #13, !dbg !74, !noalias !76 - %17 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %16, i64 0, i32 1, !dbg !74 - %18 = load i64, i64* %17, align 8, !dbg !74, !tbaa !80, !noalias !76 - %19 = inttoptr i64 %18 to %struct.RClass*, !dbg !74 - %20 = getelementptr inbounds %struct.RClass, %struct.RClass* %19, i64 0, i32 2, !dbg !74 - %21 = load %struct.rb_classext_struct*, %struct.rb_classext_struct** %20, align 8, !dbg !74, !tbaa !82, !noalias !76 - %22 = getelementptr inbounds %struct.rb_classext_struct, %struct.rb_classext_struct* %21, i64 0, i32 8, !dbg !74 - %23 = load i64, i64* %22, align 8, !dbg !74, !tbaa !85, !noalias !76 - %24 = inttoptr i64 %23 to %struct.RClass*, !dbg !74 - %25 = getelementptr inbounds %struct.RClass, %struct.RClass* %24, i64 0, i32 1, !dbg !74 - %26 = load i64, i64* %25, align 8, !dbg !74, !tbaa !87, !noalias !76 - %27 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %16, i64 0, i32 2, !dbg !74 - %28 = load %struct.rb_method_definition_struct*, %struct.rb_method_definition_struct** %27, align 8, !dbg !74, !tbaa !88, !noalias !76 - %29 = getelementptr inbounds %struct.rb_method_definition_struct, %struct.rb_method_definition_struct* %28, i64 0, i32 2, !dbg !74 - %30 = load i64, i64* %29, align 8, !dbg !74, !tbaa !89, !noalias !76 - %31 = tail call %struct.rb_callable_method_entry_struct* @rb_callable_method_entry(i64 %26, i64 %30) #13, !dbg !74, !noalias !76 - %32 = icmp eq %struct.rb_callable_method_entry_struct* %31, null, !dbg !74 - br i1 %32, label %33, label %sorbet_callSuper.exit, !dbg !74 - -33: ; preds = %fillRequiredArgs - %34 = load i64, i64* @rb_eRuntimeError, align 8, !dbg !74, !tbaa !4 - tail call void (i64, i8*, ...) @rb_raise(i64 %34, i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @.str.6, i64 0, i64 0)) #12, !dbg !74 - unreachable, !dbg !74 + tail call void @llvm.experimental.noalias.scope.decl(metadata !65), !dbg !63 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !29, !noalias !65 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !63 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !63, !tbaa !41, !noalias !65 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 3, !dbg !63 + %8 = load i64, i64* %7, align 8, !dbg !63, !tbaa !68, !noalias !65 + %9 = tail call %struct.rb_callable_method_entry_struct* @rb_vm_frame_method_entry(%struct.rb_control_frame_struct* %6) #13, !dbg !63, !noalias !65 + %10 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %9, i64 0, i32 1, !dbg !63 + %11 = load i64, i64* %10, align 8, !dbg !63, !tbaa !69, !noalias !65 + %12 = inttoptr i64 %11 to %struct.RClass*, !dbg !63 + %13 = getelementptr inbounds %struct.RClass, %struct.RClass* %12, i64 0, i32 2, !dbg !63 + %14 = load %struct.rb_classext_struct*, %struct.rb_classext_struct** %13, align 8, !dbg !63, !tbaa !71, !noalias !65 + %15 = getelementptr inbounds %struct.rb_classext_struct, %struct.rb_classext_struct* %14, i64 0, i32 8, !dbg !63 + %16 = load i64, i64* %15, align 8, !dbg !63, !tbaa !74, !noalias !65 + %17 = inttoptr i64 %16 to %struct.RClass*, !dbg !63 + %18 = getelementptr inbounds %struct.RClass, %struct.RClass* %17, i64 0, i32 1, !dbg !63 + %19 = load i64, i64* %18, align 8, !dbg !63, !tbaa !76, !noalias !65 + %20 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %9, i64 0, i32 2, !dbg !63 + %21 = load %struct.rb_method_definition_struct*, %struct.rb_method_definition_struct** %20, align 8, !dbg !63, !tbaa !77, !noalias !65 + %22 = getelementptr inbounds %struct.rb_method_definition_struct, %struct.rb_method_definition_struct* %21, i64 0, i32 2, !dbg !63 + %23 = load i64, i64* %22, align 8, !dbg !63, !tbaa !78, !noalias !65 + %24 = tail call %struct.rb_callable_method_entry_struct* @rb_callable_method_entry(i64 %19, i64 %23) #13, !dbg !63, !noalias !65 + %25 = icmp eq %struct.rb_callable_method_entry_struct* %24, null, !dbg !63 + br i1 %25, label %26, label %sorbet_callSuper.exit, !dbg !63 + +26: ; preds = %fillRequiredArgs + %27 = load i64, i64* @rb_eRuntimeError, align 8, !dbg !63, !tbaa !4 + tail call void (i64, i8*, ...) @rb_raise(i64 %27, i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @.str.6, i64 0, i64 0)) #12, !dbg !63 + unreachable, !dbg !63 sorbet_callSuper.exit: ; preds = %fillRequiredArgs - %35 = tail call i64 @rb_vm_call_kw(%struct.rb_execution_context_struct* nonnull %11, i64 %15, i64 %30, i32 noundef 0, i64* noundef null, %struct.rb_callable_method_entry_struct* nonnull %31, i32 noundef 0) #13, !dbg !74 + %28 = tail call i64 @rb_vm_call_kw(%struct.rb_execution_context_struct* nonnull %4, i64 %8, i64 %23, i32 noundef 0, i64* noundef null, %struct.rb_callable_method_entry_struct* nonnull %24, i32 noundef 0) #13, !dbg !63 %"" = load i64, i64* @"", align 8 ret i64 %"" } @@ -625,36 +595,28 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !41 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !44 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !47 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !49 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !29 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !91 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !91, !prof !75 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %3, align 8, !tbaa !29 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !80 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !80, !prof !64 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !91 - unreachable, !dbg !91 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !80 + unreachable, !dbg !80 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !92 - store i64* %11, i64** %3, align 8, !dbg !92, !tbaa !29 - %"rubyStr_Override!" = load i64, i64* @"rubyStrFrozen_Override!", align 8, !dbg !93 - %12 = load i64, i64* @rb_mKernel, align 8, !dbg !22 - %13 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !29 - %14 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %13, i64 0, i32 2, !dbg !22 - %15 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %14, align 8, !dbg !22, !tbaa !41 - %16 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %15, i64 0, i32 1, !dbg !22 - %17 = load i64*, i64** %16, align 8, !dbg !22, !tbaa !65 - %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !22 - store i64 %12, i64* %17, align 8, !dbg !22, !tbaa !4 - %19 = getelementptr inbounds i64, i64* %18, i64 1, !dbg !22 - store i64* %19, i64** %16, align 8, !dbg !22, !tbaa !65 - store i64 %"rubyStr_Override!", i64* %18, align 8, !dbg !22, !tbaa !4 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %3, align 8, !dbg !81, !tbaa !29 + %"rubyStr_Override!" = load i64, i64* @"rubyStrFrozen_Override!", align 8, !dbg !82 + %4 = load i64, i64* @rb_mKernel, align 8, !dbg !22 + %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !29 + %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 2, !dbg !22 + %7 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %6, align 8, !dbg !22, !tbaa !41 + %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %7, i64 0, i32 1, !dbg !22 + %9 = load i64*, i64** %8, align 8, !dbg !22, !tbaa !54 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !22 + store i64 %4, i64* %9, align 8, !dbg !22, !tbaa !4 + %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !22 + store i64* %11, i64** %8, align 8, !dbg !22, !tbaa !54 + store i64 %"rubyStr_Override!", i64* %10, align 8, !dbg !22, !tbaa !4 %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.2, i64 0), !dbg !22 %"" = load i64, i64* @"", align 8 ret i64 %"" @@ -673,7 +635,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !63 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !52 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -682,7 +644,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #10 { define linkonce void @"const_recompute_T::Helpers"() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"str_T::Helpers", i64 0, i64 0), i64 10) store i64 %1, i64* @"guarded_const_T::Helpers", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !63 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !52 store i64 %2, i64* @"guard_epoch_T::Helpers", align 8 ret void } @@ -691,7 +653,7 @@ define linkonce void @"const_recompute_T::Helpers"() local_unnamed_addr #10 { define linkonce void @const_recompute_IFoo() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @str_IFoo, i64 0, i64 0), i64 4) store i64 %1, i64* @guarded_const_IFoo, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !63 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !52 store i64 %2, i64* @guard_epoch_IFoo, align 8 ret void } @@ -700,7 +662,7 @@ define linkonce void @const_recompute_IFoo() local_unnamed_addr #10 { define linkonce void @const_recompute_Foo() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 3) store i64 %1, i64* @guarded_const_Foo, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !63 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !52 store i64 %2, i64* @guard_epoch_Foo, align 8 ret void } @@ -770,50 +732,39 @@ attributes #13 = { nounwind } !44 = !{!45, !30, i64 16} !45 = !{!"rb_control_frame_struct", !30, i64 0, !30, i64 8, !30, i64 16, !5, i64 24, !30, i64 32, !30, i64 40, !30, i64 48} !46 = !{!45, !30, i64 32} -!47 = !{!48, !30, i64 16} -!48 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !30, i64 16, !6, i64 24} -!49 = !{!50, !30, i64 8} -!50 = !{!"rb_iseq_constant_body", !6, i64 0, !36, i64 4, !30, i64 8, !51, i64 16, !53, i64 64, !56, i64 120, !30, i64 152, !30, i64 160, !30, i64 168, !30, i64 176, !30, i64 184, !30, i64 192, !57, i64 200, !36, i64 232, !36, i64 236, !36, i64 240, !36, i64 244, !36, i64 248, !6, i64 252, !5, i64 256} -!51 = !{!"", !52, i64 0, !36, i64 4, !36, i64 8, !36, i64 12, !36, i64 16, !36, i64 20, !36, i64 24, !36, i64 28, !30, i64 32, !30, i64 40} -!52 = !{!"", !36, i64 0, !36, i64 0, !36, i64 0, !36, i64 0, !36, i64 0, !36, i64 0, !36, i64 0, !36, i64 0, !36, i64 1, !36, i64 1} -!53 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !36, i64 32, !54, i64 36} -!54 = !{!"rb_code_location_struct", !55, i64 0, !55, i64 8} -!55 = !{!"rb_code_position_struct", !36, i64 0, !36, i64 4} -!56 = !{!"iseq_insn_info", !30, i64 0, !30, i64 8, !36, i64 16, !30, i64 24} -!57 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !30, i64 24} -!58 = !DILocation(line: 0, scope: !9) -!59 = !DILocation(line: 5, column: 1, scope: !9) -!60 = !DILocation(line: 10, column: 3, scope: !15, inlinedAt: !61) -!61 = distinct !DILocation(line: 5, column: 1, scope: !9) -!62 = !DILocation(line: 6, column: 3, scope: !15, inlinedAt: !61) -!63 = !{!37, !37, i64 0} -!64 = !{!"branch_weights", i32 1, i32 10000} -!65 = !{!45, !30, i64 8} -!66 = !DILocation(line: 7, column: 3, scope: !15, inlinedAt: !61) -!67 = !DILocation(line: 8, column: 3, scope: !15, inlinedAt: !61) -!68 = !DILocation(line: 11, column: 3, scope: !15, inlinedAt: !61) -!69 = !DILocation(line: 14, column: 1, scope: !9) -!70 = !DILocation(line: 16, column: 3, scope: !25, inlinedAt: !71) -!71 = distinct !DILocation(line: 14, column: 1, scope: !9) -!72 = !DILocation(line: 17, column: 3, scope: !25, inlinedAt: !71) -!73 = distinct !DISubprogram(name: "IFoo.foo", linkageName: "func_IFoo.foo", scope: null, file: !2, line: 11, type: !10, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!74 = !DILocation(line: 11, column: 3, scope: !73) -!75 = !{!"branch_weights", i32 1, i32 2000} -!76 = !{!77} -!77 = distinct !{!77, !78, !"sorbet_callSuper: argument 0"} -!78 = distinct !{!78, !"sorbet_callSuper"} -!79 = !{!45, !5, i64 24} -!80 = !{!81, !5, i64 8} -!81 = !{!"rb_callable_method_entry_struct", !5, i64 0, !5, i64 8, !30, i64 16, !5, i64 24, !5, i64 32} -!82 = !{!83, !30, i64 24} -!83 = !{!"RClass", !84, i64 0, !5, i64 16, !30, i64 24, !37, i64 32} -!84 = !{!"RBasic", !5, i64 0, !5, i64 8} -!85 = !{!86, !5, i64 64} -!86 = !{!"rb_classext_struct", !30, i64 0, !30, i64 8, !30, i64 16, !30, i64 24, !30, i64 32, !30, i64 40, !30, i64 48, !30, i64 56, !5, i64 64, !5, i64 72, !30, i64 80, !5, i64 88} -!87 = !{!83, !5, i64 16} -!88 = !{!81, !30, i64 16} -!89 = !{!90, !5, i64 32} -!90 = !{!"rb_method_definition_struct", !6, i64 0, !36, i64 0, !36, i64 4, !6, i64 8, !5, i64 32, !5, i64 40} -!91 = !DILocation(line: 17, column: 3, scope: !23) -!92 = !DILocation(line: 0, scope: !23) -!93 = !DILocation(line: 18, column: 14, scope: !23) +!47 = !DILocation(line: 0, scope: !9) +!48 = !DILocation(line: 5, column: 1, scope: !9) +!49 = !DILocation(line: 10, column: 3, scope: !15, inlinedAt: !50) +!50 = distinct !DILocation(line: 5, column: 1, scope: !9) +!51 = !DILocation(line: 6, column: 3, scope: !15, inlinedAt: !50) +!52 = !{!37, !37, i64 0} +!53 = !{!"branch_weights", i32 1, i32 10000} +!54 = !{!45, !30, i64 8} +!55 = !DILocation(line: 7, column: 3, scope: !15, inlinedAt: !50) +!56 = !DILocation(line: 8, column: 3, scope: !15, inlinedAt: !50) +!57 = !DILocation(line: 11, column: 3, scope: !15, inlinedAt: !50) +!58 = !DILocation(line: 14, column: 1, scope: !9) +!59 = !DILocation(line: 16, column: 3, scope: !25, inlinedAt: !60) +!60 = distinct !DILocation(line: 14, column: 1, scope: !9) +!61 = !DILocation(line: 17, column: 3, scope: !25, inlinedAt: !60) +!62 = distinct !DISubprogram(name: "IFoo.foo", linkageName: "func_IFoo.foo", scope: null, file: !2, line: 11, type: !10, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!63 = !DILocation(line: 11, column: 3, scope: !62) +!64 = !{!"branch_weights", i32 1, i32 2000} +!65 = !{!66} +!66 = distinct !{!66, !67, !"sorbet_callSuper: argument 0"} +!67 = distinct !{!67, !"sorbet_callSuper"} +!68 = !{!45, !5, i64 24} +!69 = !{!70, !5, i64 8} +!70 = !{!"rb_callable_method_entry_struct", !5, i64 0, !5, i64 8, !30, i64 16, !5, i64 24, !5, i64 32} +!71 = !{!72, !30, i64 24} +!72 = !{!"RClass", !73, i64 0, !5, i64 16, !30, i64 24, !37, i64 32} +!73 = !{!"RBasic", !5, i64 0, !5, i64 8} +!74 = !{!75, !5, i64 64} +!75 = !{!"rb_classext_struct", !30, i64 0, !30, i64 8, !30, i64 16, !30, i64 24, !30, i64 32, !30, i64 40, !30, i64 48, !30, i64 56, !5, i64 64, !5, i64 72, !30, i64 80, !5, i64 88} +!76 = !{!72, !5, i64 16} +!77 = !{!70, !30, i64 16} +!78 = !{!79, !5, i64 32} +!79 = !{!"rb_method_definition_struct", !6, i64 0, !36, i64 0, !36, i64 4, !6, i64 8, !5, i64 32, !5, i64 40} +!80 = !DILocation(line: 17, column: 3, scope: !23) +!81 = !DILocation(line: 0, scope: !23) +!82 = !DILocation(line: 18, column: 14, scope: !23) diff --git a/test/testdata/compiler/all_arguments.llo.exp b/test/testdata/compiler/all_arguments.llo.exp index 37c8ec7db13..065840b5255 100644 --- a/test/testdata/compiler/all_arguments.llo.exp +++ b/test/testdata/compiler/all_arguments.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_take_arguments = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/all_arguments.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/all_arguments.rb" = private unnamed_addr constant [40 x i8] c"test/testdata/compiler/all_arguments.rb\00", align 1 +@iseqEncodedArray = internal global [32 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @rubyIdPrecomputed_d = internal unnamed_addr global i64 0, align 8 @str_d = private unnamed_addr constant [2 x i8] c"d\00", align 1 @rubyIdPrecomputed_e = internal unnamed_addr global i64 0, align 8 @@ -144,7 +148,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_readRealpath() local_unnamed_addr #1 @@ -220,203 +226,195 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %hashAttemptReadGuard = icmp ult i32 1, %argc, !dbg !31 - br i1 %hashAttemptReadGuard, label %readKWHashArgCountSuccess, label %argCountSecondCheckBlock, !dbg !31 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %3, align 8, !tbaa !12 + %hashAttemptReadGuard = icmp ult i32 1, %argc, !dbg !18 + br i1 %hashAttemptReadGuard, label %readKWHashArgCountSuccess, label %argCountSecondCheckBlock, !dbg !18 readKWHashArgCountSuccess: ; preds = %functionEntryInitializers - %argsWithoutHashCount = sub nuw i32 %argc, 1, !dbg !31 - %11 = getelementptr i64, i64* %argArray, i32 %argsWithoutHashCount, !dbg !31 - %KWArgHash = load i64, i64* %11, align 8, !dbg !31 - %12 = and i64 %KWArgHash, 7, !dbg !31 - %13 = icmp ne i64 %12, 0, !dbg !31 - %14 = and i64 %KWArgHash, -9, !dbg !31 - %15 = icmp eq i64 %14, 0, !dbg !31 - %16 = or i1 %13, %15, !dbg !31 - br i1 %16, label %.thread, label %sorbet_isa_Hash.exit, !dbg !31 + %argsWithoutHashCount = sub nuw i32 %argc, 1, !dbg !18 + %4 = getelementptr i64, i64* %argArray, i32 %argsWithoutHashCount, !dbg !18 + %KWArgHash = load i64, i64* %4, align 8, !dbg !18 + %5 = and i64 %KWArgHash, 7, !dbg !18 + %6 = icmp ne i64 %5, 0, !dbg !18 + %7 = and i64 %KWArgHash, -9, !dbg !18 + %8 = icmp eq i64 %7, 0, !dbg !18 + %9 = or i1 %6, %8, !dbg !18 + br i1 %9, label %.thread, label %sorbet_isa_Hash.exit, !dbg !18 sorbet_isa_Hash.exit: ; preds = %readKWHashArgCountSuccess - %17 = inttoptr i64 %KWArgHash to %struct.iseq_inline_iv_cache_entry*, !dbg !31 - %18 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %17, i64 0, i32 0, !dbg !31 - %19 = load i64, i64* %18, align 8, !dbg !31, !tbaa !32 - %20 = and i64 %19, 31, !dbg !31 - %21 = icmp eq i64 %20, 8, !dbg !31 - br i1 %21, label %fillRequiredArgs, label %.thread, !dbg !31 + %10 = inttoptr i64 %KWArgHash to %struct.iseq_inline_iv_cache_entry*, !dbg !18 + %11 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %10, i64 0, i32 0, !dbg !18 + %12 = load i64, i64* %11, align 8, !dbg !18, !tbaa !19 + %13 = and i64 %12, 31, !dbg !18 + %14 = icmp eq i64 %13, 8, !dbg !18 + br i1 %14, label %fillRequiredArgs, label %.thread, !dbg !18 .thread: ; preds = %sorbet_isa_Hash.exit, %readKWHashArgCountSuccess - br label %fillRequiredArgs, !dbg !31 + br label %fillRequiredArgs, !dbg !18 argCountFailBlock: ; preds = %argCountSecondCheckBlock - tail call void @sorbet_raiseArity(i32 noundef 0, i32 noundef 1, i32 noundef -1) #0, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 noundef 0, i32 noundef 1, i32 noundef -1) #0, !dbg !18 + unreachable, !dbg !18 argCountSecondCheckBlock: ; preds = %functionEntryInitializers - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 - br i1 %tooFewArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !34 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !18 + br i1 %tooFewArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !21 fillFromDefaultBlockDone1: ; preds = %sorbet_getMethodBlockAsProc.exit - %22 = getelementptr i64, i64* %argArray, i32 1, !dbg !31 - %rawArg_b = load i64, i64* %22, align 8, !dbg !31 - %23 = icmp sgt i32 %argcPhi91, 2, !dbg !31 - br i1 %23, label %25, label %fillFromDefaultBlockDone1.thread, !dbg !31 + %15 = getelementptr i64, i64* %argArray, i32 1, !dbg !18 + %rawArg_b = load i64, i64* %15, align 8, !dbg !18 + %16 = icmp sgt i32 %argcPhi83, 2, !dbg !18 + br i1 %16, label %18, label %fillFromDefaultBlockDone1.thread, !dbg !18 fillFromDefaultBlockDone1.thread: ; preds = %sorbet_getMethodBlockAsProc.exit, %fillFromDefaultBlockDone1 - %".sroa.0.097" = phi i64 [ 20, %fillFromDefaultBlockDone1 ], [ 0, %sorbet_getMethodBlockAsProc.exit ] - %b.sroa.0.195 = phi i64 [ %rawArg_b, %fillFromDefaultBlockDone1 ], [ 8, %sorbet_getMethodBlockAsProc.exit ] - %24 = tail call i64 @rb_ary_new() #11, !dbg !31 - br label %sorbet_readRestArgs.exit, !dbg !31 + %".sroa.0.089" = phi i64 [ 20, %fillFromDefaultBlockDone1 ], [ 0, %sorbet_getMethodBlockAsProc.exit ] + %b.sroa.0.187 = phi i64 [ %rawArg_b, %fillFromDefaultBlockDone1 ], [ 8, %sorbet_getMethodBlockAsProc.exit ] + %17 = tail call i64 @rb_ary_new() #11, !dbg !18 + br label %sorbet_readRestArgs.exit, !dbg !18 -25: ; preds = %fillFromDefaultBlockDone1 - %26 = sub nuw nsw i32 %argcPhi91, 2, !dbg !31 - %27 = zext i32 %26 to i64 - %28 = getelementptr inbounds i64, i64* %argArray, i64 2, !dbg !31 - %29 = tail call i64 @rb_ary_new_from_values(i64 %27, i64* nonnull %28) #11, !dbg !31 - br label %sorbet_readRestArgs.exit, !dbg !31 +18: ; preds = %fillFromDefaultBlockDone1 + %19 = sub nuw nsw i32 %argcPhi83, 2, !dbg !18 + %20 = zext i32 %19 to i64 + %21 = getelementptr inbounds i64, i64* %argArray, i64 2, !dbg !18 + %22 = tail call i64 @rb_ary_new_from_values(i64 %20, i64* nonnull %21) #11, !dbg !18 + br label %sorbet_readRestArgs.exit, !dbg !18 -sorbet_readRestArgs.exit: ; preds = %fillFromDefaultBlockDone1.thread, %25 - %".sroa.0.096" = phi i64 [ %".sroa.0.097", %fillFromDefaultBlockDone1.thread ], [ 20, %25 ] - %b.sroa.0.194 = phi i64 [ %b.sroa.0.195, %fillFromDefaultBlockDone1.thread ], [ %rawArg_b, %25 ] - %30 = phi i64 [ %24, %fillFromDefaultBlockDone1.thread ], [ %29, %25 ], !dbg !31 - %rubyId_d = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !31 - %rawSym = tail call i64 @rb_id2sym(i64 %rubyId_d), !dbg !31 - %31 = icmp eq i64 %hashArgsPhi88, 52, !dbg !31 - br i1 %31, label %43, label %sorbet_getKWArg.exit84, !dbg !31 +sorbet_readRestArgs.exit: ; preds = %fillFromDefaultBlockDone1.thread, %18 + %".sroa.0.088" = phi i64 [ %".sroa.0.089", %fillFromDefaultBlockDone1.thread ], [ 20, %18 ] + %b.sroa.0.186 = phi i64 [ %b.sroa.0.187, %fillFromDefaultBlockDone1.thread ], [ %rawArg_b, %18 ] + %23 = phi i64 [ %17, %fillFromDefaultBlockDone1.thread ], [ %22, %18 ], !dbg !18 + %rubyId_d = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !18 + %rawSym = tail call i64 @rb_id2sym(i64 %rubyId_d), !dbg !18 + %24 = icmp eq i64 %hashArgsPhi80, 52, !dbg !18 + br i1 %24, label %36, label %sorbet_getKWArg.exit76, !dbg !18 -sorbet_getKWArg.exit84: ; preds = %sorbet_readRestArgs.exit - %32 = tail call i64 @rb_hash_delete_entry(i64 %hashArgsPhi88, i64 %rawSym) #11, !dbg !31 - %33 = icmp eq i64 %32, 52, !dbg !31 - %34 = select i1 %33, i64 8, i64 %32, !dbg !31 - %rubyId_e = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !31 - %rawSym20 = tail call i64 @rb_id2sym(i64 %rubyId_e), !dbg !31 - %35 = tail call i64 @rb_hash_delete_entry(i64 %hashArgsPhi88, i64 %rawSym20) #11, !dbg !31 - %36 = icmp eq i64 %35, 52, !dbg !31 - %e.sroa.0.1 = select i1 %36, i64 8, i64 %35, !dbg !31 - %37 = tail call i64 @rb_hash_dup(i64 %hashArgsPhi88) #11, !dbg !31 - br i1 %36, label %sorbet_readKWRestArgs.exit.thread, label %47 +sorbet_getKWArg.exit76: ; preds = %sorbet_readRestArgs.exit + %25 = tail call i64 @rb_hash_delete_entry(i64 %hashArgsPhi80, i64 %rawSym) #11, !dbg !18 + %26 = icmp eq i64 %25, 52, !dbg !18 + %27 = select i1 %26, i64 8, i64 %25, !dbg !18 + %rubyId_e = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !18 + %rawSym20 = tail call i64 @rb_id2sym(i64 %rubyId_e), !dbg !18 + %28 = tail call i64 @rb_hash_delete_entry(i64 %hashArgsPhi80, i64 %rawSym20) #11, !dbg !18 + %29 = icmp eq i64 %28, 52, !dbg !18 + %e.sroa.0.1 = select i1 %29, i64 8, i64 %28, !dbg !18 + %30 = tail call i64 @rb_hash_dup(i64 %hashArgsPhi80) #11, !dbg !18 + br i1 %29, label %sorbet_readKWRestArgs.exit.thread, label %40 fillRequiredArgs: ; preds = %sorbet_isa_Hash.exit, %.thread, %argCountSecondCheckBlock - %argcPhi91 = phi i32 [ 1, %argCountSecondCheckBlock ], [ %argsWithoutHashCount, %sorbet_isa_Hash.exit ], [ %argc, %.thread ] - %hashArgsPhi88 = phi i64 [ 52, %argCountSecondCheckBlock ], [ %KWArgHash, %sorbet_isa_Hash.exit ], [ 52, %.thread ] - %rawArg_a = load i64, i64* %argArray, align 8, !dbg !31 - %38 = tail call i32 @rb_block_given_p() #11, !dbg !31 - %39 = icmp eq i32 %38, 0, !dbg !31 - br i1 %39, label %sorbet_getMethodBlockAsProc.exit, label %40, !dbg !31 + %argcPhi83 = phi i32 [ 1, %argCountSecondCheckBlock ], [ %argsWithoutHashCount, %sorbet_isa_Hash.exit ], [ %argc, %.thread ] + %hashArgsPhi80 = phi i64 [ 52, %argCountSecondCheckBlock ], [ %KWArgHash, %sorbet_isa_Hash.exit ], [ 52, %.thread ] + %rawArg_a = load i64, i64* %argArray, align 8, !dbg !18 + %31 = tail call i32 @rb_block_given_p() #11, !dbg !18 + %32 = icmp eq i32 %31, 0, !dbg !18 + br i1 %32, label %sorbet_getMethodBlockAsProc.exit, label %33, !dbg !18 -40: ; preds = %fillRequiredArgs - %41 = tail call i64 @rb_block_proc() #11, !dbg !31 - br label %sorbet_getMethodBlockAsProc.exit, !dbg !31 +33: ; preds = %fillRequiredArgs + %34 = tail call i64 @rb_block_proc() #11, !dbg !18 + br label %sorbet_getMethodBlockAsProc.exit, !dbg !18 -sorbet_getMethodBlockAsProc.exit: ; preds = %fillRequiredArgs, %40 - %42 = phi i64 [ %41, %40 ], [ 8, %fillRequiredArgs ], !dbg !31 - %default0 = icmp eq i32 %argcPhi91, 1, !dbg !31 - br i1 %default0, label %fillFromDefaultBlockDone1.thread, label %fillFromDefaultBlockDone1, !dbg !31, !prof !34 +sorbet_getMethodBlockAsProc.exit: ; preds = %fillRequiredArgs, %33 + %35 = phi i64 [ %34, %33 ], [ 8, %fillRequiredArgs ], !dbg !18 + %default0 = icmp eq i32 %argcPhi83, 1, !dbg !18 + br i1 %default0, label %fillFromDefaultBlockDone1.thread, label %fillFromDefaultBlockDone1, !dbg !18, !prof !21 -43: ; preds = %sorbet_readRestArgs.exit - %rubyId_e109 = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !31 - %rawSym20110 = tail call i64 @rb_id2sym(i64 %rubyId_e109), !dbg !31 - %44 = tail call i64 @rb_hash_new() #11, !dbg !31 - br label %sorbet_readKWRestArgs.exit.thread, !dbg !31 +36: ; preds = %sorbet_readRestArgs.exit + %rubyId_e101 = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !18 + %rawSym20102 = tail call i64 @rb_id2sym(i64 %rubyId_e101), !dbg !18 + %37 = tail call i64 @rb_hash_new() #11, !dbg !18 + br label %sorbet_readKWRestArgs.exit.thread, !dbg !18 -sorbet_readKWRestArgs.exit.thread: ; preds = %43, %sorbet_getKWArg.exit84 - %.ph = phi i64 [ 8, %43 ], [ %34, %sorbet_getKWArg.exit84 ] - %.ph118 = phi i64 [ %44, %43 ], [ %37, %sorbet_getKWArg.exit84 ] - %45 = and i64 %".sroa.0.096", -9, !dbg !35 - %46 = icmp ne i64 %45, 0, !dbg !35 - %b.sroa.0.0121 = select i1 %46, i64 %b.sroa.0.194, i64 3, !dbg !35 - br label %52, !dbg !36 +sorbet_readKWRestArgs.exit.thread: ; preds = %36, %sorbet_getKWArg.exit76 + %.ph = phi i64 [ 8, %36 ], [ %27, %sorbet_getKWArg.exit76 ] + %.ph110 = phi i64 [ %37, %36 ], [ %30, %sorbet_getKWArg.exit76 ] + %38 = and i64 %".sroa.0.088", -9, !dbg !22 + %39 = icmp ne i64 %38, 0, !dbg !22 + %b.sroa.0.0113 = select i1 %39, i64 %b.sroa.0.186, i64 3, !dbg !22 + br label %45, !dbg !23 -47: ; preds = %sorbet_getKWArg.exit84 - %"9.sroa.0.0116" = phi i64 [ 20, %sorbet_getKWArg.exit84 ] - %e.sroa.0.1114 = phi i64 [ %e.sroa.0.1, %sorbet_getKWArg.exit84 ] - %48 = phi i64 [ %34, %sorbet_getKWArg.exit84 ] - %49 = phi i64 [ %37, %sorbet_getKWArg.exit84 ], !dbg !31 - %50 = and i64 %".sroa.0.096", -9, !dbg !35 - %51 = icmp ne i64 %50, 0, !dbg !35 - %b.sroa.0.0 = select i1 %51, i64 %b.sroa.0.194, i64 3, !dbg !35 - br label %52, !dbg !36 +40: ; preds = %sorbet_getKWArg.exit76 + %"9.sroa.0.0108" = phi i64 [ 20, %sorbet_getKWArg.exit76 ] + %e.sroa.0.1106 = phi i64 [ %e.sroa.0.1, %sorbet_getKWArg.exit76 ] + %41 = phi i64 [ %27, %sorbet_getKWArg.exit76 ] + %42 = phi i64 [ %30, %sorbet_getKWArg.exit76 ], !dbg !18 + %43 = and i64 %".sroa.0.088", -9, !dbg !22 + %44 = icmp ne i64 %43, 0, !dbg !22 + %b.sroa.0.0 = select i1 %44, i64 %b.sroa.0.186, i64 3, !dbg !22 + br label %45, !dbg !23 -52: ; preds = %sorbet_readKWRestArgs.exit.thread, %47 - %b.sroa.0.0122 = phi i64 [ %b.sroa.0.0, %47 ], [ %b.sroa.0.0121, %sorbet_readKWRestArgs.exit.thread ] - %53 = phi i64 [ %49, %47 ], [ %.ph118, %sorbet_readKWRestArgs.exit.thread ] - %54 = phi i64 [ %48, %47 ], [ %.ph, %sorbet_readKWRestArgs.exit.thread ] - %55 = phi i64 [ %e.sroa.0.1114, %47 ], [ 5, %sorbet_readKWRestArgs.exit.thread ] - %56 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !37 - store i64* %56, i64** %3, align 8, !dbg !37, !tbaa !12 - %callArgs0Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 0, !dbg !38 - store i64 %rawArg_a, i64* %callArgs0Addr, align 8, !dbg !38 - %callArgs1Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 1, !dbg !38 - store i64 %b.sroa.0.0122, i64* %callArgs1Addr, align 8, !dbg !38 - %callArgs2Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 2, !dbg !38 - store i64 %30, i64* %callArgs2Addr, align 8, !dbg !38 - %callArgs3Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 3, !dbg !38 - store i64 %54, i64* %callArgs3Addr, align 8, !dbg !38 - %callArgs4Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 4, !dbg !38 - store i64 %55, i64* %callArgs4Addr, align 8, !dbg !38 - %callArgs5Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 5, !dbg !38 - store i64 %53, i64* %callArgs5Addr, align 8, !dbg !38 - %callArgs6Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 6, !dbg !38 - store i64 %42, i64* %callArgs6Addr, align 8, !dbg !38 - %57 = getelementptr [8 x i64], [8 x i64]* %callArgs, i64 0, i64 0, !dbg !38 - tail call void @llvm.experimental.noalias.scope.decl(metadata !39) #12, !dbg !38 - %58 = call i64 @rb_ary_new_from_values(i64 noundef 7, i64* noundef nonnull %57) #11, !dbg !38 - %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !38, !tbaa !12 - %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2, !dbg !38 - %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !dbg !38, !tbaa !14 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 1, !dbg !38 - %63 = load i64*, i64** %62, align 8, !dbg !38, !tbaa !42 - %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !38 - store i64* %64, i64** %62, align 8, !dbg !38, !tbaa !42 - store i64 %58, i64* %63, align 8, !dbg !38, !tbaa !4 - %send = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_inspect, i64 0), !dbg !38 - %65 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !43, !tbaa !12 - %66 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %65, i64 0, i32 2, !dbg !43 - %67 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %66, align 8, !dbg !43, !tbaa !14 - %68 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %67, i64 0, i32 1, !dbg !43 - %69 = load i64*, i64** %68, align 8, !dbg !43, !tbaa !42 - %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !43 - store i64 %selfRaw, i64* %69, align 8, !dbg !43, !tbaa !4 - %71 = getelementptr inbounds i64, i64* %70, i64 1, !dbg !43 - store i64* %71, i64** %68, align 8, !dbg !43, !tbaa !42 - store i64 %send, i64* %70, align 8, !dbg !43, !tbaa !4 - %send55 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !43 +45: ; preds = %sorbet_readKWRestArgs.exit.thread, %40 + %b.sroa.0.0114 = phi i64 [ %b.sroa.0.0, %40 ], [ %b.sroa.0.0113, %sorbet_readKWRestArgs.exit.thread ] + %46 = phi i64 [ %42, %40 ], [ %.ph110, %sorbet_readKWRestArgs.exit.thread ] + %47 = phi i64 [ %41, %40 ], [ %.ph, %sorbet_readKWRestArgs.exit.thread ] + %48 = phi i64 [ %e.sroa.0.1106, %40 ], [ 5, %sorbet_readKWRestArgs.exit.thread ] + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !dbg !24, !tbaa !12 + %callArgs0Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 0, !dbg !25 + store i64 %rawArg_a, i64* %callArgs0Addr, align 8, !dbg !25 + %callArgs1Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 1, !dbg !25 + store i64 %b.sroa.0.0114, i64* %callArgs1Addr, align 8, !dbg !25 + %callArgs2Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 2, !dbg !25 + store i64 %23, i64* %callArgs2Addr, align 8, !dbg !25 + %callArgs3Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 3, !dbg !25 + store i64 %47, i64* %callArgs3Addr, align 8, !dbg !25 + %callArgs4Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 4, !dbg !25 + store i64 %48, i64* %callArgs4Addr, align 8, !dbg !25 + %callArgs5Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 5, !dbg !25 + store i64 %46, i64* %callArgs5Addr, align 8, !dbg !25 + %callArgs6Addr = getelementptr [8 x i64], [8 x i64]* %callArgs, i32 0, i64 6, !dbg !25 + store i64 %35, i64* %callArgs6Addr, align 8, !dbg !25 + %49 = getelementptr [8 x i64], [8 x i64]* %callArgs, i64 0, i64 0, !dbg !25 + tail call void @llvm.experimental.noalias.scope.decl(metadata !26) #12, !dbg !25 + %50 = call i64 @rb_ary_new_from_values(i64 noundef 7, i64* noundef nonnull %49) #11, !dbg !25 + %51 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !12 + %52 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %51, i64 0, i32 2, !dbg !25 + %53 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %52, align 8, !dbg !25, !tbaa !14 + %54 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %53, i64 0, i32 1, !dbg !25 + %55 = load i64*, i64** %54, align 8, !dbg !25, !tbaa !29 + %56 = getelementptr inbounds i64, i64* %55, i64 1, !dbg !25 + store i64* %56, i64** %54, align 8, !dbg !25, !tbaa !29 + store i64 %50, i64* %55, align 8, !dbg !25, !tbaa !4 + %send = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_inspect, i64 0), !dbg !25 + %57 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !12 + %58 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %57, i64 0, i32 2, !dbg !31 + %59 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %58, align 8, !dbg !31, !tbaa !14 + %60 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %59, i64 0, i32 1, !dbg !31 + %61 = load i64*, i64** %60, align 8, !dbg !31, !tbaa !29 + %62 = getelementptr inbounds i64, i64* %61, i64 1, !dbg !31 + store i64 %selfRaw, i64* %61, align 8, !dbg !31, !tbaa !4 + %63 = getelementptr inbounds i64, i64* %62, i64 1, !dbg !31 + store i64* %63, i64** %60, align 8, !dbg !31, !tbaa !29 + store i64 %send, i64* %62, align 8, !dbg !31, !tbaa !4 + %send55 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !31 ret i64 %send55 } ; Function Attrs: sspreq define void @Init_all_arguments() local_unnamed_addr #7 { entry: - %positional_table.i = alloca i64, i32 4, align 8, !dbg !44 - %keyword_table.i = alloca i64, i32 3, align 8, !dbg !44 + %positional_table.i = alloca i64, i32 4, align 8, !dbg !32 + %keyword_table.i = alloca i64, i32 3, align 8, !dbg !32 %locals.i165.i = alloca i64, i32 0, align 8 %locals.i.i = alloca i64, i32 0, align 8 - %keywords.i = alloca i64, align 8, !dbg !46 - %keywords5.i = alloca i64, align 8, !dbg !47 - %keywords11.i = alloca i64, align 8, !dbg !48 - %keywords17.i = alloca i64, align 8, !dbg !49 - %keywords23.i = alloca i64, align 8, !dbg !50 - %keywords29.i = alloca i64, align 8, !dbg !51 - %keywords35.i = alloca i64, align 8, !dbg !52 - %keywords41.i = alloca i64, i32 2, align 8, !dbg !53 - %keywords48.i = alloca i64, i32 2, align 8, !dbg !54 - %keywords56.i = alloca i64, i32 2, align 8, !dbg !55 - %keywords64.i = alloca i64, i32 2, align 8, !dbg !56 - %keywords72.i = alloca i64, i32 2, align 8, !dbg !57 - %keywords80.i = alloca i64, i32 2, align 8, !dbg !58 - %keywords88.i = alloca i64, i32 2, align 8, !dbg !59 - %keywords96.i = alloca i64, i32 3, align 8, !dbg !60 - %keywords105.i = alloca i64, i32 3, align 8, !dbg !61 - %keywords115.i = alloca i64, i32 3, align 8, !dbg !62 - %keywords125.i = alloca i64, i32 3, align 8, !dbg !63 - %keywords135.i = alloca i64, i32 3, align 8, !dbg !64 - %keywords145.i = alloca i64, i32 3, align 8, !dbg !65 - %keywords155.i = alloca i64, i32 3, align 8, !dbg !66 + %keywords.i = alloca i64, align 8, !dbg !34 + %keywords5.i = alloca i64, align 8, !dbg !35 + %keywords11.i = alloca i64, align 8, !dbg !36 + %keywords17.i = alloca i64, align 8, !dbg !37 + %keywords23.i = alloca i64, align 8, !dbg !38 + %keywords29.i = alloca i64, align 8, !dbg !39 + %keywords35.i = alloca i64, align 8, !dbg !40 + %keywords41.i = alloca i64, i32 2, align 8, !dbg !41 + %keywords48.i = alloca i64, i32 2, align 8, !dbg !42 + %keywords56.i = alloca i64, i32 2, align 8, !dbg !43 + %keywords64.i = alloca i64, i32 2, align 8, !dbg !44 + %keywords72.i = alloca i64, i32 2, align 8, !dbg !45 + %keywords80.i = alloca i64, i32 2, align 8, !dbg !46 + %keywords88.i = alloca i64, i32 2, align 8, !dbg !47 + %keywords96.i = alloca i64, i32 3, align 8, !dbg !48 + %keywords105.i = alloca i64, i32 3, align 8, !dbg !49 + %keywords115.i = alloca i64, i32 3, align 8, !dbg !50 + %keywords125.i = alloca i64, i32 3, align 8, !dbg !51 + %keywords135.i = alloca i64, i32 3, align 8, !dbg !52 + %keywords145.i = alloca i64, i32 3, align 8, !dbg !53 + %keywords155.i = alloca i64, i32 3, align 8, !dbg !54 %realpath = tail call i64 @sorbet_readRealpath() %0 = bitcast i64* %keywords.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0) @@ -495,211 +493,213 @@ entry: %37 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([40 x i8], [40 x i8]* @"str_test/testdata/compiler/all_arguments.rb", i64 0, i64 0), i64 noundef 39) #11 tail call void @rb_gc_register_mark_object(i64 %37) #11 store i64 %37, i64* @"rubyStrFrozen_test/testdata/compiler/all_arguments.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 32) %rubyId_take_arguments.i.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8 %rubyStr_take_arguments.i.i = load i64, i64* @rubyStrFrozen_take_arguments, align 8 - %38 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_take_arguments.i.i, i64 %rubyId_take_arguments.i.i, i64 %37, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 6, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 8) + %"rubyStr_test/testdata/compiler/all_arguments.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/all_arguments.rb", align 8 + %38 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_take_arguments.i.i, i64 %rubyId_take_arguments.i.i, i64 %"rubyStr_test/testdata/compiler/all_arguments.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 8) store %struct.rb_iseq_struct* %38, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#take_arguments", align 8 - %rubyId_inspect.i = load i64, i64* @rubyIdPrecomputed_inspect, align 8, !dbg !38 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_inspect, i64 %rubyId_inspect.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !38 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !43 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !43 + %rubyId_inspect.i = load i64, i64* @rubyIdPrecomputed_inspect, align 8, !dbg !25 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_inspect, i64 %rubyId_inspect.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !25 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !31 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !31 %39 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #11 call void @rb_gc_register_mark_object(i64 %39) #11 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/all_arguments.rb.i164.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/all_arguments.rb", align 8 - %40 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %39, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/all_arguments.rb.i164.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 30, i64* noundef nonnull %locals.i165.i, i32 noundef 0, i32 noundef 11) + %40 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %39, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/all_arguments.rb.i164.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i165.i, i32 noundef 0, i32 noundef 11) store %struct.rb_iseq_struct* %40, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !44 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !44 - %rubyId_take_arguments.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !46 - %rubyId_d.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !46 - %41 = call i64 @rb_id2sym(i64 %rubyId_d.i) #11, !dbg !46 - store i64 %41, i64* %keywords.i, align 8, !dbg !46 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments, i64 %rubyId_take_arguments.i, i32 noundef 68, i32 noundef 8, i32 noundef 1, i64* noundef nonnull %keywords.i), !dbg !46 - %rubyId_take_arguments4.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !47 - %rubyId_d6.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !47 - %42 = call i64 @rb_id2sym(i64 %rubyId_d6.i) #11, !dbg !47 - store i64 %42, i64* %keywords5.i, align 8, !dbg !47 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.1, i64 %rubyId_take_arguments4.i, i32 noundef 68, i32 noundef 7, i32 noundef 1, i64* noundef nonnull %keywords5.i), !dbg !47 - %rubyId_take_arguments10.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !48 - %rubyId_d12.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !48 - %43 = call i64 @rb_id2sym(i64 %rubyId_d12.i) #11, !dbg !48 - store i64 %43, i64* %keywords11.i, align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.2, i64 %rubyId_take_arguments10.i, i32 noundef 68, i32 noundef 6, i32 noundef 1, i64* noundef nonnull %keywords11.i), !dbg !48 - %rubyId_take_arguments16.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !49 - %rubyId_d18.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !49 - %44 = call i64 @rb_id2sym(i64 %rubyId_d18.i) #11, !dbg !49 - store i64 %44, i64* %keywords17.i, align 8, !dbg !49 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.3, i64 %rubyId_take_arguments16.i, i32 noundef 68, i32 noundef 5, i32 noundef 1, i64* noundef nonnull %keywords17.i), !dbg !49 - %rubyId_take_arguments22.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !50 - %rubyId_d24.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !50 - %45 = call i64 @rb_id2sym(i64 %rubyId_d24.i) #11, !dbg !50 - store i64 %45, i64* %keywords23.i, align 8, !dbg !50 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.4, i64 %rubyId_take_arguments22.i, i32 noundef 68, i32 noundef 4, i32 noundef 1, i64* noundef nonnull %keywords23.i), !dbg !50 - %rubyId_take_arguments28.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !51 - %rubyId_d30.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !51 - %46 = call i64 @rb_id2sym(i64 %rubyId_d30.i) #11, !dbg !51 - store i64 %46, i64* %keywords29.i, align 8, !dbg !51 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.5, i64 %rubyId_take_arguments28.i, i32 noundef 68, i32 noundef 3, i32 noundef 1, i64* noundef nonnull %keywords29.i), !dbg !51 - %rubyId_take_arguments34.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !52 - %rubyId_d36.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !52 - %47 = call i64 @rb_id2sym(i64 %rubyId_d36.i) #11, !dbg !52 - store i64 %47, i64* %keywords35.i, align 8, !dbg !52 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.6, i64 %rubyId_take_arguments34.i, i32 noundef 68, i32 noundef 2, i32 noundef 1, i64* noundef nonnull %keywords35.i), !dbg !52 - %rubyId_take_arguments40.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !53 - %rubyId_d42.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !53 - %48 = call i64 @rb_id2sym(i64 %rubyId_d42.i) #11, !dbg !53 - store i64 %48, i64* %keywords41.i, align 8, !dbg !53 - %rubyId_e.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !53 - %49 = call i64 @rb_id2sym(i64 %rubyId_e.i) #11, !dbg !53 - %50 = getelementptr i64, i64* %keywords41.i, i32 1, !dbg !53 - store i64 %49, i64* %50, align 8, !dbg !53 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.7, i64 %rubyId_take_arguments40.i, i32 noundef 68, i32 noundef 9, i32 noundef 2, i64* noundef nonnull %keywords41.i), !dbg !53 - %rubyId_take_arguments47.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !54 - %rubyId_d49.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !54 - %51 = call i64 @rb_id2sym(i64 %rubyId_d49.i) #11, !dbg !54 - store i64 %51, i64* %keywords48.i, align 8, !dbg !54 - %rubyId_e51.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !54 - %52 = call i64 @rb_id2sym(i64 %rubyId_e51.i) #11, !dbg !54 - %53 = getelementptr i64, i64* %keywords48.i, i32 1, !dbg !54 - store i64 %52, i64* %53, align 8, !dbg !54 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.8, i64 %rubyId_take_arguments47.i, i32 noundef 68, i32 noundef 8, i32 noundef 2, i64* noundef nonnull %keywords48.i), !dbg !54 - %rubyId_take_arguments55.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !55 - %rubyId_d57.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !55 - %54 = call i64 @rb_id2sym(i64 %rubyId_d57.i) #11, !dbg !55 - store i64 %54, i64* %keywords56.i, align 8, !dbg !55 - %rubyId_e59.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !55 - %55 = call i64 @rb_id2sym(i64 %rubyId_e59.i) #11, !dbg !55 - %56 = getelementptr i64, i64* %keywords56.i, i32 1, !dbg !55 - store i64 %55, i64* %56, align 8, !dbg !55 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.9, i64 %rubyId_take_arguments55.i, i32 noundef 68, i32 noundef 7, i32 noundef 2, i64* noundef nonnull %keywords56.i), !dbg !55 - %rubyId_take_arguments63.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !56 - %rubyId_d65.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !56 - %57 = call i64 @rb_id2sym(i64 %rubyId_d65.i) #11, !dbg !56 - store i64 %57, i64* %keywords64.i, align 8, !dbg !56 - %rubyId_e67.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !56 - %58 = call i64 @rb_id2sym(i64 %rubyId_e67.i) #11, !dbg !56 - %59 = getelementptr i64, i64* %keywords64.i, i32 1, !dbg !56 - store i64 %58, i64* %59, align 8, !dbg !56 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.10, i64 %rubyId_take_arguments63.i, i32 noundef 68, i32 noundef 6, i32 noundef 2, i64* noundef nonnull %keywords64.i), !dbg !56 - %rubyId_take_arguments71.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !57 - %rubyId_d73.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !57 - %60 = call i64 @rb_id2sym(i64 %rubyId_d73.i) #11, !dbg !57 - store i64 %60, i64* %keywords72.i, align 8, !dbg !57 - %rubyId_e75.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !57 - %61 = call i64 @rb_id2sym(i64 %rubyId_e75.i) #11, !dbg !57 - %62 = getelementptr i64, i64* %keywords72.i, i32 1, !dbg !57 - store i64 %61, i64* %62, align 8, !dbg !57 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.11, i64 %rubyId_take_arguments71.i, i32 noundef 68, i32 noundef 5, i32 noundef 2, i64* noundef nonnull %keywords72.i), !dbg !57 - %rubyId_take_arguments79.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !58 - %rubyId_d81.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !58 - %63 = call i64 @rb_id2sym(i64 %rubyId_d81.i) #11, !dbg !58 - store i64 %63, i64* %keywords80.i, align 8, !dbg !58 - %rubyId_e83.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !58 - %64 = call i64 @rb_id2sym(i64 %rubyId_e83.i) #11, !dbg !58 - %65 = getelementptr i64, i64* %keywords80.i, i32 1, !dbg !58 - store i64 %64, i64* %65, align 8, !dbg !58 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.12, i64 %rubyId_take_arguments79.i, i32 noundef 68, i32 noundef 4, i32 noundef 2, i64* noundef nonnull %keywords80.i), !dbg !58 - %rubyId_take_arguments87.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !59 - %rubyId_d89.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !59 - %66 = call i64 @rb_id2sym(i64 %rubyId_d89.i) #11, !dbg !59 - store i64 %66, i64* %keywords88.i, align 8, !dbg !59 - %rubyId_e91.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !59 - %67 = call i64 @rb_id2sym(i64 %rubyId_e91.i) #11, !dbg !59 - %68 = getelementptr i64, i64* %keywords88.i, i32 1, !dbg !59 - store i64 %67, i64* %68, align 8, !dbg !59 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.13, i64 %rubyId_take_arguments87.i, i32 noundef 68, i32 noundef 3, i32 noundef 2, i64* noundef nonnull %keywords88.i), !dbg !59 - %rubyId_take_arguments95.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !60 - %rubyId_d97.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !60 - %69 = call i64 @rb_id2sym(i64 %rubyId_d97.i) #11, !dbg !60 - store i64 %69, i64* %keywords96.i, align 8, !dbg !60 - %rubyId_e99.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !60 - %70 = call i64 @rb_id2sym(i64 %rubyId_e99.i) #11, !dbg !60 - %71 = getelementptr i64, i64* %keywords96.i, i32 1, !dbg !60 - store i64 %70, i64* %71, align 8, !dbg !60 - %rubyId_baz.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !60 - %72 = call i64 @rb_id2sym(i64 %rubyId_baz.i) #11, !dbg !60 - %73 = getelementptr i64, i64* %keywords96.i, i32 2, !dbg !60 - store i64 %72, i64* %73, align 8, !dbg !60 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.14, i64 %rubyId_take_arguments95.i, i32 noundef 68, i32 noundef 10, i32 noundef 3, i64* noundef nonnull %keywords96.i), !dbg !60 - %rubyId_take_arguments104.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !61 - %rubyId_d106.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !61 - %74 = call i64 @rb_id2sym(i64 %rubyId_d106.i) #11, !dbg !61 - store i64 %74, i64* %keywords105.i, align 8, !dbg !61 - %rubyId_e108.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !61 - %75 = call i64 @rb_id2sym(i64 %rubyId_e108.i) #11, !dbg !61 - %76 = getelementptr i64, i64* %keywords105.i, i32 1, !dbg !61 - store i64 %75, i64* %76, align 8, !dbg !61 - %rubyId_baz110.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !61 - %77 = call i64 @rb_id2sym(i64 %rubyId_baz110.i) #11, !dbg !61 - %78 = getelementptr i64, i64* %keywords105.i, i32 2, !dbg !61 - store i64 %77, i64* %78, align 8, !dbg !61 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.15, i64 %rubyId_take_arguments104.i, i32 noundef 68, i32 noundef 9, i32 noundef 3, i64* noundef nonnull %keywords105.i), !dbg !61 - %rubyId_take_arguments114.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !62 - %rubyId_d116.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !62 - %79 = call i64 @rb_id2sym(i64 %rubyId_d116.i) #11, !dbg !62 - store i64 %79, i64* %keywords115.i, align 8, !dbg !62 - %rubyId_e118.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !62 - %80 = call i64 @rb_id2sym(i64 %rubyId_e118.i) #11, !dbg !62 - %81 = getelementptr i64, i64* %keywords115.i, i32 1, !dbg !62 - store i64 %80, i64* %81, align 8, !dbg !62 - %rubyId_baz120.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !62 - %82 = call i64 @rb_id2sym(i64 %rubyId_baz120.i) #11, !dbg !62 - %83 = getelementptr i64, i64* %keywords115.i, i32 2, !dbg !62 - store i64 %82, i64* %83, align 8, !dbg !62 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.16, i64 %rubyId_take_arguments114.i, i32 noundef 68, i32 noundef 8, i32 noundef 3, i64* noundef nonnull %keywords115.i), !dbg !62 - %rubyId_take_arguments124.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !63 - %rubyId_d126.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !63 - %84 = call i64 @rb_id2sym(i64 %rubyId_d126.i) #11, !dbg !63 - store i64 %84, i64* %keywords125.i, align 8, !dbg !63 - %rubyId_e128.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !63 - %85 = call i64 @rb_id2sym(i64 %rubyId_e128.i) #11, !dbg !63 - %86 = getelementptr i64, i64* %keywords125.i, i32 1, !dbg !63 - store i64 %85, i64* %86, align 8, !dbg !63 - %rubyId_baz130.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !63 - %87 = call i64 @rb_id2sym(i64 %rubyId_baz130.i) #11, !dbg !63 - %88 = getelementptr i64, i64* %keywords125.i, i32 2, !dbg !63 - store i64 %87, i64* %88, align 8, !dbg !63 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.17, i64 %rubyId_take_arguments124.i, i32 noundef 68, i32 noundef 7, i32 noundef 3, i64* noundef nonnull %keywords125.i), !dbg !63 - %rubyId_take_arguments134.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !64 - %rubyId_d136.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !64 - %89 = call i64 @rb_id2sym(i64 %rubyId_d136.i) #11, !dbg !64 - store i64 %89, i64* %keywords135.i, align 8, !dbg !64 - %rubyId_e138.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !64 - %90 = call i64 @rb_id2sym(i64 %rubyId_e138.i) #11, !dbg !64 - %91 = getelementptr i64, i64* %keywords135.i, i32 1, !dbg !64 - store i64 %90, i64* %91, align 8, !dbg !64 - %rubyId_baz140.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !64 - %92 = call i64 @rb_id2sym(i64 %rubyId_baz140.i) #11, !dbg !64 - %93 = getelementptr i64, i64* %keywords135.i, i32 2, !dbg !64 - store i64 %92, i64* %93, align 8, !dbg !64 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.18, i64 %rubyId_take_arguments134.i, i32 noundef 68, i32 noundef 6, i32 noundef 3, i64* noundef nonnull %keywords135.i), !dbg !64 - %rubyId_take_arguments144.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !65 - %rubyId_d146.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !65 - %94 = call i64 @rb_id2sym(i64 %rubyId_d146.i) #11, !dbg !65 - store i64 %94, i64* %keywords145.i, align 8, !dbg !65 - %rubyId_e148.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !65 - %95 = call i64 @rb_id2sym(i64 %rubyId_e148.i) #11, !dbg !65 - %96 = getelementptr i64, i64* %keywords145.i, i32 1, !dbg !65 - store i64 %95, i64* %96, align 8, !dbg !65 - %rubyId_baz150.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !65 - %97 = call i64 @rb_id2sym(i64 %rubyId_baz150.i) #11, !dbg !65 - %98 = getelementptr i64, i64* %keywords145.i, i32 2, !dbg !65 - store i64 %97, i64* %98, align 8, !dbg !65 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.19, i64 %rubyId_take_arguments144.i, i32 noundef 68, i32 noundef 5, i32 noundef 3, i64* noundef nonnull %keywords145.i), !dbg !65 - %rubyId_take_arguments154.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !66 - %rubyId_d156.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !66 - %99 = call i64 @rb_id2sym(i64 %rubyId_d156.i) #11, !dbg !66 - store i64 %99, i64* %keywords155.i, align 8, !dbg !66 - %rubyId_e158.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !66 - %100 = call i64 @rb_id2sym(i64 %rubyId_e158.i) #11, !dbg !66 - %101 = getelementptr i64, i64* %keywords155.i, i32 1, !dbg !66 - store i64 %100, i64* %101, align 8, !dbg !66 - %rubyId_baz160.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !66 - %102 = call i64 @rb_id2sym(i64 %rubyId_baz160.i) #11, !dbg !66 - %103 = getelementptr i64, i64* %keywords155.i, i32 2, !dbg !66 - store i64 %102, i64* %103, align 8, !dbg !66 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.20, i64 %rubyId_take_arguments154.i, i32 noundef 68, i32 noundef 4, i32 noundef 3, i64* noundef nonnull %keywords155.i), !dbg !66 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !32 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !32 + %rubyId_take_arguments.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !34 + %rubyId_d.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !34 + %41 = call i64 @rb_id2sym(i64 %rubyId_d.i) #11, !dbg !34 + store i64 %41, i64* %keywords.i, align 8, !dbg !34 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments, i64 %rubyId_take_arguments.i, i32 noundef 68, i32 noundef 8, i32 noundef 1, i64* noundef nonnull %keywords.i), !dbg !34 + %rubyId_take_arguments4.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !35 + %rubyId_d6.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !35 + %42 = call i64 @rb_id2sym(i64 %rubyId_d6.i) #11, !dbg !35 + store i64 %42, i64* %keywords5.i, align 8, !dbg !35 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.1, i64 %rubyId_take_arguments4.i, i32 noundef 68, i32 noundef 7, i32 noundef 1, i64* noundef nonnull %keywords5.i), !dbg !35 + %rubyId_take_arguments10.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !36 + %rubyId_d12.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !36 + %43 = call i64 @rb_id2sym(i64 %rubyId_d12.i) #11, !dbg !36 + store i64 %43, i64* %keywords11.i, align 8, !dbg !36 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.2, i64 %rubyId_take_arguments10.i, i32 noundef 68, i32 noundef 6, i32 noundef 1, i64* noundef nonnull %keywords11.i), !dbg !36 + %rubyId_take_arguments16.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !37 + %rubyId_d18.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !37 + %44 = call i64 @rb_id2sym(i64 %rubyId_d18.i) #11, !dbg !37 + store i64 %44, i64* %keywords17.i, align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.3, i64 %rubyId_take_arguments16.i, i32 noundef 68, i32 noundef 5, i32 noundef 1, i64* noundef nonnull %keywords17.i), !dbg !37 + %rubyId_take_arguments22.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !38 + %rubyId_d24.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !38 + %45 = call i64 @rb_id2sym(i64 %rubyId_d24.i) #11, !dbg !38 + store i64 %45, i64* %keywords23.i, align 8, !dbg !38 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.4, i64 %rubyId_take_arguments22.i, i32 noundef 68, i32 noundef 4, i32 noundef 1, i64* noundef nonnull %keywords23.i), !dbg !38 + %rubyId_take_arguments28.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !39 + %rubyId_d30.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !39 + %46 = call i64 @rb_id2sym(i64 %rubyId_d30.i) #11, !dbg !39 + store i64 %46, i64* %keywords29.i, align 8, !dbg !39 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.5, i64 %rubyId_take_arguments28.i, i32 noundef 68, i32 noundef 3, i32 noundef 1, i64* noundef nonnull %keywords29.i), !dbg !39 + %rubyId_take_arguments34.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !40 + %rubyId_d36.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !40 + %47 = call i64 @rb_id2sym(i64 %rubyId_d36.i) #11, !dbg !40 + store i64 %47, i64* %keywords35.i, align 8, !dbg !40 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.6, i64 %rubyId_take_arguments34.i, i32 noundef 68, i32 noundef 2, i32 noundef 1, i64* noundef nonnull %keywords35.i), !dbg !40 + %rubyId_take_arguments40.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !41 + %rubyId_d42.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !41 + %48 = call i64 @rb_id2sym(i64 %rubyId_d42.i) #11, !dbg !41 + store i64 %48, i64* %keywords41.i, align 8, !dbg !41 + %rubyId_e.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !41 + %49 = call i64 @rb_id2sym(i64 %rubyId_e.i) #11, !dbg !41 + %50 = getelementptr i64, i64* %keywords41.i, i32 1, !dbg !41 + store i64 %49, i64* %50, align 8, !dbg !41 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.7, i64 %rubyId_take_arguments40.i, i32 noundef 68, i32 noundef 9, i32 noundef 2, i64* noundef nonnull %keywords41.i), !dbg !41 + %rubyId_take_arguments47.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !42 + %rubyId_d49.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !42 + %51 = call i64 @rb_id2sym(i64 %rubyId_d49.i) #11, !dbg !42 + store i64 %51, i64* %keywords48.i, align 8, !dbg !42 + %rubyId_e51.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !42 + %52 = call i64 @rb_id2sym(i64 %rubyId_e51.i) #11, !dbg !42 + %53 = getelementptr i64, i64* %keywords48.i, i32 1, !dbg !42 + store i64 %52, i64* %53, align 8, !dbg !42 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.8, i64 %rubyId_take_arguments47.i, i32 noundef 68, i32 noundef 8, i32 noundef 2, i64* noundef nonnull %keywords48.i), !dbg !42 + %rubyId_take_arguments55.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !43 + %rubyId_d57.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !43 + %54 = call i64 @rb_id2sym(i64 %rubyId_d57.i) #11, !dbg !43 + store i64 %54, i64* %keywords56.i, align 8, !dbg !43 + %rubyId_e59.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !43 + %55 = call i64 @rb_id2sym(i64 %rubyId_e59.i) #11, !dbg !43 + %56 = getelementptr i64, i64* %keywords56.i, i32 1, !dbg !43 + store i64 %55, i64* %56, align 8, !dbg !43 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.9, i64 %rubyId_take_arguments55.i, i32 noundef 68, i32 noundef 7, i32 noundef 2, i64* noundef nonnull %keywords56.i), !dbg !43 + %rubyId_take_arguments63.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !44 + %rubyId_d65.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !44 + %57 = call i64 @rb_id2sym(i64 %rubyId_d65.i) #11, !dbg !44 + store i64 %57, i64* %keywords64.i, align 8, !dbg !44 + %rubyId_e67.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !44 + %58 = call i64 @rb_id2sym(i64 %rubyId_e67.i) #11, !dbg !44 + %59 = getelementptr i64, i64* %keywords64.i, i32 1, !dbg !44 + store i64 %58, i64* %59, align 8, !dbg !44 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.10, i64 %rubyId_take_arguments63.i, i32 noundef 68, i32 noundef 6, i32 noundef 2, i64* noundef nonnull %keywords64.i), !dbg !44 + %rubyId_take_arguments71.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !45 + %rubyId_d73.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !45 + %60 = call i64 @rb_id2sym(i64 %rubyId_d73.i) #11, !dbg !45 + store i64 %60, i64* %keywords72.i, align 8, !dbg !45 + %rubyId_e75.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !45 + %61 = call i64 @rb_id2sym(i64 %rubyId_e75.i) #11, !dbg !45 + %62 = getelementptr i64, i64* %keywords72.i, i32 1, !dbg !45 + store i64 %61, i64* %62, align 8, !dbg !45 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.11, i64 %rubyId_take_arguments71.i, i32 noundef 68, i32 noundef 5, i32 noundef 2, i64* noundef nonnull %keywords72.i), !dbg !45 + %rubyId_take_arguments79.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !46 + %rubyId_d81.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !46 + %63 = call i64 @rb_id2sym(i64 %rubyId_d81.i) #11, !dbg !46 + store i64 %63, i64* %keywords80.i, align 8, !dbg !46 + %rubyId_e83.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !46 + %64 = call i64 @rb_id2sym(i64 %rubyId_e83.i) #11, !dbg !46 + %65 = getelementptr i64, i64* %keywords80.i, i32 1, !dbg !46 + store i64 %64, i64* %65, align 8, !dbg !46 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.12, i64 %rubyId_take_arguments79.i, i32 noundef 68, i32 noundef 4, i32 noundef 2, i64* noundef nonnull %keywords80.i), !dbg !46 + %rubyId_take_arguments87.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !47 + %rubyId_d89.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !47 + %66 = call i64 @rb_id2sym(i64 %rubyId_d89.i) #11, !dbg !47 + store i64 %66, i64* %keywords88.i, align 8, !dbg !47 + %rubyId_e91.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !47 + %67 = call i64 @rb_id2sym(i64 %rubyId_e91.i) #11, !dbg !47 + %68 = getelementptr i64, i64* %keywords88.i, i32 1, !dbg !47 + store i64 %67, i64* %68, align 8, !dbg !47 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.13, i64 %rubyId_take_arguments87.i, i32 noundef 68, i32 noundef 3, i32 noundef 2, i64* noundef nonnull %keywords88.i), !dbg !47 + %rubyId_take_arguments95.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !48 + %rubyId_d97.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !48 + %69 = call i64 @rb_id2sym(i64 %rubyId_d97.i) #11, !dbg !48 + store i64 %69, i64* %keywords96.i, align 8, !dbg !48 + %rubyId_e99.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !48 + %70 = call i64 @rb_id2sym(i64 %rubyId_e99.i) #11, !dbg !48 + %71 = getelementptr i64, i64* %keywords96.i, i32 1, !dbg !48 + store i64 %70, i64* %71, align 8, !dbg !48 + %rubyId_baz.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !48 + %72 = call i64 @rb_id2sym(i64 %rubyId_baz.i) #11, !dbg !48 + %73 = getelementptr i64, i64* %keywords96.i, i32 2, !dbg !48 + store i64 %72, i64* %73, align 8, !dbg !48 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.14, i64 %rubyId_take_arguments95.i, i32 noundef 68, i32 noundef 10, i32 noundef 3, i64* noundef nonnull %keywords96.i), !dbg !48 + %rubyId_take_arguments104.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !49 + %rubyId_d106.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !49 + %74 = call i64 @rb_id2sym(i64 %rubyId_d106.i) #11, !dbg !49 + store i64 %74, i64* %keywords105.i, align 8, !dbg !49 + %rubyId_e108.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !49 + %75 = call i64 @rb_id2sym(i64 %rubyId_e108.i) #11, !dbg !49 + %76 = getelementptr i64, i64* %keywords105.i, i32 1, !dbg !49 + store i64 %75, i64* %76, align 8, !dbg !49 + %rubyId_baz110.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !49 + %77 = call i64 @rb_id2sym(i64 %rubyId_baz110.i) #11, !dbg !49 + %78 = getelementptr i64, i64* %keywords105.i, i32 2, !dbg !49 + store i64 %77, i64* %78, align 8, !dbg !49 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.15, i64 %rubyId_take_arguments104.i, i32 noundef 68, i32 noundef 9, i32 noundef 3, i64* noundef nonnull %keywords105.i), !dbg !49 + %rubyId_take_arguments114.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !50 + %rubyId_d116.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !50 + %79 = call i64 @rb_id2sym(i64 %rubyId_d116.i) #11, !dbg !50 + store i64 %79, i64* %keywords115.i, align 8, !dbg !50 + %rubyId_e118.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !50 + %80 = call i64 @rb_id2sym(i64 %rubyId_e118.i) #11, !dbg !50 + %81 = getelementptr i64, i64* %keywords115.i, i32 1, !dbg !50 + store i64 %80, i64* %81, align 8, !dbg !50 + %rubyId_baz120.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !50 + %82 = call i64 @rb_id2sym(i64 %rubyId_baz120.i) #11, !dbg !50 + %83 = getelementptr i64, i64* %keywords115.i, i32 2, !dbg !50 + store i64 %82, i64* %83, align 8, !dbg !50 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.16, i64 %rubyId_take_arguments114.i, i32 noundef 68, i32 noundef 8, i32 noundef 3, i64* noundef nonnull %keywords115.i), !dbg !50 + %rubyId_take_arguments124.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !51 + %rubyId_d126.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !51 + %84 = call i64 @rb_id2sym(i64 %rubyId_d126.i) #11, !dbg !51 + store i64 %84, i64* %keywords125.i, align 8, !dbg !51 + %rubyId_e128.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !51 + %85 = call i64 @rb_id2sym(i64 %rubyId_e128.i) #11, !dbg !51 + %86 = getelementptr i64, i64* %keywords125.i, i32 1, !dbg !51 + store i64 %85, i64* %86, align 8, !dbg !51 + %rubyId_baz130.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !51 + %87 = call i64 @rb_id2sym(i64 %rubyId_baz130.i) #11, !dbg !51 + %88 = getelementptr i64, i64* %keywords125.i, i32 2, !dbg !51 + store i64 %87, i64* %88, align 8, !dbg !51 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.17, i64 %rubyId_take_arguments124.i, i32 noundef 68, i32 noundef 7, i32 noundef 3, i64* noundef nonnull %keywords125.i), !dbg !51 + %rubyId_take_arguments134.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !52 + %rubyId_d136.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !52 + %89 = call i64 @rb_id2sym(i64 %rubyId_d136.i) #11, !dbg !52 + store i64 %89, i64* %keywords135.i, align 8, !dbg !52 + %rubyId_e138.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !52 + %90 = call i64 @rb_id2sym(i64 %rubyId_e138.i) #11, !dbg !52 + %91 = getelementptr i64, i64* %keywords135.i, i32 1, !dbg !52 + store i64 %90, i64* %91, align 8, !dbg !52 + %rubyId_baz140.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !52 + %92 = call i64 @rb_id2sym(i64 %rubyId_baz140.i) #11, !dbg !52 + %93 = getelementptr i64, i64* %keywords135.i, i32 2, !dbg !52 + store i64 %92, i64* %93, align 8, !dbg !52 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.18, i64 %rubyId_take_arguments134.i, i32 noundef 68, i32 noundef 6, i32 noundef 3, i64* noundef nonnull %keywords135.i), !dbg !52 + %rubyId_take_arguments144.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !53 + %rubyId_d146.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !53 + %94 = call i64 @rb_id2sym(i64 %rubyId_d146.i) #11, !dbg !53 + store i64 %94, i64* %keywords145.i, align 8, !dbg !53 + %rubyId_e148.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !53 + %95 = call i64 @rb_id2sym(i64 %rubyId_e148.i) #11, !dbg !53 + %96 = getelementptr i64, i64* %keywords145.i, i32 1, !dbg !53 + store i64 %95, i64* %96, align 8, !dbg !53 + %rubyId_baz150.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !53 + %97 = call i64 @rb_id2sym(i64 %rubyId_baz150.i) #11, !dbg !53 + %98 = getelementptr i64, i64* %keywords145.i, i32 2, !dbg !53 + store i64 %97, i64* %98, align 8, !dbg !53 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.19, i64 %rubyId_take_arguments144.i, i32 noundef 68, i32 noundef 5, i32 noundef 3, i64* noundef nonnull %keywords145.i), !dbg !53 + %rubyId_take_arguments154.i = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !54 + %rubyId_d156.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !54 + %99 = call i64 @rb_id2sym(i64 %rubyId_d156.i) #11, !dbg !54 + store i64 %99, i64* %keywords155.i, align 8, !dbg !54 + %rubyId_e158.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !54 + %100 = call i64 @rb_id2sym(i64 %rubyId_e158.i) #11, !dbg !54 + %101 = getelementptr i64, i64* %keywords155.i, i32 1, !dbg !54 + store i64 %100, i64* %101, align 8, !dbg !54 + %rubyId_baz160.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !54 + %102 = call i64 @rb_id2sym(i64 %rubyId_baz160.i) #11, !dbg !54 + %103 = getelementptr i64, i64* %keywords155.i, i32 2, !dbg !54 + store i64 %102, i64* %103, align 8, !dbg !54 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.20, i64 %rubyId_take_arguments154.i, i32 noundef 68, i32 noundef 4, i32 noundef 3, i64* noundef nonnull %keywords155.i), !dbg !54 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %0) call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %1) call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %2) @@ -723,7 +723,7 @@ entry: call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %20) %104 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %105 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %104, i64 0, i32 18 - %106 = load i64, i64* %105, align 8, !tbaa !67 + %106 = load i64, i64* %105, align 8, !tbaa !55 %107 = bitcast i64* %positional_table.i to i8* call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %107) %108 = bitcast i64* %keyword_table.i to i8* @@ -733,663 +733,614 @@ entry: %110 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %109, i64 0, i32 2 %111 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %110, align 8, !tbaa !14 %112 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %111, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %112, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %112, align 8, !tbaa !64 %113 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %111, i64 0, i32 4 - %114 = load i64*, i64** %113, align 8, !tbaa !76 + %114 = load i64*, i64** %113, align 8, !tbaa !65 %115 = load i64, i64* %114, align 8, !tbaa !4 %116 = and i64 %115, -33 store i64 %116, i64* %114, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %109, %struct.rb_control_frame_struct* align 8 %111, %struct.rb_iseq_struct* %stackFrame.i) #11 %117 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %111, i64 0, i32 0 - %118 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %112, align 8, !tbaa !18 - %119 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %118, i64 0, i32 2 - %120 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %119, align 8, !tbaa !20 - %121 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %120, i64 0, i32 2 - %122 = load i64*, i64** %121, align 8, !tbaa !22 - %123 = getelementptr inbounds i64, i64* %122, i64 3 - %124 = getelementptr inbounds i64, i64* %123, i64 1 - store i64* %124, i64** %117, align 8, !dbg !77, !tbaa !12 - %rubyId_take_arguments.i1 = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !44 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_take_arguments.i1) #11, !dbg !44 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !44 - %rawSym386.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #11, !dbg !44 - %125 = load i64, i64* @rb_cObject, align 8, !dbg !44 - %stackFrame387.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#take_arguments", align 8, !dbg !44 - %126 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #9, !dbg !44 - %127 = bitcast i8* %126 to i16*, !dbg !44 - %128 = load i16, i16* %127, align 8, !dbg !44 - %129 = and i16 %128, -384, !dbg !44 - %130 = or i16 %129, 119, !dbg !44 - store i16 %130, i16* %127, align 8, !dbg !44 - %131 = getelementptr inbounds i8, i8* %126, i64 8, !dbg !44 - %132 = bitcast i8* %131 to i32*, !dbg !44 - %133 = getelementptr inbounds i8, i8* %126, i64 12, !dbg !44 - %134 = bitcast i8* %133 to i32*, !dbg !44 - %135 = getelementptr inbounds i8, i8* %126, i64 16, !dbg !44 - %136 = getelementptr inbounds i8, i8* %126, i64 20, !dbg !44 - %137 = bitcast i8* %136 to i32*, !dbg !44 - store i32 0, i32* %137, align 4, !dbg !44, !tbaa !78 - %138 = getelementptr inbounds i8, i8* %126, i64 24, !dbg !44 - %139 = bitcast i8* %138 to i32*, !dbg !44 - store i32 0, i32* %139, align 8, !dbg !44, !tbaa !80 - %140 = getelementptr inbounds i8, i8* %126, i64 28, !dbg !44 - %141 = bitcast i8* %140 to i32*, !dbg !44 - store i32 3, i32* %141, align 4, !dbg !44, !tbaa !81 - %142 = getelementptr inbounds i8, i8* %126, i64 4, !dbg !44 - %143 = bitcast i8* %142 to i32*, !dbg !44 - %144 = bitcast i32* %143 to <4 x i32>*, !dbg !44 - store <4 x i32> , <4 x i32>* %144, align 4, !dbg !44, !tbaa !82 - %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !44 - store i64 %rubyId_a.i, i64* %positional_table.i, align 8, !dbg !44 - %rubyId_b.i = load i64, i64* @rubyIdPrecomputed_b, align 8, !dbg !44 - %145 = getelementptr i64, i64* %positional_table.i, i32 1, !dbg !44 - store i64 %rubyId_b.i, i64* %145, align 8, !dbg !44 - %rubyId_c.i = load i64, i64* @rubyIdPrecomputed_c, align 8, !dbg !44 - %146 = getelementptr i64, i64* %positional_table.i, i32 2, !dbg !44 - store i64 %rubyId_c.i, i64* %146, align 8, !dbg !44 - %rubyId_g.i = load i64, i64* @rubyIdPrecomputed_g, align 8, !dbg !44 - %147 = getelementptr i64, i64* %positional_table.i, i32 3, !dbg !44 - store i64 %rubyId_g.i, i64* %147, align 8, !dbg !44 - %148 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 4, i64 noundef 8) #9, !dbg !44 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %148, i8* nocapture noundef nonnull readonly align 8 dereferenceable(24) %107, i64 noundef 32, i1 noundef false) #11, !dbg !44 - %149 = getelementptr inbounds i8, i8* %126, i64 32, !dbg !44 - %150 = bitcast i8* %149 to i8**, !dbg !44 - store i8* %148, i8** %150, align 8, !dbg !44, !tbaa !83 - %rubyId_d.i2 = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !44 - store i64 %rubyId_d.i2, i64* %keyword_table.i, align 8, !dbg !44 - %rubyId_e.i3 = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !44 - %151 = getelementptr i64, i64* %keyword_table.i, i32 1, !dbg !44 - store i64 %rubyId_e.i3, i64* %151, align 8, !dbg !44 - %rubyId_f.i = load i64, i64* @rubyIdPrecomputed_f, align 8, !dbg !44 - %152 = getelementptr i64, i64* %keyword_table.i, i32 2, !dbg !44 - store i64 %rubyId_f.i, i64* %152, align 8, !dbg !44 - %153 = getelementptr inbounds i8, i8* %126, i64 40, !dbg !44 - %154 = bitcast i8* %153 to i32*, !dbg !44 - store i32 2, i32* %154, align 8, !dbg !44, !tbaa !84 - %155 = getelementptr inbounds i8, i8* %126, i64 44, !dbg !44 - %156 = bitcast i8* %155 to i32*, !dbg !44 - store i32 1, i32* %156, align 4, !dbg !44, !tbaa !85 - %157 = load i32, i32* %132, align 8, !dbg !44, !tbaa !86 - %158 = load i32, i32* %134, align 4, !dbg !44, !tbaa !87 - %159 = add i32 %157, 2, !dbg !44 - %160 = add i32 %159, %158, !dbg !44 - %161 = getelementptr inbounds i8, i8* %126, i64 48, !dbg !44 - %162 = bitcast i8* %161 to i32*, !dbg !44 - store i32 %160, i32* %162, align 8, !dbg !44, !tbaa !88 - %163 = load i16, i16* %127, align 8, !dbg !44 - %164 = and i16 %163, 32, !dbg !44 - %165 = icmp eq i16 %164, 0, !dbg !44 - br i1 %165, label %"func_.$152.exit", label %166, !dbg !44 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %117, align 8, !dbg !66, !tbaa !12 + %rubyId_take_arguments.i1 = load i64, i64* @rubyIdPrecomputed_take_arguments, align 8, !dbg !32 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_take_arguments.i1) #11, !dbg !32 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !32 + %rawSym386.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #11, !dbg !32 + %118 = load i64, i64* @rb_cObject, align 8, !dbg !32 + %stackFrame387.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#take_arguments", align 8, !dbg !32 + %119 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #9, !dbg !32 + %120 = bitcast i8* %119 to i16*, !dbg !32 + %121 = load i16, i16* %120, align 8, !dbg !32 + %122 = and i16 %121, -384, !dbg !32 + %123 = or i16 %122, 119, !dbg !32 + store i16 %123, i16* %120, align 8, !dbg !32 + %124 = getelementptr inbounds i8, i8* %119, i64 8, !dbg !32 + %125 = bitcast i8* %124 to i32*, !dbg !32 + %126 = getelementptr inbounds i8, i8* %119, i64 12, !dbg !32 + %127 = bitcast i8* %126 to i32*, !dbg !32 + %128 = getelementptr inbounds i8, i8* %119, i64 16, !dbg !32 + %129 = getelementptr inbounds i8, i8* %119, i64 20, !dbg !32 + %130 = bitcast i8* %129 to i32*, !dbg !32 + store i32 0, i32* %130, align 4, !dbg !32, !tbaa !67 + %131 = getelementptr inbounds i8, i8* %119, i64 24, !dbg !32 + %132 = bitcast i8* %131 to i32*, !dbg !32 + store i32 0, i32* %132, align 8, !dbg !32, !tbaa !70 + %133 = getelementptr inbounds i8, i8* %119, i64 28, !dbg !32 + %134 = bitcast i8* %133 to i32*, !dbg !32 + store i32 3, i32* %134, align 4, !dbg !32, !tbaa !71 + %135 = getelementptr inbounds i8, i8* %119, i64 4, !dbg !32 + %136 = bitcast i8* %135 to i32*, !dbg !32 + %137 = bitcast i32* %136 to <4 x i32>*, !dbg !32 + store <4 x i32> , <4 x i32>* %137, align 4, !dbg !32, !tbaa !72 + %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !32 + store i64 %rubyId_a.i, i64* %positional_table.i, align 8, !dbg !32 + %rubyId_b.i = load i64, i64* @rubyIdPrecomputed_b, align 8, !dbg !32 + %138 = getelementptr i64, i64* %positional_table.i, i32 1, !dbg !32 + store i64 %rubyId_b.i, i64* %138, align 8, !dbg !32 + %rubyId_c.i = load i64, i64* @rubyIdPrecomputed_c, align 8, !dbg !32 + %139 = getelementptr i64, i64* %positional_table.i, i32 2, !dbg !32 + store i64 %rubyId_c.i, i64* %139, align 8, !dbg !32 + %rubyId_g.i = load i64, i64* @rubyIdPrecomputed_g, align 8, !dbg !32 + %140 = getelementptr i64, i64* %positional_table.i, i32 3, !dbg !32 + store i64 %rubyId_g.i, i64* %140, align 8, !dbg !32 + %141 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 4, i64 noundef 8) #9, !dbg !32 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %141, i8* nocapture noundef nonnull readonly align 8 dereferenceable(24) %107, i64 noundef 32, i1 noundef false) #11, !dbg !32 + %142 = getelementptr inbounds i8, i8* %119, i64 32, !dbg !32 + %143 = bitcast i8* %142 to i8**, !dbg !32 + store i8* %141, i8** %143, align 8, !dbg !32, !tbaa !73 + %rubyId_d.i2 = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !32 + store i64 %rubyId_d.i2, i64* %keyword_table.i, align 8, !dbg !32 + %rubyId_e.i3 = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !32 + %144 = getelementptr i64, i64* %keyword_table.i, i32 1, !dbg !32 + store i64 %rubyId_e.i3, i64* %144, align 8, !dbg !32 + %rubyId_f.i = load i64, i64* @rubyIdPrecomputed_f, align 8, !dbg !32 + %145 = getelementptr i64, i64* %keyword_table.i, i32 2, !dbg !32 + store i64 %rubyId_f.i, i64* %145, align 8, !dbg !32 + %146 = getelementptr inbounds i8, i8* %119, i64 40, !dbg !32 + %147 = bitcast i8* %146 to i32*, !dbg !32 + store i32 2, i32* %147, align 8, !dbg !32, !tbaa !74 + %148 = getelementptr inbounds i8, i8* %119, i64 44, !dbg !32 + %149 = bitcast i8* %148 to i32*, !dbg !32 + store i32 1, i32* %149, align 4, !dbg !32, !tbaa !75 + %150 = load i32, i32* %125, align 8, !dbg !32, !tbaa !76 + %151 = load i32, i32* %127, align 4, !dbg !32, !tbaa !77 + %152 = add i32 %150, 2, !dbg !32 + %153 = add i32 %152, %151, !dbg !32 + %154 = getelementptr inbounds i8, i8* %119, i64 48, !dbg !32 + %155 = bitcast i8* %154 to i32*, !dbg !32 + store i32 %153, i32* %155, align 8, !dbg !32, !tbaa !78 + %156 = load i16, i16* %120, align 8, !dbg !32 + %157 = and i16 %156, 32, !dbg !32 + %158 = icmp eq i16 %157, 0, !dbg !32 + br i1 %158, label %"func_.$152.exit", label %159, !dbg !32 -166: ; preds = %entry - %167 = add nsw i32 %160, 1, !dbg !44 - %168 = getelementptr inbounds i8, i8* %126, i64 52, !dbg !44 - %169 = bitcast i8* %168 to i32*, !dbg !44 - store i32 %167, i32* %169, align 4, !dbg !44, !tbaa !89 - br label %"func_.$152.exit", !dbg !44 +159: ; preds = %entry + %160 = add nsw i32 %153, 1, !dbg !32 + %161 = getelementptr inbounds i8, i8* %119, i64 52, !dbg !32 + %162 = bitcast i8* %161 to i32*, !dbg !32 + store i32 %160, i32* %162, align 4, !dbg !32, !tbaa !79 + br label %"func_.$152.exit", !dbg !32 -"func_.$152.exit": ; preds = %entry, %166 - %170 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 3, i64 noundef 8) #9, !dbg !44 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %170, i8* nocapture noundef nonnull readonly align 8 dereferenceable(24) %108, i64 noundef 24, i1 noundef false) #11, !dbg !44 - %171 = getelementptr inbounds i8, i8* %126, i64 56, !dbg !44 - %172 = bitcast i8* %171 to i8**, !dbg !44 - store i8* %170, i8** %172, align 8, !dbg !44, !tbaa !90 - %173 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([15 x i8], [15 x i8]* @str_take_arguments, i64 0, i64 0)) #11, !dbg !44 - %174 = bitcast i8* %126 to %struct.rb_sorbet_param_struct*, !dbg !44 - %175 = bitcast %struct.rb_iseq_struct* %stackFrame387.i to i8*, !dbg !44 - call void @rb_add_method_sorbet(i64 %125, i64 %173, i64 (i32, i64*, i64)* noundef @"func_Object#take_arguments", %struct.rb_sorbet_param_struct* nonnull %174, i32 noundef 1, i8* %175) #11, !dbg !44 - %176 = getelementptr inbounds i64, i64* %122, i64 7, !dbg !44 - %177 = getelementptr inbounds i64, i64* %176, i64 1, !dbg !44 - store i64* %177, i64** %117, align 8, !dbg !44, !tbaa !12 - %rubyId_d398.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !91 - %rawSym399.i = call i64 @rb_id2sym(i64 %rubyId_d398.i) #11, !dbg !91 - %178 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !46, !tbaa !12 - %179 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %178, i64 0, i32 2, !dbg !46 - %180 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %179, align 8, !dbg !46, !tbaa !14 - %181 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %180, i64 0, i32 1, !dbg !46 - %182 = load i64*, i64** %181, align 8, !dbg !46, !tbaa !42 - %183 = getelementptr inbounds i64, i64* %182, i64 1, !dbg !46 - store i64 %106, i64* %182, align 8, !dbg !46, !tbaa !4 - %184 = getelementptr inbounds i64, i64* %183, i64 1, !dbg !46 - %185 = getelementptr inbounds i64, i64* %184, i64 1, !dbg !46 - %186 = getelementptr inbounds i64, i64* %185, i64 1, !dbg !46 - %187 = getelementptr inbounds i64, i64* %186, i64 1, !dbg !46 - %188 = bitcast i64* %183 to <4 x i64>*, !dbg !46 - store <4 x i64> , <4 x i64>* %188, align 8, !dbg !46, !tbaa !4 - %189 = getelementptr inbounds i64, i64* %187, i64 1, !dbg !46 - %190 = getelementptr inbounds i64, i64* %189, i64 1, !dbg !46 - %191 = bitcast i64* %187 to <2 x i64>*, !dbg !46 - store <2 x i64> , <2 x i64>* %191, align 8, !dbg !46, !tbaa !4 - %192 = getelementptr inbounds i64, i64* %190, i64 1, !dbg !46 - store i64 -13, i64* %190, align 8, !dbg !46, !tbaa !4 - %193 = getelementptr inbounds i64, i64* %192, i64 1, !dbg !46 - store i64* %193, i64** %181, align 8, !dbg !46, !tbaa !42 - store i64 -15, i64* %192, align 8, !dbg !46, !tbaa !4 - %send413.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments, i64 0) #11, !dbg !46 - %194 = getelementptr inbounds i64, i64* %122, i64 8, !dbg !46 - %195 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !46 - store i64* %195, i64** %117, align 8, !dbg !46, !tbaa !12 - %rubyId_d420.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !92 - %rawSym421.i = call i64 @rb_id2sym(i64 %rubyId_d420.i) #11, !dbg !92 - %196 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !47, !tbaa !12 - %197 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %196, i64 0, i32 2, !dbg !47 - %198 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %197, align 8, !dbg !47, !tbaa !14 - %199 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %198, i64 0, i32 1, !dbg !47 - %200 = load i64*, i64** %199, align 8, !dbg !47, !tbaa !42 - %201 = getelementptr inbounds i64, i64* %200, i64 1, !dbg !47 - store i64 %106, i64* %200, align 8, !dbg !47, !tbaa !4 - %202 = getelementptr inbounds i64, i64* %201, i64 1, !dbg !47 - %203 = getelementptr inbounds i64, i64* %202, i64 1, !dbg !47 - %204 = getelementptr inbounds i64, i64* %203, i64 1, !dbg !47 - %205 = getelementptr inbounds i64, i64* %204, i64 1, !dbg !47 - %206 = bitcast i64* %201 to <4 x i64>*, !dbg !47 - store <4 x i64> , <4 x i64>* %206, align 8, !dbg !47, !tbaa !4 - %207 = getelementptr inbounds i64, i64* %205, i64 1, !dbg !47 - %208 = getelementptr inbounds i64, i64* %207, i64 1, !dbg !47 - %209 = bitcast i64* %205 to <2 x i64>*, !dbg !47 - store <2 x i64> , <2 x i64>* %209, align 8, !dbg !47, !tbaa !4 - %210 = getelementptr inbounds i64, i64* %208, i64 1, !dbg !47 - store i64* %210, i64** %199, align 8, !dbg !47, !tbaa !42 - store i64 -15, i64* %208, align 8, !dbg !47, !tbaa !4 - %send435.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.1, i64 0) #11, !dbg !47 - %211 = getelementptr inbounds i64, i64* %122, i64 9, !dbg !47 - %212 = getelementptr inbounds i64, i64* %211, i64 1, !dbg !47 - store i64* %212, i64** %117, align 8, !dbg !47, !tbaa !12 - %rubyId_d441.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !93 - %rawSym442.i = call i64 @rb_id2sym(i64 %rubyId_d441.i) #11, !dbg !93 - %213 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !12 - %214 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %213, i64 0, i32 2, !dbg !48 - %215 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %214, align 8, !dbg !48, !tbaa !14 - %216 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %215, i64 0, i32 1, !dbg !48 - %217 = load i64*, i64** %216, align 8, !dbg !48, !tbaa !42 - %218 = getelementptr inbounds i64, i64* %217, i64 1, !dbg !48 - store i64 %106, i64* %217, align 8, !dbg !48, !tbaa !4 - %219 = getelementptr inbounds i64, i64* %218, i64 1, !dbg !48 - %220 = getelementptr inbounds i64, i64* %219, i64 1, !dbg !48 - %221 = getelementptr inbounds i64, i64* %220, i64 1, !dbg !48 - %222 = getelementptr inbounds i64, i64* %221, i64 1, !dbg !48 - %223 = bitcast i64* %218 to <4 x i64>*, !dbg !48 - store <4 x i64> , <4 x i64>* %223, align 8, !dbg !48, !tbaa !4 - %224 = getelementptr inbounds i64, i64* %222, i64 1, !dbg !48 - %225 = getelementptr inbounds i64, i64* %224, i64 1, !dbg !48 - store i64* %225, i64** %216, align 8, !dbg !48, !tbaa !42 - %226 = bitcast i64* %222 to <2 x i64>*, !dbg !48 - store <2 x i64> , <2 x i64>* %226, align 8, !dbg !48, !tbaa !4 - %send455.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.2, i64 0) #11, !dbg !48 - %227 = getelementptr inbounds i64, i64* %122, i64 10, !dbg !48 - %228 = getelementptr inbounds i64, i64* %227, i64 1, !dbg !48 - store i64* %228, i64** %117, align 8, !dbg !48, !tbaa !12 - %rubyId_d460.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !94 - %rawSym461.i = call i64 @rb_id2sym(i64 %rubyId_d460.i) #11, !dbg !94 - %229 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !12 - %230 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %229, i64 0, i32 2, !dbg !49 - %231 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %230, align 8, !dbg !49, !tbaa !14 - %232 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %231, i64 0, i32 1, !dbg !49 - %233 = load i64*, i64** %232, align 8, !dbg !49, !tbaa !42 - %234 = getelementptr inbounds i64, i64* %233, i64 1, !dbg !49 - store i64 %106, i64* %233, align 8, !dbg !49, !tbaa !4 - %235 = getelementptr inbounds i64, i64* %234, i64 1, !dbg !49 - %236 = getelementptr inbounds i64, i64* %235, i64 1, !dbg !49 - %237 = getelementptr inbounds i64, i64* %236, i64 1, !dbg !49 - %238 = getelementptr inbounds i64, i64* %237, i64 1, !dbg !49 - %239 = bitcast i64* %234 to <4 x i64>*, !dbg !49 - store <4 x i64> , <4 x i64>* %239, align 8, !dbg !49, !tbaa !4 - %240 = getelementptr inbounds i64, i64* %238, i64 1, !dbg !49 - store i64* %240, i64** %232, align 8, !dbg !49, !tbaa !42 - store i64 -15, i64* %238, align 8, !dbg !49, !tbaa !4 - %send473.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.3, i64 0) #11, !dbg !49 - %241 = getelementptr inbounds i64, i64* %122, i64 11, !dbg !49 - %242 = getelementptr inbounds i64, i64* %241, i64 1, !dbg !49 - store i64* %242, i64** %117, align 8, !dbg !49, !tbaa !12 - %rubyId_d477.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !95 - %rawSym478.i = call i64 @rb_id2sym(i64 %rubyId_d477.i) #11, !dbg !95 - %243 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !50, !tbaa !12 - %244 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %243, i64 0, i32 2, !dbg !50 - %245 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %244, align 8, !dbg !50, !tbaa !14 - %246 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %245, i64 0, i32 1, !dbg !50 - %247 = load i64*, i64** %246, align 8, !dbg !50, !tbaa !42 - %248 = getelementptr inbounds i64, i64* %247, i64 1, !dbg !50 - store i64 %106, i64* %247, align 8, !dbg !50, !tbaa !4 - %249 = getelementptr inbounds i64, i64* %248, i64 1, !dbg !50 - %250 = getelementptr inbounds i64, i64* %249, i64 1, !dbg !50 - %251 = getelementptr inbounds i64, i64* %250, i64 1, !dbg !50 - %252 = getelementptr inbounds i64, i64* %251, i64 1, !dbg !50 - store i64* %252, i64** %246, align 8, !dbg !50, !tbaa !42 - %253 = bitcast i64* %248 to <4 x i64>*, !dbg !50 - store <4 x i64> , <4 x i64>* %253, align 8, !dbg !50, !tbaa !4 - %send489.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.4, i64 0) #11, !dbg !50 - %254 = getelementptr inbounds i64, i64* %122, i64 12, !dbg !50 - %255 = getelementptr inbounds i64, i64* %254, i64 1, !dbg !50 - store i64* %255, i64** %117, align 8, !dbg !50, !tbaa !12 - %rubyId_d492.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !96 - %rawSym493.i = call i64 @rb_id2sym(i64 %rubyId_d492.i) #11, !dbg !96 - %256 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !51, !tbaa !12 - %257 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %256, i64 0, i32 2, !dbg !51 - %258 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %257, align 8, !dbg !51, !tbaa !14 - %259 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %258, i64 0, i32 1, !dbg !51 - %260 = load i64*, i64** %259, align 8, !dbg !51, !tbaa !42 - %261 = getelementptr inbounds i64, i64* %260, i64 1, !dbg !51 - store i64 %106, i64* %260, align 8, !dbg !51, !tbaa !4 - %262 = getelementptr inbounds i64, i64* %261, i64 1, !dbg !51 - %263 = getelementptr inbounds i64, i64* %262, i64 1, !dbg !51 - %264 = bitcast i64* %261 to <2 x i64>*, !dbg !51 - store <2 x i64> , <2 x i64>* %264, align 8, !dbg !51, !tbaa !4 - %265 = getelementptr inbounds i64, i64* %263, i64 1, !dbg !51 - store i64* %265, i64** %259, align 8, !dbg !51, !tbaa !42 - store i64 -15, i64* %263, align 8, !dbg !51, !tbaa !4 - %send503.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.5, i64 0) #11, !dbg !51 - %266 = getelementptr inbounds i64, i64* %122, i64 13, !dbg !51 - %267 = getelementptr inbounds i64, i64* %266, i64 1, !dbg !51 - store i64* %267, i64** %117, align 8, !dbg !51, !tbaa !12 - %rubyId_d505.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !97 - %rawSym506.i = call i64 @rb_id2sym(i64 %rubyId_d505.i) #11, !dbg !97 - %268 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !52, !tbaa !12 - %269 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %268, i64 0, i32 2, !dbg !52 - %270 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %269, align 8, !dbg !52, !tbaa !14 - %271 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %270, i64 0, i32 1, !dbg !52 - %272 = load i64*, i64** %271, align 8, !dbg !52, !tbaa !42 - %273 = getelementptr inbounds i64, i64* %272, i64 1, !dbg !52 - store i64 %106, i64* %272, align 8, !dbg !52, !tbaa !4 - %274 = getelementptr inbounds i64, i64* %273, i64 1, !dbg !52 - %275 = getelementptr inbounds i64, i64* %274, i64 1, !dbg !52 - store i64* %275, i64** %271, align 8, !dbg !52, !tbaa !42 - %276 = bitcast i64* %273 to <2 x i64>*, !dbg !52 - store <2 x i64> , <2 x i64>* %276, align 8, !dbg !52, !tbaa !4 - %send515.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.6, i64 0) #11, !dbg !52 - %277 = getelementptr inbounds i64, i64* %122, i64 15, !dbg !52 - %278 = getelementptr inbounds i64, i64* %277, i64 1, !dbg !52 - store i64* %278, i64** %117, align 8, !dbg !52, !tbaa !12 - %rubyId_d523.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !98 - %rawSym524.i = call i64 @rb_id2sym(i64 %rubyId_d523.i) #11, !dbg !98 - %rubyId_e526.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !99 - %rawSym527.i = call i64 @rb_id2sym(i64 %rubyId_e526.i) #11, !dbg !99 - %279 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !53, !tbaa !12 - %280 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %279, i64 0, i32 2, !dbg !53 - %281 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %280, align 8, !dbg !53, !tbaa !14 - %282 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %281, i64 0, i32 1, !dbg !53 - %283 = load i64*, i64** %282, align 8, !dbg !53, !tbaa !42 - %284 = getelementptr inbounds i64, i64* %283, i64 1, !dbg !53 - store i64 %106, i64* %283, align 8, !dbg !53, !tbaa !4 - %285 = getelementptr inbounds i64, i64* %284, i64 1, !dbg !53 - %286 = getelementptr inbounds i64, i64* %285, i64 1, !dbg !53 - %287 = getelementptr inbounds i64, i64* %286, i64 1, !dbg !53 - %288 = getelementptr inbounds i64, i64* %287, i64 1, !dbg !53 - %289 = bitcast i64* %284 to <4 x i64>*, !dbg !53 - store <4 x i64> , <4 x i64>* %289, align 8, !dbg !53, !tbaa !4 - %290 = getelementptr inbounds i64, i64* %288, i64 1, !dbg !53 - %291 = getelementptr inbounds i64, i64* %290, i64 1, !dbg !53 - %292 = bitcast i64* %288 to <2 x i64>*, !dbg !53 - store <2 x i64> , <2 x i64>* %292, align 8, !dbg !53, !tbaa !4 - %293 = getelementptr inbounds i64, i64* %291, i64 1, !dbg !53 - store i64 -13, i64* %291, align 8, !dbg !53, !tbaa !4 - %294 = getelementptr inbounds i64, i64* %293, i64 1, !dbg !53 - store i64 -15, i64* %293, align 8, !dbg !53, !tbaa !4 - %295 = getelementptr inbounds i64, i64* %294, i64 1, !dbg !53 - store i64* %295, i64** %282, align 8, !dbg !53, !tbaa !42 - store i64 -17, i64* %294, align 8, !dbg !53, !tbaa !4 - %send543.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.7, i64 0) #11, !dbg !53 - %296 = getelementptr inbounds i64, i64* %122, i64 16, !dbg !53 - %297 = getelementptr inbounds i64, i64* %296, i64 1, !dbg !53 - store i64* %297, i64** %117, align 8, !dbg !53, !tbaa !12 - %rubyId_d550.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !100 - %rawSym551.i = call i64 @rb_id2sym(i64 %rubyId_d550.i) #11, !dbg !100 - %rubyId_e553.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !101 - %rawSym554.i = call i64 @rb_id2sym(i64 %rubyId_e553.i) #11, !dbg !101 - %298 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !54, !tbaa !12 - %299 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %298, i64 0, i32 2, !dbg !54 - %300 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %299, align 8, !dbg !54, !tbaa !14 - %301 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %300, i64 0, i32 1, !dbg !54 - %302 = load i64*, i64** %301, align 8, !dbg !54, !tbaa !42 - %303 = getelementptr inbounds i64, i64* %302, i64 1, !dbg !54 - store i64 %106, i64* %302, align 8, !dbg !54, !tbaa !4 - %304 = getelementptr inbounds i64, i64* %303, i64 1, !dbg !54 - %305 = getelementptr inbounds i64, i64* %304, i64 1, !dbg !54 - %306 = getelementptr inbounds i64, i64* %305, i64 1, !dbg !54 - %307 = getelementptr inbounds i64, i64* %306, i64 1, !dbg !54 - %308 = bitcast i64* %303 to <4 x i64>*, !dbg !54 - store <4 x i64> , <4 x i64>* %308, align 8, !dbg !54, !tbaa !4 - %309 = getelementptr inbounds i64, i64* %307, i64 1, !dbg !54 - %310 = getelementptr inbounds i64, i64* %309, i64 1, !dbg !54 - %311 = bitcast i64* %307 to <2 x i64>*, !dbg !54 - store <2 x i64> , <2 x i64>* %311, align 8, !dbg !54, !tbaa !4 - %312 = getelementptr inbounds i64, i64* %310, i64 1, !dbg !54 - store i64 -15, i64* %310, align 8, !dbg !54, !tbaa !4 - %313 = getelementptr inbounds i64, i64* %312, i64 1, !dbg !54 - store i64* %313, i64** %301, align 8, !dbg !54, !tbaa !42 - store i64 -17, i64* %312, align 8, !dbg !54, !tbaa !4 - %send569.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.8, i64 0) #11, !dbg !54 - %314 = getelementptr inbounds i64, i64* %122, i64 17, !dbg !54 - %315 = getelementptr inbounds i64, i64* %314, i64 1, !dbg !54 - store i64* %315, i64** %117, align 8, !dbg !54, !tbaa !12 - %rubyId_d575.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !102 - %rawSym576.i = call i64 @rb_id2sym(i64 %rubyId_d575.i) #11, !dbg !102 - %rubyId_e578.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !103 - %rawSym579.i = call i64 @rb_id2sym(i64 %rubyId_e578.i) #11, !dbg !103 - %316 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !55, !tbaa !12 - %317 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %316, i64 0, i32 2, !dbg !55 - %318 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %317, align 8, !dbg !55, !tbaa !14 - %319 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %318, i64 0, i32 1, !dbg !55 - %320 = load i64*, i64** %319, align 8, !dbg !55, !tbaa !42 - %321 = getelementptr inbounds i64, i64* %320, i64 1, !dbg !55 - store i64 %106, i64* %320, align 8, !dbg !55, !tbaa !4 - %322 = getelementptr inbounds i64, i64* %321, i64 1, !dbg !55 - %323 = getelementptr inbounds i64, i64* %322, i64 1, !dbg !55 - %324 = getelementptr inbounds i64, i64* %323, i64 1, !dbg !55 - %325 = getelementptr inbounds i64, i64* %324, i64 1, !dbg !55 - %326 = bitcast i64* %321 to <4 x i64>*, !dbg !55 - store <4 x i64> , <4 x i64>* %326, align 8, !dbg !55, !tbaa !4 - %327 = getelementptr inbounds i64, i64* %325, i64 1, !dbg !55 - %328 = getelementptr inbounds i64, i64* %327, i64 1, !dbg !55 - %329 = bitcast i64* %325 to <2 x i64>*, !dbg !55 - store <2 x i64> , <2 x i64>* %329, align 8, !dbg !55, !tbaa !4 - %330 = getelementptr inbounds i64, i64* %328, i64 1, !dbg !55 - store i64* %330, i64** %319, align 8, !dbg !55, !tbaa !42 - store i64 -17, i64* %328, align 8, !dbg !55, !tbaa !4 - %send593.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.9, i64 0) #11, !dbg !55 - %331 = getelementptr inbounds i64, i64* %122, i64 18, !dbg !55 - %332 = getelementptr inbounds i64, i64* %331, i64 1, !dbg !55 - store i64* %332, i64** %117, align 8, !dbg !55, !tbaa !12 - %rubyId_d598.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !104 - %rawSym599.i = call i64 @rb_id2sym(i64 %rubyId_d598.i) #11, !dbg !104 - %rubyId_e601.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !105 - %rawSym602.i = call i64 @rb_id2sym(i64 %rubyId_e601.i) #11, !dbg !105 - %333 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !56, !tbaa !12 - %334 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %333, i64 0, i32 2, !dbg !56 - %335 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %334, align 8, !dbg !56, !tbaa !14 - %336 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %335, i64 0, i32 1, !dbg !56 - %337 = load i64*, i64** %336, align 8, !dbg !56, !tbaa !42 - %338 = getelementptr inbounds i64, i64* %337, i64 1, !dbg !56 - store i64 %106, i64* %337, align 8, !dbg !56, !tbaa !4 - %339 = getelementptr inbounds i64, i64* %338, i64 1, !dbg !56 - %340 = getelementptr inbounds i64, i64* %339, i64 1, !dbg !56 - %341 = getelementptr inbounds i64, i64* %340, i64 1, !dbg !56 - %342 = getelementptr inbounds i64, i64* %341, i64 1, !dbg !56 - %343 = bitcast i64* %338 to <4 x i64>*, !dbg !56 - store <4 x i64> , <4 x i64>* %343, align 8, !dbg !56, !tbaa !4 - %344 = getelementptr inbounds i64, i64* %342, i64 1, !dbg !56 - %345 = getelementptr inbounds i64, i64* %344, i64 1, !dbg !56 - store i64* %345, i64** %336, align 8, !dbg !56, !tbaa !42 - %346 = bitcast i64* %342 to <2 x i64>*, !dbg !56 - store <2 x i64> , <2 x i64>* %346, align 8, !dbg !56, !tbaa !4 - %send615.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.10, i64 0) #11, !dbg !56 - %347 = getelementptr inbounds i64, i64* %122, i64 19, !dbg !56 - %348 = getelementptr inbounds i64, i64* %347, i64 1, !dbg !56 - store i64* %348, i64** %117, align 8, !dbg !56, !tbaa !12 - %rubyId_d619.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !106 - %rawSym620.i = call i64 @rb_id2sym(i64 %rubyId_d619.i) #11, !dbg !106 - %rubyId_e622.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !107 - %rawSym623.i = call i64 @rb_id2sym(i64 %rubyId_e622.i) #11, !dbg !107 - %349 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !57, !tbaa !12 - %350 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %349, i64 0, i32 2, !dbg !57 - %351 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %350, align 8, !dbg !57, !tbaa !14 - %352 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %351, i64 0, i32 1, !dbg !57 - %353 = load i64*, i64** %352, align 8, !dbg !57, !tbaa !42 - %354 = getelementptr inbounds i64, i64* %353, i64 1, !dbg !57 - store i64 %106, i64* %353, align 8, !dbg !57, !tbaa !4 - %355 = getelementptr inbounds i64, i64* %354, i64 1, !dbg !57 - %356 = getelementptr inbounds i64, i64* %355, i64 1, !dbg !57 - %357 = getelementptr inbounds i64, i64* %356, i64 1, !dbg !57 - %358 = getelementptr inbounds i64, i64* %357, i64 1, !dbg !57 - %359 = bitcast i64* %354 to <4 x i64>*, !dbg !57 - store <4 x i64> , <4 x i64>* %359, align 8, !dbg !57, !tbaa !4 - %360 = getelementptr inbounds i64, i64* %358, i64 1, !dbg !57 - store i64* %360, i64** %352, align 8, !dbg !57, !tbaa !42 - store i64 -17, i64* %358, align 8, !dbg !57, !tbaa !4 - %send635.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.11, i64 0) #11, !dbg !57 - %361 = getelementptr inbounds i64, i64* %122, i64 20, !dbg !57 - %362 = getelementptr inbounds i64, i64* %361, i64 1, !dbg !57 - store i64* %362, i64** %117, align 8, !dbg !57, !tbaa !12 - %rubyId_d638.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !108 - %rawSym639.i = call i64 @rb_id2sym(i64 %rubyId_d638.i) #11, !dbg !108 - %rubyId_e641.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !109 - %rawSym642.i = call i64 @rb_id2sym(i64 %rubyId_e641.i) #11, !dbg !109 - %363 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !58, !tbaa !12 - %364 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %363, i64 0, i32 2, !dbg !58 - %365 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %364, align 8, !dbg !58, !tbaa !14 - %366 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %365, i64 0, i32 1, !dbg !58 - %367 = load i64*, i64** %366, align 8, !dbg !58, !tbaa !42 - %368 = getelementptr inbounds i64, i64* %367, i64 1, !dbg !58 - store i64 %106, i64* %367, align 8, !dbg !58, !tbaa !4 - %369 = getelementptr inbounds i64, i64* %368, i64 1, !dbg !58 - %370 = getelementptr inbounds i64, i64* %369, i64 1, !dbg !58 - %371 = getelementptr inbounds i64, i64* %370, i64 1, !dbg !58 - %372 = getelementptr inbounds i64, i64* %371, i64 1, !dbg !58 - store i64* %372, i64** %366, align 8, !dbg !58, !tbaa !42 - %373 = bitcast i64* %368 to <4 x i64>*, !dbg !58 - store <4 x i64> , <4 x i64>* %373, align 8, !dbg !58, !tbaa !4 - %send653.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.12, i64 0) #11, !dbg !58 - %374 = getelementptr inbounds i64, i64* %122, i64 21, !dbg !58 - %375 = getelementptr inbounds i64, i64* %374, i64 1, !dbg !58 - store i64* %375, i64** %117, align 8, !dbg !58, !tbaa !12 - %rubyId_d655.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !110 - %rawSym656.i = call i64 @rb_id2sym(i64 %rubyId_d655.i) #11, !dbg !110 - %rubyId_e658.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !111 - %rawSym659.i = call i64 @rb_id2sym(i64 %rubyId_e658.i) #11, !dbg !111 - %376 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !59, !tbaa !12 - %377 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %376, i64 0, i32 2, !dbg !59 - %378 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %377, align 8, !dbg !59, !tbaa !14 - %379 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %378, i64 0, i32 1, !dbg !59 - %380 = load i64*, i64** %379, align 8, !dbg !59, !tbaa !42 - %381 = getelementptr inbounds i64, i64* %380, i64 1, !dbg !59 - store i64 %106, i64* %380, align 8, !dbg !59, !tbaa !4 - %382 = getelementptr inbounds i64, i64* %381, i64 1, !dbg !59 - %383 = getelementptr inbounds i64, i64* %382, i64 1, !dbg !59 - %384 = bitcast i64* %381 to <2 x i64>*, !dbg !59 - store <2 x i64> , <2 x i64>* %384, align 8, !dbg !59, !tbaa !4 - %385 = getelementptr inbounds i64, i64* %383, i64 1, !dbg !59 - store i64* %385, i64** %379, align 8, !dbg !59, !tbaa !42 - store i64 -17, i64* %383, align 8, !dbg !59, !tbaa !4 - %send669.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.13, i64 0) #11, !dbg !59 - %386 = getelementptr inbounds i64, i64* %122, i64 23, !dbg !59 - %387 = getelementptr inbounds i64, i64* %386, i64 1, !dbg !59 - store i64* %387, i64** %117, align 8, !dbg !59, !tbaa !12 - %rubyId_d677.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !112 - %rawSym678.i = call i64 @rb_id2sym(i64 %rubyId_d677.i) #11, !dbg !112 - %rubyId_e680.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !113 - %rawSym681.i = call i64 @rb_id2sym(i64 %rubyId_e680.i) #11, !dbg !113 - %rubyId_baz.i4 = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !114 - %rawSym683.i = call i64 @rb_id2sym(i64 %rubyId_baz.i4) #11, !dbg !114 - %388 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !60, !tbaa !12 - %389 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %388, i64 0, i32 2, !dbg !60 - %390 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %389, align 8, !dbg !60, !tbaa !14 - %391 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %390, i64 0, i32 1, !dbg !60 - %392 = load i64*, i64** %391, align 8, !dbg !60, !tbaa !42 - %393 = getelementptr inbounds i64, i64* %392, i64 1, !dbg !60 - store i64 %106, i64* %392, align 8, !dbg !60, !tbaa !4 - %394 = getelementptr inbounds i64, i64* %393, i64 1, !dbg !60 - %395 = getelementptr inbounds i64, i64* %394, i64 1, !dbg !60 - %396 = getelementptr inbounds i64, i64* %395, i64 1, !dbg !60 - %397 = getelementptr inbounds i64, i64* %396, i64 1, !dbg !60 - %398 = bitcast i64* %393 to <4 x i64>*, !dbg !60 - store <4 x i64> , <4 x i64>* %398, align 8, !dbg !60, !tbaa !4 - %399 = getelementptr inbounds i64, i64* %397, i64 1, !dbg !60 - %400 = getelementptr inbounds i64, i64* %399, i64 1, !dbg !60 - %401 = bitcast i64* %397 to <2 x i64>*, !dbg !60 - store <2 x i64> , <2 x i64>* %401, align 8, !dbg !60, !tbaa !4 - %402 = getelementptr inbounds i64, i64* %400, i64 1, !dbg !60 - store i64 -13, i64* %400, align 8, !dbg !60, !tbaa !4 - %403 = getelementptr inbounds i64, i64* %402, i64 1, !dbg !60 - store i64 -15, i64* %402, align 8, !dbg !60, !tbaa !4 - %404 = getelementptr inbounds i64, i64* %403, i64 1, !dbg !60 - store i64 -17, i64* %403, align 8, !dbg !60, !tbaa !4 - %405 = getelementptr inbounds i64, i64* %404, i64 1, !dbg !60 - store i64* %405, i64** %391, align 8, !dbg !60, !tbaa !42 - store i64 -19, i64* %404, align 8, !dbg !60, !tbaa !4 - %send700.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.14, i64 0) #11, !dbg !60 - %406 = getelementptr inbounds i64, i64* %122, i64 24, !dbg !60 - %407 = getelementptr inbounds i64, i64* %406, i64 1, !dbg !60 - store i64* %407, i64** %117, align 8, !dbg !60, !tbaa !12 - %rubyId_d707.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !115 - %rawSym708.i = call i64 @rb_id2sym(i64 %rubyId_d707.i) #11, !dbg !115 - %rubyId_e710.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !116 - %rawSym711.i = call i64 @rb_id2sym(i64 %rubyId_e710.i) #11, !dbg !116 - %rubyId_baz713.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !117 - %rawSym714.i = call i64 @rb_id2sym(i64 %rubyId_baz713.i) #11, !dbg !117 - %408 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !12 - %409 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %408, i64 0, i32 2, !dbg !61 - %410 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %409, align 8, !dbg !61, !tbaa !14 - %411 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %410, i64 0, i32 1, !dbg !61 - %412 = load i64*, i64** %411, align 8, !dbg !61, !tbaa !42 - %413 = getelementptr inbounds i64, i64* %412, i64 1, !dbg !61 - store i64 %106, i64* %412, align 8, !dbg !61, !tbaa !4 - %414 = getelementptr inbounds i64, i64* %413, i64 1, !dbg !61 - %415 = getelementptr inbounds i64, i64* %414, i64 1, !dbg !61 - %416 = getelementptr inbounds i64, i64* %415, i64 1, !dbg !61 - %417 = getelementptr inbounds i64, i64* %416, i64 1, !dbg !61 - %418 = bitcast i64* %413 to <4 x i64>*, !dbg !61 - store <4 x i64> , <4 x i64>* %418, align 8, !dbg !61, !tbaa !4 - %419 = getelementptr inbounds i64, i64* %417, i64 1, !dbg !61 - %420 = getelementptr inbounds i64, i64* %419, i64 1, !dbg !61 - %421 = bitcast i64* %417 to <2 x i64>*, !dbg !61 - store <2 x i64> , <2 x i64>* %421, align 8, !dbg !61, !tbaa !4 - %422 = getelementptr inbounds i64, i64* %420, i64 1, !dbg !61 - store i64 -15, i64* %420, align 8, !dbg !61, !tbaa !4 - %423 = getelementptr inbounds i64, i64* %422, i64 1, !dbg !61 - store i64 -17, i64* %422, align 8, !dbg !61, !tbaa !4 - %424 = getelementptr inbounds i64, i64* %423, i64 1, !dbg !61 - store i64* %424, i64** %411, align 8, !dbg !61, !tbaa !42 - store i64 -19, i64* %423, align 8, !dbg !61, !tbaa !4 - %send730.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.15, i64 0) #11, !dbg !61 - %425 = getelementptr inbounds i64, i64* %122, i64 25, !dbg !61 - %426 = getelementptr inbounds i64, i64* %425, i64 1, !dbg !61 - store i64* %426, i64** %117, align 8, !dbg !61, !tbaa !12 - %rubyId_d736.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !118 - %rawSym737.i = call i64 @rb_id2sym(i64 %rubyId_d736.i) #11, !dbg !118 - %rubyId_e739.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !119 - %rawSym740.i = call i64 @rb_id2sym(i64 %rubyId_e739.i) #11, !dbg !119 - %rubyId_baz742.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !120 - %rawSym743.i = call i64 @rb_id2sym(i64 %rubyId_baz742.i) #11, !dbg !120 - %427 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !62, !tbaa !12 - %428 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %427, i64 0, i32 2, !dbg !62 - %429 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %428, align 8, !dbg !62, !tbaa !14 - %430 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %429, i64 0, i32 1, !dbg !62 - %431 = load i64*, i64** %430, align 8, !dbg !62, !tbaa !42 - %432 = getelementptr inbounds i64, i64* %431, i64 1, !dbg !62 - store i64 %106, i64* %431, align 8, !dbg !62, !tbaa !4 - %433 = getelementptr inbounds i64, i64* %432, i64 1, !dbg !62 - %434 = getelementptr inbounds i64, i64* %433, i64 1, !dbg !62 - %435 = getelementptr inbounds i64, i64* %434, i64 1, !dbg !62 - %436 = getelementptr inbounds i64, i64* %435, i64 1, !dbg !62 - %437 = bitcast i64* %432 to <4 x i64>*, !dbg !62 - store <4 x i64> , <4 x i64>* %437, align 8, !dbg !62, !tbaa !4 - %438 = getelementptr inbounds i64, i64* %436, i64 1, !dbg !62 - %439 = getelementptr inbounds i64, i64* %438, i64 1, !dbg !62 - %440 = bitcast i64* %436 to <2 x i64>*, !dbg !62 - store <2 x i64> , <2 x i64>* %440, align 8, !dbg !62, !tbaa !4 - %441 = getelementptr inbounds i64, i64* %439, i64 1, !dbg !62 - store i64 -17, i64* %439, align 8, !dbg !62, !tbaa !4 - %442 = getelementptr inbounds i64, i64* %441, i64 1, !dbg !62 - store i64* %442, i64** %430, align 8, !dbg !62, !tbaa !42 - store i64 -19, i64* %441, align 8, !dbg !62, !tbaa !4 - %send758.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.16, i64 0) #11, !dbg !62 - %443 = getelementptr inbounds i64, i64* %122, i64 26, !dbg !62 - %444 = getelementptr inbounds i64, i64* %443, i64 1, !dbg !62 - store i64* %444, i64** %117, align 8, !dbg !62, !tbaa !12 - %rubyId_d763.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !121 - %rawSym764.i = call i64 @rb_id2sym(i64 %rubyId_d763.i) #11, !dbg !121 - %rubyId_e766.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !122 - %rawSym767.i = call i64 @rb_id2sym(i64 %rubyId_e766.i) #11, !dbg !122 - %rubyId_baz769.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !123 - %rawSym770.i = call i64 @rb_id2sym(i64 %rubyId_baz769.i) #11, !dbg !123 - %445 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !12 - %446 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %445, i64 0, i32 2, !dbg !63 - %447 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %446, align 8, !dbg !63, !tbaa !14 - %448 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %447, i64 0, i32 1, !dbg !63 - %449 = load i64*, i64** %448, align 8, !dbg !63, !tbaa !42 - %450 = getelementptr inbounds i64, i64* %449, i64 1, !dbg !63 - store i64 %106, i64* %449, align 8, !dbg !63, !tbaa !4 - %451 = getelementptr inbounds i64, i64* %450, i64 1, !dbg !63 - %452 = getelementptr inbounds i64, i64* %451, i64 1, !dbg !63 - %453 = getelementptr inbounds i64, i64* %452, i64 1, !dbg !63 - %454 = getelementptr inbounds i64, i64* %453, i64 1, !dbg !63 - %455 = bitcast i64* %450 to <4 x i64>*, !dbg !63 - store <4 x i64> , <4 x i64>* %455, align 8, !dbg !63, !tbaa !4 - %456 = getelementptr inbounds i64, i64* %454, i64 1, !dbg !63 - %457 = getelementptr inbounds i64, i64* %456, i64 1, !dbg !63 - %458 = bitcast i64* %454 to <2 x i64>*, !dbg !63 - store <2 x i64> , <2 x i64>* %458, align 8, !dbg !63, !tbaa !4 - %459 = getelementptr inbounds i64, i64* %457, i64 1, !dbg !63 - store i64* %459, i64** %448, align 8, !dbg !63, !tbaa !42 - store i64 -19, i64* %457, align 8, !dbg !63, !tbaa !4 - %send784.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.17, i64 0) #11, !dbg !63 - %460 = getelementptr inbounds i64, i64* %122, i64 27, !dbg !63 - %461 = getelementptr inbounds i64, i64* %460, i64 1, !dbg !63 - store i64* %461, i64** %117, align 8, !dbg !63, !tbaa !12 - %rubyId_d788.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !124 - %rawSym789.i = call i64 @rb_id2sym(i64 %rubyId_d788.i) #11, !dbg !124 - %rubyId_e791.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !125 - %rawSym792.i = call i64 @rb_id2sym(i64 %rubyId_e791.i) #11, !dbg !125 - %rubyId_baz794.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !126 - %rawSym795.i = call i64 @rb_id2sym(i64 %rubyId_baz794.i) #11, !dbg !126 - %462 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !64, !tbaa !12 - %463 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %462, i64 0, i32 2, !dbg !64 - %464 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %463, align 8, !dbg !64, !tbaa !14 - %465 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %464, i64 0, i32 1, !dbg !64 - %466 = load i64*, i64** %465, align 8, !dbg !64, !tbaa !42 - %467 = getelementptr inbounds i64, i64* %466, i64 1, !dbg !64 - store i64 %106, i64* %466, align 8, !dbg !64, !tbaa !4 - %468 = getelementptr inbounds i64, i64* %467, i64 1, !dbg !64 - %469 = getelementptr inbounds i64, i64* %468, i64 1, !dbg !64 - %470 = getelementptr inbounds i64, i64* %469, i64 1, !dbg !64 - %471 = getelementptr inbounds i64, i64* %470, i64 1, !dbg !64 - %472 = bitcast i64* %467 to <4 x i64>*, !dbg !64 - store <4 x i64> , <4 x i64>* %472, align 8, !dbg !64, !tbaa !4 - %473 = getelementptr inbounds i64, i64* %471, i64 1, !dbg !64 - %474 = getelementptr inbounds i64, i64* %473, i64 1, !dbg !64 - store i64* %474, i64** %465, align 8, !dbg !64, !tbaa !42 - %475 = bitcast i64* %471 to <2 x i64>*, !dbg !64 - store <2 x i64> , <2 x i64>* %475, align 8, !dbg !64, !tbaa !4 - %send808.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.18, i64 0) #11, !dbg !64 - %476 = getelementptr inbounds i64, i64* %122, i64 28, !dbg !64 - %477 = getelementptr inbounds i64, i64* %476, i64 1, !dbg !64 - store i64* %477, i64** %117, align 8, !dbg !64, !tbaa !12 - %rubyId_d811.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !127 - %rawSym812.i = call i64 @rb_id2sym(i64 %rubyId_d811.i) #11, !dbg !127 - %rubyId_e814.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !128 - %rawSym815.i = call i64 @rb_id2sym(i64 %rubyId_e814.i) #11, !dbg !128 - %rubyId_baz817.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !129 - %rawSym818.i = call i64 @rb_id2sym(i64 %rubyId_baz817.i) #11, !dbg !129 - %478 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !65, !tbaa !12 - %479 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %478, i64 0, i32 2, !dbg !65 - %480 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %479, align 8, !dbg !65, !tbaa !14 - %481 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %480, i64 0, i32 1, !dbg !65 - %482 = load i64*, i64** %481, align 8, !dbg !65, !tbaa !42 - %483 = getelementptr inbounds i64, i64* %482, i64 1, !dbg !65 - store i64 %106, i64* %482, align 8, !dbg !65, !tbaa !4 - %484 = getelementptr inbounds i64, i64* %483, i64 1, !dbg !65 - %485 = getelementptr inbounds i64, i64* %484, i64 1, !dbg !65 - %486 = getelementptr inbounds i64, i64* %485, i64 1, !dbg !65 - %487 = getelementptr inbounds i64, i64* %486, i64 1, !dbg !65 - %488 = bitcast i64* %483 to <4 x i64>*, !dbg !65 - store <4 x i64> , <4 x i64>* %488, align 8, !dbg !65, !tbaa !4 - %489 = getelementptr inbounds i64, i64* %487, i64 1, !dbg !65 - store i64* %489, i64** %481, align 8, !dbg !65, !tbaa !42 - store i64 -19, i64* %487, align 8, !dbg !65, !tbaa !4 - %send830.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.19, i64 0) #11, !dbg !65 - %490 = getelementptr inbounds i64, i64* %122, i64 29, !dbg !65 - %491 = getelementptr inbounds i64, i64* %490, i64 1, !dbg !65 - store i64* %491, i64** %117, align 8, !dbg !65, !tbaa !12 - %rubyId_d832.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !130 - %rawSym833.i = call i64 @rb_id2sym(i64 %rubyId_d832.i) #11, !dbg !130 - %rubyId_e835.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !131 - %rawSym836.i = call i64 @rb_id2sym(i64 %rubyId_e835.i) #11, !dbg !131 - %rubyId_baz838.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !132 - %rawSym839.i = call i64 @rb_id2sym(i64 %rubyId_baz838.i) #11, !dbg !132 - %492 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !66, !tbaa !12 - %493 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %492, i64 0, i32 2, !dbg !66 - %494 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %493, align 8, !dbg !66, !tbaa !14 - %495 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %494, i64 0, i32 1, !dbg !66 - %496 = load i64*, i64** %495, align 8, !dbg !66, !tbaa !42 - %497 = getelementptr inbounds i64, i64* %496, i64 1, !dbg !66 - store i64 %106, i64* %496, align 8, !dbg !66, !tbaa !4 - %498 = getelementptr inbounds i64, i64* %497, i64 1, !dbg !66 - %499 = getelementptr inbounds i64, i64* %498, i64 1, !dbg !66 - %500 = getelementptr inbounds i64, i64* %499, i64 1, !dbg !66 - %501 = getelementptr inbounds i64, i64* %500, i64 1, !dbg !66 - store i64* %501, i64** %495, align 8, !dbg !66, !tbaa !42 - %502 = bitcast i64* %497 to <4 x i64>*, !dbg !66 - store <4 x i64> , <4 x i64>* %502, align 8, !dbg !66, !tbaa !4 - %send850.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.20, i64 0) #11, !dbg !66 +"func_.$152.exit": ; preds = %entry, %159 + %163 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 3, i64 noundef 8) #9, !dbg !32 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %163, i8* nocapture noundef nonnull readonly align 8 dereferenceable(24) %108, i64 noundef 24, i1 noundef false) #11, !dbg !32 + %164 = getelementptr inbounds i8, i8* %119, i64 56, !dbg !32 + %165 = bitcast i8* %164 to i8**, !dbg !32 + store i8* %163, i8** %165, align 8, !dbg !32, !tbaa !80 + %166 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([15 x i8], [15 x i8]* @str_take_arguments, i64 0, i64 0)) #11, !dbg !32 + %167 = bitcast i8* %119 to %struct.rb_sorbet_param_struct*, !dbg !32 + %168 = bitcast %struct.rb_iseq_struct* %stackFrame387.i to i8*, !dbg !32 + call void @rb_add_method_sorbet(i64 %118, i64 %166, i64 (i32, i64*, i64)* noundef @"func_Object#take_arguments", %struct.rb_sorbet_param_struct* nonnull %167, i32 noundef 1, i8* %168) #11, !dbg !32 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %117, align 8, !dbg !32, !tbaa !12 + %rubyId_d398.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !81 + %rawSym399.i = call i64 @rb_id2sym(i64 %rubyId_d398.i) #11, !dbg !81 + %169 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 + %170 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %169, i64 0, i32 2, !dbg !34 + %171 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %170, align 8, !dbg !34, !tbaa !14 + %172 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %171, i64 0, i32 1, !dbg !34 + %173 = load i64*, i64** %172, align 8, !dbg !34, !tbaa !29 + %174 = getelementptr inbounds i64, i64* %173, i64 1, !dbg !34 + store i64 %106, i64* %173, align 8, !dbg !34, !tbaa !4 + %175 = getelementptr inbounds i64, i64* %174, i64 1, !dbg !34 + %176 = getelementptr inbounds i64, i64* %175, i64 1, !dbg !34 + %177 = getelementptr inbounds i64, i64* %176, i64 1, !dbg !34 + %178 = getelementptr inbounds i64, i64* %177, i64 1, !dbg !34 + %179 = bitcast i64* %174 to <4 x i64>*, !dbg !34 + store <4 x i64> , <4 x i64>* %179, align 8, !dbg !34, !tbaa !4 + %180 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !34 + %181 = getelementptr inbounds i64, i64* %180, i64 1, !dbg !34 + %182 = bitcast i64* %178 to <2 x i64>*, !dbg !34 + store <2 x i64> , <2 x i64>* %182, align 8, !dbg !34, !tbaa !4 + %183 = getelementptr inbounds i64, i64* %181, i64 1, !dbg !34 + store i64 -13, i64* %181, align 8, !dbg !34, !tbaa !4 + %184 = getelementptr inbounds i64, i64* %183, i64 1, !dbg !34 + store i64* %184, i64** %172, align 8, !dbg !34, !tbaa !29 + store i64 -15, i64* %183, align 8, !dbg !34, !tbaa !4 + %send413.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments, i64 0) #11, !dbg !34 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %117, align 8, !dbg !34, !tbaa !12 + %rubyId_d420.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !82 + %rawSym421.i = call i64 @rb_id2sym(i64 %rubyId_d420.i) #11, !dbg !82 + %185 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !12 + %186 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %185, i64 0, i32 2, !dbg !35 + %187 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %186, align 8, !dbg !35, !tbaa !14 + %188 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %187, i64 0, i32 1, !dbg !35 + %189 = load i64*, i64** %188, align 8, !dbg !35, !tbaa !29 + %190 = getelementptr inbounds i64, i64* %189, i64 1, !dbg !35 + store i64 %106, i64* %189, align 8, !dbg !35, !tbaa !4 + %191 = getelementptr inbounds i64, i64* %190, i64 1, !dbg !35 + %192 = getelementptr inbounds i64, i64* %191, i64 1, !dbg !35 + %193 = getelementptr inbounds i64, i64* %192, i64 1, !dbg !35 + %194 = getelementptr inbounds i64, i64* %193, i64 1, !dbg !35 + %195 = bitcast i64* %190 to <4 x i64>*, !dbg !35 + store <4 x i64> , <4 x i64>* %195, align 8, !dbg !35, !tbaa !4 + %196 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !35 + %197 = getelementptr inbounds i64, i64* %196, i64 1, !dbg !35 + %198 = bitcast i64* %194 to <2 x i64>*, !dbg !35 + store <2 x i64> , <2 x i64>* %198, align 8, !dbg !35, !tbaa !4 + %199 = getelementptr inbounds i64, i64* %197, i64 1, !dbg !35 + store i64* %199, i64** %188, align 8, !dbg !35, !tbaa !29 + store i64 -15, i64* %197, align 8, !dbg !35, !tbaa !4 + %send435.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.1, i64 0) #11, !dbg !35 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %117, align 8, !dbg !35, !tbaa !12 + %rubyId_d441.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !83 + %rawSym442.i = call i64 @rb_id2sym(i64 %rubyId_d441.i) #11, !dbg !83 + %200 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !36, !tbaa !12 + %201 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %200, i64 0, i32 2, !dbg !36 + %202 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %201, align 8, !dbg !36, !tbaa !14 + %203 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %202, i64 0, i32 1, !dbg !36 + %204 = load i64*, i64** %203, align 8, !dbg !36, !tbaa !29 + %205 = getelementptr inbounds i64, i64* %204, i64 1, !dbg !36 + store i64 %106, i64* %204, align 8, !dbg !36, !tbaa !4 + %206 = getelementptr inbounds i64, i64* %205, i64 1, !dbg !36 + %207 = getelementptr inbounds i64, i64* %206, i64 1, !dbg !36 + %208 = getelementptr inbounds i64, i64* %207, i64 1, !dbg !36 + %209 = getelementptr inbounds i64, i64* %208, i64 1, !dbg !36 + %210 = bitcast i64* %205 to <4 x i64>*, !dbg !36 + store <4 x i64> , <4 x i64>* %210, align 8, !dbg !36, !tbaa !4 + %211 = getelementptr inbounds i64, i64* %209, i64 1, !dbg !36 + %212 = getelementptr inbounds i64, i64* %211, i64 1, !dbg !36 + store i64* %212, i64** %203, align 8, !dbg !36, !tbaa !29 + %213 = bitcast i64* %209 to <2 x i64>*, !dbg !36 + store <2 x i64> , <2 x i64>* %213, align 8, !dbg !36, !tbaa !4 + %send455.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.2, i64 0) #11, !dbg !36 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %117, align 8, !dbg !36, !tbaa !12 + %rubyId_d460.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !84 + %rawSym461.i = call i64 @rb_id2sym(i64 %rubyId_d460.i) #11, !dbg !84 + %214 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !12 + %215 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %214, i64 0, i32 2, !dbg !37 + %216 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %215, align 8, !dbg !37, !tbaa !14 + %217 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %216, i64 0, i32 1, !dbg !37 + %218 = load i64*, i64** %217, align 8, !dbg !37, !tbaa !29 + %219 = getelementptr inbounds i64, i64* %218, i64 1, !dbg !37 + store i64 %106, i64* %218, align 8, !dbg !37, !tbaa !4 + %220 = getelementptr inbounds i64, i64* %219, i64 1, !dbg !37 + %221 = getelementptr inbounds i64, i64* %220, i64 1, !dbg !37 + %222 = getelementptr inbounds i64, i64* %221, i64 1, !dbg !37 + %223 = getelementptr inbounds i64, i64* %222, i64 1, !dbg !37 + %224 = bitcast i64* %219 to <4 x i64>*, !dbg !37 + store <4 x i64> , <4 x i64>* %224, align 8, !dbg !37, !tbaa !4 + %225 = getelementptr inbounds i64, i64* %223, i64 1, !dbg !37 + store i64* %225, i64** %217, align 8, !dbg !37, !tbaa !29 + store i64 -15, i64* %223, align 8, !dbg !37, !tbaa !4 + %send473.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.3, i64 0) #11, !dbg !37 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %117, align 8, !dbg !37, !tbaa !12 + %rubyId_d477.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !85 + %rawSym478.i = call i64 @rb_id2sym(i64 %rubyId_d477.i) #11, !dbg !85 + %226 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !38, !tbaa !12 + %227 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %226, i64 0, i32 2, !dbg !38 + %228 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %227, align 8, !dbg !38, !tbaa !14 + %229 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %228, i64 0, i32 1, !dbg !38 + %230 = load i64*, i64** %229, align 8, !dbg !38, !tbaa !29 + %231 = getelementptr inbounds i64, i64* %230, i64 1, !dbg !38 + store i64 %106, i64* %230, align 8, !dbg !38, !tbaa !4 + %232 = getelementptr inbounds i64, i64* %231, i64 1, !dbg !38 + %233 = getelementptr inbounds i64, i64* %232, i64 1, !dbg !38 + %234 = getelementptr inbounds i64, i64* %233, i64 1, !dbg !38 + %235 = getelementptr inbounds i64, i64* %234, i64 1, !dbg !38 + store i64* %235, i64** %229, align 8, !dbg !38, !tbaa !29 + %236 = bitcast i64* %231 to <4 x i64>*, !dbg !38 + store <4 x i64> , <4 x i64>* %236, align 8, !dbg !38, !tbaa !4 + %send489.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.4, i64 0) #11, !dbg !38 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %117, align 8, !dbg !38, !tbaa !12 + %rubyId_d492.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !86 + %rawSym493.i = call i64 @rb_id2sym(i64 %rubyId_d492.i) #11, !dbg !86 + %237 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !12 + %238 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %237, i64 0, i32 2, !dbg !39 + %239 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %238, align 8, !dbg !39, !tbaa !14 + %240 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %239, i64 0, i32 1, !dbg !39 + %241 = load i64*, i64** %240, align 8, !dbg !39, !tbaa !29 + %242 = getelementptr inbounds i64, i64* %241, i64 1, !dbg !39 + store i64 %106, i64* %241, align 8, !dbg !39, !tbaa !4 + %243 = getelementptr inbounds i64, i64* %242, i64 1, !dbg !39 + %244 = getelementptr inbounds i64, i64* %243, i64 1, !dbg !39 + %245 = bitcast i64* %242 to <2 x i64>*, !dbg !39 + store <2 x i64> , <2 x i64>* %245, align 8, !dbg !39, !tbaa !4 + %246 = getelementptr inbounds i64, i64* %244, i64 1, !dbg !39 + store i64* %246, i64** %240, align 8, !dbg !39, !tbaa !29 + store i64 -15, i64* %244, align 8, !dbg !39, !tbaa !4 + %send503.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.5, i64 0) #11, !dbg !39 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %117, align 8, !dbg !39, !tbaa !12 + %rubyId_d505.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !87 + %rawSym506.i = call i64 @rb_id2sym(i64 %rubyId_d505.i) #11, !dbg !87 + %247 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !12 + %248 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %247, i64 0, i32 2, !dbg !40 + %249 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %248, align 8, !dbg !40, !tbaa !14 + %250 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %249, i64 0, i32 1, !dbg !40 + %251 = load i64*, i64** %250, align 8, !dbg !40, !tbaa !29 + %252 = getelementptr inbounds i64, i64* %251, i64 1, !dbg !40 + store i64 %106, i64* %251, align 8, !dbg !40, !tbaa !4 + %253 = getelementptr inbounds i64, i64* %252, i64 1, !dbg !40 + %254 = getelementptr inbounds i64, i64* %253, i64 1, !dbg !40 + store i64* %254, i64** %250, align 8, !dbg !40, !tbaa !29 + %255 = bitcast i64* %252 to <2 x i64>*, !dbg !40 + store <2 x i64> , <2 x i64>* %255, align 8, !dbg !40, !tbaa !4 + %send515.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.6, i64 0) #11, !dbg !40 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %117, align 8, !dbg !40, !tbaa !12 + %rubyId_d523.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !88 + %rawSym524.i = call i64 @rb_id2sym(i64 %rubyId_d523.i) #11, !dbg !88 + %rubyId_e526.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !89 + %rawSym527.i = call i64 @rb_id2sym(i64 %rubyId_e526.i) #11, !dbg !89 + %256 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !41, !tbaa !12 + %257 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %256, i64 0, i32 2, !dbg !41 + %258 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %257, align 8, !dbg !41, !tbaa !14 + %259 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %258, i64 0, i32 1, !dbg !41 + %260 = load i64*, i64** %259, align 8, !dbg !41, !tbaa !29 + %261 = getelementptr inbounds i64, i64* %260, i64 1, !dbg !41 + store i64 %106, i64* %260, align 8, !dbg !41, !tbaa !4 + %262 = getelementptr inbounds i64, i64* %261, i64 1, !dbg !41 + %263 = getelementptr inbounds i64, i64* %262, i64 1, !dbg !41 + %264 = getelementptr inbounds i64, i64* %263, i64 1, !dbg !41 + %265 = getelementptr inbounds i64, i64* %264, i64 1, !dbg !41 + %266 = bitcast i64* %261 to <4 x i64>*, !dbg !41 + store <4 x i64> , <4 x i64>* %266, align 8, !dbg !41, !tbaa !4 + %267 = getelementptr inbounds i64, i64* %265, i64 1, !dbg !41 + %268 = getelementptr inbounds i64, i64* %267, i64 1, !dbg !41 + %269 = bitcast i64* %265 to <2 x i64>*, !dbg !41 + store <2 x i64> , <2 x i64>* %269, align 8, !dbg !41, !tbaa !4 + %270 = getelementptr inbounds i64, i64* %268, i64 1, !dbg !41 + store i64 -13, i64* %268, align 8, !dbg !41, !tbaa !4 + %271 = getelementptr inbounds i64, i64* %270, i64 1, !dbg !41 + store i64 -15, i64* %270, align 8, !dbg !41, !tbaa !4 + %272 = getelementptr inbounds i64, i64* %271, i64 1, !dbg !41 + store i64* %272, i64** %259, align 8, !dbg !41, !tbaa !29 + store i64 -17, i64* %271, align 8, !dbg !41, !tbaa !4 + %send543.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.7, i64 0) #11, !dbg !41 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %117, align 8, !dbg !41, !tbaa !12 + %rubyId_d550.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !90 + %rawSym551.i = call i64 @rb_id2sym(i64 %rubyId_d550.i) #11, !dbg !90 + %rubyId_e553.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !91 + %rawSym554.i = call i64 @rb_id2sym(i64 %rubyId_e553.i) #11, !dbg !91 + %273 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !42, !tbaa !12 + %274 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %273, i64 0, i32 2, !dbg !42 + %275 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %274, align 8, !dbg !42, !tbaa !14 + %276 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %275, i64 0, i32 1, !dbg !42 + %277 = load i64*, i64** %276, align 8, !dbg !42, !tbaa !29 + %278 = getelementptr inbounds i64, i64* %277, i64 1, !dbg !42 + store i64 %106, i64* %277, align 8, !dbg !42, !tbaa !4 + %279 = getelementptr inbounds i64, i64* %278, i64 1, !dbg !42 + %280 = getelementptr inbounds i64, i64* %279, i64 1, !dbg !42 + %281 = getelementptr inbounds i64, i64* %280, i64 1, !dbg !42 + %282 = getelementptr inbounds i64, i64* %281, i64 1, !dbg !42 + %283 = bitcast i64* %278 to <4 x i64>*, !dbg !42 + store <4 x i64> , <4 x i64>* %283, align 8, !dbg !42, !tbaa !4 + %284 = getelementptr inbounds i64, i64* %282, i64 1, !dbg !42 + %285 = getelementptr inbounds i64, i64* %284, i64 1, !dbg !42 + %286 = bitcast i64* %282 to <2 x i64>*, !dbg !42 + store <2 x i64> , <2 x i64>* %286, align 8, !dbg !42, !tbaa !4 + %287 = getelementptr inbounds i64, i64* %285, i64 1, !dbg !42 + store i64 -15, i64* %285, align 8, !dbg !42, !tbaa !4 + %288 = getelementptr inbounds i64, i64* %287, i64 1, !dbg !42 + store i64* %288, i64** %276, align 8, !dbg !42, !tbaa !29 + store i64 -17, i64* %287, align 8, !dbg !42, !tbaa !4 + %send569.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.8, i64 0) #11, !dbg !42 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %117, align 8, !dbg !42, !tbaa !12 + %rubyId_d575.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !92 + %rawSym576.i = call i64 @rb_id2sym(i64 %rubyId_d575.i) #11, !dbg !92 + %rubyId_e578.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !93 + %rawSym579.i = call i64 @rb_id2sym(i64 %rubyId_e578.i) #11, !dbg !93 + %289 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !43, !tbaa !12 + %290 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %289, i64 0, i32 2, !dbg !43 + %291 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %290, align 8, !dbg !43, !tbaa !14 + %292 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %291, i64 0, i32 1, !dbg !43 + %293 = load i64*, i64** %292, align 8, !dbg !43, !tbaa !29 + %294 = getelementptr inbounds i64, i64* %293, i64 1, !dbg !43 + store i64 %106, i64* %293, align 8, !dbg !43, !tbaa !4 + %295 = getelementptr inbounds i64, i64* %294, i64 1, !dbg !43 + %296 = getelementptr inbounds i64, i64* %295, i64 1, !dbg !43 + %297 = getelementptr inbounds i64, i64* %296, i64 1, !dbg !43 + %298 = getelementptr inbounds i64, i64* %297, i64 1, !dbg !43 + %299 = bitcast i64* %294 to <4 x i64>*, !dbg !43 + store <4 x i64> , <4 x i64>* %299, align 8, !dbg !43, !tbaa !4 + %300 = getelementptr inbounds i64, i64* %298, i64 1, !dbg !43 + %301 = getelementptr inbounds i64, i64* %300, i64 1, !dbg !43 + %302 = bitcast i64* %298 to <2 x i64>*, !dbg !43 + store <2 x i64> , <2 x i64>* %302, align 8, !dbg !43, !tbaa !4 + %303 = getelementptr inbounds i64, i64* %301, i64 1, !dbg !43 + store i64* %303, i64** %292, align 8, !dbg !43, !tbaa !29 + store i64 -17, i64* %301, align 8, !dbg !43, !tbaa !4 + %send593.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.9, i64 0) #11, !dbg !43 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %117, align 8, !dbg !43, !tbaa !12 + %rubyId_d598.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !94 + %rawSym599.i = call i64 @rb_id2sym(i64 %rubyId_d598.i) #11, !dbg !94 + %rubyId_e601.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !95 + %rawSym602.i = call i64 @rb_id2sym(i64 %rubyId_e601.i) #11, !dbg !95 + %304 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !44, !tbaa !12 + %305 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %304, i64 0, i32 2, !dbg !44 + %306 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %305, align 8, !dbg !44, !tbaa !14 + %307 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %306, i64 0, i32 1, !dbg !44 + %308 = load i64*, i64** %307, align 8, !dbg !44, !tbaa !29 + %309 = getelementptr inbounds i64, i64* %308, i64 1, !dbg !44 + store i64 %106, i64* %308, align 8, !dbg !44, !tbaa !4 + %310 = getelementptr inbounds i64, i64* %309, i64 1, !dbg !44 + %311 = getelementptr inbounds i64, i64* %310, i64 1, !dbg !44 + %312 = getelementptr inbounds i64, i64* %311, i64 1, !dbg !44 + %313 = getelementptr inbounds i64, i64* %312, i64 1, !dbg !44 + %314 = bitcast i64* %309 to <4 x i64>*, !dbg !44 + store <4 x i64> , <4 x i64>* %314, align 8, !dbg !44, !tbaa !4 + %315 = getelementptr inbounds i64, i64* %313, i64 1, !dbg !44 + %316 = getelementptr inbounds i64, i64* %315, i64 1, !dbg !44 + store i64* %316, i64** %307, align 8, !dbg !44, !tbaa !29 + %317 = bitcast i64* %313 to <2 x i64>*, !dbg !44 + store <2 x i64> , <2 x i64>* %317, align 8, !dbg !44, !tbaa !4 + %send615.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.10, i64 0) #11, !dbg !44 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 20), i64** %117, align 8, !dbg !44, !tbaa !12 + %rubyId_d619.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !96 + %rawSym620.i = call i64 @rb_id2sym(i64 %rubyId_d619.i) #11, !dbg !96 + %rubyId_e622.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !97 + %rawSym623.i = call i64 @rb_id2sym(i64 %rubyId_e622.i) #11, !dbg !97 + %318 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !45, !tbaa !12 + %319 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %318, i64 0, i32 2, !dbg !45 + %320 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %319, align 8, !dbg !45, !tbaa !14 + %321 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %320, i64 0, i32 1, !dbg !45 + %322 = load i64*, i64** %321, align 8, !dbg !45, !tbaa !29 + %323 = getelementptr inbounds i64, i64* %322, i64 1, !dbg !45 + store i64 %106, i64* %322, align 8, !dbg !45, !tbaa !4 + %324 = getelementptr inbounds i64, i64* %323, i64 1, !dbg !45 + %325 = getelementptr inbounds i64, i64* %324, i64 1, !dbg !45 + %326 = getelementptr inbounds i64, i64* %325, i64 1, !dbg !45 + %327 = getelementptr inbounds i64, i64* %326, i64 1, !dbg !45 + %328 = bitcast i64* %323 to <4 x i64>*, !dbg !45 + store <4 x i64> , <4 x i64>* %328, align 8, !dbg !45, !tbaa !4 + %329 = getelementptr inbounds i64, i64* %327, i64 1, !dbg !45 + store i64* %329, i64** %321, align 8, !dbg !45, !tbaa !29 + store i64 -17, i64* %327, align 8, !dbg !45, !tbaa !4 + %send635.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.11, i64 0) #11, !dbg !45 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 21), i64** %117, align 8, !dbg !45, !tbaa !12 + %rubyId_d638.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !98 + %rawSym639.i = call i64 @rb_id2sym(i64 %rubyId_d638.i) #11, !dbg !98 + %rubyId_e641.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !99 + %rawSym642.i = call i64 @rb_id2sym(i64 %rubyId_e641.i) #11, !dbg !99 + %330 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !46, !tbaa !12 + %331 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %330, i64 0, i32 2, !dbg !46 + %332 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %331, align 8, !dbg !46, !tbaa !14 + %333 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %332, i64 0, i32 1, !dbg !46 + %334 = load i64*, i64** %333, align 8, !dbg !46, !tbaa !29 + %335 = getelementptr inbounds i64, i64* %334, i64 1, !dbg !46 + store i64 %106, i64* %334, align 8, !dbg !46, !tbaa !4 + %336 = getelementptr inbounds i64, i64* %335, i64 1, !dbg !46 + %337 = getelementptr inbounds i64, i64* %336, i64 1, !dbg !46 + %338 = getelementptr inbounds i64, i64* %337, i64 1, !dbg !46 + %339 = getelementptr inbounds i64, i64* %338, i64 1, !dbg !46 + store i64* %339, i64** %333, align 8, !dbg !46, !tbaa !29 + %340 = bitcast i64* %335 to <4 x i64>*, !dbg !46 + store <4 x i64> , <4 x i64>* %340, align 8, !dbg !46, !tbaa !4 + %send653.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.12, i64 0) #11, !dbg !46 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 22), i64** %117, align 8, !dbg !46, !tbaa !12 + %rubyId_d655.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !100 + %rawSym656.i = call i64 @rb_id2sym(i64 %rubyId_d655.i) #11, !dbg !100 + %rubyId_e658.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !101 + %rawSym659.i = call i64 @rb_id2sym(i64 %rubyId_e658.i) #11, !dbg !101 + %341 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !47, !tbaa !12 + %342 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %341, i64 0, i32 2, !dbg !47 + %343 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %342, align 8, !dbg !47, !tbaa !14 + %344 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %343, i64 0, i32 1, !dbg !47 + %345 = load i64*, i64** %344, align 8, !dbg !47, !tbaa !29 + %346 = getelementptr inbounds i64, i64* %345, i64 1, !dbg !47 + store i64 %106, i64* %345, align 8, !dbg !47, !tbaa !4 + %347 = getelementptr inbounds i64, i64* %346, i64 1, !dbg !47 + %348 = getelementptr inbounds i64, i64* %347, i64 1, !dbg !47 + %349 = bitcast i64* %346 to <2 x i64>*, !dbg !47 + store <2 x i64> , <2 x i64>* %349, align 8, !dbg !47, !tbaa !4 + %350 = getelementptr inbounds i64, i64* %348, i64 1, !dbg !47 + store i64* %350, i64** %344, align 8, !dbg !47, !tbaa !29 + store i64 -17, i64* %348, align 8, !dbg !47, !tbaa !4 + %send669.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.13, i64 0) #11, !dbg !47 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 24), i64** %117, align 8, !dbg !47, !tbaa !12 + %rubyId_d677.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !102 + %rawSym678.i = call i64 @rb_id2sym(i64 %rubyId_d677.i) #11, !dbg !102 + %rubyId_e680.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !103 + %rawSym681.i = call i64 @rb_id2sym(i64 %rubyId_e680.i) #11, !dbg !103 + %rubyId_baz.i4 = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !104 + %rawSym683.i = call i64 @rb_id2sym(i64 %rubyId_baz.i4) #11, !dbg !104 + %351 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !12 + %352 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %351, i64 0, i32 2, !dbg !48 + %353 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %352, align 8, !dbg !48, !tbaa !14 + %354 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %353, i64 0, i32 1, !dbg !48 + %355 = load i64*, i64** %354, align 8, !dbg !48, !tbaa !29 + %356 = getelementptr inbounds i64, i64* %355, i64 1, !dbg !48 + store i64 %106, i64* %355, align 8, !dbg !48, !tbaa !4 + %357 = getelementptr inbounds i64, i64* %356, i64 1, !dbg !48 + %358 = getelementptr inbounds i64, i64* %357, i64 1, !dbg !48 + %359 = getelementptr inbounds i64, i64* %358, i64 1, !dbg !48 + %360 = getelementptr inbounds i64, i64* %359, i64 1, !dbg !48 + %361 = bitcast i64* %356 to <4 x i64>*, !dbg !48 + store <4 x i64> , <4 x i64>* %361, align 8, !dbg !48, !tbaa !4 + %362 = getelementptr inbounds i64, i64* %360, i64 1, !dbg !48 + %363 = getelementptr inbounds i64, i64* %362, i64 1, !dbg !48 + %364 = bitcast i64* %360 to <2 x i64>*, !dbg !48 + store <2 x i64> , <2 x i64>* %364, align 8, !dbg !48, !tbaa !4 + %365 = getelementptr inbounds i64, i64* %363, i64 1, !dbg !48 + store i64 -13, i64* %363, align 8, !dbg !48, !tbaa !4 + %366 = getelementptr inbounds i64, i64* %365, i64 1, !dbg !48 + store i64 -15, i64* %365, align 8, !dbg !48, !tbaa !4 + %367 = getelementptr inbounds i64, i64* %366, i64 1, !dbg !48 + store i64 -17, i64* %366, align 8, !dbg !48, !tbaa !4 + %368 = getelementptr inbounds i64, i64* %367, i64 1, !dbg !48 + store i64* %368, i64** %354, align 8, !dbg !48, !tbaa !29 + store i64 -19, i64* %367, align 8, !dbg !48, !tbaa !4 + %send700.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.14, i64 0) #11, !dbg !48 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 25), i64** %117, align 8, !dbg !48, !tbaa !12 + %rubyId_d707.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !105 + %rawSym708.i = call i64 @rb_id2sym(i64 %rubyId_d707.i) #11, !dbg !105 + %rubyId_e710.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !106 + %rawSym711.i = call i64 @rb_id2sym(i64 %rubyId_e710.i) #11, !dbg !106 + %rubyId_baz713.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !107 + %rawSym714.i = call i64 @rb_id2sym(i64 %rubyId_baz713.i) #11, !dbg !107 + %369 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !12 + %370 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %369, i64 0, i32 2, !dbg !49 + %371 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %370, align 8, !dbg !49, !tbaa !14 + %372 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %371, i64 0, i32 1, !dbg !49 + %373 = load i64*, i64** %372, align 8, !dbg !49, !tbaa !29 + %374 = getelementptr inbounds i64, i64* %373, i64 1, !dbg !49 + store i64 %106, i64* %373, align 8, !dbg !49, !tbaa !4 + %375 = getelementptr inbounds i64, i64* %374, i64 1, !dbg !49 + %376 = getelementptr inbounds i64, i64* %375, i64 1, !dbg !49 + %377 = getelementptr inbounds i64, i64* %376, i64 1, !dbg !49 + %378 = getelementptr inbounds i64, i64* %377, i64 1, !dbg !49 + %379 = bitcast i64* %374 to <4 x i64>*, !dbg !49 + store <4 x i64> , <4 x i64>* %379, align 8, !dbg !49, !tbaa !4 + %380 = getelementptr inbounds i64, i64* %378, i64 1, !dbg !49 + %381 = getelementptr inbounds i64, i64* %380, i64 1, !dbg !49 + %382 = bitcast i64* %378 to <2 x i64>*, !dbg !49 + store <2 x i64> , <2 x i64>* %382, align 8, !dbg !49, !tbaa !4 + %383 = getelementptr inbounds i64, i64* %381, i64 1, !dbg !49 + store i64 -15, i64* %381, align 8, !dbg !49, !tbaa !4 + %384 = getelementptr inbounds i64, i64* %383, i64 1, !dbg !49 + store i64 -17, i64* %383, align 8, !dbg !49, !tbaa !4 + %385 = getelementptr inbounds i64, i64* %384, i64 1, !dbg !49 + store i64* %385, i64** %372, align 8, !dbg !49, !tbaa !29 + store i64 -19, i64* %384, align 8, !dbg !49, !tbaa !4 + %send730.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.15, i64 0) #11, !dbg !49 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 26), i64** %117, align 8, !dbg !49, !tbaa !12 + %rubyId_d736.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !108 + %rawSym737.i = call i64 @rb_id2sym(i64 %rubyId_d736.i) #11, !dbg !108 + %rubyId_e739.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !109 + %rawSym740.i = call i64 @rb_id2sym(i64 %rubyId_e739.i) #11, !dbg !109 + %rubyId_baz742.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !110 + %rawSym743.i = call i64 @rb_id2sym(i64 %rubyId_baz742.i) #11, !dbg !110 + %386 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !50, !tbaa !12 + %387 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %386, i64 0, i32 2, !dbg !50 + %388 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %387, align 8, !dbg !50, !tbaa !14 + %389 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %388, i64 0, i32 1, !dbg !50 + %390 = load i64*, i64** %389, align 8, !dbg !50, !tbaa !29 + %391 = getelementptr inbounds i64, i64* %390, i64 1, !dbg !50 + store i64 %106, i64* %390, align 8, !dbg !50, !tbaa !4 + %392 = getelementptr inbounds i64, i64* %391, i64 1, !dbg !50 + %393 = getelementptr inbounds i64, i64* %392, i64 1, !dbg !50 + %394 = getelementptr inbounds i64, i64* %393, i64 1, !dbg !50 + %395 = getelementptr inbounds i64, i64* %394, i64 1, !dbg !50 + %396 = bitcast i64* %391 to <4 x i64>*, !dbg !50 + store <4 x i64> , <4 x i64>* %396, align 8, !dbg !50, !tbaa !4 + %397 = getelementptr inbounds i64, i64* %395, i64 1, !dbg !50 + %398 = getelementptr inbounds i64, i64* %397, i64 1, !dbg !50 + %399 = bitcast i64* %395 to <2 x i64>*, !dbg !50 + store <2 x i64> , <2 x i64>* %399, align 8, !dbg !50, !tbaa !4 + %400 = getelementptr inbounds i64, i64* %398, i64 1, !dbg !50 + store i64 -17, i64* %398, align 8, !dbg !50, !tbaa !4 + %401 = getelementptr inbounds i64, i64* %400, i64 1, !dbg !50 + store i64* %401, i64** %389, align 8, !dbg !50, !tbaa !29 + store i64 -19, i64* %400, align 8, !dbg !50, !tbaa !4 + %send758.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.16, i64 0) #11, !dbg !50 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %117, align 8, !dbg !50, !tbaa !12 + %rubyId_d763.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !111 + %rawSym764.i = call i64 @rb_id2sym(i64 %rubyId_d763.i) #11, !dbg !111 + %rubyId_e766.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !112 + %rawSym767.i = call i64 @rb_id2sym(i64 %rubyId_e766.i) #11, !dbg !112 + %rubyId_baz769.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !113 + %rawSym770.i = call i64 @rb_id2sym(i64 %rubyId_baz769.i) #11, !dbg !113 + %402 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !51, !tbaa !12 + %403 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %402, i64 0, i32 2, !dbg !51 + %404 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %403, align 8, !dbg !51, !tbaa !14 + %405 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %404, i64 0, i32 1, !dbg !51 + %406 = load i64*, i64** %405, align 8, !dbg !51, !tbaa !29 + %407 = getelementptr inbounds i64, i64* %406, i64 1, !dbg !51 + store i64 %106, i64* %406, align 8, !dbg !51, !tbaa !4 + %408 = getelementptr inbounds i64, i64* %407, i64 1, !dbg !51 + %409 = getelementptr inbounds i64, i64* %408, i64 1, !dbg !51 + %410 = getelementptr inbounds i64, i64* %409, i64 1, !dbg !51 + %411 = getelementptr inbounds i64, i64* %410, i64 1, !dbg !51 + %412 = bitcast i64* %407 to <4 x i64>*, !dbg !51 + store <4 x i64> , <4 x i64>* %412, align 8, !dbg !51, !tbaa !4 + %413 = getelementptr inbounds i64, i64* %411, i64 1, !dbg !51 + %414 = getelementptr inbounds i64, i64* %413, i64 1, !dbg !51 + %415 = bitcast i64* %411 to <2 x i64>*, !dbg !51 + store <2 x i64> , <2 x i64>* %415, align 8, !dbg !51, !tbaa !4 + %416 = getelementptr inbounds i64, i64* %414, i64 1, !dbg !51 + store i64* %416, i64** %405, align 8, !dbg !51, !tbaa !29 + store i64 -19, i64* %414, align 8, !dbg !51, !tbaa !4 + %send784.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.17, i64 0) #11, !dbg !51 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 28), i64** %117, align 8, !dbg !51, !tbaa !12 + %rubyId_d788.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !114 + %rawSym789.i = call i64 @rb_id2sym(i64 %rubyId_d788.i) #11, !dbg !114 + %rubyId_e791.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !115 + %rawSym792.i = call i64 @rb_id2sym(i64 %rubyId_e791.i) #11, !dbg !115 + %rubyId_baz794.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !116 + %rawSym795.i = call i64 @rb_id2sym(i64 %rubyId_baz794.i) #11, !dbg !116 + %417 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !52, !tbaa !12 + %418 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %417, i64 0, i32 2, !dbg !52 + %419 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %418, align 8, !dbg !52, !tbaa !14 + %420 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %419, i64 0, i32 1, !dbg !52 + %421 = load i64*, i64** %420, align 8, !dbg !52, !tbaa !29 + %422 = getelementptr inbounds i64, i64* %421, i64 1, !dbg !52 + store i64 %106, i64* %421, align 8, !dbg !52, !tbaa !4 + %423 = getelementptr inbounds i64, i64* %422, i64 1, !dbg !52 + %424 = getelementptr inbounds i64, i64* %423, i64 1, !dbg !52 + %425 = getelementptr inbounds i64, i64* %424, i64 1, !dbg !52 + %426 = getelementptr inbounds i64, i64* %425, i64 1, !dbg !52 + %427 = bitcast i64* %422 to <4 x i64>*, !dbg !52 + store <4 x i64> , <4 x i64>* %427, align 8, !dbg !52, !tbaa !4 + %428 = getelementptr inbounds i64, i64* %426, i64 1, !dbg !52 + %429 = getelementptr inbounds i64, i64* %428, i64 1, !dbg !52 + store i64* %429, i64** %420, align 8, !dbg !52, !tbaa !29 + %430 = bitcast i64* %426 to <2 x i64>*, !dbg !52 + store <2 x i64> , <2 x i64>* %430, align 8, !dbg !52, !tbaa !4 + %send808.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.18, i64 0) #11, !dbg !52 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 29), i64** %117, align 8, !dbg !52, !tbaa !12 + %rubyId_d811.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !117 + %rawSym812.i = call i64 @rb_id2sym(i64 %rubyId_d811.i) #11, !dbg !117 + %rubyId_e814.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !118 + %rawSym815.i = call i64 @rb_id2sym(i64 %rubyId_e814.i) #11, !dbg !118 + %rubyId_baz817.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !119 + %rawSym818.i = call i64 @rb_id2sym(i64 %rubyId_baz817.i) #11, !dbg !119 + %431 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !53, !tbaa !12 + %432 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %431, i64 0, i32 2, !dbg !53 + %433 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %432, align 8, !dbg !53, !tbaa !14 + %434 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %433, i64 0, i32 1, !dbg !53 + %435 = load i64*, i64** %434, align 8, !dbg !53, !tbaa !29 + %436 = getelementptr inbounds i64, i64* %435, i64 1, !dbg !53 + store i64 %106, i64* %435, align 8, !dbg !53, !tbaa !4 + %437 = getelementptr inbounds i64, i64* %436, i64 1, !dbg !53 + %438 = getelementptr inbounds i64, i64* %437, i64 1, !dbg !53 + %439 = getelementptr inbounds i64, i64* %438, i64 1, !dbg !53 + %440 = getelementptr inbounds i64, i64* %439, i64 1, !dbg !53 + %441 = bitcast i64* %436 to <4 x i64>*, !dbg !53 + store <4 x i64> , <4 x i64>* %441, align 8, !dbg !53, !tbaa !4 + %442 = getelementptr inbounds i64, i64* %440, i64 1, !dbg !53 + store i64* %442, i64** %434, align 8, !dbg !53, !tbaa !29 + store i64 -19, i64* %440, align 8, !dbg !53, !tbaa !4 + %send830.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.19, i64 0) #11, !dbg !53 + store i64* getelementptr inbounds ([32 x i64], [32 x i64]* @iseqEncodedArray, i64 0, i64 30), i64** %117, align 8, !dbg !53, !tbaa !12 + %rubyId_d832.i = load i64, i64* @rubyIdPrecomputed_d, align 8, !dbg !120 + %rawSym833.i = call i64 @rb_id2sym(i64 %rubyId_d832.i) #11, !dbg !120 + %rubyId_e835.i = load i64, i64* @rubyIdPrecomputed_e, align 8, !dbg !121 + %rawSym836.i = call i64 @rb_id2sym(i64 %rubyId_e835.i) #11, !dbg !121 + %rubyId_baz838.i = load i64, i64* @rubyIdPrecomputed_baz, align 8, !dbg !122 + %rawSym839.i = call i64 @rb_id2sym(i64 %rubyId_baz838.i) #11, !dbg !122 + %443 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !54, !tbaa !12 + %444 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %443, i64 0, i32 2, !dbg !54 + %445 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %444, align 8, !dbg !54, !tbaa !14 + %446 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %445, i64 0, i32 1, !dbg !54 + %447 = load i64*, i64** %446, align 8, !dbg !54, !tbaa !29 + %448 = getelementptr inbounds i64, i64* %447, i64 1, !dbg !54 + store i64 %106, i64* %447, align 8, !dbg !54, !tbaa !4 + %449 = getelementptr inbounds i64, i64* %448, i64 1, !dbg !54 + %450 = getelementptr inbounds i64, i64* %449, i64 1, !dbg !54 + %451 = getelementptr inbounds i64, i64* %450, i64 1, !dbg !54 + %452 = getelementptr inbounds i64, i64* %451, i64 1, !dbg !54 + store i64* %452, i64** %446, align 8, !dbg !54, !tbaa !29 + %453 = bitcast i64* %448 to <4 x i64>*, !dbg !54 + store <4 x i64> , <4 x i64>* %453, align 8, !dbg !54, !tbaa !4 + %send850.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_take_arguments.20, i64 0) #11, !dbg !54 call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %107) call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %108) ret void @@ -1439,118 +1390,108 @@ attributes #12 = { willreturn } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 4, column: 1, scope: !8) -!32 = !{!33, !5, i64 0} -!33 = !{!"RBasic", !5, i64 0, !5, i64 8} -!34 = !{!"branch_weights", i32 1, i32 2000} -!35 = !DILocation(line: 4, column: 23, scope: !8) -!36 = !DILocation(line: 4, column: 36, scope: !8) -!37 = !DILocation(line: 0, scope: !8) -!38 = !DILocation(line: 5, column: 10, scope: !8) -!39 = !{!40} -!40 = distinct !{!40, !41, !"sorbet_buildArrayIntrinsic: argument 0"} -!41 = distinct !{!41, !"sorbet_buildArrayIntrinsic"} -!42 = !{!19, !13, i64 8} -!43 = !DILocation(line: 5, column: 5, scope: !8) -!44 = !DILocation(line: 4, column: 1, scope: !45) -!45 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!46 = !DILocation(line: 8, column: 1, scope: !45) -!47 = !DILocation(line: 9, column: 1, scope: !45) -!48 = !DILocation(line: 10, column: 1, scope: !45) -!49 = !DILocation(line: 11, column: 1, scope: !45) -!50 = !DILocation(line: 12, column: 1, scope: !45) -!51 = !DILocation(line: 13, column: 1, scope: !45) -!52 = !DILocation(line: 14, column: 1, scope: !45) -!53 = !DILocation(line: 16, column: 1, scope: !45) -!54 = !DILocation(line: 17, column: 1, scope: !45) -!55 = !DILocation(line: 18, column: 1, scope: !45) -!56 = !DILocation(line: 19, column: 1, scope: !45) -!57 = !DILocation(line: 20, column: 1, scope: !45) -!58 = !DILocation(line: 21, column: 1, scope: !45) -!59 = !DILocation(line: 22, column: 1, scope: !45) -!60 = !DILocation(line: 24, column: 1, scope: !45) -!61 = !DILocation(line: 25, column: 1, scope: !45) -!62 = !DILocation(line: 26, column: 1, scope: !45) -!63 = !DILocation(line: 27, column: 1, scope: !45) -!64 = !DILocation(line: 28, column: 1, scope: !45) -!65 = !DILocation(line: 29, column: 1, scope: !45) -!66 = !DILocation(line: 30, column: 1, scope: !45) -!67 = !{!68, !5, i64 400} -!68 = !{!"rb_vm_struct", !5, i64 0, !69, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !72, i64 216, !6, i64 224, !70, i64 264, !70, i64 280, !70, i64 296, !70, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !73, i64 472, !74, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !70, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !75, i64 1200, !6, i64 1232} -!69 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !70, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!70 = !{!"list_head", !71, i64 0} -!71 = !{!"list_node", !13, i64 0, !13, i64 8} -!72 = !{!"long long", !6, i64 0} -!73 = !{!"", !6, i64 0} -!74 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!75 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!76 = !{!19, !13, i64 32} -!77 = !DILocation(line: 0, scope: !45) -!78 = !{!79, !16, i64 20} -!79 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!80 = !{!79, !16, i64 24} -!81 = !{!79, !16, i64 28} -!82 = !{!16, !16, i64 0} -!83 = !{!79, !13, i64 32} -!84 = !{!79, !16, i64 40} -!85 = !{!79, !16, i64 44} -!86 = !{!79, !16, i64 8} -!87 = !{!79, !16, i64 12} -!88 = !{!79, !16, i64 48} -!89 = !{!79, !16, i64 52} -!90 = !{!79, !13, i64 56} -!91 = !DILocation(line: 8, column: 44, scope: !45) -!92 = !DILocation(line: 9, column: 40, scope: !45) -!93 = !DILocation(line: 10, column: 36, scope: !45) -!94 = !DILocation(line: 11, column: 32, scope: !45) -!95 = !DILocation(line: 12, column: 28, scope: !45) -!96 = !DILocation(line: 13, column: 24, scope: !45) -!97 = !DILocation(line: 14, column: 20, scope: !45) -!98 = !DILocation(line: 16, column: 44, scope: !45) -!99 = !DILocation(line: 16, column: 51, scope: !45) -!100 = !DILocation(line: 17, column: 40, scope: !45) -!101 = !DILocation(line: 17, column: 47, scope: !45) -!102 = !DILocation(line: 18, column: 36, scope: !45) -!103 = !DILocation(line: 18, column: 43, scope: !45) -!104 = !DILocation(line: 19, column: 32, scope: !45) -!105 = !DILocation(line: 19, column: 39, scope: !45) -!106 = !DILocation(line: 20, column: 28, scope: !45) -!107 = !DILocation(line: 20, column: 35, scope: !45) -!108 = !DILocation(line: 21, column: 24, scope: !45) -!109 = !DILocation(line: 21, column: 31, scope: !45) -!110 = !DILocation(line: 22, column: 20, scope: !45) -!111 = !DILocation(line: 22, column: 27, scope: !45) -!112 = !DILocation(line: 24, column: 44, scope: !45) -!113 = !DILocation(line: 24, column: 51, scope: !45) -!114 = !DILocation(line: 24, column: 58, scope: !45) -!115 = !DILocation(line: 25, column: 40, scope: !45) -!116 = !DILocation(line: 25, column: 47, scope: !45) -!117 = !DILocation(line: 25, column: 54, scope: !45) -!118 = !DILocation(line: 26, column: 36, scope: !45) -!119 = !DILocation(line: 26, column: 43, scope: !45) -!120 = !DILocation(line: 26, column: 50, scope: !45) -!121 = !DILocation(line: 27, column: 32, scope: !45) -!122 = !DILocation(line: 27, column: 39, scope: !45) -!123 = !DILocation(line: 27, column: 46, scope: !45) -!124 = !DILocation(line: 28, column: 28, scope: !45) -!125 = !DILocation(line: 28, column: 35, scope: !45) -!126 = !DILocation(line: 28, column: 42, scope: !45) -!127 = !DILocation(line: 29, column: 24, scope: !45) -!128 = !DILocation(line: 29, column: 31, scope: !45) -!129 = !DILocation(line: 29, column: 38, scope: !45) -!130 = !DILocation(line: 30, column: 20, scope: !45) -!131 = !DILocation(line: 30, column: 27, scope: !45) -!132 = !DILocation(line: 30, column: 34, scope: !45) +!18 = !DILocation(line: 4, column: 1, scope: !8) +!19 = !{!20, !5, i64 0} +!20 = !{!"RBasic", !5, i64 0, !5, i64 8} +!21 = !{!"branch_weights", i32 1, i32 2000} +!22 = !DILocation(line: 4, column: 23, scope: !8) +!23 = !DILocation(line: 4, column: 36, scope: !8) +!24 = !DILocation(line: 0, scope: !8) +!25 = !DILocation(line: 5, column: 10, scope: !8) +!26 = !{!27} +!27 = distinct !{!27, !28, !"sorbet_buildArrayIntrinsic: argument 0"} +!28 = distinct !{!28, !"sorbet_buildArrayIntrinsic"} +!29 = !{!30, !13, i64 8} +!30 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!31 = !DILocation(line: 5, column: 5, scope: !8) +!32 = !DILocation(line: 4, column: 1, scope: !33) +!33 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!34 = !DILocation(line: 8, column: 1, scope: !33) +!35 = !DILocation(line: 9, column: 1, scope: !33) +!36 = !DILocation(line: 10, column: 1, scope: !33) +!37 = !DILocation(line: 11, column: 1, scope: !33) +!38 = !DILocation(line: 12, column: 1, scope: !33) +!39 = !DILocation(line: 13, column: 1, scope: !33) +!40 = !DILocation(line: 14, column: 1, scope: !33) +!41 = !DILocation(line: 16, column: 1, scope: !33) +!42 = !DILocation(line: 17, column: 1, scope: !33) +!43 = !DILocation(line: 18, column: 1, scope: !33) +!44 = !DILocation(line: 19, column: 1, scope: !33) +!45 = !DILocation(line: 20, column: 1, scope: !33) +!46 = !DILocation(line: 21, column: 1, scope: !33) +!47 = !DILocation(line: 22, column: 1, scope: !33) +!48 = !DILocation(line: 24, column: 1, scope: !33) +!49 = !DILocation(line: 25, column: 1, scope: !33) +!50 = !DILocation(line: 26, column: 1, scope: !33) +!51 = !DILocation(line: 27, column: 1, scope: !33) +!52 = !DILocation(line: 28, column: 1, scope: !33) +!53 = !DILocation(line: 29, column: 1, scope: !33) +!54 = !DILocation(line: 30, column: 1, scope: !33) +!55 = !{!56, !5, i64 400} +!56 = !{!"rb_vm_struct", !5, i64 0, !57, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !60, i64 216, !6, i64 224, !58, i64 264, !58, i64 280, !58, i64 296, !58, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !61, i64 472, !62, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !58, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !63, i64 1200, !6, i64 1232} +!57 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !58, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!58 = !{!"list_head", !59, i64 0} +!59 = !{!"list_node", !13, i64 0, !13, i64 8} +!60 = !{!"long long", !6, i64 0} +!61 = !{!"", !6, i64 0} +!62 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!63 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!64 = !{!30, !13, i64 16} +!65 = !{!30, !13, i64 32} +!66 = !DILocation(line: 0, scope: !33) +!67 = !{!68, !16, i64 20} +!68 = !{!"rb_sorbet_param_struct", !69, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!69 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!70 = !{!68, !16, i64 24} +!71 = !{!68, !16, i64 28} +!72 = !{!16, !16, i64 0} +!73 = !{!68, !13, i64 32} +!74 = !{!68, !16, i64 40} +!75 = !{!68, !16, i64 44} +!76 = !{!68, !16, i64 8} +!77 = !{!68, !16, i64 12} +!78 = !{!68, !16, i64 48} +!79 = !{!68, !16, i64 52} +!80 = !{!68, !13, i64 56} +!81 = !DILocation(line: 8, column: 44, scope: !33) +!82 = !DILocation(line: 9, column: 40, scope: !33) +!83 = !DILocation(line: 10, column: 36, scope: !33) +!84 = !DILocation(line: 11, column: 32, scope: !33) +!85 = !DILocation(line: 12, column: 28, scope: !33) +!86 = !DILocation(line: 13, column: 24, scope: !33) +!87 = !DILocation(line: 14, column: 20, scope: !33) +!88 = !DILocation(line: 16, column: 44, scope: !33) +!89 = !DILocation(line: 16, column: 51, scope: !33) +!90 = !DILocation(line: 17, column: 40, scope: !33) +!91 = !DILocation(line: 17, column: 47, scope: !33) +!92 = !DILocation(line: 18, column: 36, scope: !33) +!93 = !DILocation(line: 18, column: 43, scope: !33) +!94 = !DILocation(line: 19, column: 32, scope: !33) +!95 = !DILocation(line: 19, column: 39, scope: !33) +!96 = !DILocation(line: 20, column: 28, scope: !33) +!97 = !DILocation(line: 20, column: 35, scope: !33) +!98 = !DILocation(line: 21, column: 24, scope: !33) +!99 = !DILocation(line: 21, column: 31, scope: !33) +!100 = !DILocation(line: 22, column: 20, scope: !33) +!101 = !DILocation(line: 22, column: 27, scope: !33) +!102 = !DILocation(line: 24, column: 44, scope: !33) +!103 = !DILocation(line: 24, column: 51, scope: !33) +!104 = !DILocation(line: 24, column: 58, scope: !33) +!105 = !DILocation(line: 25, column: 40, scope: !33) +!106 = !DILocation(line: 25, column: 47, scope: !33) +!107 = !DILocation(line: 25, column: 54, scope: !33) +!108 = !DILocation(line: 26, column: 36, scope: !33) +!109 = !DILocation(line: 26, column: 43, scope: !33) +!110 = !DILocation(line: 26, column: 50, scope: !33) +!111 = !DILocation(line: 27, column: 32, scope: !33) +!112 = !DILocation(line: 27, column: 39, scope: !33) +!113 = !DILocation(line: 27, column: 46, scope: !33) +!114 = !DILocation(line: 28, column: 28, scope: !33) +!115 = !DILocation(line: 28, column: 35, scope: !33) +!116 = !DILocation(line: 28, column: 42, scope: !33) +!117 = !DILocation(line: 29, column: 24, scope: !33) +!118 = !DILocation(line: 29, column: 31, scope: !33) +!119 = !DILocation(line: 29, column: 38, scope: !33) +!120 = !DILocation(line: 30, column: 20, scope: !33) +!121 = !DILocation(line: 30, column: 27, scope: !33) +!122 = !DILocation(line: 30, column: 34, scope: !33) diff --git a/test/testdata/compiler/block_arg_expand.llo.exp b/test/testdata/compiler/block_arg_expand.llo.exp index f6486c93435..0f23dfa07a6 100644 --- a/test/testdata/compiler/block_arg_expand.llo.exp +++ b/test/testdata/compiler/block_arg_expand.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,37 +50,37 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.rb_captured_block = type { i64, i64*, %union.anon.17 } -%union.anon.17 = type { %struct.rb_iseq_struct* } +%struct.rb_captured_block = type { i64, i64*, %union.anon.20 } +%union.anon.20 = type { %struct.rb_iseq_struct* } %struct.iseq_inline_iv_cache_entry = type { i64, i64 } -%struct.RArray = type { %struct.iseq_inline_iv_cache_entry, %union.anon.25 } -%union.anon.25 = type { %struct.anon.26 } -%struct.anon.26 = type { i64, %union.anon.27, i64* } -%union.anon.27 = type { i64 } +%struct.RArray = type { %struct.iseq_inline_iv_cache_entry, %union.anon.28 } +%union.anon.28 = type { %struct.anon.29 } +%struct.anon.29 = type { i64, %union.anon, i64* } %struct.sorbet_inlineIntrinsicEnv = type { i64, i64, i32, i64*, i64 } @ruby_current_execution_context_ptr = external local_unnamed_addr global %struct.rb_execution_context_struct*, align 8 @@ -92,6 +93,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/block_arg_expand.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/block_arg_expand.rb" = private unnamed_addr constant [43 x i8] c"test/testdata/compiler/block_arg_expand.rb\00", align 1 +@iseqEncodedArray = internal global [9 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_.$152$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -111,7 +114,9 @@ declare void @rb_error_arity(i32, i32, i32) local_unnamed_addr #0 ; Function Attrs: cold noreturn declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_readRealpath() local_unnamed_addr #2 @@ -202,277 +207,267 @@ functionEntryInitializers: %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !13 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !23 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !25 - %13 = getelementptr inbounds i64, i64* %12, i64 4 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %8, align 8, !tbaa !4 - %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !34 - br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !34 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %8, align 8, !tbaa !4 + %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !23 + br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !23 argArrayExpandArrayTest: ; preds = %functionEntryInitializers - %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !34 - %15 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !34 - %16 = icmp ne i64 %15, 0, !dbg !34 - %17 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !34 - %18 = icmp eq i64 %17, 0, !dbg !34 - %19 = or i1 %16, %18, !dbg !34 - br i1 %19, label %fillFromDefaultBlockDone2, label %sorbet_isa_Array.exit, !dbg !34 + %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !23 + %9 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !23 + %10 = icmp ne i64 %9, 0, !dbg !23 + %11 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !23 + %12 = icmp eq i64 %11, 0, !dbg !23 + %13 = or i1 %10, %12, !dbg !23 + br i1 %13, label %fillFromDefaultBlockDone2, label %sorbet_isa_Array.exit, !dbg !23 sorbet_isa_Array.exit: ; preds = %argArrayExpandArrayTest - %20 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !34 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !34 - %22 = load i64, i64* %21, align 8, !dbg !34, !tbaa !35 - %23 = and i64 %22, 31, !dbg !34 - %24 = icmp eq i64 %23, 7, !dbg !34 - br i1 %24, label %argArrayExpand, label %fillFromDefaultBlockDone2, !dbg !34 + %14 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !23 + %15 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %14, i64 0, i32 0, !dbg !23 + %16 = load i64, i64* %15, align 8, !dbg !23, !tbaa !24 + %17 = and i64 %16, 31, !dbg !23 + %18 = icmp eq i64 %17, 7, !dbg !23 + br i1 %18, label %argArrayExpand, label %fillFromDefaultBlockDone2, !dbg !23 argArrayExpand: ; preds = %sorbet_isa_Array.exit - %25 = and i64 %22, 33554432, !dbg !34 - %26 = icmp eq i64 %25, 0, !dbg !34 - br i1 %26, label %28, label %27, !dbg !34 - -27: ; preds = %argArrayExpand - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #14, !dbg !34 - br label %28, !dbg !34 - -28: ; preds = %27, %argArrayExpand - %29 = load i64, i64* %21, align 8, !dbg !34, !tbaa !35 - %30 = and i64 %29, 8192, !dbg !34 - %31 = icmp eq i64 %30, 0, !dbg !34 - %32 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.RArray*, !dbg !34 - br i1 %31, label %37, label %33, !dbg !34 - -33: ; preds = %28 - %34 = getelementptr inbounds %struct.RArray, %struct.RArray* %32, i64 0, i32 1, i32 0, i32 0, !dbg !34 - %35 = lshr i64 %29, 15, !dbg !34 - %36 = and i64 %35, 3, !dbg !34 - br label %rb_array_len.exit, !dbg !34 - -37: ; preds = %28 - %38 = getelementptr inbounds %struct.RArray, %struct.RArray* %32, i64 0, i32 1, i32 0, i32 2, !dbg !34 - %39 = load i64*, i64** %38, align 8, !dbg !34, !tbaa !37 - %40 = getelementptr inbounds %struct.RArray, %struct.RArray* %32, i64 0, i32 1, i32 0, i32 0, !dbg !34 - %41 = load i64, i64* %40, align 8, !dbg !34, !tbaa !37 - br label %rb_array_len.exit, !dbg !34 - -rb_array_len.exit: ; preds = %33, %37 - %42 = phi i64* [ %34, %33 ], [ %39, %37 ] - %43 = phi i64 [ %36, %33 ], [ %41, %37 ], !dbg !34 - %44 = trunc i64 %43 to i32, !dbg !34 - br label %fillRequiredArgs, !dbg !34 + %19 = and i64 %16, 33554432, !dbg !23 + %20 = icmp eq i64 %19, 0, !dbg !23 + br i1 %20, label %22, label %21, !dbg !23 + +21: ; preds = %argArrayExpand + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #14, !dbg !23 + br label %22, !dbg !23 + +22: ; preds = %21, %argArrayExpand + %23 = load i64, i64* %15, align 8, !dbg !23, !tbaa !24 + %24 = and i64 %23, 8192, !dbg !23 + %25 = icmp eq i64 %24, 0, !dbg !23 + %26 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.RArray*, !dbg !23 + br i1 %25, label %31, label %27, !dbg !23 + +27: ; preds = %22 + %28 = getelementptr inbounds %struct.RArray, %struct.RArray* %26, i64 0, i32 1, i32 0, i32 0, !dbg !23 + %29 = lshr i64 %23, 15, !dbg !23 + %30 = and i64 %29, 3, !dbg !23 + br label %rb_array_len.exit, !dbg !23 + +31: ; preds = %22 + %32 = getelementptr inbounds %struct.RArray, %struct.RArray* %26, i64 0, i32 1, i32 0, i32 2, !dbg !23 + %33 = load i64*, i64** %32, align 8, !dbg !23, !tbaa !26 + %34 = getelementptr inbounds %struct.RArray, %struct.RArray* %26, i64 0, i32 1, i32 0, i32 0, !dbg !23 + %35 = load i64, i64* %34, align 8, !dbg !23, !tbaa !26 + br label %rb_array_len.exit, !dbg !23 + +rb_array_len.exit: ; preds = %27, %31 + %36 = phi i64* [ %28, %27 ], [ %33, %31 ] + %37 = phi i64 [ %30, %27 ], [ %35, %31 ], !dbg !23 + %38 = trunc i64 %37 to i32, !dbg !23 + br label %fillRequiredArgs, !dbg !23 fillFromArgBlock0: ; preds = %fillRequiredArgs - %rawArg_el1 = load i64, i64* %argArrayPhi, align 8, !dbg !34 - %default1 = icmp eq i32 %argcPhi, 1, !dbg !34 - br i1 %default1, label %fillFromDefaultBlockDone2, label %fillFromArgBlock1, !dbg !34, !prof !38 + %rawArg_el1 = load i64, i64* %argArrayPhi, align 8, !dbg !23 + %default1 = icmp eq i32 %argcPhi, 1, !dbg !23 + br i1 %default1, label %fillFromDefaultBlockDone2, label %fillFromArgBlock1, !dbg !23, !prof !27 fillFromArgBlock1: ; preds = %fillFromArgBlock0 - %45 = getelementptr i64, i64* %argArrayPhi, i32 1, !dbg !34 - %rawArg_el2 = load i64, i64* %45, align 8, !dbg !34 - br label %fillFromDefaultBlockDone2, !dbg !34 + %39 = getelementptr i64, i64* %argArrayPhi, i32 1, !dbg !23 + %rawArg_el2 = load i64, i64* %39, align 8, !dbg !23 + br label %fillFromDefaultBlockDone2, !dbg !23 fillFromDefaultBlockDone2: ; preds = %sorbet_isa_Array.exit, %argArrayExpandArrayTest, %fillFromArgBlock0, %fillFromArgBlock1 - %el2.sroa.0.0 = phi i64 [ %rawArg_el2, %fillFromArgBlock1 ], [ 8, %fillFromArgBlock0 ], [ 8, %argArrayExpandArrayTest ], [ 8, %sorbet_isa_Array.exit ], !dbg !34 - %el1.sroa.0.1 = phi i64 [ %rawArg_el1, %fillFromArgBlock1 ], [ %rawArg_el1, %fillFromArgBlock0 ], [ %arg1_maybeExpandToFullArgs, %argArrayExpandArrayTest ], [ %arg1_maybeExpandToFullArgs, %sorbet_isa_Array.exit ], !dbg !34 - %46 = getelementptr inbounds i64, i64* %12, i64 6, !dbg !39 - %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !39 - store i64* %47, i64** %8, align 8, !dbg !39, !tbaa !4 - %48 = and i64 %el1.sroa.0.1, 1, !dbg !40 - %49 = icmp eq i64 %48, 0, !dbg !40 - br i1 %49, label %50, label %typeTestSuccess, !dbg !40, !prof !38 - -50: ; preds = %fillFromDefaultBlockDone2.thread, %fillFromDefaultBlockDone2 - %el1.sroa.0.145 = phi i64 [ 8, %fillFromDefaultBlockDone2.thread ], [ %el1.sroa.0.1, %fillFromDefaultBlockDone2 ] - %el2.sroa.0.043 = phi i64 [ 8, %fillFromDefaultBlockDone2.thread ], [ %el2.sroa.0.0, %fillFromDefaultBlockDone2 ] - %51 = and i64 %el1.sroa.0.145, 7, !dbg !40 - %52 = icmp ne i64 %51, 0, !dbg !40 - %53 = and i64 %el1.sroa.0.145, -9, !dbg !40 - %54 = icmp eq i64 %53, 0, !dbg !40 - %55 = or i1 %52, %54, !dbg !40 - br i1 %55, label %codeRepl, label %sorbet_isa_Integer.exit39, !dbg !40, !prof !41 - -sorbet_isa_Integer.exit39: ; preds = %50 - %56 = inttoptr i64 %el1.sroa.0.145 to %struct.iseq_inline_iv_cache_entry*, !dbg !40 - %57 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %56, i64 0, i32 0, !dbg !40 - %58 = load i64, i64* %57, align 8, !dbg !40, !tbaa !35 - %59 = and i64 %58, 31, !dbg !40 - %60 = icmp eq i64 %59, 10, !dbg !40 - br i1 %60, label %typeTestSuccess, label %codeRepl, !dbg !40, !prof !42 + %el2.sroa.0.0 = phi i64 [ %rawArg_el2, %fillFromArgBlock1 ], [ 8, %fillFromArgBlock0 ], [ 8, %argArrayExpandArrayTest ], [ 8, %sorbet_isa_Array.exit ], !dbg !23 + %el1.sroa.0.1 = phi i64 [ %rawArg_el1, %fillFromArgBlock1 ], [ %rawArg_el1, %fillFromArgBlock0 ], [ %arg1_maybeExpandToFullArgs, %argArrayExpandArrayTest ], [ %arg1_maybeExpandToFullArgs, %sorbet_isa_Array.exit ], !dbg !23 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %8, align 8, !dbg !28, !tbaa !4 + %40 = and i64 %el1.sroa.0.1, 1, !dbg !29 + %41 = icmp eq i64 %40, 0, !dbg !29 + br i1 %41, label %42, label %typeTestSuccess, !dbg !29, !prof !27 + +42: ; preds = %fillFromDefaultBlockDone2.thread, %fillFromDefaultBlockDone2 + %el1.sroa.0.142 = phi i64 [ 8, %fillFromDefaultBlockDone2.thread ], [ %el1.sroa.0.1, %fillFromDefaultBlockDone2 ] + %el2.sroa.0.040 = phi i64 [ 8, %fillFromDefaultBlockDone2.thread ], [ %el2.sroa.0.0, %fillFromDefaultBlockDone2 ] + %43 = and i64 %el1.sroa.0.142, 7, !dbg !29 + %44 = icmp ne i64 %43, 0, !dbg !29 + %45 = and i64 %el1.sroa.0.142, -9, !dbg !29 + %46 = icmp eq i64 %45, 0, !dbg !29 + %47 = or i1 %44, %46, !dbg !29 + br i1 %47, label %codeRepl, label %sorbet_isa_Integer.exit36, !dbg !29, !prof !30 + +sorbet_isa_Integer.exit36: ; preds = %42 + %48 = inttoptr i64 %el1.sroa.0.142 to %struct.iseq_inline_iv_cache_entry*, !dbg !29 + %49 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %48, i64 0, i32 0, !dbg !29 + %50 = load i64, i64* %49, align 8, !dbg !29, !tbaa !24 + %51 = and i64 %50, 31, !dbg !29 + %52 = icmp eq i64 %51, 10, !dbg !29 + br i1 %52, label %typeTestSuccess, label %codeRepl, !dbg !29, !prof !31 fillRequiredArgs: ; preds = %functionEntryInitializers, %rb_array_len.exit - %argcPhi = phi i32 [ %argc, %functionEntryInitializers ], [ %44, %rb_array_len.exit ], !dbg !34 - %argArrayPhi = phi i64* [ %argArray, %functionEntryInitializers ], [ %42, %rb_array_len.exit ], !dbg !34 - %default0 = icmp eq i32 %argcPhi, 0, !dbg !34 - br i1 %default0, label %fillFromDefaultBlockDone2.thread, label %fillFromArgBlock0, !dbg !34, !prof !38 + %argcPhi = phi i32 [ %argc, %functionEntryInitializers ], [ %38, %rb_array_len.exit ], !dbg !23 + %argArrayPhi = phi i64* [ %argArray, %functionEntryInitializers ], [ %36, %rb_array_len.exit ], !dbg !23 + %default0 = icmp eq i32 %argcPhi, 0, !dbg !23 + br i1 %default0, label %fillFromDefaultBlockDone2.thread, label %fillFromArgBlock0, !dbg !23, !prof !27 fillFromDefaultBlockDone2.thread: ; preds = %fillRequiredArgs - %61 = getelementptr inbounds i64, i64* %12, i64 6, !dbg !39 - %62 = getelementptr inbounds i64, i64* %61, i64 1, !dbg !39 - store i64* %62, i64** %8, align 8, !dbg !39, !tbaa !4 - br label %50, !dbg !40 - -typeTestSuccess: ; preds = %fillFromDefaultBlockDone2, %sorbet_isa_Integer.exit39 - %el2.sroa.0.04249 = phi i64 [ %el2.sroa.0.043, %sorbet_isa_Integer.exit39 ], [ %el2.sroa.0.0, %fillFromDefaultBlockDone2 ] - %el1.sroa.0.14448 = phi i64 [ %el1.sroa.0.145, %sorbet_isa_Integer.exit39 ], [ %el1.sroa.0.1, %fillFromDefaultBlockDone2 ] - %63 = phi i64 [ 0, %sorbet_isa_Integer.exit39 ], [ 1, %fillFromDefaultBlockDone2 ] - %64 = and i64 %el2.sroa.0.04249, 1, !dbg !43 - %65 = icmp eq i64 %64, 0, !dbg !43 - br i1 %65, label %66, label %"fastSymCallIntrinsic_Integer_+", !dbg !43, !prof !38 - -66: ; preds = %typeTestSuccess - %67 = and i64 %el2.sroa.0.04249, 7, !dbg !43 - %68 = icmp ne i64 %67, 0, !dbg !43 - %69 = and i64 %el2.sroa.0.04249, -9, !dbg !43 - %70 = icmp eq i64 %69, 0, !dbg !43 - %71 = or i1 %68, %70, !dbg !43 - br i1 %71, label %codeRepl64, label %sorbet_isa_Integer.exit, !dbg !43, !prof !41 - -sorbet_isa_Integer.exit: ; preds = %66 - %72 = inttoptr i64 %el2.sroa.0.04249 to %struct.iseq_inline_iv_cache_entry*, !dbg !43 - %73 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %72, i64 0, i32 0, !dbg !43 - %74 = load i64, i64* %73, align 8, !dbg !43, !tbaa !35 - %75 = and i64 %74, 31, !dbg !43 - %76 = icmp eq i64 %75, 10, !dbg !43 - br i1 %76, label %"fastSymCallIntrinsic_Integer_+", label %codeRepl64, !dbg !43, !prof !42 - -codeRepl: ; preds = %sorbet_isa_Integer.exit39, %50 - tail call fastcc void @"func_.$152$block_1.cold.1"(i64 %el1.sroa.0.145) #17, !dbg !40 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %8, align 8, !dbg !28, !tbaa !4 + br label %42, !dbg !29 + +typeTestSuccess: ; preds = %fillFromDefaultBlockDone2, %sorbet_isa_Integer.exit36 + %el2.sroa.0.03946 = phi i64 [ %el2.sroa.0.040, %sorbet_isa_Integer.exit36 ], [ %el2.sroa.0.0, %fillFromDefaultBlockDone2 ] + %el1.sroa.0.14145 = phi i64 [ %el1.sroa.0.142, %sorbet_isa_Integer.exit36 ], [ %el1.sroa.0.1, %fillFromDefaultBlockDone2 ] + %53 = phi i64 [ 0, %sorbet_isa_Integer.exit36 ], [ 1, %fillFromDefaultBlockDone2 ] + %54 = and i64 %el2.sroa.0.03946, 1, !dbg !32 + %55 = icmp eq i64 %54, 0, !dbg !32 + br i1 %55, label %56, label %"fastSymCallIntrinsic_Integer_+", !dbg !32, !prof !27 + +56: ; preds = %typeTestSuccess + %57 = and i64 %el2.sroa.0.03946, 7, !dbg !32 + %58 = icmp ne i64 %57, 0, !dbg !32 + %59 = and i64 %el2.sroa.0.03946, -9, !dbg !32 + %60 = icmp eq i64 %59, 0, !dbg !32 + %61 = or i1 %58, %60, !dbg !32 + br i1 %61, label %codeRepl61, label %sorbet_isa_Integer.exit, !dbg !32, !prof !30 + +sorbet_isa_Integer.exit: ; preds = %56 + %62 = inttoptr i64 %el2.sroa.0.03946 to %struct.iseq_inline_iv_cache_entry*, !dbg !32 + %63 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %62, i64 0, i32 0, !dbg !32 + %64 = load i64, i64* %63, align 8, !dbg !32, !tbaa !24 + %65 = and i64 %64, 31, !dbg !32 + %66 = icmp eq i64 %65, 10, !dbg !32 + br i1 %66, label %"fastSymCallIntrinsic_Integer_+", label %codeRepl61, !dbg !32, !prof !31 + +codeRepl: ; preds = %sorbet_isa_Integer.exit36, %42 + tail call fastcc void @"func_.$152$block_1.cold.1"(i64 %el1.sroa.0.142) #17, !dbg !29 unreachable -codeRepl64: ; preds = %sorbet_isa_Integer.exit, %66 - tail call fastcc void @"func_.$152$block_1.cold.1"(i64 %el2.sroa.0.04249) #17, !dbg !43 +codeRepl61: ; preds = %sorbet_isa_Integer.exit, %56 + tail call fastcc void @"func_.$152$block_1.cold.1"(i64 %el2.sroa.0.03946) #17, !dbg !32 unreachable "fastSymCallIntrinsic_Integer_+": ; preds = %typeTestSuccess, %sorbet_isa_Integer.exit - tail call void @llvm.experimental.noalias.scope.decl(metadata !44), !dbg !40 - %77 = and i64 %63, %el2.sroa.0.04249, !dbg !40 - %78 = icmp eq i64 %77, 0, !dbg !40 - br i1 %78, label %88, label %79, !dbg !40, !prof !47 - -79: ; preds = %"fastSymCallIntrinsic_Integer_+" - %80 = add nsw i64 %el2.sroa.0.04249, -1, !dbg !40 - %81 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %el1.sroa.0.14448, i64 %80) #18, !dbg !40 - %82 = extractvalue { i64, i1 } %81, 1, !dbg !40 - %83 = extractvalue { i64, i1 } %81, 0, !dbg !40 - br i1 %82, label %84, label %sorbet_rb_int_plus.exit, !dbg !40 - -84: ; preds = %79 - %85 = ashr i64 %83, 1, !dbg !40 - %86 = xor i64 %85, -9223372036854775808, !dbg !40 - %87 = tail call i64 @rb_int2big(i64 %86) #14, !dbg !40, !noalias !44 - br label %sorbet_rb_int_plus.exit, !dbg !40 - -88: ; preds = %"fastSymCallIntrinsic_Integer_+" - %89 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %el1.sroa.0.14448, i64 %el2.sroa.0.04249) #14, !dbg !40, !noalias !44 - br label %sorbet_rb_int_plus.exit, !dbg !40 - -sorbet_rb_int_plus.exit: ; preds = %84, %79, %88 - %90 = phi i64 [ %89, %88 ], [ %87, %84 ], [ %83, %79 ], !dbg !40 - store i64* %14, i64** %8, align 8, !dbg !40, !tbaa !4 - ret i64 %90, !dbg !34 + tail call void @llvm.experimental.noalias.scope.decl(metadata !33), !dbg !29 + %67 = and i64 %53, %el2.sroa.0.03946, !dbg !29 + %68 = icmp eq i64 %67, 0, !dbg !29 + br i1 %68, label %78, label %69, !dbg !29, !prof !36 + +69: ; preds = %"fastSymCallIntrinsic_Integer_+" + %70 = add nsw i64 %el2.sroa.0.03946, -1, !dbg !29 + %71 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %el1.sroa.0.14145, i64 %70) #18, !dbg !29 + %72 = extractvalue { i64, i1 } %71, 1, !dbg !29 + %73 = extractvalue { i64, i1 } %71, 0, !dbg !29 + br i1 %72, label %74, label %sorbet_rb_int_plus.exit, !dbg !29 + +74: ; preds = %69 + %75 = ashr i64 %73, 1, !dbg !29 + %76 = xor i64 %75, -9223372036854775808, !dbg !29 + %77 = tail call i64 @rb_int2big(i64 %76) #14, !dbg !29, !noalias !33 + br label %sorbet_rb_int_plus.exit, !dbg !29 + +78: ; preds = %"fastSymCallIntrinsic_Integer_+" + %79 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %el1.sroa.0.14145, i64 %el2.sroa.0.03946) #14, !dbg !29, !noalias !33 + br label %sorbet_rb_int_plus.exit, !dbg !29 + +sorbet_rb_int_plus.exit: ; preds = %74, %69, %78 + %80 = phi i64 [ %79, %78 ], [ %77, %74 ], [ %73, %69 ], !dbg !29 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %8, align 8, !dbg !29, !tbaa !4 + ret i64 %80, !dbg !23 } ; Function Attrs: nounwind ssp define internal i64 @forward_sorbet_rb_array_each(i64 %0) #9 { entry: %1 = alloca i64, align 8 - %2 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !4 - %3 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %2, i64 0, i32 17, !dbg !48 - %4 = load i64, i64* %3, align 8, !dbg !48, !tbaa !8 - %5 = and i64 %4, -4, !dbg !48 - %6 = inttoptr i64 %5 to %struct.rb_captured_block*, !dbg !48 - store i64 0, i64* %3, align 8, !dbg !48, !tbaa !8 - %7 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !48 - %8 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %7, i64 0, i32 0, !dbg !48 - %9 = load i64, i64* %8, align 8, !dbg !48, !tbaa !49 - %10 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %7, i64 0, i32 2, !dbg !48 - %11 = load i32, i32* %10, align 8, !dbg !48, !tbaa !51 - %12 = icmp slt i32 %11, 0, !dbg !48 - %13 = icmp sgt i32 %11, 0, !dbg !48 - %or.cond.i = or i1 %12, %13, !dbg !48 - br i1 %or.cond.i, label %14, label %rb_check_arity.1.exit, !dbg !48 + %2 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !4 + %3 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %2, i64 0, i32 17, !dbg !37 + %4 = load i64, i64* %3, align 8, !dbg !37, !tbaa !8 + %5 = and i64 %4, -4, !dbg !37 + %6 = inttoptr i64 %5 to %struct.rb_captured_block*, !dbg !37 + store i64 0, i64* %3, align 8, !dbg !37, !tbaa !8 + %7 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !37 + %8 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %7, i64 0, i32 0, !dbg !37 + %9 = load i64, i64* %8, align 8, !dbg !37, !tbaa !38 + %10 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %7, i64 0, i32 2, !dbg !37 + %11 = load i32, i32* %10, align 8, !dbg !37, !tbaa !40 + %12 = icmp slt i32 %11, 0, !dbg !37 + %13 = icmp sgt i32 %11, 0, !dbg !37 + %or.cond.i = or i1 %12, %13, !dbg !37 + br i1 %or.cond.i, label %14, label %rb_check_arity.1.exit, !dbg !37 14: ; preds = %entry - tail call void @rb_error_arity(i32 %11, i32 noundef 0, i32 noundef 0) #16, !dbg !48 - unreachable, !dbg !48 + tail call void @rb_error_arity(i32 %11, i32 noundef 0, i32 noundef 0) #16, !dbg !37 + unreachable, !dbg !37 rb_check_arity.1.exit: ; preds = %entry - tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %6) #14, !dbg !48 - %15 = inttoptr i64 %9 to %struct.iseq_inline_iv_cache_entry*, !dbg !48 - %16 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %15, i64 0, i32 0, !dbg !48 - %17 = load i64, i64* %16, align 8, !dbg !48, !tbaa !35 - %18 = and i64 %17, 8192, !dbg !48 - %19 = icmp eq i64 %18, 0, !dbg !48 - br i1 %19, label %23, label %20, !dbg !48 + tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %6) #14, !dbg !37 + %15 = inttoptr i64 %9 to %struct.iseq_inline_iv_cache_entry*, !dbg !37 + %16 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %15, i64 0, i32 0, !dbg !37 + %17 = load i64, i64* %16, align 8, !dbg !37, !tbaa !24 + %18 = and i64 %17, 8192, !dbg !37 + %19 = icmp eq i64 %18, 0, !dbg !37 + br i1 %19, label %23, label %20, !dbg !37 20: ; preds = %rb_check_arity.1.exit - %21 = lshr i64 %17, 15, !dbg !48 - %22 = and i64 %21, 3, !dbg !48 - br label %rb_array_len.exit1, !dbg !48 + %21 = lshr i64 %17, 15, !dbg !37 + %22 = and i64 %21, 3, !dbg !37 + br label %rb_array_len.exit1, !dbg !37 23: ; preds = %rb_check_arity.1.exit - %24 = inttoptr i64 %9 to %struct.RArray*, !dbg !48 - %25 = getelementptr inbounds %struct.RArray, %struct.RArray* %24, i64 0, i32 1, i32 0, i32 0, !dbg !48 - %26 = load i64, i64* %25, align 8, !dbg !48, !tbaa !37 - br label %rb_array_len.exit1, !dbg !48 + %24 = inttoptr i64 %9 to %struct.RArray*, !dbg !37 + %25 = getelementptr inbounds %struct.RArray, %struct.RArray* %24, i64 0, i32 1, i32 0, i32 0, !dbg !37 + %26 = load i64, i64* %25, align 8, !dbg !37, !tbaa !26 + br label %rb_array_len.exit1, !dbg !37 rb_array_len.exit1: ; preds = %20, %23 - %27 = phi i64 [ %22, %20 ], [ %26, %23 ], !dbg !48 - %28 = icmp sgt i64 %27, 0, !dbg !48 - br i1 %28, label %29, label %sorbet_rb_array_each_withBlock.exit, !dbg !48 + %27 = phi i64 [ %22, %20 ], [ %26, %23 ], !dbg !37 + %28 = icmp sgt i64 %27, 0, !dbg !37 + br i1 %28, label %29, label %sorbet_rb_array_each_withBlock.exit, !dbg !37 29: ; preds = %rb_array_len.exit1 - %30 = bitcast i64* %1 to i8*, !dbg !48 + %30 = bitcast i64* %1 to i8*, !dbg !37 %31 = inttoptr i64 %9 to %struct.RArray* %32 = getelementptr inbounds %struct.RArray, %struct.RArray* %31, i64 0, i32 1, i32 0, i32 0 %33 = getelementptr inbounds %struct.RArray, %struct.RArray* %31, i64 0, i32 1, i32 0, i32 2 - br label %34, !dbg !48 + br label %34, !dbg !37 34: ; preds = %rb_array_len.exit, %29 - %35 = phi i64 [ 0, %29 ], [ %45, %rb_array_len.exit ], !dbg !48 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %30) #14, !dbg !48 - %36 = load i64, i64* %16, align 8, !dbg !48, !tbaa !35 - %37 = and i64 %36, 8192, !dbg !48 - %38 = icmp eq i64 %37, 0, !dbg !48 - br i1 %38, label %39, label %rb_array_const_ptr_transient.exit, !dbg !48 + %35 = phi i64 [ 0, %29 ], [ %45, %rb_array_len.exit ], !dbg !37 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %30) #14, !dbg !37 + %36 = load i64, i64* %16, align 8, !dbg !37, !tbaa !24 + %37 = and i64 %36, 8192, !dbg !37 + %38 = icmp eq i64 %37, 0, !dbg !37 + br i1 %38, label %39, label %rb_array_const_ptr_transient.exit, !dbg !37 39: ; preds = %34 - %40 = load i64*, i64** %33, align 8, !dbg !48, !tbaa !37 - br label %rb_array_const_ptr_transient.exit, !dbg !48 + %40 = load i64*, i64** %33, align 8, !dbg !37, !tbaa !26 + br label %rb_array_const_ptr_transient.exit, !dbg !37 rb_array_const_ptr_transient.exit: ; preds = %34, %39 - %41 = phi i64* [ %40, %39 ], [ %32, %34 ], !dbg !48 - %42 = getelementptr inbounds i64, i64* %41, i64 %35, !dbg !48 - %43 = load i64, i64* %42, align 8, !dbg !48, !tbaa !13 - store i64 %43, i64* %1, align 8, !dbg !48, !tbaa !13 - %44 = call i64 @"func_.$152$block_1"(i64 undef, i64 undef, i32 noundef 1, i64* noalias nocapture noundef nonnull readonly align 8 dereferenceable(8) %1, i64 undef) #14, !dbg !48 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %30) #14, !dbg !48 - %45 = add nuw nsw i64 %35, 1, !dbg !48 - %46 = load i64, i64* %16, align 8, !dbg !48, !tbaa !35 - %47 = and i64 %46, 8192, !dbg !48 - %48 = icmp eq i64 %47, 0, !dbg !48 - br i1 %48, label %52, label %49, !dbg !48 + %41 = phi i64* [ %40, %39 ], [ %32, %34 ], !dbg !37 + %42 = getelementptr inbounds i64, i64* %41, i64 %35, !dbg !37 + %43 = load i64, i64* %42, align 8, !dbg !37, !tbaa !13 + store i64 %43, i64* %1, align 8, !dbg !37, !tbaa !13 + %44 = call i64 @"func_.$152$block_1"(i64 undef, i64 undef, i32 noundef 1, i64* noalias nocapture noundef nonnull readonly align 8 dereferenceable(8) %1, i64 undef) #14, !dbg !37 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %30) #14, !dbg !37 + %45 = add nuw nsw i64 %35, 1, !dbg !37 + %46 = load i64, i64* %16, align 8, !dbg !37, !tbaa !24 + %47 = and i64 %46, 8192, !dbg !37 + %48 = icmp eq i64 %47, 0, !dbg !37 + br i1 %48, label %52, label %49, !dbg !37 49: ; preds = %rb_array_const_ptr_transient.exit - %50 = lshr i64 %46, 15, !dbg !48 - %51 = and i64 %50, 3, !dbg !48 - br label %rb_array_len.exit, !dbg !48 + %50 = lshr i64 %46, 15, !dbg !37 + %51 = and i64 %50, 3, !dbg !37 + br label %rb_array_len.exit, !dbg !37 52: ; preds = %rb_array_const_ptr_transient.exit - %53 = load i64, i64* %32, align 8, !dbg !48, !tbaa !37 - br label %rb_array_len.exit, !dbg !48 + %53 = load i64, i64* %32, align 8, !dbg !37, !tbaa !26 + br label %rb_array_len.exit, !dbg !37 rb_array_len.exit: ; preds = %49, %52 - %54 = phi i64 [ %51, %49 ], [ %53, %52 ], !dbg !48 - %55 = icmp sgt i64 %54, %45, !dbg !48 - br i1 %55, label %34, label %sorbet_rb_array_each_withBlock.exit, !dbg !48, !llvm.loop !52 + %54 = phi i64 [ %51, %49 ], [ %53, %52 ], !dbg !37 + %55 = icmp sgt i64 %54, %45, !dbg !37 + br i1 %55, label %34, label %sorbet_rb_array_each_withBlock.exit, !dbg !37, !llvm.loop !41 sorbet_rb_array_each_withBlock.exit: ; preds = %rb_array_len.exit, %rb_array_len.exit1 - tail call void @sorbet_popRubyStack() #14, !dbg !48 - ret i64 %9, !dbg !48 + tail call void @sorbet_popRubyStack() #14, !dbg !37 + ret i64 %9, !dbg !37 } ; Function Attrs: sspreq @@ -497,21 +492,23 @@ entry: %7 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([43 x i8], [43 x i8]* @"str_test/testdata/compiler/block_arg_expand.rb", i64 0, i64 0), i64 noundef 42) #14 tail call void @rb_gc_register_mark_object(i64 %7) #14 store i64 %7, i64* @"rubyStrFrozen_test/testdata/compiler/block_arg_expand.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 9) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %7, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 8, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 3) + %"rubyStr_test/testdata/compiler/block_arg_expand.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_arg_expand.rb", align 8 + %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_arg_expand.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %8, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %9 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #14 call void @rb_gc_register_mark_object(i64 %9) #14 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/block_arg_expand.rb.i2.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_arg_expand.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_arg_expand.rb.i2.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 8, i64* noundef null, i32 noundef 0, i32 noundef 3) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_arg_expand.rb.i2.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 - %rubyId_each.i = load i64, i64* @rubyIdPrecomputed_each, align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_each, i64 %rubyId_each.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !48 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !40 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !40 + %rubyId_each.i = load i64, i64* @rubyIdPrecomputed_each, align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_each, i64 %rubyId_each.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !37 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !29 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !29 %11 = bitcast [3 x i64]* %callArgs.i to i8* call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %11) %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 @@ -527,70 +524,63 @@ entry: store i64 %19, i64* %17, align 8, !tbaa !13 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %12, %struct.rb_control_frame_struct* align 8 %14, %struct.rb_iseq_struct* %stackFrame.i) #14 %20 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 0 - %21 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %15, align 8, !tbaa !20 - %22 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %21, i64 0, i32 2 - %23 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %22, align 8, !tbaa !23 - %24 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %23, i64 0, i32 2 - %25 = load i64*, i64** %24, align 8, !tbaa !25 - %26 = getelementptr inbounds i64, i64* %25, i64 4 - %27 = getelementptr inbounds i64, i64* %26, i64 1 - store i64* %27, i64** %20, align 8, !dbg !54, !tbaa !4 - %callArgs0Addr.i = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i32 0, i64 0, !dbg !55 - %28 = bitcast i64* %callArgs0Addr.i to <2 x i64>*, !dbg !55 - store <2 x i64> , <2 x i64>* %28, align 8, !dbg !55 - %29 = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i64 0, i64 0, !dbg !55 - call void @llvm.experimental.noalias.scope.decl(metadata !56) #14, !dbg !55 - %30 = call i64 @rb_ary_new_from_values(i64 noundef 2, i64* noundef nonnull %29) #14, !dbg !55 - store i64 %30, i64* %callArgs0Addr.i, align 8, !dbg !48 - call void @llvm.experimental.noalias.scope.decl(metadata !59) #14, !dbg !48 - %31 = call i64 @rb_ary_new_from_values(i64 noundef 1, i64* noundef nonnull %29) #14, !dbg !48 - %32 = and i64 %31, 7, !dbg !48 - %33 = icmp ne i64 %32, 0, !dbg !48 - %34 = and i64 %31, -9, !dbg !48 - %35 = icmp eq i64 %34, 0, !dbg !48 - %36 = or i1 %33, %35, !dbg !48 - br i1 %36, label %alternativeCallIntrinsic_Array_each.i, label %sorbet_isa_Array.exit.i, !dbg !48, !prof !41 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %20, align 8, !dbg !43, !tbaa !4 + %callArgs0Addr.i = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i32 0, i64 0, !dbg !44 + %21 = bitcast i64* %callArgs0Addr.i to <2 x i64>*, !dbg !44 + store <2 x i64> , <2 x i64>* %21, align 8, !dbg !44 + %22 = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i64 0, i64 0, !dbg !44 + call void @llvm.experimental.noalias.scope.decl(metadata !45) #14, !dbg !44 + %23 = call i64 @rb_ary_new_from_values(i64 noundef 2, i64* noundef nonnull %22) #14, !dbg !44 + store i64 %23, i64* %callArgs0Addr.i, align 8, !dbg !37 + call void @llvm.experimental.noalias.scope.decl(metadata !48) #14, !dbg !37 + %24 = call i64 @rb_ary_new_from_values(i64 noundef 1, i64* noundef nonnull %22) #14, !dbg !37 + %25 = and i64 %24, 7, !dbg !37 + %26 = icmp ne i64 %25, 0, !dbg !37 + %27 = and i64 %24, -9, !dbg !37 + %28 = icmp eq i64 %27, 0, !dbg !37 + %29 = or i1 %26, %28, !dbg !37 + br i1 %29, label %alternativeCallIntrinsic_Array_each.i, label %sorbet_isa_Array.exit.i, !dbg !37, !prof !30 sorbet_isa_Array.exit.i: ; preds = %entry - %37 = inttoptr i64 %31 to %struct.iseq_inline_iv_cache_entry*, !dbg !48 - %38 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %37, i64 0, i32 0, !dbg !48 - %39 = load i64, i64* %38, align 8, !dbg !48, !tbaa !35 - %40 = and i64 %39, 31, !dbg !48 - %41 = icmp eq i64 %40, 7, !dbg !48 - br i1 %41, label %fastSymCallIntrinsic_Array_each.i, label %alternativeCallIntrinsic_Array_each.i, !dbg !48, !prof !42 + %30 = inttoptr i64 %24 to %struct.iseq_inline_iv_cache_entry*, !dbg !37 + %31 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %30, i64 0, i32 0, !dbg !37 + %32 = load i64, i64* %31, align 8, !dbg !37, !tbaa !24 + %33 = and i64 %32, 31, !dbg !37 + %34 = icmp eq i64 %33, 7, !dbg !37 + br i1 %34, label %fastSymCallIntrinsic_Array_each.i, label %alternativeCallIntrinsic_Array_each.i, !dbg !37, !prof !31 alternativeCallIntrinsic_Array_each.i: ; preds = %sorbet_isa_Array.exit.i, %entry - %42 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !4 - %43 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %42, i64 0, i32 2, !dbg !48 - %44 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %43, align 8, !dbg !48, !tbaa !19 - %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 1, !dbg !48 - %46 = load i64*, i64** %45, align 8, !dbg !48, !tbaa !62 - %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !48 - store i64* %47, i64** %45, align 8, !dbg !48, !tbaa !62 - store i64 %31, i64* %46, align 8, !dbg !48, !tbaa !13 - %48 = call i64 @rb_iterate(i64 (i64)* noundef nonnull @sorbet_iterMethod, i64 noundef ptrtoint (%struct.FunctionInlineCache* @ic_each to i64), i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #14, !dbg !48 - br label %"func_.$152.exit", !dbg !48 + %35 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !4 + %36 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %35, i64 0, i32 2, !dbg !37 + %37 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %36, align 8, !dbg !37, !tbaa !19 + %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 1, !dbg !37 + %39 = load i64*, i64** %38, align 8, !dbg !37, !tbaa !51 + %40 = getelementptr inbounds i64, i64* %39, i64 1, !dbg !37 + store i64* %40, i64** %38, align 8, !dbg !37, !tbaa !51 + store i64 %24, i64* %39, align 8, !dbg !37, !tbaa !13 + %41 = call i64 @rb_iterate(i64 (i64)* noundef nonnull @sorbet_iterMethod, i64 noundef ptrtoint (%struct.FunctionInlineCache* @ic_each to i64), i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #14, !dbg !37 + br label %"func_.$152.exit", !dbg !37 fastSymCallIntrinsic_Array_each.i: ; preds = %sorbet_isa_Array.exit.i - %rubyId_each.i1 = load i64, i64* @rubyIdPrecomputed_each, align 8, !dbg !48 - %49 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !48 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %49) #14, !dbg !48 - %50 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !48 - store i64 %31, i64* %50, align 8, !dbg !48, !tbaa !49 - %51 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !48 - store i64 %rubyId_each.i1, i64* %51, align 8, !dbg !48, !tbaa !63 - %52 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !48 - store i32 0, i32* %52, align 8, !dbg !48, !tbaa !51 - %53 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !48 - %54 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !48 - %55 = bitcast i64** %53 to i8*, !dbg !48 - call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %55, i8 0, i64 16, i1 false) #14, !dbg !48 - %56 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_array_each, i64 noundef %54, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #14, !dbg !48 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %49) #14, !dbg !48 - br label %"func_.$152.exit", !dbg !48 + %rubyId_each.i1 = load i64, i64* @rubyIdPrecomputed_each, align 8, !dbg !37 + %42 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !37 + call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %42) #14, !dbg !37 + %43 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !37 + store i64 %24, i64* %43, align 8, !dbg !37, !tbaa !38 + %44 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !37 + store i64 %rubyId_each.i1, i64* %44, align 8, !dbg !37, !tbaa !52 + %45 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !37 + store i32 0, i32* %45, align 8, !dbg !37, !tbaa !40 + %46 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !37 + %47 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !37 + %48 = bitcast i64** %46 to i8*, !dbg !37 + call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %48, i8 0, i64 16, i1 false) #14, !dbg !37 + %49 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_array_each, i64 noundef %47, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #14, !dbg !37 + call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %42) #14, !dbg !37 + br label %"func_.$152.exit", !dbg !37 "func_.$152.exit": ; preds = %alternativeCallIntrinsic_Array_each.i, %fastSymCallIntrinsic_Array_each.i - store i64* %27, i64** %20, align 8, !tbaa !4 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %20, align 8, !tbaa !4 call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %11) ret void } @@ -602,10 +592,10 @@ declare void @llvm.experimental.noalias.scope.decl(metadata) #11 declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #12 ; Function Attrs: cold minsize noreturn ssp -define internal fastcc void @"func_.$152$block_1.cold.1"(i64 %el1.sroa.0.145) unnamed_addr #13 !dbg !64 { +define internal fastcc void @"func_.$152$block_1.cold.1"(i64 %el1.sroa.0.142) unnamed_addr #13 !dbg !53 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %el1.sroa.0.145, i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_T.let, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #0, !dbg !66 - unreachable, !dbg !66 + tail call void @sorbet_cast_failure(i64 %el1.sroa.0.142, i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_T.let, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #0, !dbg !55 + unreachable, !dbg !55 } attributes #0 = { noreturn } @@ -654,47 +644,36 @@ attributes #18 = { nounwind willreturn } !20 = !{!21, !5, i64 16} !21 = !{!"rb_control_frame_struct", !5, i64 0, !5, i64 8, !5, i64 16, !10, i64 24, !5, i64 32, !5, i64 40, !5, i64 48} !22 = !{!21, !5, i64 32} -!23 = !{!24, !5, i64 16} -!24 = !{!"rb_iseq_struct", !10, i64 0, !10, i64 8, !5, i64 16, !6, i64 24} -!25 = !{!26, !5, i64 8} -!26 = !{!"rb_iseq_constant_body", !6, i64 0, !11, i64 4, !5, i64 8, !27, i64 16, !29, i64 64, !32, i64 120, !5, i64 152, !5, i64 160, !5, i64 168, !5, i64 176, !5, i64 184, !5, i64 192, !33, i64 200, !11, i64 232, !11, i64 236, !11, i64 240, !11, i64 244, !11, i64 248, !6, i64 252, !10, i64 256} -!27 = !{!"", !28, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !5, i64 32, !5, i64 40} -!28 = !{!"", !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 1, !11, i64 1} -!29 = !{!"rb_iseq_location_struct", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !11, i64 32, !30, i64 36} -!30 = !{!"rb_code_location_struct", !31, i64 0, !31, i64 8} -!31 = !{!"rb_code_position_struct", !11, i64 0, !11, i64 4} -!32 = !{!"iseq_insn_info", !5, i64 0, !5, i64 8, !11, i64 16, !5, i64 24} -!33 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !5, i64 24} -!34 = !DILocation(line: 5, column: 1, scope: !14) -!35 = !{!36, !10, i64 0} -!36 = !{!"RBasic", !10, i64 0, !10, i64 8} -!37 = !{!6, !6, i64 0} -!38 = !{!"branch_weights", i32 1, i32 2000} -!39 = !DILocation(line: 5, column: 24, scope: !14) -!40 = !DILocation(line: 7, column: 3, scope: !14) -!41 = !{!"branch_weights", i32 1073205, i32 2146410443} -!42 = !{!"branch_weights", i32 2000, i32 1} -!43 = !DILocation(line: 7, column: 25, scope: !14) -!44 = !{!45} -!45 = distinct !{!45, !46, !"sorbet_rb_int_plus: argument 0"} -!46 = distinct !{!46, !"sorbet_rb_int_plus"} -!47 = !{!"branch_weights", i32 4001, i32 4000000} -!48 = !DILocation(line: 5, column: 1, scope: !15) -!49 = !{!50, !10, i64 0} -!50 = !{!"sorbet_inlineIntrinsicEnv", !10, i64 0, !10, i64 8, !11, i64 16, !5, i64 24, !10, i64 32} -!51 = !{!50, !11, i64 16} -!52 = distinct !{!52, !53} -!53 = !{!"llvm.loop.unroll.disable"} -!54 = !DILocation(line: 0, scope: !15) -!55 = !DILocation(line: 5, column: 2, scope: !15) -!56 = !{!57} -!57 = distinct !{!57, !58, !"sorbet_buildArrayIntrinsic: argument 0"} -!58 = distinct !{!58, !"sorbet_buildArrayIntrinsic"} -!59 = !{!60} -!60 = distinct !{!60, !61, !"sorbet_buildArrayIntrinsic: argument 0"} -!61 = distinct !{!61, !"sorbet_buildArrayIntrinsic"} -!62 = !{!21, !5, i64 8} -!63 = !{!50, !10, i64 8} -!64 = distinct !DISubprogram(name: "func_.$152$block_1.cold.1", linkageName: "func_.$152$block_1.cold.1", scope: null, file: !2, type: !65, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!65 = !DISubroutineType(types: !3) -!66 = !DILocation(line: 7, column: 3, scope: !64) +!23 = !DILocation(line: 5, column: 1, scope: !14) +!24 = !{!25, !10, i64 0} +!25 = !{!"RBasic", !10, i64 0, !10, i64 8} +!26 = !{!6, !6, i64 0} +!27 = !{!"branch_weights", i32 1, i32 2000} +!28 = !DILocation(line: 5, column: 24, scope: !14) +!29 = !DILocation(line: 7, column: 3, scope: !14) +!30 = !{!"branch_weights", i32 1073205, i32 2146410443} +!31 = !{!"branch_weights", i32 2000, i32 1} +!32 = !DILocation(line: 7, column: 25, scope: !14) +!33 = !{!34} +!34 = distinct !{!34, !35, !"sorbet_rb_int_plus: argument 0"} +!35 = distinct !{!35, !"sorbet_rb_int_plus"} +!36 = !{!"branch_weights", i32 4001, i32 4000000} +!37 = !DILocation(line: 5, column: 1, scope: !15) +!38 = !{!39, !10, i64 0} +!39 = !{!"sorbet_inlineIntrinsicEnv", !10, i64 0, !10, i64 8, !11, i64 16, !5, i64 24, !10, i64 32} +!40 = !{!39, !11, i64 16} +!41 = distinct !{!41, !42} +!42 = !{!"llvm.loop.unroll.disable"} +!43 = !DILocation(line: 0, scope: !15) +!44 = !DILocation(line: 5, column: 2, scope: !15) +!45 = !{!46} +!46 = distinct !{!46, !47, !"sorbet_buildArrayIntrinsic: argument 0"} +!47 = distinct !{!47, !"sorbet_buildArrayIntrinsic"} +!48 = !{!49} +!49 = distinct !{!49, !50, !"sorbet_buildArrayIntrinsic: argument 0"} +!50 = distinct !{!50, !"sorbet_buildArrayIntrinsic"} +!51 = !{!21, !5, i64 8} +!52 = !{!39, !10, i64 8} +!53 = distinct !DISubprogram(name: "func_.$152$block_1.cold.1", linkageName: "func_.$152$block_1.cold.1", scope: null, file: !2, type: !54, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!54 = !DISubroutineType(types: !3) +!55 = !DILocation(line: 7, column: 3, scope: !53) diff --git a/test/testdata/compiler/block_args.llo.exp b/test/testdata/compiler/block_args.llo.exp index cda70784290..3748d431028 100644 --- a/test/testdata/compiler/block_args.llo.exp +++ b/test/testdata/compiler/block_args.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -86,6 +88,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/block_args.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/block_args.rb" = private unnamed_addr constant [37 x i8] c"test/testdata/compiler/block_args.rb\00", align 1 +@iseqEncodedArray = internal global [5 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_.$152$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -100,7 +104,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -179,74 +185,68 @@ functionEntryInitializers: %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !13 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !23 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !25 - %13 = getelementptr inbounds i64, i64* %12, i64 3 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %8, align 8, !tbaa !4 - %default0 = icmp eq i32 %argc, 0, !dbg !34 - br i1 %default0, label %fillFromDefaultBlockDone1.thread, label %fillFromDefaultBlockDone1, !dbg !34, !prof !35 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !tbaa !4 + %default0 = icmp eq i32 %argc, 0, !dbg !23 + br i1 %default0, label %fillFromDefaultBlockDone1.thread, label %fillFromDefaultBlockDone1, !dbg !23, !prof !24 fillFromDefaultBlockDone1: ; preds = %functionEntryInitializers - %rawArg_x = load i64, i64* %argArray, align 8, !dbg !34 - %15 = and i64 %rawArg_x, 1, !dbg !36 - %16 = icmp eq i64 %15, 0, !dbg !36 - br i1 %16, label %fillFromDefaultBlockDone1.thread, label %34, !dbg !36, !prof !35 + %rawArg_x = load i64, i64* %argArray, align 8, !dbg !23 + %9 = and i64 %rawArg_x, 1, !dbg !25 + %10 = icmp eq i64 %9, 0, !dbg !25 + br i1 %10, label %fillFromDefaultBlockDone1.thread, label %28, !dbg !25, !prof !24 fillFromDefaultBlockDone1.thread: ; preds = %functionEntryInitializers, %fillFromDefaultBlockDone1 - %x.sroa.0.024 = phi i64 [ %rawArg_x, %fillFromDefaultBlockDone1 ], [ 8, %functionEntryInitializers ] - %17 = and i64 %x.sroa.0.024, 7, !dbg !36 - %18 = icmp ne i64 %17, 0, !dbg !36 - %19 = and i64 %x.sroa.0.024, -9, !dbg !36 - %20 = icmp eq i64 %19, 0, !dbg !36 - %21 = or i1 %18, %20, !dbg !36 - br i1 %21, label %"alternativeCallIntrinsic_Integer_+", label %sorbet_isa_Integer.exit, !dbg !36, !prof !37 + %x.sroa.0.023 = phi i64 [ %rawArg_x, %fillFromDefaultBlockDone1 ], [ 8, %functionEntryInitializers ] + %11 = and i64 %x.sroa.0.023, 7, !dbg !25 + %12 = icmp ne i64 %11, 0, !dbg !25 + %13 = and i64 %x.sroa.0.023, -9, !dbg !25 + %14 = icmp eq i64 %13, 0, !dbg !25 + %15 = or i1 %12, %14, !dbg !25 + br i1 %15, label %"alternativeCallIntrinsic_Integer_+", label %sorbet_isa_Integer.exit, !dbg !25, !prof !26 sorbet_isa_Integer.exit: ; preds = %fillFromDefaultBlockDone1.thread - %22 = inttoptr i64 %x.sroa.0.024 to %struct.iseq_inline_iv_cache_entry*, !dbg !36 - %23 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %22, i64 0, i32 0, !dbg !36 - %24 = load i64, i64* %23, align 8, !dbg !36, !tbaa !38 - %25 = and i64 %24, 31, !dbg !36 - %26 = icmp eq i64 %25, 10, !dbg !36 - br i1 %26, label %42, label %"alternativeCallIntrinsic_Integer_+", !dbg !36, !prof !40 + %16 = inttoptr i64 %x.sroa.0.023 to %struct.iseq_inline_iv_cache_entry*, !dbg !25 + %17 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %16, i64 0, i32 0, !dbg !25 + %18 = load i64, i64* %17, align 8, !dbg !25, !tbaa !27 + %19 = and i64 %18, 31, !dbg !25 + %20 = icmp eq i64 %19, 10, !dbg !25 + br i1 %20, label %36, label %"alternativeCallIntrinsic_Integer_+", !dbg !25, !prof !29 -afterSend: ; preds = %38, %34, %42, %"alternativeCallIntrinsic_Integer_+" - %"symIntrinsicRawPhi_+" = phi i64 [ %send, %"alternativeCallIntrinsic_Integer_+" ], [ %43, %42 ], [ %41, %38 ], [ %37, %34 ], !dbg !36 - ret i64 %"symIntrinsicRawPhi_+", !dbg !41 +afterSend: ; preds = %32, %28, %36, %"alternativeCallIntrinsic_Integer_+" + %"symIntrinsicRawPhi_+" = phi i64 [ %send, %"alternativeCallIntrinsic_Integer_+" ], [ %37, %36 ], [ %35, %32 ], [ %31, %28 ], !dbg !25 + ret i64 %"symIntrinsicRawPhi_+", !dbg !30 "alternativeCallIntrinsic_Integer_+": ; preds = %fillFromDefaultBlockDone1.thread, %sorbet_isa_Integer.exit - %27 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !36, !tbaa !4 - %28 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %27, i64 0, i32 2, !dbg !36 - %29 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %28, align 8, !dbg !36, !tbaa !19 - %30 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %29, i64 0, i32 1, !dbg !36 - %31 = load i64*, i64** %30, align 8, !dbg !36, !tbaa !42 - %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !36 - store i64 %x.sroa.0.024, i64* %31, align 8, !dbg !36, !tbaa !13 - %33 = getelementptr inbounds i64, i64* %32, i64 1, !dbg !36 - store i64* %33, i64** %30, align 8, !dbg !36, !tbaa !42 - store i64 3, i64* %32, align 8, !dbg !36, !tbaa !13 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !36 - br label %afterSend, !dbg !36 - -34: ; preds = %fillFromDefaultBlockDone1 - tail call void @llvm.experimental.noalias.scope.decl(metadata !43), !dbg !36 - %35 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %rawArg_x, i64 noundef 2) #13, !dbg !36 - %36 = extractvalue { i64, i1 } %35, 1, !dbg !36 - %37 = extractvalue { i64, i1 } %35, 0, !dbg !36 - br i1 %36, label %38, label %afterSend, !dbg !36 - -38: ; preds = %34 - %39 = ashr i64 %37, 1, !dbg !36 - %40 = xor i64 %39, -9223372036854775808, !dbg !36 - %41 = tail call i64 @rb_int2big(i64 %40) #10, !dbg !36 - br label %afterSend, !dbg !36 - -42: ; preds = %sorbet_isa_Integer.exit - tail call void @llvm.experimental.noalias.scope.decl(metadata !46), !dbg !36 - %43 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %x.sroa.0.024, i64 noundef 3) #10, !dbg !36, !noalias !43 - br label %afterSend, !dbg !36 + %21 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !4 + %22 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %21, i64 0, i32 2, !dbg !25 + %23 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %22, align 8, !dbg !25, !tbaa !19 + %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 1, !dbg !25 + %25 = load i64*, i64** %24, align 8, !dbg !25, !tbaa !31 + %26 = getelementptr inbounds i64, i64* %25, i64 1, !dbg !25 + store i64 %x.sroa.0.023, i64* %25, align 8, !dbg !25, !tbaa !13 + %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !25 + store i64* %27, i64** %24, align 8, !dbg !25, !tbaa !31 + store i64 3, i64* %26, align 8, !dbg !25, !tbaa !13 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !25 + br label %afterSend, !dbg !25 + +28: ; preds = %fillFromDefaultBlockDone1 + tail call void @llvm.experimental.noalias.scope.decl(metadata !32), !dbg !25 + %29 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %rawArg_x, i64 noundef 2) #13, !dbg !25 + %30 = extractvalue { i64, i1 } %29, 1, !dbg !25 + %31 = extractvalue { i64, i1 } %29, 0, !dbg !25 + br i1 %30, label %32, label %afterSend, !dbg !25 + +32: ; preds = %28 + %33 = ashr i64 %31, 1, !dbg !25 + %34 = xor i64 %33, -9223372036854775808, !dbg !25 + %35 = tail call i64 @rb_int2big(i64 %34) #10, !dbg !25 + br label %afterSend, !dbg !25 + +36: ; preds = %sorbet_isa_Integer.exit + tail call void @llvm.experimental.noalias.scope.decl(metadata !35), !dbg !25 + %37 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %x.sroa.0.023, i64 noundef 3) #10, !dbg !25, !noalias !32 + br label %afterSend, !dbg !25 } ; Function Attrs: sspreq @@ -272,26 +272,28 @@ entry: %7 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([37 x i8], [37 x i8]* @"str_test/testdata/compiler/block_args.rb", i64 0, i64 0), i64 noundef 36) #10 tail call void @rb_gc_register_mark_object(i64 %7) #10 store i64 %7, i64* @"rubyStrFrozen_test/testdata/compiler/block_args.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 5) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %7, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 4, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 3) + %"rubyStr_test/testdata/compiler/block_args.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_args.rb", align 8 + %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_args.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %8, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %9 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #10 call void @rb_gc_register_mark_object(i64 %9) #10 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/block_args.rb.i3.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_args.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_args.rb.i3.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 4, i64* noundef null, i32 noundef 0, i32 noundef 3) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_args.rb.i3.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 - %rubyId_map.i = load i64, i64* @rubyIdPrecomputed_map, align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_map, i64 %rubyId_map.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !48 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !36 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !36 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !49 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !49 + %rubyId_map.i = load i64, i64* @rubyIdPrecomputed_map, align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_map, i64 %rubyId_map.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !37 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !25 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !38 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !38 %11 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !4 %12 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %11, i64 0, i32 18 - %13 = load i64, i64* %12, align 8, !tbaa !50 + %13 = load i64, i64* %12, align 8, !tbaa !39 %14 = bitcast [3 x i64]* %callArgs.i to i8* call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %14) %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 @@ -307,41 +309,34 @@ entry: store i64 %22, i64* %20, align 8, !tbaa !13 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %15, %struct.rb_control_frame_struct* align 8 %17, %struct.rb_iseq_struct* %stackFrame.i) #10 %23 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 0 - %24 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %18, align 8, !tbaa !20 - %25 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %24, i64 0, i32 2 - %26 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %25, align 8, !tbaa !23 - %27 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %26, i64 0, i32 2 - %28 = load i64*, i64** %27, align 8, !tbaa !25 - %29 = getelementptr inbounds i64, i64* %28, i64 3 - %30 = getelementptr inbounds i64, i64* %29, i64 1 - store i64* %30, i64** %23, align 8, !dbg !59, !tbaa !4 - %callArgs0Addr.i = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i32 0, i64 0, !dbg !48 - %31 = bitcast i64* %callArgs0Addr.i to <2 x i64>*, !dbg !48 - store <2 x i64> , <2 x i64>* %31, align 8, !dbg !48 - %32 = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i64 0, i64 0, !dbg !48 - call void @llvm.experimental.noalias.scope.decl(metadata !60) #10, !dbg !48 - %33 = call i64 @rb_ary_new_from_values(i64 noundef 2, i64* noundef nonnull %32) #10, !dbg !48 - %34 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !4 - %35 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %34, i64 0, i32 2, !dbg !48 - %36 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %35, align 8, !dbg !48, !tbaa !19 - %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 1, !dbg !48 - %38 = load i64*, i64** %37, align 8, !dbg !48, !tbaa !42 - %39 = getelementptr inbounds i64, i64* %38, i64 1, !dbg !48 - store i64* %39, i64** %37, align 8, !dbg !48, !tbaa !42 - store i64 %33, i64* %38, align 8, !dbg !48, !tbaa !13 - %40 = call i64 @rb_iterate(i64 (i64)* noundef nonnull @sorbet_iterMethod, i64 noundef ptrtoint (%struct.FunctionInlineCache* @ic_map to i64), i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #10, !dbg !48 - store i64* %30, i64** %23, align 8, !tbaa !4 - %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !4 - %42 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %41, i64 0, i32 2, !dbg !49 - %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !dbg !49, !tbaa !19 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 1, !dbg !49 - %45 = load i64*, i64** %44, align 8, !dbg !49, !tbaa !42 - %46 = getelementptr inbounds i64, i64* %45, i64 1, !dbg !49 - store i64 %13, i64* %45, align 8, !dbg !49, !tbaa !13 - %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !49 - store i64* %47, i64** %44, align 8, !dbg !49, !tbaa !42 - store i64 %40, i64* %46, align 8, !dbg !49, !tbaa !13 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !49 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %23, align 8, !dbg !48, !tbaa !4 + %callArgs0Addr.i = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i32 0, i64 0, !dbg !37 + %24 = bitcast i64* %callArgs0Addr.i to <2 x i64>*, !dbg !37 + store <2 x i64> , <2 x i64>* %24, align 8, !dbg !37 + %25 = getelementptr [3 x i64], [3 x i64]* %callArgs.i, i64 0, i64 0, !dbg !37 + call void @llvm.experimental.noalias.scope.decl(metadata !49) #10, !dbg !37 + %26 = call i64 @rb_ary_new_from_values(i64 noundef 2, i64* noundef nonnull %25) #10, !dbg !37 + %27 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !4 + %28 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %27, i64 0, i32 2, !dbg !37 + %29 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %28, align 8, !dbg !37, !tbaa !19 + %30 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %29, i64 0, i32 1, !dbg !37 + %31 = load i64*, i64** %30, align 8, !dbg !37, !tbaa !31 + %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !37 + store i64* %32, i64** %30, align 8, !dbg !37, !tbaa !31 + store i64 %26, i64* %31, align 8, !dbg !37, !tbaa !13 + %33 = call i64 @rb_iterate(i64 (i64)* noundef nonnull @sorbet_iterMethod, i64 noundef ptrtoint (%struct.FunctionInlineCache* @ic_map to i64), i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #10, !dbg !37 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %23, align 8, !tbaa !4 + %34 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !38, !tbaa !4 + %35 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %34, i64 0, i32 2, !dbg !38 + %36 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %35, align 8, !dbg !38, !tbaa !19 + %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 1, !dbg !38 + %38 = load i64*, i64** %37, align 8, !dbg !38, !tbaa !31 + %39 = getelementptr inbounds i64, i64* %38, i64 1, !dbg !38 + store i64 %13, i64* %38, align 8, !dbg !38, !tbaa !13 + %40 = getelementptr inbounds i64, i64* %39, i64 1, !dbg !38 + store i64* %40, i64** %37, align 8, !dbg !38, !tbaa !31 + store i64 %33, i64* %39, align 8, !dbg !38, !tbaa !13 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !38 call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %14) ret void } @@ -396,43 +391,32 @@ attributes #13 = { nounwind willreturn } !20 = !{!21, !5, i64 16} !21 = !{!"rb_control_frame_struct", !5, i64 0, !5, i64 8, !5, i64 16, !10, i64 24, !5, i64 32, !5, i64 40, !5, i64 48} !22 = !{!21, !5, i64 32} -!23 = !{!24, !5, i64 16} -!24 = !{!"rb_iseq_struct", !10, i64 0, !10, i64 8, !5, i64 16, !6, i64 24} -!25 = !{!26, !5, i64 8} -!26 = !{!"rb_iseq_constant_body", !6, i64 0, !11, i64 4, !5, i64 8, !27, i64 16, !29, i64 64, !32, i64 120, !5, i64 152, !5, i64 160, !5, i64 168, !5, i64 176, !5, i64 184, !5, i64 192, !33, i64 200, !11, i64 232, !11, i64 236, !11, i64 240, !11, i64 244, !11, i64 248, !6, i64 252, !10, i64 256} -!27 = !{!"", !28, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !5, i64 32, !5, i64 40} -!28 = !{!"", !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 1, !11, i64 1} -!29 = !{!"rb_iseq_location_struct", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !11, i64 32, !30, i64 36} -!30 = !{!"rb_code_location_struct", !31, i64 0, !31, i64 8} -!31 = !{!"rb_code_position_struct", !11, i64 0, !11, i64 4} -!32 = !{!"iseq_insn_info", !5, i64 0, !5, i64 8, !11, i64 16, !5, i64 24} -!33 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !5, i64 24} -!34 = !DILocation(line: 4, column: 1, scope: !14) -!35 = !{!"branch_weights", i32 1, i32 2000} -!36 = !DILocation(line: 4, column: 21, scope: !14) -!37 = !{!"branch_weights", i32 1073205, i32 2146410443} -!38 = !{!39, !10, i64 0} -!39 = !{!"RBasic", !10, i64 0, !10, i64 8} -!40 = !{!"branch_weights", i32 2000, i32 1} -!41 = !DILocation(line: 4, column: 6, scope: !14) -!42 = !{!21, !5, i64 8} -!43 = !{!44} -!44 = distinct !{!44, !45, !"sorbet_rb_int_plus: argument 0"} -!45 = distinct !{!45, !"sorbet_rb_int_plus"} -!46 = !{!47} -!47 = distinct !{!47, !45, !"sorbet_rb_int_plus: argument 0:thread"} -!48 = !DILocation(line: 4, column: 6, scope: !15) -!49 = !DILocation(line: 4, column: 1, scope: !15) -!50 = !{!51, !10, i64 400} -!51 = !{!"rb_vm_struct", !10, i64 0, !52, i64 8, !5, i64 192, !5, i64 200, !5, i64 208, !55, i64 216, !6, i64 224, !53, i64 264, !53, i64 280, !53, i64 296, !53, i64 312, !10, i64 328, !11, i64 336, !11, i64 340, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 348, !10, i64 352, !6, i64 360, !10, i64 400, !10, i64 408, !10, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !5, i64 456, !5, i64 464, !56, i64 472, !57, i64 992, !5, i64 1016, !5, i64 1024, !11, i64 1032, !11, i64 1036, !53, i64 1040, !6, i64 1056, !10, i64 1096, !10, i64 1104, !10, i64 1112, !10, i64 1120, !10, i64 1128, !11, i64 1136, !5, i64 1144, !5, i64 1152, !5, i64 1160, !5, i64 1168, !5, i64 1176, !5, i64 1184, !11, i64 1192, !58, i64 1200, !6, i64 1232} -!52 = !{!"rb_global_vm_lock_struct", !5, i64 0, !6, i64 8, !53, i64 48, !5, i64 64, !11, i64 72, !6, i64 80, !6, i64 128, !11, i64 176, !11, i64 180} -!53 = !{!"list_head", !54, i64 0} -!54 = !{!"list_node", !5, i64 0, !5, i64 8} -!55 = !{!"long long", !6, i64 0} -!56 = !{!"", !6, i64 0} -!57 = !{!"rb_hook_list_struct", !5, i64 0, !11, i64 8, !11, i64 12, !11, i64 16} -!58 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24} -!59 = !DILocation(line: 0, scope: !15) -!60 = !{!61} -!61 = distinct !{!61, !62, !"sorbet_buildArrayIntrinsic: argument 0"} -!62 = distinct !{!62, !"sorbet_buildArrayIntrinsic"} +!23 = !DILocation(line: 4, column: 1, scope: !14) +!24 = !{!"branch_weights", i32 1, i32 2000} +!25 = !DILocation(line: 4, column: 21, scope: !14) +!26 = !{!"branch_weights", i32 1073205, i32 2146410443} +!27 = !{!28, !10, i64 0} +!28 = !{!"RBasic", !10, i64 0, !10, i64 8} +!29 = !{!"branch_weights", i32 2000, i32 1} +!30 = !DILocation(line: 4, column: 6, scope: !14) +!31 = !{!21, !5, i64 8} +!32 = !{!33} +!33 = distinct !{!33, !34, !"sorbet_rb_int_plus: argument 0"} +!34 = distinct !{!34, !"sorbet_rb_int_plus"} +!35 = !{!36} +!36 = distinct !{!36, !34, !"sorbet_rb_int_plus: argument 0:thread"} +!37 = !DILocation(line: 4, column: 6, scope: !15) +!38 = !DILocation(line: 4, column: 1, scope: !15) +!39 = !{!40, !10, i64 400} +!40 = !{!"rb_vm_struct", !10, i64 0, !41, i64 8, !5, i64 192, !5, i64 200, !5, i64 208, !44, i64 216, !6, i64 224, !42, i64 264, !42, i64 280, !42, i64 296, !42, i64 312, !10, i64 328, !11, i64 336, !11, i64 340, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 348, !10, i64 352, !6, i64 360, !10, i64 400, !10, i64 408, !10, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !5, i64 456, !5, i64 464, !45, i64 472, !46, i64 992, !5, i64 1016, !5, i64 1024, !11, i64 1032, !11, i64 1036, !42, i64 1040, !6, i64 1056, !10, i64 1096, !10, i64 1104, !10, i64 1112, !10, i64 1120, !10, i64 1128, !11, i64 1136, !5, i64 1144, !5, i64 1152, !5, i64 1160, !5, i64 1168, !5, i64 1176, !5, i64 1184, !11, i64 1192, !47, i64 1200, !6, i64 1232} +!41 = !{!"rb_global_vm_lock_struct", !5, i64 0, !6, i64 8, !42, i64 48, !5, i64 64, !11, i64 72, !6, i64 80, !6, i64 128, !11, i64 176, !11, i64 180} +!42 = !{!"list_head", !43, i64 0} +!43 = !{!"list_node", !5, i64 0, !5, i64 8} +!44 = !{!"long long", !6, i64 0} +!45 = !{!"", !6, i64 0} +!46 = !{!"rb_hook_list_struct", !5, i64 0, !11, i64 8, !11, i64 12, !11, i64 16} +!47 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24} +!48 = !DILocation(line: 0, scope: !15) +!49 = !{!50} +!50 = distinct !{!50, !51, !"sorbet_buildArrayIntrinsic: argument 0"} +!51 = distinct !{!51, !"sorbet_buildArrayIntrinsic"} diff --git a/test/testdata/compiler/block_no_args.llo.exp b/test/testdata/compiler/block_no_args.llo.exp index 1777d51409e..6d20132da30 100644 --- a/test/testdata/compiler/block_no_args.llo.exp +++ b/test/testdata/compiler/block_no_args.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,32 +50,33 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.rb_captured_block = type { i64, i64*, %union.anon.17 } -%union.anon.17 = type { %struct.rb_iseq_struct* } +%struct.rb_captured_block = type { i64, i64*, %union.anon.20 } +%union.anon.20 = type { %struct.rb_iseq_struct* } %struct.iseq_inline_iv_cache_entry = type { i64, i64 } %struct.sorbet_inlineIntrinsicEnv = type { i64, i64, i32, i64*, i64 } @@ -90,6 +92,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/block_no_args.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/block_no_args.rb" = private unnamed_addr constant [40 x i8] c"test/testdata/compiler/block_no_args.rb\00", align 1 +@iseqEncodedArray = internal global [7 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_.$152$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -106,7 +110,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @rb_error_arity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_readRealpath() local_unnamed_addr #1 @@ -179,277 +185,189 @@ functionEntryInitializers: %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !4 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !22 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !24 - %13 = getelementptr inbounds i64, i64* %12, i64 3 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %8, align 8, !tbaa !13 - %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !33 - br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !33 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !tbaa !13 + %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !22 + br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !22 argArrayExpandArrayTest: ; preds = %functionEntryInitializers - %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !33 - %15 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !33 - %16 = icmp ne i64 %15, 0, !dbg !33 - %17 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !33 - %18 = icmp eq i64 %17, 0, !dbg !33 - %19 = or i1 %16, %18, !dbg !33 - br i1 %19, label %fillRequiredArgs, label %sorbet_isa_Array.exit, !dbg !33 + %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !22 + %9 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !22 + %10 = icmp ne i64 %9, 0, !dbg !22 + %11 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !22 + %12 = icmp eq i64 %11, 0, !dbg !22 + %13 = or i1 %10, %12, !dbg !22 + br i1 %13, label %fillRequiredArgs, label %sorbet_isa_Array.exit, !dbg !22 sorbet_isa_Array.exit: ; preds = %argArrayExpandArrayTest - %20 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !33 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !33 - %22 = load i64, i64* %21, align 8, !dbg !33, !tbaa !34 - %23 = and i64 %22, 31, !dbg !33 - %24 = icmp ne i64 %23, 7, !dbg !33 - %25 = and i64 %22, 33554432, !dbg !33 - %26 = icmp eq i64 %25, 0, !dbg !33 - %or.cond = or i1 %24, %26, !dbg !33 - br i1 %or.cond, label %fillRequiredArgs, label %27, !dbg !33 - -27: ; preds = %sorbet_isa_Array.exit - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #13, !dbg !33 - br label %fillRequiredArgs, !dbg !33 - -fillRequiredArgs: ; preds = %argArrayExpandArrayTest, %27, %functionEntryInitializers, %sorbet_isa_Array.exit - %28 = getelementptr inbounds i64, i64* %12, i64 4, !dbg !33 - %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !33 - store i64* %29, i64** %8, align 8, !dbg !33, !tbaa !13 - %rubyStr_hi = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !36 - %30 = load i64, i64* @rb_mKernel, align 8, !dbg !37 - %31 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !13 - %32 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %31, i64 0, i32 2, !dbg !37 - %33 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %32, align 8, !dbg !37, !tbaa !15 - %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 1, !dbg !37 - %35 = load i64*, i64** %34, align 8, !dbg !37, !tbaa !38 - %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !37 - store i64 %30, i64* %35, align 8, !dbg !37, !tbaa !4 - %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !37 - store i64* %37, i64** %34, align 8, !dbg !37, !tbaa !38 - store i64 %rubyStr_hi, i64* %36, align 8, !dbg !37, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !37 - store i64* %14, i64** %8, align 8, !dbg !37, !tbaa !13 - ret i64 %send, !dbg !33 + %14 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !22 + %15 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %14, i64 0, i32 0, !dbg !22 + %16 = load i64, i64* %15, align 8, !dbg !22, !tbaa !23 + %17 = and i64 %16, 31, !dbg !22 + %18 = icmp ne i64 %17, 7, !dbg !22 + %19 = and i64 %16, 33554432, !dbg !22 + %20 = icmp eq i64 %19, 0, !dbg !22 + %or.cond = or i1 %18, %20, !dbg !22 + br i1 %or.cond, label %fillRequiredArgs, label %21, !dbg !22 + +21: ; preds = %sorbet_isa_Array.exit + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #13, !dbg !22 + br label %fillRequiredArgs, !dbg !22 + +fillRequiredArgs: ; preds = %argArrayExpandArrayTest, %21, %functionEntryInitializers, %sorbet_isa_Array.exit + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %8, align 8, !dbg !22, !tbaa !13 + %rubyStr_hi = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !25 + %22 = load i64, i64* @rb_mKernel, align 8, !dbg !26 + %23 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !26, !tbaa !13 + %24 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %23, i64 0, i32 2, !dbg !26 + %25 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %24, align 8, !dbg !26, !tbaa !15 + %26 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %25, i64 0, i32 1, !dbg !26 + %27 = load i64*, i64** %26, align 8, !dbg !26, !tbaa !27 + %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !26 + store i64 %22, i64* %27, align 8, !dbg !26, !tbaa !4 + %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !26 + store i64* %29, i64** %26, align 8, !dbg !26, !tbaa !27 + store i64 %rubyStr_hi, i64* %28, align 8, !dbg !26, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !26 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !dbg !26, !tbaa !13 + ret i64 %send, !dbg !22 } ; Function Attrs: nounwind ssp define internal i64 @forward_sorbet_rb_int_dotimes(i64 %0) #7 { entry: - %1 = alloca i64, align 8 + %1 = alloca [1 x i64], align 8 %2 = alloca [1 x i64], align 8 - %3 = alloca i64, align 8 - %4 = alloca [1 x i64], align 8 - %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !13 - %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 17, !dbg !39 - %7 = load i64, i64* %6, align 8, !dbg !39, !tbaa !40 - %8 = and i64 %7, -4, !dbg !39 - %9 = inttoptr i64 %8 to %struct.rb_captured_block*, !dbg !39 - store i64 0, i64* %6, align 8, !dbg !39, !tbaa !40 - %10 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !39 - %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 0, !dbg !39 - %12 = load i64, i64* %11, align 8, !dbg !39, !tbaa !41 - %13 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 2, !dbg !39 - %14 = load i32, i32* %13, align 8, !dbg !39, !tbaa !43 - %15 = icmp slt i32 %14, 0, !dbg !39 - %16 = icmp sgt i32 %14, 0, !dbg !39 - %or.cond.i = or i1 %15, %16, !dbg !39 - br i1 %or.cond.i, label %17, label %rb_check_arity.1.exit, !dbg !39 - -17: ; preds = %entry - tail call void @rb_error_arity(i32 %14, i32 noundef 0, i32 noundef 0) #12, !dbg !39 - unreachable, !dbg !39 + %3 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !13 + %4 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %3, i64 0, i32 17, !dbg !28 + %5 = load i64, i64* %4, align 8, !dbg !28, !tbaa !29 + %6 = and i64 %5, -4, !dbg !28 + %7 = inttoptr i64 %6 to %struct.rb_captured_block*, !dbg !28 + store i64 0, i64* %4, align 8, !dbg !28, !tbaa !29 + %8 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !28 + %9 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %8, i64 0, i32 0, !dbg !28 + %10 = load i64, i64* %9, align 8, !dbg !28, !tbaa !30 + %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %8, i64 0, i32 2, !dbg !28 + %12 = load i32, i32* %11, align 8, !dbg !28, !tbaa !32 + %13 = icmp slt i32 %12, 0, !dbg !28 + %14 = icmp sgt i32 %12, 0, !dbg !28 + %or.cond.i1 = or i1 %13, %14, !dbg !28 + br i1 %or.cond.i1, label %15, label %rb_check_arity.1.exit, !dbg !28 + +15: ; preds = %entry + tail call void @rb_error_arity(i32 %12, i32 noundef 0, i32 noundef 0) #12, !dbg !28 + unreachable, !dbg !28 rb_check_arity.1.exit: ; preds = %entry - tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %9) #13, !dbg !39 - %18 = and i64 %12, 1, !dbg !39 - %19 = icmp eq i64 %18, 0, !dbg !39 - br i1 %19, label %20, label %30, !dbg !39, !prof !44 - -20: ; preds = %rb_check_arity.1.exit - %21 = bitcast [1 x i64]* %2 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - %22 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !39 - store i64 %12, i64* %22, align 8, !dbg !39, !tbaa !4 - %23 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %22) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - %24 = and i64 %23, -9, !dbg !39 - %25 = icmp eq i64 %24, 0, !dbg !39 - br i1 %25, label %sorbet_rb_int_dotimes_withBlock.exit, label %26, !dbg !39 - -26: ; preds = %20 - %27 = bitcast i64* %3 to i8*, !dbg !39 - %28 = bitcast [1 x i64]* %4 to i8*, !dbg !39 - %29 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !39 - br label %81, !dbg !39 - -30: ; preds = %rb_check_arity.1.exit - %31 = ashr i64 %12, 1, !dbg !39 - %32 = icmp sgt i64 %12, 1, !dbg !39 - br i1 %32, label %33, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !39 - -33: ; preds = %30 - %34 = bitcast i64* %1 to i8*, !dbg !39 - %35 = icmp sgt i64 %31, 1, !dbg !39 - %36 = select i1 %35, i64 %31, i64 1, !dbg !39 - br label %37, !dbg !39 - -37: ; preds = %"func_.$152$block_1.exit", %33 - %38 = phi i64 [ 0, %33 ], [ %79, %"func_.$152$block_1.exit" ], !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %34) #13, !dbg !39 - %39 = shl nuw i64 %38, 1, !dbg !39 - %40 = or i64 %39, 1, !dbg !39 - store i64 %40, i64* %1, align 8, !dbg !39, !tbaa !4 - tail call void @llvm.experimental.noalias.scope.decl(metadata !45), !dbg !39 - %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !45 - %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !45 - %42 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %41, i64 0, i32 2 - %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !tbaa !15, !noalias !45 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %44, align 8, !tbaa !19, !noalias !45 - %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 4 - %46 = load i64*, i64** %45, align 8, !tbaa !21, !noalias !45 - %47 = load i64, i64* %46, align 8, !tbaa !4, !noalias !45 - %48 = and i64 %47, -129 - store i64 %48, i64* %46, align 8, !tbaa !4, !noalias !45 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 0 - %50 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame.i, i64 0, i32 2 - %51 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %50, align 8, !tbaa !22, !noalias !45 - %52 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %51, i64 0, i32 2 - %53 = load i64*, i64** %52, align 8, !tbaa !24, !noalias !45 - %54 = getelementptr inbounds i64, i64* %53, i64 3 - %55 = getelementptr inbounds i64, i64* %54, i64 1 - store i64* %55, i64** %49, align 8, !tbaa !13, !noalias !45 - %arg1_maybeExpandToFullArgs.i = load i64, i64* %1, align 8, !dbg !48, !alias.scope !45 - %56 = and i64 %arg1_maybeExpandToFullArgs.i, 7, !dbg !48 - %57 = icmp ne i64 %56, 0, !dbg !48 - %58 = and i64 %arg1_maybeExpandToFullArgs.i, -9, !dbg !48 - %59 = icmp eq i64 %58, 0, !dbg !48 - %60 = or i1 %57, %59, !dbg !48 - br i1 %60, label %"func_.$152$block_1.exit", label %sorbet_isa_Array.exit.i, !dbg !48 - -sorbet_isa_Array.exit.i: ; preds = %37 - %61 = inttoptr i64 %arg1_maybeExpandToFullArgs.i to %struct.iseq_inline_iv_cache_entry*, !dbg !48 - %62 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %61, i64 0, i32 0, !dbg !48 - %63 = load i64, i64* %62, align 8, !dbg !48, !tbaa !34, !noalias !45 - %64 = and i64 %63, 31, !dbg !48 - %65 = icmp ne i64 %64, 7, !dbg !48 - %66 = and i64 %63, 33554432, !dbg !48 - %67 = icmp eq i64 %66, 0, !dbg !48 - %or.cond.i6 = or i1 %65, %67, !dbg !48 - br i1 %or.cond.i6, label %"func_.$152$block_1.exit", label %68, !dbg !48 - -68: ; preds = %sorbet_isa_Array.exit.i - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs.i) #13, !dbg !48, !noalias !45 - br label %"func_.$152$block_1.exit", !dbg !48 - -"func_.$152$block_1.exit": ; preds = %37, %sorbet_isa_Array.exit.i, %68 - %69 = getelementptr inbounds i64, i64* %53, i64 4, !dbg !48 - %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !48 - store i64* %70, i64** %49, align 8, !dbg !48, !tbaa !13, !noalias !45 - %rubyStr_hi.i = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !50, !noalias !45 - %71 = load i64, i64* @rb_mKernel, align 8, !dbg !51, !noalias !45 - %72 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !51, !tbaa !13, !noalias !45 - %73 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %72, i64 0, i32 2, !dbg !51 - %74 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %73, align 8, !dbg !51, !tbaa !15, !noalias !45 - %75 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %74, i64 0, i32 1, !dbg !51 - %76 = load i64*, i64** %75, align 8, !dbg !51, !tbaa !38, !noalias !45 - %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !51 - store i64 %71, i64* %76, align 8, !dbg !51, !tbaa !4, !noalias !45 - %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !51 - store i64* %78, i64** %75, align 8, !dbg !51, !tbaa !38, !noalias !45 - store i64 %rubyStr_hi.i, i64* %77, align 8, !dbg !51, !tbaa !4, !noalias !45 - %send.i = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !51, !noalias !45 - store i64* %55, i64** %49, align 8, !dbg !51, !tbaa !13, !noalias !45 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %34) #13, !dbg !39 - %79 = add nuw nsw i64 %38, 1, !dbg !39 - %80 = icmp eq i64 %79, %36, !dbg !39 - br i1 %80, label %sorbet_rb_int_dotimes_withBlock.exit, label %37, !dbg !39, !llvm.loop !52 - -81: ; preds = %"func_.$152$block_1.exit13", %26 - %82 = phi i64 [ 1, %26 ], [ %123, %"func_.$152$block_1.exit13" ], !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %27) #13, !dbg !39 - %83 = shl i64 %82, 1, !dbg !39 - %84 = or i64 %83, 1, !dbg !39 - store i64 %84, i64* %3, align 8, !dbg !39, !tbaa !4 - call void @llvm.experimental.noalias.scope.decl(metadata !54), !dbg !39 - %stackFrame.i7 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !54 - %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !54 - %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2 - %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !tbaa !15, !noalias !54 - %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i7, %struct.rb_iseq_struct** %88, align 8, !tbaa !19, !noalias !54 - %89 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 4 - %90 = load i64*, i64** %89, align 8, !tbaa !21, !noalias !54 - %91 = load i64, i64* %90, align 8, !tbaa !4, !noalias !54 - %92 = and i64 %91, -129 - store i64 %92, i64* %90, align 8, !tbaa !4, !noalias !54 - %93 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 0 - %94 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame.i7, i64 0, i32 2 - %95 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %94, align 8, !tbaa !22, !noalias !54 - %96 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %95, i64 0, i32 2 - %97 = load i64*, i64** %96, align 8, !tbaa !24, !noalias !54 - %98 = getelementptr inbounds i64, i64* %97, i64 3 - %99 = getelementptr inbounds i64, i64* %98, i64 1 - store i64* %99, i64** %93, align 8, !tbaa !13, !noalias !54 - %arg1_maybeExpandToFullArgs.i8 = load i64, i64* %3, align 8, !dbg !57, !alias.scope !54 - %100 = and i64 %arg1_maybeExpandToFullArgs.i8, 7, !dbg !57 - %101 = icmp ne i64 %100, 0, !dbg !57 - %102 = and i64 %arg1_maybeExpandToFullArgs.i8, -9, !dbg !57 - %103 = icmp eq i64 %102, 0, !dbg !57 - %104 = or i1 %101, %103, !dbg !57 - br i1 %104, label %"func_.$152$block_1.exit13", label %sorbet_isa_Array.exit.i10, !dbg !57 - -sorbet_isa_Array.exit.i10: ; preds = %81 - %105 = inttoptr i64 %arg1_maybeExpandToFullArgs.i8 to %struct.iseq_inline_iv_cache_entry*, !dbg !57 - %106 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %105, i64 0, i32 0, !dbg !57 - %107 = load i64, i64* %106, align 8, !dbg !57, !tbaa !34, !noalias !54 - %108 = and i64 %107, 31, !dbg !57 - %109 = icmp ne i64 %108, 7, !dbg !57 - %110 = and i64 %107, 33554432, !dbg !57 - %111 = icmp eq i64 %110, 0, !dbg !57 - %or.cond.i9 = or i1 %109, %111, !dbg !57 - br i1 %or.cond.i9, label %"func_.$152$block_1.exit13", label %112, !dbg !57 - -112: ; preds = %sorbet_isa_Array.exit.i10 - call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs.i8) #13, !dbg !57, !noalias !54 - br label %"func_.$152$block_1.exit13", !dbg !57 - -"func_.$152$block_1.exit13": ; preds = %81, %sorbet_isa_Array.exit.i10, %112 - %113 = getelementptr inbounds i64, i64* %97, i64 4, !dbg !57 - %114 = getelementptr inbounds i64, i64* %113, i64 1, !dbg !57 - store i64* %114, i64** %93, align 8, !dbg !57, !tbaa !13, !noalias !54 - %rubyStr_hi.i11 = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !59, !noalias !54 - %115 = load i64, i64* @rb_mKernel, align 8, !dbg !60, !noalias !54 - %116 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !60, !tbaa !13, !noalias !54 - %117 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %116, i64 0, i32 2, !dbg !60 - %118 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %117, align 8, !dbg !60, !tbaa !15, !noalias !54 - %119 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %118, i64 0, i32 1, !dbg !60 - %120 = load i64*, i64** %119, align 8, !dbg !60, !tbaa !38, !noalias !54 - %121 = getelementptr inbounds i64, i64* %120, i64 1, !dbg !60 - store i64 %115, i64* %120, align 8, !dbg !60, !tbaa !4, !noalias !54 - %122 = getelementptr inbounds i64, i64* %121, i64 1, !dbg !60 - store i64* %122, i64** %119, align 8, !dbg !60, !tbaa !38, !noalias !54 - store i64 %rubyStr_hi.i11, i64* %121, align 8, !dbg !60, !tbaa !4, !noalias !54 - %send.i12 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !60, !noalias !54 - store i64* %99, i64** %93, align 8, !dbg !60, !tbaa !13, !noalias !54 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !39 - store i64 3, i64* %29, align 8, !dbg !39 - %123 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %82, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %29) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #13, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - store i64 %12, i64* %22, align 8, !dbg !39, !tbaa !4 - %124 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %123, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %22) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - %125 = and i64 %124, -9, !dbg !39 - %126 = icmp eq i64 %125, 0, !dbg !39 - br i1 %126, label %sorbet_rb_int_dotimes_withBlock.exit, label %81, !dbg !39, !llvm.loop !61 - -sorbet_rb_int_dotimes_withBlock.exit: ; preds = %"func_.$152$block_1.exit", %"func_.$152$block_1.exit13", %20, %30 - call void @sorbet_popRubyStack() #13, !dbg !39 - ret i64 %12, !dbg !39 + tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %7) #13, !dbg !28 + %16 = and i64 %10, 1, !dbg !28 + %17 = icmp eq i64 %16, 0, !dbg !28 + br i1 %17, label %18, label %28, !dbg !28, !prof !33 + +18: ; preds = %rb_check_arity.1.exit + %19 = bitcast [1 x i64]* %1 to i8*, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + %20 = getelementptr inbounds [1 x i64], [1 x i64]* %1, i64 0, i64 0, !dbg !28 + store i64 %10, i64* %20, align 8, !dbg !28, !tbaa !4 + %21 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %20) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + %22 = and i64 %21, -9, !dbg !28 + %23 = icmp eq i64 %22, 0, !dbg !28 + br i1 %23, label %sorbet_rb_int_dotimes_withBlock.exit, label %24, !dbg !28 + +24: ; preds = %18 + %25 = bitcast [1 x i64]* %2 to i8*, !dbg !28 + %26 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !28 + %27 = load i64, i64* @rb_mKernel, align 8 + br label %"func_.$152$block_1.exit", !dbg !28 + +28: ; preds = %rb_check_arity.1.exit + %29 = ashr i64 %10, 1, !dbg !28 + %30 = icmp sgt i64 %10, 1, !dbg !28 + br i1 %30, label %31, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !28 + +31: ; preds = %28 + %32 = icmp sgt i64 %29, 1, !dbg !28 + %33 = select i1 %32, i64 %29, i64 1, !dbg !28 + %34 = load i64, i64* @rb_mKernel, align 8 + br label %"func_.$152$block_1.exit8", !dbg !28 + +"func_.$152$block_1.exit8": ; preds = %31, %"func_.$152$block_1.exit8" + %35 = phi i64 [ 0, %31 ], [ %52, %"func_.$152$block_1.exit8" ], !dbg !28 + tail call void @llvm.experimental.noalias.scope.decl(metadata !34), !dbg !28 + %stackFrame.i2 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !34 + %36 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !34 + %37 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %36, i64 0, i32 2 + %38 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %37, align 8, !tbaa !15, !noalias !34 + %39 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i2, %struct.rb_iseq_struct** %39, align 8, !tbaa !19, !noalias !34 + %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 4 + %41 = load i64*, i64** %40, align 8, !tbaa !21, !noalias !34 + %42 = load i64, i64* %41, align 8, !tbaa !4, !noalias !34 + %43 = and i64 %42, -129 + store i64 %43, i64* %41, align 8, !tbaa !4, !noalias !34 + %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 0 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %44, align 8, !dbg !37, !tbaa !13, !noalias !34 + %rubyStr_hi.i6 = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !39, !noalias !34 + %45 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !13, !noalias !34 + %46 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %45, i64 0, i32 2, !dbg !40 + %47 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %46, align 8, !dbg !40, !tbaa !15, !noalias !34 + %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %47, i64 0, i32 1, !dbg !40 + %49 = load i64*, i64** %48, align 8, !dbg !40, !tbaa !27, !noalias !34 + %50 = getelementptr inbounds i64, i64* %49, i64 1, !dbg !40 + store i64 %34, i64* %49, align 8, !dbg !40, !tbaa !4, !noalias !34 + %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !40 + store i64* %51, i64** %48, align 8, !dbg !40, !tbaa !27, !noalias !34 + store i64 %rubyStr_hi.i6, i64* %50, align 8, !dbg !40, !tbaa !4, !noalias !34 + %send.i7 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !40, !noalias !34 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %44, align 8, !dbg !40, !tbaa !13, !noalias !34 + %52 = add nuw nsw i64 %35, 1, !dbg !28 + %53 = icmp eq i64 %52, %33, !dbg !28 + br i1 %53, label %sorbet_rb_int_dotimes_withBlock.exit, label %"func_.$152$block_1.exit8", !dbg !28, !llvm.loop !41 + +"func_.$152$block_1.exit": ; preds = %24, %"func_.$152$block_1.exit" + %54 = phi i64 [ 1, %24 ], [ %71, %"func_.$152$block_1.exit" ], !dbg !28 + call void @llvm.experimental.noalias.scope.decl(metadata !43), !dbg !28 + %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !43 + %55 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !43 + %56 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %55, i64 0, i32 2 + %57 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %56, align 8, !tbaa !15, !noalias !43 + %58 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %58, align 8, !tbaa !19, !noalias !43 + %59 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 4 + %60 = load i64*, i64** %59, align 8, !tbaa !21, !noalias !43 + %61 = load i64, i64* %60, align 8, !tbaa !4, !noalias !43 + %62 = and i64 %61, -129 + store i64 %62, i64* %60, align 8, !tbaa !4, !noalias !43 + %63 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 0 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %63, align 8, !dbg !46, !tbaa !13, !noalias !43 + %rubyStr_hi.i = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !48, !noalias !43 + %64 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !13, !noalias !43 + %65 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %64, i64 0, i32 2, !dbg !49 + %66 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %65, align 8, !dbg !49, !tbaa !15, !noalias !43 + %67 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %66, i64 0, i32 1, !dbg !49 + %68 = load i64*, i64** %67, align 8, !dbg !49, !tbaa !27, !noalias !43 + %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !49 + store i64 %27, i64* %68, align 8, !dbg !49, !tbaa !4, !noalias !43 + %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !49 + store i64* %70, i64** %67, align 8, !dbg !49, !tbaa !27, !noalias !43 + store i64 %rubyStr_hi.i, i64* %69, align 8, !dbg !49, !tbaa !4, !noalias !43 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !49, !noalias !43 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %63, align 8, !dbg !49, !tbaa !13, !noalias !43 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %25) #13, !dbg !28 + store i64 3, i64* %26, align 8, !dbg !28 + %71 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %54, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %26) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %25) #13, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + store i64 %10, i64* %20, align 8, !dbg !28, !tbaa !4 + %72 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %71, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %20) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + %73 = and i64 %72, -9, !dbg !28 + %74 = icmp eq i64 %73, 0, !dbg !28 + br i1 %74, label %sorbet_rb_int_dotimes_withBlock.exit, label %"func_.$152$block_1.exit", !dbg !28, !llvm.loop !50 + +sorbet_rb_int_dotimes_withBlock.exit: ; preds = %"func_.$152$block_1.exit8", %"func_.$152$block_1.exit", %18, %28 + call void @sorbet_popRubyStack() #13, !dbg !28 + ret i64 %10, !dbg !28 } ; Function Attrs: sspreq @@ -472,24 +390,26 @@ entry: %6 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([40 x i8], [40 x i8]* @"str_test/testdata/compiler/block_no_args.rb", i64 0, i64 0), i64 noundef 39) #13 tail call void @rb_gc_register_mark_object(i64 %6) #13 store i64 %6, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 7) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %6, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 6, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/block_no_args.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args.rb", align 8 + %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %7, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %8 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #13 call void @rb_gc_register_mark_object(i64 %8) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/block_no_args.rb.i2.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args.rb", align 8 - %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %8, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args.rb.i2.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 6, i64* noundef null, i32 noundef 0, i32 noundef 2) + %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %8, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args.rb.i2.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %9, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 - %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !39 + %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !28 %10 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_hi, i64 0, i64 0), i64 noundef 2) #13 call void @rb_gc_register_mark_object(i64 %10) #13 store i64 %10, i64* @rubyStrFrozen_hi, align 8 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !26 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !26 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %11 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13 %12 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %11, i64 0, i32 2 @@ -503,38 +423,31 @@ entry: store i64 %18, i64* %16, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %11, %struct.rb_control_frame_struct* align 8 %13, %struct.rb_iseq_struct* %stackFrame.i) #13 %19 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %13, i64 0, i32 0 - %20 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %14, align 8, !tbaa !19 - %21 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %20, i64 0, i32 2 - %22 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %21, align 8, !tbaa !22 - %23 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %22, i64 0, i32 2 - %24 = load i64*, i64** %23, align 8, !tbaa !24 - %25 = getelementptr inbounds i64, i64* %24, i64 3 - %26 = getelementptr inbounds i64, i64* %25, i64 1 - store i64* %26, i64** %19, align 8, !dbg !62, !tbaa !13 - %rubyId_times.i1 = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - %27 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %27) #13, !dbg !39 - %28 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !39 - store i64 21, i64* %28, align 8, !dbg !39, !tbaa !41 - %29 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !39 - store i64 %rubyId_times.i1, i64* %29, align 8, !dbg !39, !tbaa !63 - %30 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !39 - store i32 0, i32* %30, align 8, !dbg !39, !tbaa !43 - %31 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !39 - %32 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !39 - %33 = bitcast i64** %31 to i8*, !dbg !39 - call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %33, i8 0, i64 16, i1 false) #13, !dbg !39 - %34 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %32, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %27) #13, !dbg !39 - store i64* %26, i64** %19, align 8, !tbaa !13 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %19, align 8, !dbg !51, !tbaa !13 + %rubyId_times.i1 = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !28 + %20 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %20) #13, !dbg !28 + %21 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !28 + store i64 21, i64* %21, align 8, !dbg !28, !tbaa !30 + %22 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !28 + store i64 %rubyId_times.i1, i64* %22, align 8, !dbg !28, !tbaa !52 + %23 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !28 + store i32 0, i32* %23, align 8, !dbg !28, !tbaa !32 + %24 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !28 + %25 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !28 + %26 = bitcast i64** %24 to i8*, !dbg !28 + call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %26, i8 0, i64 16, i1 false) #13, !dbg !28 + %27 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %25, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %20) #13, !dbg !28 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %19, align 8, !tbaa !13 ret void } -; Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly -declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #9 - ; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn -declare void @llvm.experimental.noalias.scope.decl(metadata) #10 +declare void @llvm.experimental.noalias.scope.decl(metadata) #9 + +; Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly +declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #10 attributes #0 = { noreturn } attributes #1 = { "addedToSilenceEmptyAttrsError" } @@ -545,8 +458,8 @@ attributes #5 = { nounwind ssp uwtable } attributes #6 = { ssp } attributes #7 = { nounwind ssp } attributes #8 = { sspreq } -attributes #9 = { argmemonly nofree nosync nounwind willreturn writeonly } -attributes #10 = { inaccessiblememonly nofree nosync nounwind willreturn } +attributes #9 = { inaccessiblememonly nofree nosync nounwind willreturn } +attributes #10 = { argmemonly nofree nosync nounwind willreturn writeonly } attributes #11 = { nounwind allocsize(0,1) } attributes #12 = { noreturn nounwind } attributes #13 = { nounwind } @@ -576,45 +489,34 @@ attributes #13 = { nounwind } !19 = !{!20, !14, i64 16} !20 = !{!"rb_control_frame_struct", !14, i64 0, !14, i64 8, !14, i64 16, !5, i64 24, !14, i64 32, !14, i64 40, !14, i64 48} !21 = !{!20, !14, i64 32} -!22 = !{!23, !14, i64 16} -!23 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !14, i64 16, !6, i64 24} -!24 = !{!25, !14, i64 8} -!25 = !{!"rb_iseq_constant_body", !6, i64 0, !17, i64 4, !14, i64 8, !26, i64 16, !28, i64 64, !31, i64 120, !14, i64 152, !14, i64 160, !14, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !32, i64 200, !17, i64 232, !17, i64 236, !17, i64 240, !17, i64 244, !17, i64 248, !6, i64 252, !5, i64 256} -!26 = !{!"", !27, i64 0, !17, i64 4, !17, i64 8, !17, i64 12, !17, i64 16, !17, i64 20, !17, i64 24, !17, i64 28, !14, i64 32, !14, i64 40} -!27 = !{!"", !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 1, !17, i64 1} -!28 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !17, i64 32, !29, i64 36} -!29 = !{!"rb_code_location_struct", !30, i64 0, !30, i64 8} -!30 = !{!"rb_code_position_struct", !17, i64 0, !17, i64 4} -!31 = !{!"iseq_insn_info", !14, i64 0, !14, i64 8, !17, i64 16, !14, i64 24} -!32 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !14, i64 24} -!33 = !DILocation(line: 4, column: 1, scope: !8) -!34 = !{!35, !5, i64 0} -!35 = !{!"RBasic", !5, i64 0, !5, i64 8} -!36 = !DILocation(line: 5, column: 15, scope: !8) -!37 = !DILocation(line: 5, column: 3, scope: !8) -!38 = !{!20, !14, i64 8} -!39 = !DILocation(line: 4, column: 1, scope: !9) -!40 = !{!16, !5, i64 128} -!41 = !{!42, !5, i64 0} -!42 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !17, i64 16, !14, i64 24, !5, i64 32} -!43 = !{!42, !17, i64 16} -!44 = !{!"branch_weights", i32 1, i32 2000} -!45 = !{!46} -!46 = distinct !{!46, !47, !"func_.$152$block_1: %argArray"} -!47 = distinct !{!47, !"func_.$152$block_1"} -!48 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !49) -!49 = distinct !DILocation(line: 4, column: 1, scope: !9) -!50 = !DILocation(line: 5, column: 15, scope: !8, inlinedAt: !49) -!51 = !DILocation(line: 5, column: 3, scope: !8, inlinedAt: !49) -!52 = distinct !{!52, !53} -!53 = !{!"llvm.loop.unroll.disable"} -!54 = !{!55} -!55 = distinct !{!55, !56, !"func_.$152$block_1: %argArray"} -!56 = distinct !{!56, !"func_.$152$block_1"} -!57 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !58) -!58 = distinct !DILocation(line: 4, column: 1, scope: !9) -!59 = !DILocation(line: 5, column: 15, scope: !8, inlinedAt: !58) -!60 = !DILocation(line: 5, column: 3, scope: !8, inlinedAt: !58) -!61 = distinct !{!61, !53} -!62 = !DILocation(line: 0, scope: !9) -!63 = !{!42, !5, i64 8} +!22 = !DILocation(line: 4, column: 1, scope: !8) +!23 = !{!24, !5, i64 0} +!24 = !{!"RBasic", !5, i64 0, !5, i64 8} +!25 = !DILocation(line: 5, column: 15, scope: !8) +!26 = !DILocation(line: 5, column: 3, scope: !8) +!27 = !{!20, !14, i64 8} +!28 = !DILocation(line: 4, column: 1, scope: !9) +!29 = !{!16, !5, i64 128} +!30 = !{!31, !5, i64 0} +!31 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !17, i64 16, !14, i64 24, !5, i64 32} +!32 = !{!31, !17, i64 16} +!33 = !{!"branch_weights", i32 1, i32 2000} +!34 = !{!35} +!35 = distinct !{!35, !36, !"func_.$152$block_1: %argArray"} +!36 = distinct !{!36, !"func_.$152$block_1"} +!37 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !38) +!38 = distinct !DILocation(line: 4, column: 1, scope: !9) +!39 = !DILocation(line: 5, column: 15, scope: !8, inlinedAt: !38) +!40 = !DILocation(line: 5, column: 3, scope: !8, inlinedAt: !38) +!41 = distinct !{!41, !42} +!42 = !{!"llvm.loop.unroll.disable"} +!43 = !{!44} +!44 = distinct !{!44, !45, !"func_.$152$block_1: %argArray"} +!45 = distinct !{!45, !"func_.$152$block_1"} +!46 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !47) +!47 = distinct !DILocation(line: 4, column: 1, scope: !9) +!48 = !DILocation(line: 5, column: 15, scope: !8, inlinedAt: !47) +!49 = !DILocation(line: 5, column: 3, scope: !8, inlinedAt: !47) +!50 = distinct !{!50, !42} +!51 = !DILocation(line: 0, scope: !9) +!52 = !{!31, !5, i64 8} diff --git a/test/testdata/compiler/block_no_args_capture.llo.exp b/test/testdata/compiler/block_no_args_capture.llo.exp index d97058e2f14..802437c12a7 100644 --- a/test/testdata/compiler/block_no_args_capture.llo.exp +++ b/test/testdata/compiler/block_no_args_capture.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,32 +50,33 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.rb_captured_block = type { i64, i64*, %union.anon.17 } -%union.anon.17 = type { %struct.rb_iseq_struct* } +%struct.rb_captured_block = type { i64, i64*, %union.anon.20 } +%union.anon.20 = type { %struct.rb_iseq_struct* } %struct.iseq_inline_iv_cache_entry = type { i64, i64 } %struct.sorbet_inlineIntrinsicEnv = type { i64, i64, i32, i64*, i64 } @@ -92,6 +94,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"str_test/testdata/compiler/block_no_args_capture.rb" = private unnamed_addr constant [48 x i8] c"test/testdata/compiler/block_no_args_capture.rb\00", align 1 @rubyIdPrecomputed_s = internal unnamed_addr global i64 0, align 8 @str_s = private unnamed_addr constant [2 x i8] c"s\00", align 1 +@iseqEncodedArray = internal global [8 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_.$152$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -108,7 +112,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @rb_error_arity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_readRealpath() local_unnamed_addr #1 @@ -183,68 +189,58 @@ functionEntryInitializers: %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !4 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !22 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !24 - %13 = getelementptr inbounds i64, i64* %12, i64 3 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %8, align 8, !tbaa !13 - %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !33 - br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %vm_get_ep.exit, !dbg !33 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !tbaa !13 + %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !22 + br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %vm_get_ep.exit, !dbg !22 argArrayExpandArrayTest: ; preds = %functionEntryInitializers - %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !33 - %15 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !33 - %16 = icmp ne i64 %15, 0, !dbg !33 - %17 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !33 - %18 = icmp eq i64 %17, 0, !dbg !33 - %19 = or i1 %16, %18, !dbg !33 - br i1 %19, label %vm_get_ep.exit, label %sorbet_isa_Array.exit, !dbg !33 + %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !22 + %9 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !22 + %10 = icmp ne i64 %9, 0, !dbg !22 + %11 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !22 + %12 = icmp eq i64 %11, 0, !dbg !22 + %13 = or i1 %10, %12, !dbg !22 + br i1 %13, label %vm_get_ep.exit, label %sorbet_isa_Array.exit, !dbg !22 sorbet_isa_Array.exit: ; preds = %argArrayExpandArrayTest - %20 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !33 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !33 - %22 = load i64, i64* %21, align 8, !dbg !33, !tbaa !34 - %23 = and i64 %22, 31, !dbg !33 - %24 = icmp ne i64 %23, 7, !dbg !33 - %25 = and i64 %22, 33554432, !dbg !33 - %26 = icmp eq i64 %25, 0, !dbg !33 - %or.cond = or i1 %24, %26, !dbg !33 - br i1 %or.cond, label %vm_get_ep.exit, label %27, !dbg !33 - -27: ; preds = %sorbet_isa_Array.exit - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #13, !dbg !33 - br label %vm_get_ep.exit, !dbg !33 - -vm_get_ep.exit: ; preds = %argArrayExpandArrayTest, %27, %functionEntryInitializers, %sorbet_isa_Array.exit - %28 = getelementptr inbounds i64, i64* %12, i64 4 - %29 = getelementptr inbounds i64, i64* %12, i64 5, !dbg !36 - %30 = getelementptr inbounds i64, i64* %29, i64 1, !dbg !36 - store i64* %30, i64** %8, align 8, !dbg !36, !tbaa !13 - %31 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !13 - %32 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %31, i64 0, i32 2, !dbg !37 - %33 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %32, align 8, !dbg !37, !tbaa !15 - %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 4, !dbg !37 - %35 = load i64*, i64** %34, align 8, !dbg !37 - %36 = getelementptr inbounds i64, i64* %35, i64 -1, !dbg !37 - %37 = load i64, i64* %36, align 8, !dbg !37, !tbaa !4 - %38 = and i64 %37, -4, !dbg !37 - %39 = getelementptr inbounds i64, i64* %28, i64 1 - %40 = load i64, i64* @rb_mKernel, align 8, !dbg !37 - %41 = inttoptr i64 %38 to i64*, !dbg !37 - %42 = getelementptr inbounds i64, i64* %41, i64 -3, !dbg !37 - %43 = load i64, i64* %42, align 8, !dbg !37, !tbaa !4 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 1, !dbg !37 - %45 = load i64*, i64** %44, align 8, !dbg !37, !tbaa !38 - %46 = getelementptr inbounds i64, i64* %45, i64 1, !dbg !37 - store i64 %40, i64* %45, align 8, !dbg !37, !tbaa !4 - %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !37 - store i64* %47, i64** %44, align 8, !dbg !37, !tbaa !38 - store i64 %43, i64* %46, align 8, !dbg !37, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !37 - store i64* %39, i64** %8, align 8, !dbg !37, !tbaa !13 - ret i64 %send, !dbg !36 + %14 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !22 + %15 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %14, i64 0, i32 0, !dbg !22 + %16 = load i64, i64* %15, align 8, !dbg !22, !tbaa !23 + %17 = and i64 %16, 31, !dbg !22 + %18 = icmp ne i64 %17, 7, !dbg !22 + %19 = and i64 %16, 33554432, !dbg !22 + %20 = icmp eq i64 %19, 0, !dbg !22 + %or.cond = or i1 %18, %20, !dbg !22 + br i1 %or.cond, label %vm_get_ep.exit, label %21, !dbg !22 + +21: ; preds = %sorbet_isa_Array.exit + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #13, !dbg !22 + br label %vm_get_ep.exit, !dbg !22 + +vm_get_ep.exit: ; preds = %argArrayExpandArrayTest, %21, %functionEntryInitializers, %sorbet_isa_Array.exit + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %8, align 8, !dbg !25, !tbaa !13 + %22 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !26, !tbaa !13 + %23 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %22, i64 0, i32 2, !dbg !26 + %24 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %23, align 8, !dbg !26, !tbaa !15 + %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 4, !dbg !26 + %26 = load i64*, i64** %25, align 8, !dbg !26 + %27 = getelementptr inbounds i64, i64* %26, i64 -1, !dbg !26 + %28 = load i64, i64* %27, align 8, !dbg !26, !tbaa !4 + %29 = and i64 %28, -4, !dbg !26 + %30 = load i64, i64* @rb_mKernel, align 8, !dbg !26 + %31 = inttoptr i64 %29 to i64*, !dbg !26 + %32 = getelementptr inbounds i64, i64* %31, i64 -3, !dbg !26 + %33 = load i64, i64* %32, align 8, !dbg !26, !tbaa !4 + %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 1, !dbg !26 + %35 = load i64*, i64** %34, align 8, !dbg !26, !tbaa !27 + %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !26 + store i64 %30, i64* %35, align 8, !dbg !26, !tbaa !4 + %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !26 + store i64* %37, i64** %34, align 8, !dbg !26, !tbaa !27 + store i64 %33, i64* %36, align 8, !dbg !26, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !26 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %8, align 8, !dbg !26, !tbaa !13 + ret i64 %send, !dbg !25 } ; Function Attrs: nounwind ssp @@ -254,233 +250,213 @@ entry: %2 = alloca [1 x i64], align 8 %3 = alloca i64, align 8 %4 = alloca [1 x i64], align 8 - %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !13 - %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 17, !dbg !39 - %7 = load i64, i64* %6, align 8, !dbg !39, !tbaa !40 - %8 = and i64 %7, -4, !dbg !39 - %9 = inttoptr i64 %8 to %struct.rb_captured_block*, !dbg !39 - store i64 0, i64* %6, align 8, !dbg !39, !tbaa !40 - %10 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !39 - %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 0, !dbg !39 - %12 = load i64, i64* %11, align 8, !dbg !39, !tbaa !41 - %13 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 2, !dbg !39 - %14 = load i32, i32* %13, align 8, !dbg !39, !tbaa !43 - %15 = icmp slt i32 %14, 0, !dbg !39 - %16 = icmp sgt i32 %14, 0, !dbg !39 - %or.cond.i = or i1 %15, %16, !dbg !39 - br i1 %or.cond.i, label %17, label %rb_check_arity.1.exit, !dbg !39 + %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !13 + %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 17, !dbg !28 + %7 = load i64, i64* %6, align 8, !dbg !28, !tbaa !29 + %8 = and i64 %7, -4, !dbg !28 + %9 = inttoptr i64 %8 to %struct.rb_captured_block*, !dbg !28 + store i64 0, i64* %6, align 8, !dbg !28, !tbaa !29 + %10 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !28 + %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 0, !dbg !28 + %12 = load i64, i64* %11, align 8, !dbg !28, !tbaa !30 + %13 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 2, !dbg !28 + %14 = load i32, i32* %13, align 8, !dbg !28, !tbaa !32 + %15 = icmp slt i32 %14, 0, !dbg !28 + %16 = icmp sgt i32 %14, 0, !dbg !28 + %or.cond.i = or i1 %15, %16, !dbg !28 + br i1 %or.cond.i, label %17, label %rb_check_arity.1.exit, !dbg !28 17: ; preds = %entry - tail call void @rb_error_arity(i32 %14, i32 noundef 0, i32 noundef 0) #12, !dbg !39 - unreachable, !dbg !39 + tail call void @rb_error_arity(i32 %14, i32 noundef 0, i32 noundef 0) #12, !dbg !28 + unreachable, !dbg !28 rb_check_arity.1.exit: ; preds = %entry - tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %9) #13, !dbg !39 - %18 = and i64 %12, 1, !dbg !39 - %19 = icmp eq i64 %18, 0, !dbg !39 - br i1 %19, label %20, label %30, !dbg !39, !prof !44 + tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %9) #13, !dbg !28 + %18 = and i64 %12, 1, !dbg !28 + %19 = icmp eq i64 %18, 0, !dbg !28 + br i1 %19, label %20, label %30, !dbg !28, !prof !33 20: ; preds = %rb_check_arity.1.exit - %21 = bitcast [1 x i64]* %2 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - %22 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !39 - store i64 %12, i64* %22, align 8, !dbg !39, !tbaa !4 - %23 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %22) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - %24 = and i64 %23, -9, !dbg !39 - %25 = icmp eq i64 %24, 0, !dbg !39 - br i1 %25, label %sorbet_rb_int_dotimes_withBlock.exit, label %26, !dbg !39 + %21 = bitcast [1 x i64]* %2 to i8*, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !28 + %22 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !28 + store i64 %12, i64* %22, align 8, !dbg !28, !tbaa !4 + %23 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %22) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !28 + %24 = and i64 %23, -9, !dbg !28 + %25 = icmp eq i64 %24, 0, !dbg !28 + br i1 %25, label %sorbet_rb_int_dotimes_withBlock.exit, label %26, !dbg !28 26: ; preds = %20 - %27 = bitcast i64* %3 to i8*, !dbg !39 - %28 = bitcast [1 x i64]* %4 to i8*, !dbg !39 - %29 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !39 - br label %91, !dbg !39 + %27 = bitcast i64* %3 to i8*, !dbg !28 + %28 = bitcast [1 x i64]* %4 to i8*, !dbg !28 + %29 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !28 + br label %81, !dbg !28 30: ; preds = %rb_check_arity.1.exit - %31 = ashr i64 %12, 1, !dbg !39 - %32 = icmp sgt i64 %12, 1, !dbg !39 - br i1 %32, label %33, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !39 + %31 = ashr i64 %12, 1, !dbg !28 + %32 = icmp sgt i64 %12, 1, !dbg !28 + br i1 %32, label %33, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !28 33: ; preds = %30 - %34 = bitcast i64* %1 to i8*, !dbg !39 - %35 = icmp sgt i64 %31, 1, !dbg !39 - %36 = select i1 %35, i64 %31, i64 1, !dbg !39 - br label %37, !dbg !39 + %34 = bitcast i64* %1 to i8*, !dbg !28 + %35 = icmp sgt i64 %31, 1, !dbg !28 + %36 = select i1 %35, i64 %31, i64 1, !dbg !28 + br label %37, !dbg !28 37: ; preds = %"func_.$152$block_1.exit", %33 - %38 = phi i64 [ 0, %33 ], [ %89, %"func_.$152$block_1.exit" ], !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %34) #13, !dbg !39 - %39 = shl nuw i64 %38, 1, !dbg !39 - %40 = or i64 %39, 1, !dbg !39 - store i64 %40, i64* %1, align 8, !dbg !39, !tbaa !4 - tail call void @llvm.experimental.noalias.scope.decl(metadata !45), !dbg !39 - %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !45 - %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !45 + %38 = phi i64 [ 0, %33 ], [ %79, %"func_.$152$block_1.exit" ], !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %34) #13, !dbg !28 + %39 = shl nuw i64 %38, 1, !dbg !28 + %40 = or i64 %39, 1, !dbg !28 + store i64 %40, i64* %1, align 8, !dbg !28, !tbaa !4 + tail call void @llvm.experimental.noalias.scope.decl(metadata !34), !dbg !28 + %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !34 + %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !34 %42 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %41, i64 0, i32 2 - %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !tbaa !15, !noalias !45 + %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !tbaa !15, !noalias !34 %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %44, align 8, !tbaa !19, !noalias !45 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %44, align 8, !tbaa !19, !noalias !34 %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 4 - %46 = load i64*, i64** %45, align 8, !tbaa !21, !noalias !45 - %47 = load i64, i64* %46, align 8, !tbaa !4, !noalias !45 + %46 = load i64*, i64** %45, align 8, !tbaa !21, !noalias !34 + %47 = load i64, i64* %46, align 8, !tbaa !4, !noalias !34 %48 = and i64 %47, -129 - store i64 %48, i64* %46, align 8, !tbaa !4, !noalias !45 + store i64 %48, i64* %46, align 8, !tbaa !4, !noalias !34 %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 0 - %50 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame.i, i64 0, i32 2 - %51 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %50, align 8, !tbaa !22, !noalias !45 - %52 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %51, i64 0, i32 2 - %53 = load i64*, i64** %52, align 8, !tbaa !24, !noalias !45 - %54 = getelementptr inbounds i64, i64* %53, i64 3 - %55 = getelementptr inbounds i64, i64* %54, i64 1 - store i64* %55, i64** %49, align 8, !tbaa !13, !noalias !45 - %arg1_maybeExpandToFullArgs.i = load i64, i64* %1, align 8, !dbg !48, !alias.scope !45 - %56 = and i64 %arg1_maybeExpandToFullArgs.i, 7, !dbg !48 - %57 = icmp ne i64 %56, 0, !dbg !48 - %58 = and i64 %arg1_maybeExpandToFullArgs.i, -9, !dbg !48 - %59 = icmp eq i64 %58, 0, !dbg !48 - %60 = or i1 %57, %59, !dbg !48 - br i1 %60, label %"func_.$152$block_1.exit", label %sorbet_isa_Array.exit.i, !dbg !48 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %49, align 8, !tbaa !13, !noalias !34 + %arg1_maybeExpandToFullArgs.i = load i64, i64* %1, align 8, !dbg !37, !alias.scope !34 + %50 = and i64 %arg1_maybeExpandToFullArgs.i, 7, !dbg !37 + %51 = icmp ne i64 %50, 0, !dbg !37 + %52 = and i64 %arg1_maybeExpandToFullArgs.i, -9, !dbg !37 + %53 = icmp eq i64 %52, 0, !dbg !37 + %54 = or i1 %51, %53, !dbg !37 + br i1 %54, label %"func_.$152$block_1.exit", label %sorbet_isa_Array.exit.i, !dbg !37 sorbet_isa_Array.exit.i: ; preds = %37 - %61 = inttoptr i64 %arg1_maybeExpandToFullArgs.i to %struct.iseq_inline_iv_cache_entry*, !dbg !48 - %62 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %61, i64 0, i32 0, !dbg !48 - %63 = load i64, i64* %62, align 8, !dbg !48, !tbaa !34, !noalias !45 - %64 = and i64 %63, 31, !dbg !48 - %65 = icmp ne i64 %64, 7, !dbg !48 - %66 = and i64 %63, 33554432, !dbg !48 - %67 = icmp eq i64 %66, 0, !dbg !48 - %or.cond.i6 = or i1 %65, %67, !dbg !48 - br i1 %or.cond.i6, label %"func_.$152$block_1.exit", label %68, !dbg !48 - -68: ; preds = %sorbet_isa_Array.exit.i - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs.i) #13, !dbg !48, !noalias !45 - br label %"func_.$152$block_1.exit", !dbg !48 - -"func_.$152$block_1.exit": ; preds = %37, %sorbet_isa_Array.exit.i, %68 - %69 = getelementptr inbounds i64, i64* %53, i64 4 - %70 = getelementptr inbounds i64, i64* %53, i64 5, !dbg !50 - %71 = getelementptr inbounds i64, i64* %70, i64 1, !dbg !50 - store i64* %71, i64** %49, align 8, !dbg !50, !tbaa !13, !noalias !45 - %72 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !51, !tbaa !13, !noalias !45 - %73 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %72, i64 0, i32 2, !dbg !51 - %74 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %73, align 8, !dbg !51, !tbaa !15, !noalias !45 - %75 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %74, i64 0, i32 4, !dbg !51 - %76 = load i64*, i64** %75, align 8, !dbg !51, !noalias !45 - %77 = getelementptr inbounds i64, i64* %76, i64 -1, !dbg !51 - %78 = load i64, i64* %77, align 8, !dbg !51, !tbaa !4, !noalias !45 - %79 = and i64 %78, -4, !dbg !51 - %80 = getelementptr inbounds i64, i64* %69, i64 1 - %81 = load i64, i64* @rb_mKernel, align 8, !dbg !51, !noalias !45 - %82 = inttoptr i64 %79 to i64*, !dbg !51 - %83 = getelementptr inbounds i64, i64* %82, i64 -3, !dbg !51 - %84 = load i64, i64* %83, align 8, !dbg !51, !tbaa !4, !noalias !45 - %85 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %74, i64 0, i32 1, !dbg !51 - %86 = load i64*, i64** %85, align 8, !dbg !51, !tbaa !38, !noalias !45 - %87 = getelementptr inbounds i64, i64* %86, i64 1, !dbg !51 - store i64 %81, i64* %86, align 8, !dbg !51, !tbaa !4, !noalias !45 - %88 = getelementptr inbounds i64, i64* %87, i64 1, !dbg !51 - store i64* %88, i64** %85, align 8, !dbg !51, !tbaa !38, !noalias !45 - store i64 %84, i64* %87, align 8, !dbg !51, !tbaa !4, !noalias !45 - %send.i = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !51, !noalias !45 - store i64* %80, i64** %49, align 8, !dbg !51, !tbaa !13, !noalias !45 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %34) #13, !dbg !39 - %89 = add nuw nsw i64 %38, 1, !dbg !39 - %90 = icmp eq i64 %89, %36, !dbg !39 - br i1 %90, label %sorbet_rb_int_dotimes_withBlock.exit, label %37, !dbg !39, !llvm.loop !52 - -91: ; preds = %"func_.$152$block_1.exit12", %26 - %92 = phi i64 [ 1, %26 ], [ %143, %"func_.$152$block_1.exit12" ], !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %27) #13, !dbg !39 - %93 = shl i64 %92, 1, !dbg !39 - %94 = or i64 %93, 1, !dbg !39 - store i64 %94, i64* %3, align 8, !dbg !39, !tbaa !4 - call void @llvm.experimental.noalias.scope.decl(metadata !54), !dbg !39 - %stackFrame.i7 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !54 - %95 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !54 - %96 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %95, i64 0, i32 2 - %97 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %96, align 8, !tbaa !15, !noalias !54 - %98 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %97, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i7, %struct.rb_iseq_struct** %98, align 8, !tbaa !19, !noalias !54 - %99 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %97, i64 0, i32 4 - %100 = load i64*, i64** %99, align 8, !tbaa !21, !noalias !54 - %101 = load i64, i64* %100, align 8, !tbaa !4, !noalias !54 - %102 = and i64 %101, -129 - store i64 %102, i64* %100, align 8, !tbaa !4, !noalias !54 - %103 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %97, i64 0, i32 0 - %104 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame.i7, i64 0, i32 2 - %105 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %104, align 8, !tbaa !22, !noalias !54 - %106 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %105, i64 0, i32 2 - %107 = load i64*, i64** %106, align 8, !tbaa !24, !noalias !54 - %108 = getelementptr inbounds i64, i64* %107, i64 3 - %109 = getelementptr inbounds i64, i64* %108, i64 1 - store i64* %109, i64** %103, align 8, !tbaa !13, !noalias !54 - %arg1_maybeExpandToFullArgs.i8 = load i64, i64* %3, align 8, !dbg !57, !alias.scope !54 - %110 = and i64 %arg1_maybeExpandToFullArgs.i8, 7, !dbg !57 - %111 = icmp ne i64 %110, 0, !dbg !57 - %112 = and i64 %arg1_maybeExpandToFullArgs.i8, -9, !dbg !57 - %113 = icmp eq i64 %112, 0, !dbg !57 - %114 = or i1 %111, %113, !dbg !57 - br i1 %114, label %"func_.$152$block_1.exit12", label %sorbet_isa_Array.exit.i10, !dbg !57 - -sorbet_isa_Array.exit.i10: ; preds = %91 - %115 = inttoptr i64 %arg1_maybeExpandToFullArgs.i8 to %struct.iseq_inline_iv_cache_entry*, !dbg !57 - %116 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %115, i64 0, i32 0, !dbg !57 - %117 = load i64, i64* %116, align 8, !dbg !57, !tbaa !34, !noalias !54 - %118 = and i64 %117, 31, !dbg !57 - %119 = icmp ne i64 %118, 7, !dbg !57 - %120 = and i64 %117, 33554432, !dbg !57 - %121 = icmp eq i64 %120, 0, !dbg !57 - %or.cond.i9 = or i1 %119, %121, !dbg !57 - br i1 %or.cond.i9, label %"func_.$152$block_1.exit12", label %122, !dbg !57 - -122: ; preds = %sorbet_isa_Array.exit.i10 - call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs.i8) #13, !dbg !57, !noalias !54 - br label %"func_.$152$block_1.exit12", !dbg !57 - -"func_.$152$block_1.exit12": ; preds = %91, %sorbet_isa_Array.exit.i10, %122 - %123 = getelementptr inbounds i64, i64* %107, i64 4 - %124 = getelementptr inbounds i64, i64* %107, i64 5, !dbg !59 - %125 = getelementptr inbounds i64, i64* %124, i64 1, !dbg !59 - store i64* %125, i64** %103, align 8, !dbg !59, !tbaa !13, !noalias !54 - %126 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !60, !tbaa !13, !noalias !54 - %127 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %126, i64 0, i32 2, !dbg !60 - %128 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %127, align 8, !dbg !60, !tbaa !15, !noalias !54 - %129 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %128, i64 0, i32 4, !dbg !60 - %130 = load i64*, i64** %129, align 8, !dbg !60, !noalias !54 - %131 = getelementptr inbounds i64, i64* %130, i64 -1, !dbg !60 - %132 = load i64, i64* %131, align 8, !dbg !60, !tbaa !4, !noalias !54 - %133 = and i64 %132, -4, !dbg !60 - %134 = getelementptr inbounds i64, i64* %123, i64 1 - %135 = load i64, i64* @rb_mKernel, align 8, !dbg !60, !noalias !54 - %136 = inttoptr i64 %133 to i64*, !dbg !60 - %137 = getelementptr inbounds i64, i64* %136, i64 -3, !dbg !60 - %138 = load i64, i64* %137, align 8, !dbg !60, !tbaa !4, !noalias !54 - %139 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %128, i64 0, i32 1, !dbg !60 - %140 = load i64*, i64** %139, align 8, !dbg !60, !tbaa !38, !noalias !54 - %141 = getelementptr inbounds i64, i64* %140, i64 1, !dbg !60 - store i64 %135, i64* %140, align 8, !dbg !60, !tbaa !4, !noalias !54 - %142 = getelementptr inbounds i64, i64* %141, i64 1, !dbg !60 - store i64* %142, i64** %139, align 8, !dbg !60, !tbaa !38, !noalias !54 - store i64 %138, i64* %141, align 8, !dbg !60, !tbaa !4, !noalias !54 - %send.i11 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !60, !noalias !54 - store i64* %134, i64** %103, align 8, !dbg !60, !tbaa !13, !noalias !54 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !39 - store i64 3, i64* %29, align 8, !dbg !39 - %143 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %92, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %29) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #13, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - store i64 %12, i64* %22, align 8, !dbg !39, !tbaa !4 - %144 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %143, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %22) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !39 - %145 = and i64 %144, -9, !dbg !39 - %146 = icmp eq i64 %145, 0, !dbg !39 - br i1 %146, label %sorbet_rb_int_dotimes_withBlock.exit, label %91, !dbg !39, !llvm.loop !61 + %55 = inttoptr i64 %arg1_maybeExpandToFullArgs.i to %struct.iseq_inline_iv_cache_entry*, !dbg !37 + %56 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %55, i64 0, i32 0, !dbg !37 + %57 = load i64, i64* %56, align 8, !dbg !37, !tbaa !23, !noalias !34 + %58 = and i64 %57, 31, !dbg !37 + %59 = icmp ne i64 %58, 7, !dbg !37 + %60 = and i64 %57, 33554432, !dbg !37 + %61 = icmp eq i64 %60, 0, !dbg !37 + %or.cond.i6 = or i1 %59, %61, !dbg !37 + br i1 %or.cond.i6, label %"func_.$152$block_1.exit", label %62, !dbg !37 + +62: ; preds = %sorbet_isa_Array.exit.i + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs.i) #13, !dbg !37, !noalias !34 + br label %"func_.$152$block_1.exit", !dbg !37 + +"func_.$152$block_1.exit": ; preds = %37, %sorbet_isa_Array.exit.i, %62 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %49, align 8, !dbg !39, !tbaa !13, !noalias !34 + %63 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !13, !noalias !34 + %64 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %63, i64 0, i32 2, !dbg !40 + %65 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %64, align 8, !dbg !40, !tbaa !15, !noalias !34 + %66 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %65, i64 0, i32 4, !dbg !40 + %67 = load i64*, i64** %66, align 8, !dbg !40, !noalias !34 + %68 = getelementptr inbounds i64, i64* %67, i64 -1, !dbg !40 + %69 = load i64, i64* %68, align 8, !dbg !40, !tbaa !4, !noalias !34 + %70 = and i64 %69, -4, !dbg !40 + %71 = load i64, i64* @rb_mKernel, align 8, !dbg !40, !noalias !34 + %72 = inttoptr i64 %70 to i64*, !dbg !40 + %73 = getelementptr inbounds i64, i64* %72, i64 -3, !dbg !40 + %74 = load i64, i64* %73, align 8, !dbg !40, !tbaa !4, !noalias !34 + %75 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %65, i64 0, i32 1, !dbg !40 + %76 = load i64*, i64** %75, align 8, !dbg !40, !tbaa !27, !noalias !34 + %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !40 + store i64 %71, i64* %76, align 8, !dbg !40, !tbaa !4, !noalias !34 + %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !40 + store i64* %78, i64** %75, align 8, !dbg !40, !tbaa !27, !noalias !34 + store i64 %74, i64* %77, align 8, !dbg !40, !tbaa !4, !noalias !34 + %send.i = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !40, !noalias !34 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %49, align 8, !dbg !40, !tbaa !13, !noalias !34 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %34) #13, !dbg !28 + %79 = add nuw nsw i64 %38, 1, !dbg !28 + %80 = icmp eq i64 %79, %36, !dbg !28 + br i1 %80, label %sorbet_rb_int_dotimes_withBlock.exit, label %37, !dbg !28, !llvm.loop !41 + +81: ; preds = %"func_.$152$block_1.exit12", %26 + %82 = phi i64 [ 1, %26 ], [ %123, %"func_.$152$block_1.exit12" ], !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %27) #13, !dbg !28 + %83 = shl i64 %82, 1, !dbg !28 + %84 = or i64 %83, 1, !dbg !28 + store i64 %84, i64* %3, align 8, !dbg !28, !tbaa !4 + call void @llvm.experimental.noalias.scope.decl(metadata !43), !dbg !28 + %stackFrame.i7 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !43 + %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !43 + %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2 + %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !tbaa !15, !noalias !43 + %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i7, %struct.rb_iseq_struct** %88, align 8, !tbaa !19, !noalias !43 + %89 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 4 + %90 = load i64*, i64** %89, align 8, !tbaa !21, !noalias !43 + %91 = load i64, i64* %90, align 8, !tbaa !4, !noalias !43 + %92 = and i64 %91, -129 + store i64 %92, i64* %90, align 8, !tbaa !4, !noalias !43 + %93 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 0 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %93, align 8, !tbaa !13, !noalias !43 + %arg1_maybeExpandToFullArgs.i8 = load i64, i64* %3, align 8, !dbg !46, !alias.scope !43 + %94 = and i64 %arg1_maybeExpandToFullArgs.i8, 7, !dbg !46 + %95 = icmp ne i64 %94, 0, !dbg !46 + %96 = and i64 %arg1_maybeExpandToFullArgs.i8, -9, !dbg !46 + %97 = icmp eq i64 %96, 0, !dbg !46 + %98 = or i1 %95, %97, !dbg !46 + br i1 %98, label %"func_.$152$block_1.exit12", label %sorbet_isa_Array.exit.i10, !dbg !46 + +sorbet_isa_Array.exit.i10: ; preds = %81 + %99 = inttoptr i64 %arg1_maybeExpandToFullArgs.i8 to %struct.iseq_inline_iv_cache_entry*, !dbg !46 + %100 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %99, i64 0, i32 0, !dbg !46 + %101 = load i64, i64* %100, align 8, !dbg !46, !tbaa !23, !noalias !43 + %102 = and i64 %101, 31, !dbg !46 + %103 = icmp ne i64 %102, 7, !dbg !46 + %104 = and i64 %101, 33554432, !dbg !46 + %105 = icmp eq i64 %104, 0, !dbg !46 + %or.cond.i9 = or i1 %103, %105, !dbg !46 + br i1 %or.cond.i9, label %"func_.$152$block_1.exit12", label %106, !dbg !46 + +106: ; preds = %sorbet_isa_Array.exit.i10 + call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs.i8) #13, !dbg !46, !noalias !43 + br label %"func_.$152$block_1.exit12", !dbg !46 + +"func_.$152$block_1.exit12": ; preds = %81, %sorbet_isa_Array.exit.i10, %106 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %93, align 8, !dbg !48, !tbaa !13, !noalias !43 + %107 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !13, !noalias !43 + %108 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %107, i64 0, i32 2, !dbg !49 + %109 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %108, align 8, !dbg !49, !tbaa !15, !noalias !43 + %110 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %109, i64 0, i32 4, !dbg !49 + %111 = load i64*, i64** %110, align 8, !dbg !49, !noalias !43 + %112 = getelementptr inbounds i64, i64* %111, i64 -1, !dbg !49 + %113 = load i64, i64* %112, align 8, !dbg !49, !tbaa !4, !noalias !43 + %114 = and i64 %113, -4, !dbg !49 + %115 = load i64, i64* @rb_mKernel, align 8, !dbg !49, !noalias !43 + %116 = inttoptr i64 %114 to i64*, !dbg !49 + %117 = getelementptr inbounds i64, i64* %116, i64 -3, !dbg !49 + %118 = load i64, i64* %117, align 8, !dbg !49, !tbaa !4, !noalias !43 + %119 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %109, i64 0, i32 1, !dbg !49 + %120 = load i64*, i64** %119, align 8, !dbg !49, !tbaa !27, !noalias !43 + %121 = getelementptr inbounds i64, i64* %120, i64 1, !dbg !49 + store i64 %115, i64* %120, align 8, !dbg !49, !tbaa !4, !noalias !43 + %122 = getelementptr inbounds i64, i64* %121, i64 1, !dbg !49 + store i64* %122, i64** %119, align 8, !dbg !49, !tbaa !27, !noalias !43 + store i64 %118, i64* %121, align 8, !dbg !49, !tbaa !4, !noalias !43 + %send.i11 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !49, !noalias !43 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %93, align 8, !dbg !49, !tbaa !13, !noalias !43 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !28 + store i64 3, i64* %29, align 8, !dbg !28 + %123 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %82, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %29) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #13, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !28 + store i64 %12, i64* %22, align 8, !dbg !28, !tbaa !4 + %124 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %123, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %22) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #13, !dbg !28 + %125 = and i64 %124, -9, !dbg !28 + %126 = icmp eq i64 %125, 0, !dbg !28 + br i1 %126, label %sorbet_rb_int_dotimes_withBlock.exit, label %81, !dbg !28, !llvm.loop !50 sorbet_rb_int_dotimes_withBlock.exit: ; preds = %"func_.$152$block_1.exit", %"func_.$152$block_1.exit12", %20, %30 - call void @sorbet_popRubyStack() #13, !dbg !39 - ret i64 %12, !dbg !39 + call void @sorbet_popRubyStack() #13, !dbg !28 + ret i64 %12, !dbg !28 } ; Function Attrs: sspreq @@ -505,13 +481,15 @@ entry: %7 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([48 x i8], [48 x i8]* @"str_test/testdata/compiler/block_no_args_capture.rb", i64 0, i64 0), i64 noundef 47) #13 tail call void @rb_gc_register_mark_object(i64 %7) #13 store i64 %7, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_capture.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 8) %8 = bitcast i64* %locals.i.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %8) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 + %"rubyStr_test/testdata/compiler/block_no_args_capture.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_capture.rb", align 8 %rubyId_s.i.i = load i64, i64* @rubyIdPrecomputed_s, align 8 store i64 %rubyId_s.i.i, i64* %locals.i.i, align 8 - %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %7, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 7, i64* noundef nonnull align 8 %locals.i.i, i32 noundef 1, i32 noundef 2) + %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_capture.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i.i, i32 noundef 1, i32 noundef 2) store %struct.rb_iseq_struct* %9, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %8) %10 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #13 @@ -519,15 +497,15 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/block_no_args_capture.rb.i2.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_capture.rb", align 8 - %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %10, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_capture.rb.i2.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 7, i64* noundef null, i32 noundef 0, i32 noundef 2) + %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %10, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_capture.rb.i2.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %11, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 %12 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_hi, i64 0, i64 0), i64 noundef 2) #13 call void @rb_gc_register_mark_object(i64 %12) #13 store i64 %12, i64* @rubyStrFrozen_hi, align 8 - %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !39 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 + %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !28 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !26 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !26 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %13 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13 %14 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %13, i64 0, i32 2 @@ -541,54 +519,45 @@ entry: store i64 %20, i64* %18, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %13, %struct.rb_control_frame_struct* align 8 %15, %struct.rb_iseq_struct* %stackFrame.i) #13 %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %15, i64 0, i32 0 - %22 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %16, align 8, !tbaa !19 - %23 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %22, i64 0, i32 2 - %24 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %23, align 8, !tbaa !22 - %25 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %24, i64 0, i32 2 - %26 = load i64*, i64** %25, align 8, !tbaa !24 - %27 = getelementptr inbounds i64, i64* %26, i64 3 - %28 = getelementptr inbounds i64, i64* %27, i64 1 - store i64* %28, i64** %21, align 8, !dbg !62, !tbaa !13 - %rubyStr_hi.i = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !63 - %29 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !13 - %30 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %29, i64 0, i32 2, !dbg !63 - %31 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %30, align 8, !dbg !63, !tbaa !15 - %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %31, i64 0, i32 4, !dbg !63 - %33 = load i64*, i64** %32, align 8, !dbg !63, !tbaa !21 - %34 = load i64, i64* %33, align 8, !dbg !63, !tbaa !4 - %35 = and i64 %34, 8, !dbg !63 - %36 = icmp eq i64 %35, 0, !dbg !63 - br i1 %36, label %37, label %39, !dbg !63, !prof !64 - -37: ; preds = %entry - %38 = getelementptr inbounds i64, i64* %33, i64 -3, !dbg !63 - store i64 %rubyStr_hi.i, i64* %38, align 8, !dbg !63, !tbaa !4 - br label %"func_.$152.exit", !dbg !63 - -39: ; preds = %entry - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %33, i32 noundef -3, i64 %rubyStr_hi.i) #13, !dbg !63 - br label %"func_.$152.exit", !dbg !63 - -"func_.$152.exit": ; preds = %37, %39 - %40 = getelementptr inbounds i64, i64* %26, i64 4, !dbg !63 - %41 = getelementptr inbounds i64, i64* %40, i64 1, !dbg !63 - store i64* %41, i64** %21, align 8, !dbg !63, !tbaa !13 - %rubyId_times.i1 = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - %42 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %42) #13, !dbg !39 - %43 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !39 - store i64 21, i64* %43, align 8, !dbg !39, !tbaa !41 - %44 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !39 - store i64 %rubyId_times.i1, i64* %44, align 8, !dbg !39, !tbaa !65 - %45 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !39 - store i32 0, i32* %45, align 8, !dbg !39, !tbaa !43 - %46 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !39 - %47 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !39 - %48 = bitcast i64** %46 to i8*, !dbg !39 - call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %48, i8 0, i64 16, i1 false) #13, !dbg !39 - %49 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %47, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %42) #13, !dbg !39 - store i64* %41, i64** %21, align 8, !tbaa !13 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %21, align 8, !dbg !51, !tbaa !13 + %rubyStr_hi.i = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !52 + %22 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !52, !tbaa !13 + %23 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %22, i64 0, i32 2, !dbg !52 + %24 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %23, align 8, !dbg !52, !tbaa !15 + %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 4, !dbg !52 + %26 = load i64*, i64** %25, align 8, !dbg !52, !tbaa !21 + %27 = load i64, i64* %26, align 8, !dbg !52, !tbaa !4 + %28 = and i64 %27, 8, !dbg !52 + %29 = icmp eq i64 %28, 0, !dbg !52 + br i1 %29, label %30, label %32, !dbg !52, !prof !53 + +30: ; preds = %entry + %31 = getelementptr inbounds i64, i64* %26, i64 -3, !dbg !52 + store i64 %rubyStr_hi.i, i64* %31, align 8, !dbg !52, !tbaa !4 + br label %"func_.$152.exit", !dbg !52 + +32: ; preds = %entry + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %26, i32 noundef -3, i64 %rubyStr_hi.i) #13, !dbg !52 + br label %"func_.$152.exit", !dbg !52 + +"func_.$152.exit": ; preds = %30, %32 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %21, align 8, !dbg !52, !tbaa !13 + %rubyId_times.i1 = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !28 + %33 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %33) #13, !dbg !28 + %34 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !28 + store i64 21, i64* %34, align 8, !dbg !28, !tbaa !30 + %35 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !28 + store i64 %rubyId_times.i1, i64* %35, align 8, !dbg !28, !tbaa !54 + %36 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !28 + store i32 0, i32* %36, align 8, !dbg !28, !tbaa !32 + %37 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !28 + %38 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !28 + %39 = bitcast i64** %37 to i8*, !dbg !28 + call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %39, i8 0, i64 16, i1 false) #13, !dbg !28 + %40 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %38, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %33) #13, !dbg !28 + store i64* getelementptr inbounds ([8 x i64], [8 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %21, align 8, !tbaa !13 ret void } @@ -638,47 +607,36 @@ attributes #13 = { nounwind } !19 = !{!20, !14, i64 16} !20 = !{!"rb_control_frame_struct", !14, i64 0, !14, i64 8, !14, i64 16, !5, i64 24, !14, i64 32, !14, i64 40, !14, i64 48} !21 = !{!20, !14, i64 32} -!22 = !{!23, !14, i64 16} -!23 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !14, i64 16, !6, i64 24} -!24 = !{!25, !14, i64 8} -!25 = !{!"rb_iseq_constant_body", !6, i64 0, !17, i64 4, !14, i64 8, !26, i64 16, !28, i64 64, !31, i64 120, !14, i64 152, !14, i64 160, !14, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !32, i64 200, !17, i64 232, !17, i64 236, !17, i64 240, !17, i64 244, !17, i64 248, !6, i64 252, !5, i64 256} -!26 = !{!"", !27, i64 0, !17, i64 4, !17, i64 8, !17, i64 12, !17, i64 16, !17, i64 20, !17, i64 24, !17, i64 28, !14, i64 32, !14, i64 40} -!27 = !{!"", !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 1, !17, i64 1} -!28 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !17, i64 32, !29, i64 36} -!29 = !{!"rb_code_location_struct", !30, i64 0, !30, i64 8} -!30 = !{!"rb_code_position_struct", !17, i64 0, !17, i64 4} -!31 = !{!"iseq_insn_info", !14, i64 0, !14, i64 8, !17, i64 16, !14, i64 24} -!32 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !14, i64 24} -!33 = !DILocation(line: 4, column: 1, scope: !8) -!34 = !{!35, !5, i64 0} -!35 = !{!"RBasic", !5, i64 0, !5, i64 8} -!36 = !DILocation(line: 5, column: 1, scope: !8) -!37 = !DILocation(line: 6, column: 3, scope: !8) -!38 = !{!20, !14, i64 8} -!39 = !DILocation(line: 5, column: 1, scope: !9) -!40 = !{!16, !5, i64 128} -!41 = !{!42, !5, i64 0} -!42 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !17, i64 16, !14, i64 24, !5, i64 32} -!43 = !{!42, !17, i64 16} -!44 = !{!"branch_weights", i32 1, i32 2000} -!45 = !{!46} -!46 = distinct !{!46, !47, !"func_.$152$block_1: %argArray"} -!47 = distinct !{!47, !"func_.$152$block_1"} -!48 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !49) -!49 = distinct !DILocation(line: 5, column: 1, scope: !9) -!50 = !DILocation(line: 5, column: 1, scope: !8, inlinedAt: !49) -!51 = !DILocation(line: 6, column: 3, scope: !8, inlinedAt: !49) -!52 = distinct !{!52, !53} -!53 = !{!"llvm.loop.unroll.disable"} -!54 = !{!55} -!55 = distinct !{!55, !56, !"func_.$152$block_1: %argArray"} -!56 = distinct !{!56, !"func_.$152$block_1"} -!57 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !58) -!58 = distinct !DILocation(line: 5, column: 1, scope: !9) -!59 = !DILocation(line: 5, column: 1, scope: !8, inlinedAt: !58) -!60 = !DILocation(line: 6, column: 3, scope: !8, inlinedAt: !58) -!61 = distinct !{!61, !53} -!62 = !DILocation(line: 0, scope: !9) -!63 = !DILocation(line: 4, column: 5, scope: !9) -!64 = !{!"branch_weights", i32 2000, i32 1} -!65 = !{!42, !5, i64 8} +!22 = !DILocation(line: 4, column: 1, scope: !8) +!23 = !{!24, !5, i64 0} +!24 = !{!"RBasic", !5, i64 0, !5, i64 8} +!25 = !DILocation(line: 5, column: 1, scope: !8) +!26 = !DILocation(line: 6, column: 3, scope: !8) +!27 = !{!20, !14, i64 8} +!28 = !DILocation(line: 5, column: 1, scope: !9) +!29 = !{!16, !5, i64 128} +!30 = !{!31, !5, i64 0} +!31 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !17, i64 16, !14, i64 24, !5, i64 32} +!32 = !{!31, !17, i64 16} +!33 = !{!"branch_weights", i32 1, i32 2000} +!34 = !{!35} +!35 = distinct !{!35, !36, !"func_.$152$block_1: %argArray"} +!36 = distinct !{!36, !"func_.$152$block_1"} +!37 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !38) +!38 = distinct !DILocation(line: 5, column: 1, scope: !9) +!39 = !DILocation(line: 5, column: 1, scope: !8, inlinedAt: !38) +!40 = !DILocation(line: 6, column: 3, scope: !8, inlinedAt: !38) +!41 = distinct !{!41, !42} +!42 = !{!"llvm.loop.unroll.disable"} +!43 = !{!44} +!44 = distinct !{!44, !45, !"func_.$152$block_1: %argArray"} +!45 = distinct !{!45, !"func_.$152$block_1"} +!46 = !DILocation(line: 4, column: 1, scope: !8, inlinedAt: !47) +!47 = distinct !DILocation(line: 5, column: 1, scope: !9) +!48 = !DILocation(line: 5, column: 1, scope: !8, inlinedAt: !47) +!49 = !DILocation(line: 6, column: 3, scope: !8, inlinedAt: !47) +!50 = distinct !{!50, !42} +!51 = !DILocation(line: 0, scope: !9) +!52 = !DILocation(line: 4, column: 5, scope: !9) +!53 = !{!"branch_weights", i32 2000, i32 1} +!54 = !{!31, !5, i64 8} diff --git a/test/testdata/compiler/block_no_args_captures_constant.llo.exp b/test/testdata/compiler/block_no_args_captures_constant.llo.exp index 3a7fd807883..60f8d48ea9d 100644 --- a/test/testdata/compiler/block_no_args_captures_constant.llo.exp +++ b/test/testdata/compiler/block_no_args_captures_constant.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,13 +69,14 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.rb_captured_block = type { i64, i64*, %union.anon.17 } -%union.anon.17 = type { %struct.rb_iseq_struct* } +%struct.rb_captured_block = type { i64, i64*, %union.anon.20 } +%union.anon.20 = type { %struct.rb_iseq_struct* } %struct.rb_sorbet_param_struct = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, i32, i32, i32, i32, i64* } %struct.sorbet_inlineIntrinsicEnv = type { i64, i64, i32, i64*, i64 } %struct.iseq_inline_iv_cache_entry = type { i64, i64 } @@ -93,6 +95,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_foo = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/block_no_args_captures_constant.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/block_no_args_captures_constant.rb" = private unnamed_addr constant [58 x i8] c"test/testdata/compiler/block_no_args_captures_constant.rb\00", align 1 +@iseqEncodedArray = internal global [13 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_Object#foo$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -126,7 +130,9 @@ declare void @rb_error_arity(i32, i32, i32) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -202,156 +208,137 @@ functionEntryInitializers: %2 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %1, i64 0, i32 2 %3 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %2, align 8, !tbaa !14 %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %3, i64 0, i32 0 - %5 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %3, i64 0, i32 2 - %6 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %5, align 8, !tbaa !18 - %7 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %6, i64 0, i32 2 - %8 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %7, align 8, !tbaa !20 - %9 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %8, i64 0, i32 2 - %10 = load i64*, i64** %9, align 8, !tbaa !22 - %11 = getelementptr inbounds i64, i64* %10, i64 1 - store i64* %11, i64** %4, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !31 - br i1 %tooManyArgs, label %argCountFailBlock, label %afterSend11, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %4, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !18 + br i1 %tooManyArgs, label %argCountFailBlock, label %afterSend11, !dbg !18, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !18 + unreachable, !dbg !18 afterSend11: ; preds = %functionEntryInitializers - %12 = getelementptr inbounds i64, i64* %11, i64 1, !dbg !33 - store i64* %12, i64** %4, align 8, !dbg !33, !tbaa !12 - %13 = load i64, i64* @rb_mKernel, align 8, !dbg !34 - %14 = load i64, i64* @guard_epoch_A, align 8, !dbg !34 - %15 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !34, !tbaa !35 - %needTakeSlowPath = icmp ne i64 %14, %15, !dbg !34 - br i1 %needTakeSlowPath, label %16, label %17, !dbg !34, !prof !37 - -16: ; preds = %afterSend11 - tail call void @const_recompute_A(), !dbg !34 - br label %17, !dbg !34 - -17: ; preds = %afterSend11, %16 - %18 = load i64, i64* @guarded_const_A, align 8, !dbg !34 - %19 = load i64, i64* @guard_epoch_A, align 8, !dbg !34 - %20 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !34, !tbaa !35 - %guardUpdated = icmp eq i64 %19, %20, !dbg !34 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !34 - %21 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 - %22 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %21, i64 0, i32 2, !dbg !34 - %23 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %22, align 8, !dbg !34, !tbaa !14 - %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 1, !dbg !34 - %25 = load i64*, i64** %24, align 8, !dbg !34, !tbaa !38 - %26 = getelementptr inbounds i64, i64* %25, i64 1, !dbg !34 - store i64 %13, i64* %25, align 8, !dbg !34, !tbaa !4 - %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !34 - store i64* %27, i64** %24, align 8, !dbg !34, !tbaa !38 - store i64 %18, i64* %26, align 8, !dbg !34, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !34 - %28 = getelementptr inbounds i64, i64* %10, i64 2, !dbg !34 - %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !34 - store i64* %29, i64** %4, align 8, !dbg !34, !tbaa !12 - %rubyId_times = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - %30 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %30) #14, !dbg !39 - %31 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !39 - store i64 21, i64* %31, align 8, !dbg !39, !tbaa !40 - %32 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !39 - store i64 %rubyId_times, i64* %32, align 8, !dbg !39, !tbaa !42 - %33 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !39 - store i32 0, i32* %33, align 8, !dbg !39, !tbaa !43 - %34 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !39 - %35 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !39 - %36 = bitcast i64** %34 to i8*, !dbg !39 - call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %36, i8 0, i64 16, i1 false), !dbg !39 - %37 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %35, i64 (i64, i64, i32, i64*, i64)* noundef @"func_Object#foo$block_1", i64 noundef 0) #14, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %30) #14, !dbg !39 - store i64* %29, i64** %4, align 8, !tbaa !12 - ret i64 %37 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %4, align 8, !dbg !20, !tbaa !12 + %5 = load i64, i64* @rb_mKernel, align 8, !dbg !21 + %6 = load i64, i64* @guard_epoch_A, align 8, !dbg !21 + %7 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !21, !tbaa !22 + %needTakeSlowPath = icmp ne i64 %6, %7, !dbg !21 + br i1 %needTakeSlowPath, label %8, label %9, !dbg !21, !prof !24 + +8: ; preds = %afterSend11 + tail call void @const_recompute_A(), !dbg !21 + br label %9, !dbg !21 + +9: ; preds = %afterSend11, %8 + %10 = load i64, i64* @guarded_const_A, align 8, !dbg !21 + %11 = load i64, i64* @guard_epoch_A, align 8, !dbg !21 + %12 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !21, !tbaa !22 + %guardUpdated = icmp eq i64 %11, %12, !dbg !21 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !21 + %13 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !12 + %14 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %13, i64 0, i32 2, !dbg !21 + %15 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %14, align 8, !dbg !21, !tbaa !14 + %16 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %15, i64 0, i32 1, !dbg !21 + %17 = load i64*, i64** %16, align 8, !dbg !21, !tbaa !25 + %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !21 + store i64 %5, i64* %17, align 8, !dbg !21, !tbaa !4 + %19 = getelementptr inbounds i64, i64* %18, i64 1, !dbg !21 + store i64* %19, i64** %16, align 8, !dbg !21, !tbaa !25 + store i64 %10, i64* %18, align 8, !dbg !21, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !21 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %4, align 8, !dbg !21, !tbaa !12 + %rubyId_times = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !27 + %20 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !27 + call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %20) #14, !dbg !27 + %21 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !27 + store i64 21, i64* %21, align 8, !dbg !27, !tbaa !28 + %22 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !27 + store i64 %rubyId_times, i64* %22, align 8, !dbg !27, !tbaa !30 + %23 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !27 + store i32 0, i32* %23, align 8, !dbg !27, !tbaa !31 + %24 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !27 + %25 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !27 + %26 = bitcast i64** %24 to i8*, !dbg !27 + call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %26, i8 0, i64 16, i1 false), !dbg !27 + %27 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %25, i64 (i64, i64, i32, i64*, i64)* noundef @"func_Object#foo$block_1", i64 noundef 0) #14, !dbg !27 + call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %20) #14, !dbg !27 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %4, align 8, !tbaa !12 + ret i64 %27 } ; Function Attrs: ssp -define internal i64 @"func_Object#foo$block_1"(i64 %firstYieldArgRaw, i64 %localsOffset, i32 %argc, i64* nocapture readonly %argArray, i64 %blockArg) #7 !dbg !44 { +define internal i64 @"func_Object#foo$block_1"(i64 %firstYieldArgRaw, i64 %localsOffset, i32 %argc, i64* nocapture readonly %argArray, i64 %blockArg) #7 !dbg !32 { functionEntryInitializers: %stackFrame = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo$block_1", align 8 %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame, %struct.rb_iseq_struct** %3, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame, %struct.rb_iseq_struct** %3, align 8, !tbaa !33 %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 4 - %5 = load i64*, i64** %4, align 8, !tbaa !45 + %5 = load i64*, i64** %4, align 8, !tbaa !34 %6 = load i64, i64* %5, align 8, !tbaa !4 %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !4 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !20 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !22 - %13 = getelementptr inbounds i64, i64* %12, i64 1 - store i64* %13, i64** %8, align 8, !tbaa !12 - %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !46 - br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !46 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %8, align 8, !tbaa !12 + %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !35 + br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !35 argArrayExpandArrayTest: ; preds = %functionEntryInitializers - %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !46 - %14 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !46 - %15 = icmp ne i64 %14, 0, !dbg !46 - %16 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !46 - %17 = icmp eq i64 %16, 0, !dbg !46 - %18 = or i1 %15, %17, !dbg !46 - br i1 %18, label %fillRequiredArgs, label %sorbet_isa_Array.exit, !dbg !46 + %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !35 + %9 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !35 + %10 = icmp ne i64 %9, 0, !dbg !35 + %11 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !35 + %12 = icmp eq i64 %11, 0, !dbg !35 + %13 = or i1 %10, %12, !dbg !35 + br i1 %13, label %fillRequiredArgs, label %sorbet_isa_Array.exit, !dbg !35 sorbet_isa_Array.exit: ; preds = %argArrayExpandArrayTest - %19 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !46 - %20 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %19, i64 0, i32 0, !dbg !46 - %21 = load i64, i64* %20, align 8, !dbg !46, !tbaa !47 - %22 = and i64 %21, 31, !dbg !46 - %23 = icmp ne i64 %22, 7, !dbg !46 - %24 = and i64 %21, 33554432, !dbg !46 - %25 = icmp eq i64 %24, 0, !dbg !46 - %or.cond = or i1 %23, %25, !dbg !46 - br i1 %or.cond, label %fillRequiredArgs, label %26, !dbg !46 - -26: ; preds = %sorbet_isa_Array.exit - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #14, !dbg !46 - br label %fillRequiredArgs, !dbg !46 - -fillRequiredArgs: ; preds = %argArrayExpandArrayTest, %26, %functionEntryInitializers, %sorbet_isa_Array.exit - %27 = getelementptr inbounds i64, i64* %12, i64 2 - %28 = getelementptr inbounds i64, i64* %27, i64 1 - %29 = getelementptr inbounds i64, i64* %12, i64 3, !dbg !49 - %30 = getelementptr inbounds i64, i64* %29, i64 1, !dbg !49 - store i64* %30, i64** %8, align 8, !dbg !49, !tbaa !12 - %31 = load i64, i64* @rb_mKernel, align 8, !dbg !50 - %32 = load i64, i64* @guard_epoch_A, align 8, !dbg !50 - %33 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !50, !tbaa !35 - %needTakeSlowPath = icmp ne i64 %32, %33, !dbg !50 - br i1 %needTakeSlowPath, label %34, label %35, !dbg !50, !prof !37 - -34: ; preds = %fillRequiredArgs - tail call void @const_recompute_A(), !dbg !50 - br label %35, !dbg !50 - -35: ; preds = %fillRequiredArgs, %34 - %36 = load i64, i64* @guarded_const_A, align 8, !dbg !50 - %37 = load i64, i64* @guard_epoch_A, align 8, !dbg !50 - %38 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !50, !tbaa !35 - %guardUpdated = icmp eq i64 %37, %38, !dbg !50 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !50 - %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !50, !tbaa !12 - %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !50 - %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !50, !tbaa !14 - %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 1, !dbg !50 - %43 = load i64*, i64** %42, align 8, !dbg !50, !tbaa !38 - %44 = getelementptr inbounds i64, i64* %43, i64 1, !dbg !50 - store i64 %31, i64* %43, align 8, !dbg !50, !tbaa !4 - %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !50 - store i64* %45, i64** %42, align 8, !dbg !50, !tbaa !38 - store i64 %36, i64* %44, align 8, !dbg !50, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0), !dbg !50 - store i64* %28, i64** %8, align 8, !dbg !50, !tbaa !12 - ret i64 %send, !dbg !49 + %14 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !35 + %15 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %14, i64 0, i32 0, !dbg !35 + %16 = load i64, i64* %15, align 8, !dbg !35, !tbaa !36 + %17 = and i64 %16, 31, !dbg !35 + %18 = icmp ne i64 %17, 7, !dbg !35 + %19 = and i64 %16, 33554432, !dbg !35 + %20 = icmp eq i64 %19, 0, !dbg !35 + %or.cond = or i1 %18, %20, !dbg !35 + br i1 %or.cond, label %fillRequiredArgs, label %21, !dbg !35 + +21: ; preds = %sorbet_isa_Array.exit + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #14, !dbg !35 + br label %fillRequiredArgs, !dbg !35 + +fillRequiredArgs: ; preds = %argArrayExpandArrayTest, %21, %functionEntryInitializers, %sorbet_isa_Array.exit + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %8, align 8, !dbg !38, !tbaa !12 + %22 = load i64, i64* @rb_mKernel, align 8, !dbg !39 + %23 = load i64, i64* @guard_epoch_A, align 8, !dbg !39 + %24 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !22 + %needTakeSlowPath = icmp ne i64 %23, %24, !dbg !39 + br i1 %needTakeSlowPath, label %25, label %26, !dbg !39, !prof !24 + +25: ; preds = %fillRequiredArgs + tail call void @const_recompute_A(), !dbg !39 + br label %26, !dbg !39 + +26: ; preds = %fillRequiredArgs, %25 + %27 = load i64, i64* @guarded_const_A, align 8, !dbg !39 + %28 = load i64, i64* @guard_epoch_A, align 8, !dbg !39 + %29 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !22 + %guardUpdated = icmp eq i64 %28, %29, !dbg !39 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !39 + %30 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !12 + %31 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %30, i64 0, i32 2, !dbg !39 + %32 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %31, align 8, !dbg !39, !tbaa !14 + %33 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 1, !dbg !39 + %34 = load i64*, i64** %33, align 8, !dbg !39, !tbaa !25 + %35 = getelementptr inbounds i64, i64* %34, i64 1, !dbg !39 + store i64 %22, i64* %34, align 8, !dbg !39, !tbaa !4 + %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !39 + store i64* %36, i64** %33, align 8, !dbg !39, !tbaa !25 + store i64 %27, i64* %35, align 8, !dbg !39, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0), !dbg !39 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %8, align 8, !dbg !39, !tbaa !12 + ret i64 %send, !dbg !38 } ; Function Attrs: nounwind ssp @@ -361,95 +348,95 @@ entry: %2 = alloca [1 x i64], align 8 %3 = alloca i64, align 8 %4 = alloca [1 x i64], align 8 - %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !12 - %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 17, !dbg !39 - %7 = load i64, i64* %6, align 8, !dbg !39, !tbaa !51 - %8 = and i64 %7, -4, !dbg !39 - %9 = inttoptr i64 %8 to %struct.rb_captured_block*, !dbg !39 - store i64 0, i64* %6, align 8, !dbg !39, !tbaa !51 - %10 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !39 - %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 0, !dbg !39 - %12 = load i64, i64* %11, align 8, !dbg !39, !tbaa !40 - %13 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 2, !dbg !39 - %14 = load i32, i32* %13, align 8, !dbg !39, !tbaa !43 - %15 = icmp slt i32 %14, 0, !dbg !39 - %16 = icmp sgt i32 %14, 0, !dbg !39 - %or.cond.i = or i1 %15, %16, !dbg !39 - br i1 %or.cond.i, label %17, label %rb_check_arity.1.exit, !dbg !39 + %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !27, !tbaa !12 + %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 17, !dbg !27 + %7 = load i64, i64* %6, align 8, !dbg !27, !tbaa !40 + %8 = and i64 %7, -4, !dbg !27 + %9 = inttoptr i64 %8 to %struct.rb_captured_block*, !dbg !27 + store i64 0, i64* %6, align 8, !dbg !27, !tbaa !40 + %10 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !27 + %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 0, !dbg !27 + %12 = load i64, i64* %11, align 8, !dbg !27, !tbaa !28 + %13 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %10, i64 0, i32 2, !dbg !27 + %14 = load i32, i32* %13, align 8, !dbg !27, !tbaa !31 + %15 = icmp slt i32 %14, 0, !dbg !27 + %16 = icmp sgt i32 %14, 0, !dbg !27 + %or.cond.i = or i1 %15, %16, !dbg !27 + br i1 %or.cond.i, label %17, label %rb_check_arity.1.exit, !dbg !27 17: ; preds = %entry - tail call void @rb_error_arity(i32 %14, i32 noundef 0, i32 noundef 0) #13, !dbg !39 - unreachable, !dbg !39 + tail call void @rb_error_arity(i32 %14, i32 noundef 0, i32 noundef 0) #13, !dbg !27 + unreachable, !dbg !27 rb_check_arity.1.exit: ; preds = %entry - tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %9) #14, !dbg !39 - %18 = and i64 %12, 1, !dbg !39 - %19 = icmp eq i64 %18, 0, !dbg !39 - br i1 %19, label %20, label %30, !dbg !39, !prof !32 + tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %9) #14, !dbg !27 + %18 = and i64 %12, 1, !dbg !27 + %19 = icmp eq i64 %18, 0, !dbg !27 + br i1 %19, label %20, label %30, !dbg !27, !prof !19 20: ; preds = %rb_check_arity.1.exit - %21 = bitcast [1 x i64]* %2 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !39 - %22 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !39 - store i64 %12, i64* %22, align 8, !dbg !39, !tbaa !4 - %23 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %22) #14, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !39 - %24 = and i64 %23, -9, !dbg !39 - %25 = icmp eq i64 %24, 0, !dbg !39 - br i1 %25, label %sorbet_rb_int_dotimes_withBlock.exit, label %26, !dbg !39 + %21 = bitcast [1 x i64]* %2 to i8*, !dbg !27 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !27 + %22 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !27 + store i64 %12, i64* %22, align 8, !dbg !27, !tbaa !4 + %23 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %22) #14, !dbg !27 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !27 + %24 = and i64 %23, -9, !dbg !27 + %25 = icmp eq i64 %24, 0, !dbg !27 + br i1 %25, label %sorbet_rb_int_dotimes_withBlock.exit, label %26, !dbg !27 26: ; preds = %20 - %27 = bitcast i64* %3 to i8*, !dbg !39 - %28 = bitcast [1 x i64]* %4 to i8*, !dbg !39 - %29 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !39 - br label %44, !dbg !39 + %27 = bitcast i64* %3 to i8*, !dbg !27 + %28 = bitcast [1 x i64]* %4 to i8*, !dbg !27 + %29 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !27 + br label %44, !dbg !27 30: ; preds = %rb_check_arity.1.exit - %31 = ashr i64 %12, 1, !dbg !39 - %32 = icmp sgt i64 %12, 1, !dbg !39 - br i1 %32, label %33, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !39 + %31 = ashr i64 %12, 1, !dbg !27 + %32 = icmp sgt i64 %12, 1, !dbg !27 + br i1 %32, label %33, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !27 33: ; preds = %30 - %34 = bitcast i64* %1 to i8*, !dbg !39 - %35 = icmp sgt i64 %31, 1, !dbg !39 - %36 = select i1 %35, i64 %31, i64 1, !dbg !39 - br label %37, !dbg !39 + %34 = bitcast i64* %1 to i8*, !dbg !27 + %35 = icmp sgt i64 %31, 1, !dbg !27 + %36 = select i1 %35, i64 %31, i64 1, !dbg !27 + br label %37, !dbg !27 37: ; preds = %37, %33 - %38 = phi i64 [ 0, %33 ], [ %42, %37 ], !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %34) #14, !dbg !39 - %39 = shl nuw i64 %38, 1, !dbg !39 - %40 = or i64 %39, 1, !dbg !39 - store i64 %40, i64* %1, align 8, !dbg !39, !tbaa !4 - %41 = call i64 @"func_Object#foo$block_1"(i64 undef, i64 undef, i32 noundef 1, i64* noalias nocapture noundef nonnull readonly align 8 dereferenceable(8) %1, i64 undef) #14, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %34) #14, !dbg !39 - %42 = add nuw nsw i64 %38, 1, !dbg !39 - %43 = icmp eq i64 %42, %36, !dbg !39 - br i1 %43, label %sorbet_rb_int_dotimes_withBlock.exit, label %37, !dbg !39, !llvm.loop !52 + %38 = phi i64 [ 0, %33 ], [ %42, %37 ], !dbg !27 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %34) #14, !dbg !27 + %39 = shl nuw i64 %38, 1, !dbg !27 + %40 = or i64 %39, 1, !dbg !27 + store i64 %40, i64* %1, align 8, !dbg !27, !tbaa !4 + %41 = call i64 @"func_Object#foo$block_1"(i64 undef, i64 undef, i32 noundef 1, i64* noalias nocapture noundef nonnull readonly align 8 dereferenceable(8) %1, i64 undef) #14, !dbg !27 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %34) #14, !dbg !27 + %42 = add nuw nsw i64 %38, 1, !dbg !27 + %43 = icmp eq i64 %42, %36, !dbg !27 + br i1 %43, label %sorbet_rb_int_dotimes_withBlock.exit, label %37, !dbg !27, !llvm.loop !41 44: ; preds = %44, %26 - %45 = phi i64 [ 1, %26 ], [ %49, %44 ], !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %27) #14, !dbg !39 - %46 = shl i64 %45, 1, !dbg !39 - %47 = or i64 %46, 1, !dbg !39 - store i64 %47, i64* %3, align 8, !dbg !39, !tbaa !4 - %48 = call i64 @"func_Object#foo$block_1"(i64 undef, i64 undef, i32 noundef 1, i64* noalias nocapture noundef nonnull readonly align 8 dereferenceable(8) %3, i64 undef) #14, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %28) #14, !dbg !39 - store i64 3, i64* %29, align 8, !dbg !39 - %49 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %45, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %29) #14, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #14, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #14, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !39 - store i64 %12, i64* %22, align 8, !dbg !39, !tbaa !4 - %50 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %49, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %22) #14, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !39 - %51 = and i64 %50, -9, !dbg !39 - %52 = icmp eq i64 %51, 0, !dbg !39 - br i1 %52, label %sorbet_rb_int_dotimes_withBlock.exit, label %44, !dbg !39, !llvm.loop !54 + %45 = phi i64 [ 1, %26 ], [ %49, %44 ], !dbg !27 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %27) #14, !dbg !27 + %46 = shl i64 %45, 1, !dbg !27 + %47 = or i64 %46, 1, !dbg !27 + store i64 %47, i64* %3, align 8, !dbg !27, !tbaa !4 + %48 = call i64 @"func_Object#foo$block_1"(i64 undef, i64 undef, i32 noundef 1, i64* noalias nocapture noundef nonnull readonly align 8 dereferenceable(8) %3, i64 undef) #14, !dbg !27 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %28) #14, !dbg !27 + store i64 3, i64* %29, align 8, !dbg !27 + %49 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %45, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %29) #14, !dbg !27 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #14, !dbg !27 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #14, !dbg !27 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !27 + store i64 %12, i64* %22, align 8, !dbg !27, !tbaa !4 + %50 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %49, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %22) #14, !dbg !27 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %21) #14, !dbg !27 + %51 = and i64 %50, -9, !dbg !27 + %52 = icmp eq i64 %51, 0, !dbg !27 + br i1 %52, label %sorbet_rb_int_dotimes_withBlock.exit, label %44, !dbg !27, !llvm.loop !43 sorbet_rb_int_dotimes_withBlock.exit: ; preds = %37, %44, %20, %30 - call void @sorbet_popRubyStack() #14, !dbg !39 - ret i64 %12, !dbg !39 + call void @sorbet_popRubyStack() #14, !dbg !27 + ret i64 %12, !dbg !27 } ; Function Attrs: sspreq @@ -478,94 +465,85 @@ entry: %8 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([58 x i8], [58 x i8]* @"str_test/testdata/compiler/block_no_args_captures_constant.rb", i64 0, i64 0), i64 noundef 57) #14 tail call void @rb_gc_register_mark_object(i64 %8) #14 store i64 %8, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_captures_constant.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 13) %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %rubyStr_foo.i.i = load i64, i64* @rubyStrFrozen_foo, align 8 - %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i.i, i64 %rubyId_foo.i.i, i64 %8, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 10, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_captures_constant.rb", align 8 + %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i.i, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %9, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8 %10 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #14 call void @rb_gc_register_mark_object(i64 %10) #14 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i6.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_captures_constant.rb", align 8 - %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %10, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i6.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 10, i64* noundef null, i32 noundef 0, i32 noundef 2) + %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %10, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i6.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %11, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo$block_1", align 8 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !34 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 - %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !39 - %rubyId_puts2.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !50 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts2.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !50 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !21 + %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !27 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !27 + %rubyId_puts2.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !39 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts2.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !39 %12 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #14 call void @rb_gc_register_mark_object(i64 %12) #14 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i7.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_no_args_captures_constant.rb", align 8 - %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %12, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i7.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 12, i64* noundef nonnull %locals.i8.i, i32 noundef 0, i32 noundef 4) + %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %12, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_no_args_captures_constant.rb.i7.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i8.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %13, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %14 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_hi, i64 0, i64 0), i64 noundef 2) #14 call void @rb_gc_register_mark_object(i64 %14) #14 store i64 %14, i64* @rubyStrFrozen_hi, align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !55 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !55 - %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !57 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !57 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !44 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !44 + %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !46 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !46 %15 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %16 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %15, i64 0, i32 18 - %17 = load i64, i64* %16, align 8, !tbaa !58 + %17 = load i64, i64* %16, align 8, !tbaa !47 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %18 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %19 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %18, i64 0, i32 2 %20 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %19, align 8, !tbaa !14 %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %21, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %21, align 8, !tbaa !33 %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 4 - %23 = load i64*, i64** %22, align 8, !tbaa !45 + %23 = load i64*, i64** %22, align 8, !tbaa !34 %24 = load i64, i64* %23, align 8, !tbaa !4 %25 = and i64 %24, -33 store i64 %25, i64* %23, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %18, %struct.rb_control_frame_struct* align 8 %20, %struct.rb_iseq_struct* %stackFrame.i) #14 %26 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 0 - %27 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %21, align 8, !tbaa !18 - %28 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %27, i64 0, i32 2 - %29 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %28, align 8, !tbaa !20 - %30 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %29, i64 0, i32 2 - %31 = load i64*, i64** %30, align 8, !tbaa !22 - %32 = getelementptr inbounds i64, i64* %31, i64 3 - %33 = getelementptr inbounds i64, i64* %32, i64 1 - store i64* %33, i64** %26, align 8, !dbg !66, !tbaa !12 - %rubyStr_hi.i = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !67 - %34 = load i64, i64* @rb_cObject, align 8, !dbg !67 - %35 = call i64 @sorbet_setConstant(i64 %34, i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 noundef 1, i64 %rubyStr_hi.i) #14, !dbg !67 - %36 = getelementptr inbounds i64, i64* %31, i64 4, !dbg !67 - %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !67 - store i64* %37, i64** %26, align 8, !dbg !67, !tbaa !12 - %rubyId_foo.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !55 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i1) #14, !dbg !55 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !55 - %rawSym12.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #14, !dbg !55 - %stackFrame13.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8, !dbg !55 - %38 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #12, !dbg !55 - %39 = bitcast i8* %38 to i16*, !dbg !55 - %40 = load i16, i16* %39, align 8, !dbg !55 - %41 = and i16 %40, -384, !dbg !55 - store i16 %41, i16* %39, align 8, !dbg !55 - %42 = getelementptr inbounds i8, i8* %38, i64 4, !dbg !55 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %42, i8 0, i64 28, i1 false) #14, !dbg !55 - %43 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #14, !dbg !55 - %44 = bitcast i8* %38 to %struct.rb_sorbet_param_struct*, !dbg !55 - %45 = bitcast %struct.rb_iseq_struct* %stackFrame13.i to i8*, !dbg !55 - call void @rb_add_method_sorbet(i64 %34, i64 %43, i64 (i32, i64*, i64)* noundef @"func_Object#foo", %struct.rb_sorbet_param_struct* nonnull %44, i32 noundef 1, i8* %45) #14, !dbg !55 - %46 = getelementptr inbounds i64, i64* %31, i64 11, !dbg !55 - %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !55 - store i64* %47, i64** %26, align 8, !dbg !55, !tbaa !12 - %48 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !57, !tbaa !12 - %49 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %48, i64 0, i32 2, !dbg !57 - %50 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %49, align 8, !dbg !57, !tbaa !14 - %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %50, i64 0, i32 1, !dbg !57 - %52 = load i64*, i64** %51, align 8, !dbg !57, !tbaa !38 - %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !57 - store i64* %53, i64** %51, align 8, !dbg !57, !tbaa !38 - store i64 %17, i64* %52, align 8, !dbg !57, !tbaa !4 - %send22.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #14, !dbg !57 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %26, align 8, !dbg !55, !tbaa !12 + %rubyStr_hi.i = load i64, i64* @rubyStrFrozen_hi, align 8, !dbg !56 + %27 = load i64, i64* @rb_cObject, align 8, !dbg !56 + %28 = call i64 @sorbet_setConstant(i64 %27, i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 noundef 1, i64 %rubyStr_hi.i) #14, !dbg !56 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %26, align 8, !dbg !56, !tbaa !12 + %rubyId_foo.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !44 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i1) #14, !dbg !44 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !44 + %rawSym12.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #14, !dbg !44 + %stackFrame13.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8, !dbg !44 + %29 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #12, !dbg !44 + %30 = bitcast i8* %29 to i16*, !dbg !44 + %31 = load i16, i16* %30, align 8, !dbg !44 + %32 = and i16 %31, -384, !dbg !44 + store i16 %32, i16* %30, align 8, !dbg !44 + %33 = getelementptr inbounds i8, i8* %29, i64 4, !dbg !44 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %33, i8 0, i64 28, i1 false) #14, !dbg !44 + %34 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #14, !dbg !44 + %35 = bitcast i8* %29 to %struct.rb_sorbet_param_struct*, !dbg !44 + %36 = bitcast %struct.rb_iseq_struct* %stackFrame13.i to i8*, !dbg !44 + call void @rb_add_method_sorbet(i64 %27, i64 %34, i64 (i32, i64*, i64)* noundef @"func_Object#foo", %struct.rb_sorbet_param_struct* nonnull %35, i32 noundef 1, i8* %36) #14, !dbg !44 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %26, align 8, !dbg !44, !tbaa !12 + %37 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !46, !tbaa !12 + %38 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %37, i64 0, i32 2, !dbg !46 + %39 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %38, align 8, !dbg !46, !tbaa !14 + %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %39, i64 0, i32 1, !dbg !46 + %41 = load i64*, i64** %40, align 8, !dbg !46, !tbaa !25 + %42 = getelementptr inbounds i64, i64* %41, i64 1, !dbg !46 + store i64* %42, i64** %40, align 8, !dbg !46, !tbaa !25 + store i64 %17, i64* %41, align 8, !dbg !46, !tbaa !4 + %send22.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #14, !dbg !46 ret void } @@ -579,7 +557,7 @@ declare void @llvm.assume(i1 noundef) #11 define linkonce void @const_recompute_A() local_unnamed_addr #7 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !35 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !22 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -621,53 +599,42 @@ attributes #14 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 5, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 1, i32 2000} -!33 = !DILocation(line: 0, scope: !8) -!34 = !DILocation(line: 6, column: 3, scope: !8) -!35 = !{!36, !36, i64 0} -!36 = !{!"long long", !6, i64 0} -!37 = !{!"branch_weights", i32 1, i32 10000} -!38 = !{!19, !13, i64 8} -!39 = !DILocation(line: 7, column: 3, scope: !8) -!40 = !{!41, !5, i64 0} -!41 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !16, i64 16, !13, i64 24, !5, i64 32} -!42 = !{!41, !5, i64 8} -!43 = !{!41, !16, i64 16} -!44 = distinct !DISubprogram(name: "Object#foo", linkageName: "func_Object#foo$block_1", scope: !8, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!45 = !{!19, !13, i64 32} -!46 = !DILocation(line: 5, column: 1, scope: !44) -!47 = !{!48, !5, i64 0} -!48 = !{!"RBasic", !5, i64 0, !5, i64 8} -!49 = !DILocation(line: 7, column: 3, scope: !44) -!50 = !DILocation(line: 8, column: 5, scope: !44) -!51 = !{!15, !5, i64 128} -!52 = distinct !{!52, !53} -!53 = !{!"llvm.loop.unroll.disable"} -!54 = distinct !{!54, !53} -!55 = !DILocation(line: 5, column: 1, scope: !56) -!56 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!57 = !DILocation(line: 12, column: 1, scope: !56) -!58 = !{!59, !5, i64 400} -!59 = !{!"rb_vm_struct", !5, i64 0, !60, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !36, i64 216, !6, i64 224, !61, i64 264, !61, i64 280, !61, i64 296, !61, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !63, i64 472, !64, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !61, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !65, i64 1200, !6, i64 1232} -!60 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !61, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!61 = !{!"list_head", !62, i64 0} -!62 = !{!"list_node", !13, i64 0, !13, i64 8} -!63 = !{!"", !6, i64 0} -!64 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!65 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!66 = !DILocation(line: 0, scope: !56) -!67 = !DILocation(line: 4, column: 5, scope: !56) +!18 = !DILocation(line: 5, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 1, i32 2000} +!20 = !DILocation(line: 0, scope: !8) +!21 = !DILocation(line: 6, column: 3, scope: !8) +!22 = !{!23, !23, i64 0} +!23 = !{!"long long", !6, i64 0} +!24 = !{!"branch_weights", i32 1, i32 10000} +!25 = !{!26, !13, i64 8} +!26 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!27 = !DILocation(line: 7, column: 3, scope: !8) +!28 = !{!29, !5, i64 0} +!29 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !16, i64 16, !13, i64 24, !5, i64 32} +!30 = !{!29, !5, i64 8} +!31 = !{!29, !16, i64 16} +!32 = distinct !DISubprogram(name: "Object#foo", linkageName: "func_Object#foo$block_1", scope: !8, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!33 = !{!26, !13, i64 16} +!34 = !{!26, !13, i64 32} +!35 = !DILocation(line: 5, column: 1, scope: !32) +!36 = !{!37, !5, i64 0} +!37 = !{!"RBasic", !5, i64 0, !5, i64 8} +!38 = !DILocation(line: 7, column: 3, scope: !32) +!39 = !DILocation(line: 8, column: 5, scope: !32) +!40 = !{!15, !5, i64 128} +!41 = distinct !{!41, !42} +!42 = !{!"llvm.loop.unroll.disable"} +!43 = distinct !{!43, !42} +!44 = !DILocation(line: 5, column: 1, scope: !45) +!45 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!46 = !DILocation(line: 12, column: 1, scope: !45) +!47 = !{!48, !5, i64 400} +!48 = !{!"rb_vm_struct", !5, i64 0, !49, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !23, i64 216, !6, i64 224, !50, i64 264, !50, i64 280, !50, i64 296, !50, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !52, i64 472, !53, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !50, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !54, i64 1200, !6, i64 1232} +!49 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !50, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!50 = !{!"list_head", !51, i64 0} +!51 = !{!"list_node", !13, i64 0, !13, i64 8} +!52 = !{!"", !6, i64 0} +!53 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!54 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!55 = !DILocation(line: 0, scope: !45) +!56 = !DILocation(line: 4, column: 5, scope: !45) diff --git a/test/testdata/compiler/block_type_checking.llo.exp b/test/testdata/compiler/block_type_checking.llo.exp index 7240de666e3..ba2c49177b4 100644 --- a/test/testdata/compiler/block_type_checking.llo.exp +++ b/test/testdata/compiler/block_type_checking.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -88,6 +90,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/block_type_checking.rb" = private unnamed_addr constant [46 x i8] c"test/testdata/compiler/block_type_checking.rb\00", align 1 +@iseqEncodedArray = internal global [19 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_.$152$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -149,7 +153,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -254,55 +260,47 @@ functionEntryInitializers: %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !13 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !23 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !25 - %13 = getelementptr inbounds i64, i64* %12, i64 4 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %8, align 8, !tbaa !4 - %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !34 - br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !34 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %8, align 8, !tbaa !4 + %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !23 + br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %fillRequiredArgs, !dbg !23 argArrayExpandArrayTest: ; preds = %functionEntryInitializers - %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !34 - %15 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !34 - %16 = icmp ne i64 %15, 0, !dbg !34 - %17 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !34 - %18 = icmp eq i64 %17, 0, !dbg !34 - %19 = or i1 %16, %18, !dbg !34 - br i1 %19, label %fillRequiredArgs, label %sorbet_isa_Array.exit, !dbg !34 + %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !23 + %9 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !23 + %10 = icmp ne i64 %9, 0, !dbg !23 + %11 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !23 + %12 = icmp eq i64 %11, 0, !dbg !23 + %13 = or i1 %10, %12, !dbg !23 + br i1 %13, label %fillRequiredArgs, label %sorbet_isa_Array.exit, !dbg !23 sorbet_isa_Array.exit: ; preds = %argArrayExpandArrayTest - %20 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !34 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !34 - %22 = load i64, i64* %21, align 8, !dbg !34, !tbaa !35 - %23 = and i64 %22, 31, !dbg !34 - %24 = icmp ne i64 %23, 7, !dbg !34 - %25 = and i64 %22, 33554432, !dbg !34 - %26 = icmp eq i64 %25, 0, !dbg !34 - %or.cond = or i1 %24, %26, !dbg !34 - br i1 %or.cond, label %fillRequiredArgs, label %27, !dbg !34 - -27: ; preds = %sorbet_isa_Array.exit - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #16, !dbg !34 - br label %fillRequiredArgs, !dbg !34 - -fillRequiredArgs: ; preds = %argArrayExpandArrayTest, %27, %functionEntryInitializers, %sorbet_isa_Array.exit - %28 = getelementptr inbounds i64, i64* %12, i64 14 - %29 = getelementptr inbounds i64, i64* %28, i64 1 - store i64* %29, i64** %8, align 8, !dbg !37, !tbaa !4 - ret i64 13, !dbg !38 + %14 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !23 + %15 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %14, i64 0, i32 0, !dbg !23 + %16 = load i64, i64* %15, align 8, !dbg !23, !tbaa !24 + %17 = and i64 %16, 31, !dbg !23 + %18 = icmp ne i64 %17, 7, !dbg !23 + %19 = and i64 %16, 33554432, !dbg !23 + %20 = icmp eq i64 %19, 0, !dbg !23 + %or.cond = or i1 %18, %20, !dbg !23 + br i1 %or.cond, label %fillRequiredArgs, label %21, !dbg !23 + +21: ; preds = %sorbet_isa_Array.exit + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #16, !dbg !23 + br label %fillRequiredArgs, !dbg !23 + +fillRequiredArgs: ; preds = %argArrayExpandArrayTest, %21, %functionEntryInitializers, %sorbet_isa_Array.exit + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %8, align 8, !dbg !26, !tbaa !4 + ret i64 13, !dbg !27 } ; Function Attrs: sspreq define void @Init_block_type_checking() local_unnamed_addr #9 { entry: - %positional_table.i.i = alloca i64, i32 2, align 8, !dbg !39 + %positional_table.i.i = alloca i64, i32 2, align 8, !dbg !28 %locals.i21.i = alloca i64, i32 0, align 8 %locals.i17.i = alloca i64, i32 0, align 8 %locals.i.i = alloca i64, i32 0, align 8 - %keywords.i = alloca i64, i32 2, align 8, !dbg !42 + %keywords.i = alloca i64, i32 2, align 8, !dbg !31 %realpath = tail call i64 @sorbet_readRealpath() %0 = bitcast i64* %keywords.i to i8* call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %0) @@ -342,9 +340,11 @@ entry: %17 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([46 x i8], [46 x i8]* @"str_test/testdata/compiler/block_type_checking.rb", i64 0, i64 0), i64 noundef 45) #16 tail call void @rb_gc_register_mark_object(i64 %17) #16 store i64 %17, i64* @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 19) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %17, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 18, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/block_type_checking.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb", align 8 + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %19 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #16 call void @rb_gc_register_mark_object(i64 %19) #16 @@ -352,57 +352,57 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i15.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb", align 8 - %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i15.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 18, i64* noundef null, i32 noundef 0, i32 noundef 2) + %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i15.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %20, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 - %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !44 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !44 - %rubyId_bar.i = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !44 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 %rubyId_bar.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !44 - %rubyId_p.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !45 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p, i64 %rubyId_p.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !45 + %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !33 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !33 + %rubyId_bar.i = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !33 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 %rubyId_bar.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !33 + %rubyId_p.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !34 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p, i64 %rubyId_p.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 %21 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0), i64 noundef 3) #16 call void @rb_gc_register_mark_object(i64 %21) #16 %rubyId_bar.i.i = load i64, i64* @rubyIdPrecomputed_bar, align 8 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i16.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb", align 8 - %22 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %21, i64 %rubyId_bar.i.i, i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i16.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 9, i32 noundef 12, i64* noundef nonnull %locals.i17.i, i32 noundef 0, i32 noundef 2) + %22 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %21, i64 %rubyId_bar.i.i, i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i16.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i17.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %22, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo#bar", align 8 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !46 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !46 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !35 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 %"rubyId_.i18.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i19.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i20.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb", align 8 - %23 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i19.i", i64 %"rubyId_.i18.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i21.i, i32 noundef 0, i32 noundef 4) + %23 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i19.i", i64 %"rubyId_.i18.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i21.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %23, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 %"rubyId_block for.i23.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i24.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i25.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/block_type_checking.rb", align 8 - %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i24.i", i64 %"rubyId_block for.i23.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* %23, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i24.i", i64 %"rubyId_block for.i23.i", i64 %"rubyStr_test/testdata/compiler/block_type_checking.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* %23, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %24, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.$block_1", align 8 - %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !48 - %rubyId_proc.i = load i64, i64* @rubyIdPrecomputed_proc, align 8, !dbg !49 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_proc, i64 %rubyId_proc.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !49 - %rubyId_returns.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !49 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns, i64 %rubyId_returns.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !49 - %rubyId_params.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !42 - %rubyId_x.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !42 - %25 = call i64 @rb_id2sym(i64 %rubyId_x.i) #16, !dbg !42 - store i64 %25, i64* %keywords.i, align 8, !dbg !42 - %rubyId_blk.i = load i64, i64* @rubyIdPrecomputed_blk, align 8, !dbg !42 - %26 = call i64 @rb_id2sym(i64 %rubyId_blk.i) #16, !dbg !42 - %27 = getelementptr i64, i64* %keywords.i, i32 1, !dbg !42 - store i64 %26, i64* %27, align 8, !dbg !42 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params, i64 %rubyId_params.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords.i), !dbg !42 - %rubyId_returns10.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !42 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.1, i64 %rubyId_returns10.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !42 - %rubyId_extend.i = load i64, i64* @rubyIdPrecomputed_extend, align 8, !dbg !50 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 %rubyId_extend.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !50 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !51 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !51 + %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 + %rubyId_proc.i = load i64, i64* @rubyIdPrecomputed_proc, align 8, !dbg !38 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_proc, i64 %rubyId_proc.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !38 + %rubyId_returns.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !38 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns, i64 %rubyId_returns.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !38 + %rubyId_params.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !31 + %rubyId_x.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !31 + %25 = call i64 @rb_id2sym(i64 %rubyId_x.i) #16, !dbg !31 + store i64 %25, i64* %keywords.i, align 8, !dbg !31 + %rubyId_blk.i = load i64, i64* @rubyIdPrecomputed_blk, align 8, !dbg !31 + %26 = call i64 @rb_id2sym(i64 %rubyId_blk.i) #16, !dbg !31 + %27 = getelementptr i64, i64* %keywords.i, i32 1, !dbg !31 + store i64 %26, i64* %27, align 8, !dbg !31 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params, i64 %rubyId_params.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords.i), !dbg !31 + %rubyId_returns10.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !31 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.1, i64 %rubyId_returns10.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !31 + %rubyId_extend.i = load i64, i64* @rubyIdPrecomputed_extend, align 8, !dbg !39 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 %rubyId_extend.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !39 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !40 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !40 call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %0) %28 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !4 %29 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %28, i64 0, i32 18 - %30 = load i64, i64* %29, align 8, !tbaa !52 + %30 = load i64, i64* %29, align 8, !tbaa !41 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %31 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !4 %32 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %31, i64 0, i32 2 @@ -416,289 +416,259 @@ entry: store i64 %38, i64* %36, align 8, !tbaa !13 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %31, %struct.rb_control_frame_struct* align 8 %33, %struct.rb_iseq_struct* %stackFrame.i) #16 %39 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 0 - %40 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %34, align 8, !tbaa !20 - %41 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %40, i64 0, i32 2 - %42 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %41, align 8, !tbaa !23 - %43 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %42, i64 0, i32 2 - %44 = load i64*, i64** %43, align 8, !tbaa !25 - %45 = getelementptr inbounds i64, i64* %44, i64 4 - %46 = getelementptr inbounds i64, i64* %45, i64 1 - store i64* %46, i64** %39, align 8, !dbg !61, !tbaa !4 - %47 = load i64, i64* @rb_cObject, align 8, !dbg !62 - %48 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 %47) #16, !dbg !62 - call void @sorbet_pushStaticInitFrame(i64 %48) #16, !dbg !62 - %49 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %49) #16 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %39, align 8, !dbg !50, !tbaa !4 + %40 = load i64, i64* @rb_cObject, align 8, !dbg !51 + %41 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 %40) #16, !dbg !51 + call void @sorbet_pushStaticInitFrame(i64 %41) #16, !dbg !51 + %42 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %42) #16 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 - %50 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !4 - %51 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %50, i64 0, i32 2 - %52 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %51, align 8, !tbaa !19 - %53 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %52, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %53, align 8, !tbaa !20 - %54 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %52, i64 0, i32 4 - %55 = load i64*, i64** %54, align 8, !tbaa !22 - %56 = load i64, i64* %55, align 8, !tbaa !13 - %57 = and i64 %56, -33 - store i64 %57, i64* %55, align 8, !tbaa !13 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %50, %struct.rb_control_frame_struct* align 8 %52, %struct.rb_iseq_struct* %stackFrame.i.i1) #16 - %58 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %52, i64 0, i32 0 - %59 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %53, align 8, !tbaa !20 - %60 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %59, i64 0, i32 2 - %61 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %60, align 8, !tbaa !23 - %62 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %61, i64 0, i32 2 - %63 = load i64*, i64** %62, align 8, !tbaa !25 - %64 = getelementptr inbounds i64, i64* %63, i64 1 - %65 = getelementptr inbounds i64, i64* %64, i64 1, !dbg !63 - store i64* %65, i64** %58, align 8, !dbg !63, !tbaa !4 - %66 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !64 - %67 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !64, !tbaa !65 - %needTakeSlowPath = icmp ne i64 %66, %67, !dbg !64 - br i1 %needTakeSlowPath, label %68, label %69, !dbg !64, !prof !66 - -68: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !64 - br label %69, !dbg !64 - -69: ; preds = %entry, %68 - %70 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !64 - %71 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !64 - %72 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !64, !tbaa !65 - %guardUpdated = icmp eq i64 %71, %72, !dbg !64 - call void @llvm.assume(i1 %guardUpdated), !dbg !64 - %73 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !64, !tbaa !4 - %74 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %73, i64 0, i32 2, !dbg !64 - %75 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %74, align 8, !dbg !64, !tbaa !19 - %76 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %75, i64 0, i32 1, !dbg !64 - %77 = load i64*, i64** %76, align 8, !dbg !64, !tbaa !67 - %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !64 - store i64 %48, i64* %77, align 8, !dbg !64, !tbaa !13 - %79 = getelementptr inbounds i64, i64* %78, i64 1, !dbg !64 - store i64* %79, i64** %76, align 8, !dbg !64, !tbaa !67 - store i64 %70, i64* %78, align 8, !dbg !64, !tbaa !13 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #16, !dbg !64 - %80 = getelementptr inbounds i64, i64* %63, i64 4, !dbg !64 - %81 = getelementptr inbounds i64, i64* %80, i64 1, !dbg !64 - store i64* %81, i64** %58, align 8, !dbg !64, !tbaa !4 - %rubyId_bar.i.i2 = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !39 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_bar.i.i2) #16, !dbg !39 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !39 - %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #16, !dbg !39 - %82 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !39 - %83 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !65 - %needTakeSlowPath3 = icmp ne i64 %82, %83, !dbg !39 - br i1 %needTakeSlowPath3, label %84, label %85, !dbg !39, !prof !66 - -84: ; preds = %69 - call void @const_recompute_Foo(), !dbg !39 - br label %85, !dbg !39 - -85: ; preds = %69, %84 - %86 = load i64, i64* @guarded_const_Foo, align 8, !dbg !39 - %87 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !39 - %88 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !65 - %guardUpdated4 = icmp eq i64 %87, %88, !dbg !39 - call void @llvm.assume(i1 %guardUpdated4), !dbg !39 - %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo#bar", align 8, !dbg !39 - %89 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #17, !dbg !39 - %90 = bitcast i8* %89 to i16*, !dbg !39 - %91 = load i16, i16* %90, align 8, !dbg !39 - %92 = and i16 %91, -384, !dbg !39 - %93 = or i16 %92, 65, !dbg !39 - store i16 %93, i16* %90, align 8, !dbg !39 - %94 = getelementptr inbounds i8, i8* %89, i64 8, !dbg !39 - %95 = bitcast i8* %94 to i32*, !dbg !39 - store i32 1, i32* %95, align 8, !dbg !39, !tbaa !68 - %96 = getelementptr inbounds i8, i8* %89, i64 12, !dbg !39 - %97 = getelementptr inbounds i8, i8* %89, i64 28, !dbg !39 - %98 = bitcast i8* %97 to i32*, !dbg !39 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %96, i8 0, i64 16, i1 false) #16, !dbg !39 - store i32 1, i32* %98, align 4, !dbg !39, !tbaa !70 - %99 = getelementptr inbounds i8, i8* %89, i64 4, !dbg !39 - %100 = bitcast i8* %99 to i32*, !dbg !39 - store i32 2, i32* %100, align 4, !dbg !39, !tbaa !71 - %rubyId_x.i.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !39 - store i64 %rubyId_x.i.i, i64* %positional_table.i.i, align 8, !dbg !39 - %rubyId_blk.i.i = load i64, i64* @rubyIdPrecomputed_blk, align 8, !dbg !39 - %101 = getelementptr i64, i64* %positional_table.i.i, i32 1, !dbg !39 - store i64 %rubyId_blk.i.i, i64* %101, align 8, !dbg !39 - %102 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #17, !dbg !39 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %102, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %49, i64 noundef 16, i1 noundef false) #16, !dbg !39 - %103 = getelementptr inbounds i8, i8* %89, i64 32, !dbg !39 - %104 = bitcast i8* %103 to i8**, !dbg !39 - store i8* %102, i8** %104, align 8, !dbg !39, !tbaa !72 - %105 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0)) #16, !dbg !39 - %106 = bitcast i8* %89 to %struct.rb_sorbet_param_struct*, !dbg !39 - %107 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !39 - call void @rb_add_method_sorbet(i64 %86, i64 %105, i64 (i32, i64*, i64)* noundef @"func_Foo#bar", %struct.rb_sorbet_param_struct* nonnull %106, i32 noundef 1, i8* %107) #16, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %49) #16 - call void @sorbet_popRubyStack() #16, !dbg !62 - %108 = getelementptr inbounds i64, i64* %44, i64 14, !dbg !62 - %109 = getelementptr inbounds i64, i64* %108, i64 1, !dbg !62 - store i64* %109, i64** %39, align 8, !dbg !62, !tbaa !4 - %110 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !44, !tbaa !4 - %111 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %110, i64 0, i32 2, !dbg !44 - %112 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %111, align 8, !dbg !44, !tbaa !19 - %113 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %112, i64 0, i32 1, !dbg !44 - %114 = load i64*, i64** %113, align 8, !dbg !44, !tbaa !67 - %115 = getelementptr inbounds i64, i64* %114, i64 1, !dbg !44 - store i64* %115, i64** %113, align 8, !dbg !44, !tbaa !67 - store i64 %86, i64* %114, align 8, !dbg !44, !tbaa !13 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #16, !dbg !44 - %116 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !44, !tbaa !4 - %117 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %116, i64 0, i32 2, !dbg !44 - %118 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %117, align 8, !dbg !44, !tbaa !19 - %119 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %118, i64 0, i32 1, !dbg !44 - %120 = load i64*, i64** %119, align 8, !dbg !44, !tbaa !67 - %121 = getelementptr inbounds i64, i64* %120, i64 1, !dbg !44 - store i64 %send.i, i64* %120, align 8, !dbg !44, !tbaa !13 - %122 = getelementptr inbounds i64, i64* %121, i64 1, !dbg !44 - store i64* %122, i64** %119, align 8, !dbg !44, !tbaa !67 - store i64 11, i64* %121, align 8, !dbg !44, !tbaa !13 - %123 = call i64 @rb_iterate(i64 (i64)* noundef nonnull @sorbet_iterMethod, i64 noundef ptrtoint (%struct.FunctionInlineCache* @ic_bar to i64), i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #16, !dbg !44 - %124 = getelementptr inbounds i64, i64* %44, i64 17, !dbg !44 - %125 = getelementptr inbounds i64, i64* %124, i64 1, !dbg !44 - store i64* %125, i64** %39, align 8, !dbg !44, !tbaa !4 - %126 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !45, !tbaa !4 - %127 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %126, i64 0, i32 2, !dbg !45 - %128 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %127, align 8, !dbg !45, !tbaa !19 - %129 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %128, i64 0, i32 1, !dbg !45 - %130 = load i64*, i64** %129, align 8, !dbg !45, !tbaa !67 - %131 = getelementptr inbounds i64, i64* %130, i64 1, !dbg !45 - store i64 %30, i64* %130, align 8, !dbg !45, !tbaa !13 - %132 = getelementptr inbounds i64, i64* %131, i64 1, !dbg !45 - store i64* %132, i64** %129, align 8, !dbg !45, !tbaa !67 - store i64 %123, i64* %131, align 8, !dbg !45, !tbaa !13 - %send32.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p, i64 0) #16, !dbg !45 + %43 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !4 + %44 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %43, i64 0, i32 2 + %45 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %44, align 8, !tbaa !19 + %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %46, align 8, !tbaa !20 + %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 4 + %48 = load i64*, i64** %47, align 8, !tbaa !22 + %49 = load i64, i64* %48, align 8, !tbaa !13 + %50 = and i64 %49, -33 + store i64 %50, i64* %48, align 8, !tbaa !13 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %43, %struct.rb_control_frame_struct* align 8 %45, %struct.rb_iseq_struct* %stackFrame.i.i1) #16 + %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 0 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %51, align 8, !dbg !52, !tbaa !4 + %52 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !53 + %53 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !53, !tbaa !54 + %needTakeSlowPath = icmp ne i64 %52, %53, !dbg !53 + br i1 %needTakeSlowPath, label %54, label %55, !dbg !53, !prof !55 + +54: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !53 + br label %55, !dbg !53 + +55: ; preds = %entry, %54 + %56 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !53 + %57 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !53 + %58 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !53, !tbaa !54 + %guardUpdated = icmp eq i64 %57, %58, !dbg !53 + call void @llvm.assume(i1 %guardUpdated), !dbg !53 + %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !53, !tbaa !4 + %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2, !dbg !53 + %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !dbg !53, !tbaa !19 + %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 1, !dbg !53 + %63 = load i64*, i64** %62, align 8, !dbg !53, !tbaa !56 + %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !53 + store i64 %41, i64* %63, align 8, !dbg !53, !tbaa !13 + %65 = getelementptr inbounds i64, i64* %64, i64 1, !dbg !53 + store i64* %65, i64** %62, align 8, !dbg !53, !tbaa !56 + store i64 %56, i64* %64, align 8, !dbg !53, !tbaa !13 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #16, !dbg !53 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %51, align 8, !dbg !53, !tbaa !4 + %rubyId_bar.i.i2 = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !28 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_bar.i.i2) #16, !dbg !28 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !28 + %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #16, !dbg !28 + %66 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !28 + %67 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !28, !tbaa !54 + %needTakeSlowPath3 = icmp ne i64 %66, %67, !dbg !28 + br i1 %needTakeSlowPath3, label %68, label %69, !dbg !28, !prof !55 + +68: ; preds = %55 + call void @const_recompute_Foo(), !dbg !28 + br label %69, !dbg !28 + +69: ; preds = %55, %68 + %70 = load i64, i64* @guarded_const_Foo, align 8, !dbg !28 + %71 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !28 + %72 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !28, !tbaa !54 + %guardUpdated4 = icmp eq i64 %71, %72, !dbg !28 + call void @llvm.assume(i1 %guardUpdated4), !dbg !28 + %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo#bar", align 8, !dbg !28 + %73 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #17, !dbg !28 + %74 = bitcast i8* %73 to i16*, !dbg !28 + %75 = load i16, i16* %74, align 8, !dbg !28 + %76 = and i16 %75, -384, !dbg !28 + %77 = or i16 %76, 65, !dbg !28 + store i16 %77, i16* %74, align 8, !dbg !28 + %78 = getelementptr inbounds i8, i8* %73, i64 8, !dbg !28 + %79 = bitcast i8* %78 to i32*, !dbg !28 + store i32 1, i32* %79, align 8, !dbg !28, !tbaa !57 + %80 = getelementptr inbounds i8, i8* %73, i64 12, !dbg !28 + %81 = getelementptr inbounds i8, i8* %73, i64 28, !dbg !28 + %82 = bitcast i8* %81 to i32*, !dbg !28 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %80, i8 0, i64 16, i1 false) #16, !dbg !28 + store i32 1, i32* %82, align 4, !dbg !28, !tbaa !60 + %83 = getelementptr inbounds i8, i8* %73, i64 4, !dbg !28 + %84 = bitcast i8* %83 to i32*, !dbg !28 + store i32 2, i32* %84, align 4, !dbg !28, !tbaa !61 + %rubyId_x.i.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !28 + store i64 %rubyId_x.i.i, i64* %positional_table.i.i, align 8, !dbg !28 + %rubyId_blk.i.i = load i64, i64* @rubyIdPrecomputed_blk, align 8, !dbg !28 + %85 = getelementptr i64, i64* %positional_table.i.i, i32 1, !dbg !28 + store i64 %rubyId_blk.i.i, i64* %85, align 8, !dbg !28 + %86 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #17, !dbg !28 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %86, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %42, i64 noundef 16, i1 noundef false) #16, !dbg !28 + %87 = getelementptr inbounds i8, i8* %73, i64 32, !dbg !28 + %88 = bitcast i8* %87 to i8**, !dbg !28 + store i8* %86, i8** %88, align 8, !dbg !28, !tbaa !62 + %89 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0)) #16, !dbg !28 + %90 = bitcast i8* %73 to %struct.rb_sorbet_param_struct*, !dbg !28 + %91 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !28 + call void @rb_add_method_sorbet(i64 %70, i64 %89, i64 (i32, i64*, i64)* noundef @"func_Foo#bar", %struct.rb_sorbet_param_struct* nonnull %90, i32 noundef 1, i8* %91) #16, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %42) #16 + call void @sorbet_popRubyStack() #16, !dbg !51 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %39, align 8, !dbg !51, !tbaa !4 + %92 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !33, !tbaa !4 + %93 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %92, i64 0, i32 2, !dbg !33 + %94 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %93, align 8, !dbg !33, !tbaa !19 + %95 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %94, i64 0, i32 1, !dbg !33 + %96 = load i64*, i64** %95, align 8, !dbg !33, !tbaa !56 + %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !33 + store i64* %97, i64** %95, align 8, !dbg !33, !tbaa !56 + store i64 %70, i64* %96, align 8, !dbg !33, !tbaa !13 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #16, !dbg !33 + %98 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !33, !tbaa !4 + %99 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %98, i64 0, i32 2, !dbg !33 + %100 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %99, align 8, !dbg !33, !tbaa !19 + %101 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %100, i64 0, i32 1, !dbg !33 + %102 = load i64*, i64** %101, align 8, !dbg !33, !tbaa !56 + %103 = getelementptr inbounds i64, i64* %102, i64 1, !dbg !33 + store i64 %send.i, i64* %102, align 8, !dbg !33, !tbaa !13 + %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !33 + store i64* %104, i64** %101, align 8, !dbg !33, !tbaa !56 + store i64 11, i64* %103, align 8, !dbg !33, !tbaa !13 + %105 = call i64 @rb_iterate(i64 (i64)* noundef nonnull @sorbet_iterMethod, i64 noundef ptrtoint (%struct.FunctionInlineCache* @ic_bar to i64), i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #16, !dbg !33 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %39, align 8, !dbg !33, !tbaa !4 + %106 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !4 + %107 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %106, i64 0, i32 2, !dbg !34 + %108 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %107, align 8, !dbg !34, !tbaa !19 + %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %108, i64 0, i32 1, !dbg !34 + %110 = load i64*, i64** %109, align 8, !dbg !34, !tbaa !56 + %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !34 + store i64 %30, i64* %110, align 8, !dbg !34, !tbaa !13 + %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !34 + store i64* %112, i64** %109, align 8, !dbg !34, !tbaa !56 + store i64 %105, i64* %111, align 8, !dbg !34, !tbaa !13 + %send32.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p, i64 0) #16, !dbg !34 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Foo#bar"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #10 !dbg !47 { +define i64 @"func_Foo#bar"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #10 !dbg !36 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !4 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !19 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !20 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !23 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !25 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !4 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !73 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !73 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !73 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !73, !prof !74 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !tbaa !4 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !63 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !63 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !63 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !63, !prof !64 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !73 - unreachable, !dbg !73 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !63 + unreachable, !dbg !63 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_x = load i64, i64* %argArray, align 8, !dbg !73 - %11 = tail call i32 @rb_block_given_p() #16, !dbg !73 - %12 = icmp eq i32 %11, 0, !dbg !73 - br i1 %12, label %sorbet_getMethodBlockAsProc.exit, label %13, !dbg !73 - -13: ; preds = %fillRequiredArgs - %14 = tail call i64 @rb_block_proc() #16, !dbg !73 - br label %sorbet_getMethodBlockAsProc.exit, !dbg !73 - -sorbet_getMethodBlockAsProc.exit: ; preds = %fillRequiredArgs, %13 - %15 = phi i64 [ %14, %13 ], [ 8, %fillRequiredArgs ], !dbg !73 - store i64* %10, i64** %3, align 8, !dbg !75, !tbaa !4 - %16 = and i64 %rawArg_x, 1, !dbg !76 - %17 = icmp eq i64 %16, 0, !dbg !76 - br i1 %17, label %18, label %typeTestSuccess, !dbg !76, !prof !77 - -18: ; preds = %sorbet_getMethodBlockAsProc.exit - %19 = and i64 %rawArg_x, 7, !dbg !76 - %20 = icmp ne i64 %19, 0, !dbg !76 - %21 = and i64 %rawArg_x, -9, !dbg !76 - %22 = icmp eq i64 %21, 0, !dbg !76 - %23 = or i1 %20, %22, !dbg !76 - br i1 %23, label %codeRepl, label %sorbet_isa_Integer.exit29, !dbg !76, !prof !78 - -sorbet_isa_Integer.exit29: ; preds = %18 - %24 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !76 - %25 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %24, i64 0, i32 0, !dbg !76 - %26 = load i64, i64* %25, align 8, !dbg !76, !tbaa !35 - %27 = and i64 %26, 31, !dbg !76 - %28 = icmp eq i64 %27, 10, !dbg !76 - br i1 %28, label %typeTestSuccess, label %codeRepl, !dbg !76, !prof !79 - -typeTestSuccess: ; preds = %sorbet_getMethodBlockAsProc.exit, %sorbet_isa_Integer.exit29 - %29 = tail call i32 @rb_block_given_p() #16, !dbg !80 - %30 = icmp ne i32 %29, 0, !dbg !80 - br i1 %30, label %typeTestSuccess7, label %codeRepl33, !dbg !80, !prof !79 - -codeRepl: ; preds = %sorbet_isa_Integer.exit29, %18 - tail call fastcc void @"func_Foo#bar.cold.1"(i64 %rawArg_x) #19, !dbg !76 + %rawArg_x = load i64, i64* %argArray, align 8, !dbg !63 + %4 = tail call i32 @rb_block_given_p() #16, !dbg !63 + %5 = icmp eq i32 %4, 0, !dbg !63 + br i1 %5, label %sorbet_getMethodBlockAsProc.exit, label %6, !dbg !63 + +6: ; preds = %fillRequiredArgs + %7 = tail call i64 @rb_block_proc() #16, !dbg !63 + br label %sorbet_getMethodBlockAsProc.exit, !dbg !63 + +sorbet_getMethodBlockAsProc.exit: ; preds = %fillRequiredArgs, %6 + %8 = phi i64 [ %7, %6 ], [ 8, %fillRequiredArgs ], !dbg !63 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !65, !tbaa !4 + %9 = and i64 %rawArg_x, 1, !dbg !66 + %10 = icmp eq i64 %9, 0, !dbg !66 + br i1 %10, label %11, label %typeTestSuccess, !dbg !66, !prof !67 + +11: ; preds = %sorbet_getMethodBlockAsProc.exit + %12 = and i64 %rawArg_x, 7, !dbg !66 + %13 = icmp ne i64 %12, 0, !dbg !66 + %14 = and i64 %rawArg_x, -9, !dbg !66 + %15 = icmp eq i64 %14, 0, !dbg !66 + %16 = or i1 %13, %15, !dbg !66 + br i1 %16, label %codeRepl, label %sorbet_isa_Integer.exit26, !dbg !66, !prof !68 + +sorbet_isa_Integer.exit26: ; preds = %11 + %17 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !66 + %18 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %17, i64 0, i32 0, !dbg !66 + %19 = load i64, i64* %18, align 8, !dbg !66, !tbaa !24 + %20 = and i64 %19, 31, !dbg !66 + %21 = icmp eq i64 %20, 10, !dbg !66 + br i1 %21, label %typeTestSuccess, label %codeRepl, !dbg !66, !prof !69 + +typeTestSuccess: ; preds = %sorbet_getMethodBlockAsProc.exit, %sorbet_isa_Integer.exit26 + %22 = tail call i32 @rb_block_given_p() #16, !dbg !70 + %23 = icmp ne i32 %22, 0, !dbg !70 + br i1 %23, label %typeTestSuccess7, label %codeRepl30, !dbg !70, !prof !69 + +codeRepl: ; preds = %sorbet_isa_Integer.exit26, %11 + tail call fastcc void @"func_Foo#bar.cold.1"(i64 %rawArg_x) #19, !dbg !66 unreachable typeTestSuccess7: ; preds = %typeTestSuccess - %31 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !80 - store i64* %31, i64** %3, align 8, !dbg !80, !tbaa !4 - tail call void @llvm.experimental.noalias.scope.decl(metadata !81), !dbg !84 - %32 = tail call i64 @rb_yield_values_kw(i32 noundef 0, i64* noundef null, i32 noundef 0) #16, !dbg !84 - %33 = getelementptr inbounds i64, i64* %9, i64 2, !dbg !84 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !84 - store i64* %34, i64** %3, align 8, !dbg !84, !tbaa !4 - tail call void @llvm.experimental.noalias.scope.decl(metadata !85), !dbg !46 - %35 = and i64 %32, %16, !dbg !46 - %36 = icmp eq i64 %35, 0, !dbg !46 - br i1 %36, label %46, label %37, !dbg !46, !prof !74 - -37: ; preds = %typeTestSuccess7 - %38 = add nsw i64 %32, -1, !dbg !46 - %39 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %rawArg_x, i64 %38) #20, !dbg !46 - %40 = extractvalue { i64, i1 } %39, 1, !dbg !46 - %41 = extractvalue { i64, i1 } %39, 0, !dbg !46 - br i1 %40, label %42, label %sorbet_rb_int_plus.exit, !dbg !46 - -42: ; preds = %37 - %43 = ashr i64 %41, 1, !dbg !46 - %44 = xor i64 %43, -9223372036854775808, !dbg !46 - %45 = tail call i64 @rb_int2big(i64 %44) #16, !dbg !46, !noalias !85 - br label %sorbet_rb_int_plus.exit, !dbg !46 - -46: ; preds = %typeTestSuccess7 - %47 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %rawArg_x, i64 %32) #16, !dbg !46, !noalias !85 - br label %sorbet_rb_int_plus.exit, !dbg !46 - -sorbet_rb_int_plus.exit: ; preds = %42, %37, %46 - %48 = phi i64 [ %47, %46 ], [ %45, %42 ], [ %41, %37 ], !dbg !46 - %49 = and i64 %48, 1 - %50 = icmp eq i64 %49, 0 - br i1 %50, label %51, label %typeTestSuccess17, !prof !77 - -51: ; preds = %sorbet_rb_int_plus.exit - %52 = and i64 %48, 7 - %53 = icmp ne i64 %52, 0 - %54 = and i64 %48, -9 - %55 = icmp eq i64 %54, 0 - %56 = or i1 %53, %55 - br i1 %56, label %codeRepl32, label %sorbet_isa_Integer.exit, !prof !78 - -sorbet_isa_Integer.exit: ; preds = %51 - %57 = inttoptr i64 %48 to %struct.iseq_inline_iv_cache_entry* - %58 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %57, i64 0, i32 0 - %59 = load i64, i64* %58, align 8, !tbaa !35 - %60 = and i64 %59, 31 - %61 = icmp eq i64 %60, 10 - br i1 %61, label %typeTestSuccess17, label %codeRepl32, !prof !79 - -codeRepl33: ; preds = %typeTestSuccess - tail call fastcc void @"func_Foo#bar.cold.3"(i64 %15) #19, !dbg !80 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !dbg !70, !tbaa !4 + tail call void @llvm.experimental.noalias.scope.decl(metadata !71), !dbg !74 + %24 = tail call i64 @rb_yield_values_kw(i32 noundef 0, i64* noundef null, i32 noundef 0) #16, !dbg !74 + store i64* getelementptr inbounds ([19 x i64], [19 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %3, align 8, !dbg !74, !tbaa !4 + tail call void @llvm.experimental.noalias.scope.decl(metadata !75), !dbg !35 + %25 = and i64 %24, %9, !dbg !35 + %26 = icmp eq i64 %25, 0, !dbg !35 + br i1 %26, label %36, label %27, !dbg !35, !prof !64 + +27: ; preds = %typeTestSuccess7 + %28 = add nsw i64 %24, -1, !dbg !35 + %29 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %rawArg_x, i64 %28) #20, !dbg !35 + %30 = extractvalue { i64, i1 } %29, 1, !dbg !35 + %31 = extractvalue { i64, i1 } %29, 0, !dbg !35 + br i1 %30, label %32, label %sorbet_rb_int_plus.exit, !dbg !35 + +32: ; preds = %27 + %33 = ashr i64 %31, 1, !dbg !35 + %34 = xor i64 %33, -9223372036854775808, !dbg !35 + %35 = tail call i64 @rb_int2big(i64 %34) #16, !dbg !35, !noalias !75 + br label %sorbet_rb_int_plus.exit, !dbg !35 + +36: ; preds = %typeTestSuccess7 + %37 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %rawArg_x, i64 %24) #16, !dbg !35, !noalias !75 + br label %sorbet_rb_int_plus.exit, !dbg !35 + +sorbet_rb_int_plus.exit: ; preds = %32, %27, %36 + %38 = phi i64 [ %37, %36 ], [ %35, %32 ], [ %31, %27 ], !dbg !35 + %39 = and i64 %38, 1 + %40 = icmp eq i64 %39, 0 + br i1 %40, label %41, label %typeTestSuccess17, !prof !67 + +41: ; preds = %sorbet_rb_int_plus.exit + %42 = and i64 %38, 7 + %43 = icmp ne i64 %42, 0 + %44 = and i64 %38, -9 + %45 = icmp eq i64 %44, 0 + %46 = or i1 %43, %45 + br i1 %46, label %codeRepl29, label %sorbet_isa_Integer.exit, !prof !68 + +sorbet_isa_Integer.exit: ; preds = %41 + %47 = inttoptr i64 %38 to %struct.iseq_inline_iv_cache_entry* + %48 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %47, i64 0, i32 0 + %49 = load i64, i64* %48, align 8, !tbaa !24 + %50 = and i64 %49, 31 + %51 = icmp eq i64 %50, 10 + br i1 %51, label %typeTestSuccess17, label %codeRepl29, !prof !69 + +codeRepl30: ; preds = %typeTestSuccess + tail call fastcc void @"func_Foo#bar.cold.3"(i64 %8) #19, !dbg !70 unreachable typeTestSuccess17: ; preds = %sorbet_rb_int_plus.exit, %sorbet_isa_Integer.exit - ret i64 %48 + ret i64 %38 -codeRepl32: ; preds = %sorbet_isa_Integer.exit, %51 - tail call fastcc void @"func_Foo#bar.cold.2"(i64 %48) #19, !dbg !75 +codeRepl29: ; preds = %sorbet_isa_Integer.exit, %41 + tail call fastcc void @"func_Foo#bar.cold.2"(i64 %38) #19, !dbg !65 unreachable } @@ -715,24 +685,24 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #7 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #7 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Foo#bar.cold.1"(i64 %rawArg_x) unnamed_addr #13 !dbg !88 { +define internal fastcc void @"func_Foo#bar.cold.1"(i64 %rawArg_x) unnamed_addr #13 !dbg !78 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_x, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !90 - unreachable, !dbg !90 + tail call void @sorbet_cast_failure(i64 %rawArg_x, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !80 + unreachable, !dbg !80 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Foo#bar.cold.2"(i64 %0) unnamed_addr #13 !dbg !91 { +define internal fastcc void @"func_Foo#bar.cold.2"(i64 %0) unnamed_addr #13 !dbg !81 { newFuncRoot: tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @"str_Return value", i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1 unreachable } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Foo#bar.cold.3"(i64 %0) unnamed_addr #13 !dbg !92 { +define internal fastcc void @"func_Foo#bar.cold.3"(i64 %0) unnamed_addr #13 !dbg !82 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([24 x i8], [24 x i8]* @"str_T.proc.returns(Integer)", i64 0, i64 0)) #1, !dbg !93 - unreachable, !dbg !93 + tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([24 x i8], [24 x i8]* @"str_T.proc.returns(Integer)", i64 0, i64 0)) #1, !dbg !83 + unreachable, !dbg !83 } ; Function Attrs: nofree nosync nounwind willreturn @@ -742,7 +712,7 @@ declare void @llvm.assume(i1 noundef) #14 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #15 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !65 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !54 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -751,7 +721,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #15 { define linkonce void @const_recompute_Foo() local_unnamed_addr #15 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 3) store i64 %1, i64* @guarded_const_Foo, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !65 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !54 store i64 %2, i64* @guard_epoch_Foo, align 8 ret void } @@ -804,74 +774,64 @@ attributes #20 = { nounwind willreturn } !20 = !{!21, !5, i64 16} !21 = !{!"rb_control_frame_struct", !5, i64 0, !5, i64 8, !5, i64 16, !10, i64 24, !5, i64 32, !5, i64 40, !5, i64 48} !22 = !{!21, !5, i64 32} -!23 = !{!24, !5, i64 16} -!24 = !{!"rb_iseq_struct", !10, i64 0, !10, i64 8, !5, i64 16, !6, i64 24} -!25 = !{!26, !5, i64 8} -!26 = !{!"rb_iseq_constant_body", !6, i64 0, !11, i64 4, !5, i64 8, !27, i64 16, !29, i64 64, !32, i64 120, !5, i64 152, !5, i64 160, !5, i64 168, !5, i64 176, !5, i64 184, !5, i64 192, !33, i64 200, !11, i64 232, !11, i64 236, !11, i64 240, !11, i64 244, !11, i64 248, !6, i64 252, !10, i64 256} -!27 = !{!"", !28, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !5, i64 32, !5, i64 40} -!28 = !{!"", !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 1, !11, i64 1} -!29 = !{!"rb_iseq_location_struct", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !11, i64 32, !30, i64 36} -!30 = !{!"rb_code_location_struct", !31, i64 0, !31, i64 8} -!31 = !{!"rb_code_position_struct", !11, i64 0, !11, i64 4} -!32 = !{!"iseq_insn_info", !5, i64 0, !5, i64 8, !11, i64 16, !5, i64 24} -!33 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !5, i64 24} -!34 = !DILocation(line: 5, column: 1, scope: !14) -!35 = !{!36, !10, i64 0} -!36 = !{!"RBasic", !10, i64 0, !10, i64 8} -!37 = !DILocation(line: 16, column: 3, scope: !14) -!38 = !DILocation(line: 15, column: 10, scope: !14) -!39 = !DILocation(line: 9, column: 3, scope: !40, inlinedAt: !41) -!40 = distinct !DISubprogram(name: "Foo.", linkageName: "func_Foo.L62", scope: null, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!41 = distinct !DILocation(line: 5, column: 1, scope: !15) -!42 = !DILocation(line: 8, column: 8, scope: !43) -!43 = distinct !DISubprogram(name: "Foo.", linkageName: "func_Foo.L62$block_1", scope: !40, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!44 = !DILocation(line: 15, column: 10, scope: !15) -!45 = !DILocation(line: 18, column: 1, scope: !15) -!46 = !DILocation(line: 11, column: 5, scope: !47) -!47 = distinct !DISubprogram(name: "Foo#bar", linkageName: "func_Foo#bar", scope: null, file: !2, line: 9, type: !16, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!48 = !DILocation(line: 8, column: 3, scope: !40) -!49 = !DILocation(line: 8, column: 32, scope: !43) -!50 = !DILocation(line: 6, column: 3, scope: !40) -!51 = !DILocation(line: 9, column: 3, scope: !40) -!52 = !{!53, !10, i64 400} -!53 = !{!"rb_vm_struct", !10, i64 0, !54, i64 8, !5, i64 192, !5, i64 200, !5, i64 208, !57, i64 216, !6, i64 224, !55, i64 264, !55, i64 280, !55, i64 296, !55, i64 312, !10, i64 328, !11, i64 336, !11, i64 340, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 348, !10, i64 352, !6, i64 360, !10, i64 400, !10, i64 408, !10, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !5, i64 456, !5, i64 464, !58, i64 472, !59, i64 992, !5, i64 1016, !5, i64 1024, !11, i64 1032, !11, i64 1036, !55, i64 1040, !6, i64 1056, !10, i64 1096, !10, i64 1104, !10, i64 1112, !10, i64 1120, !10, i64 1128, !11, i64 1136, !5, i64 1144, !5, i64 1152, !5, i64 1160, !5, i64 1168, !5, i64 1176, !5, i64 1184, !11, i64 1192, !60, i64 1200, !6, i64 1232} -!54 = !{!"rb_global_vm_lock_struct", !5, i64 0, !6, i64 8, !55, i64 48, !5, i64 64, !11, i64 72, !6, i64 80, !6, i64 128, !11, i64 176, !11, i64 180} -!55 = !{!"list_head", !56, i64 0} -!56 = !{!"list_node", !5, i64 0, !5, i64 8} -!57 = !{!"long long", !6, i64 0} -!58 = !{!"", !6, i64 0} -!59 = !{!"rb_hook_list_struct", !5, i64 0, !11, i64 8, !11, i64 12, !11, i64 16} -!60 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24} -!61 = !DILocation(line: 0, scope: !15) -!62 = !DILocation(line: 5, column: 1, scope: !15) -!63 = !DILocation(line: 8, column: 3, scope: !40, inlinedAt: !41) -!64 = !DILocation(line: 6, column: 3, scope: !40, inlinedAt: !41) -!65 = !{!57, !57, i64 0} -!66 = !{!"branch_weights", i32 1, i32 10000} -!67 = !{!21, !5, i64 8} -!68 = !{!69, !11, i64 8} -!69 = !{!"rb_sorbet_param_struct", !28, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !5, i64 32, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !5, i64 56} -!70 = !{!69, !11, i64 28} -!71 = !{!69, !11, i64 4} -!72 = !{!69, !5, i64 32} -!73 = !DILocation(line: 9, column: 3, scope: !47) -!74 = !{!"branch_weights", i32 4001, i32 4000000} -!75 = !DILocation(line: 0, scope: !47) -!76 = !DILocation(line: 9, column: 11, scope: !47) -!77 = !{!"branch_weights", i32 1, i32 2000} -!78 = !{!"branch_weights", i32 1073205, i32 2146410443} -!79 = !{!"branch_weights", i32 2000, i32 1} -!80 = !DILocation(line: 9, column: 15, scope: !47) -!81 = !{!82} -!82 = distinct !{!82, !83, !"sorbet_callBlock: argument 0"} -!83 = distinct !{!83, !"sorbet_callBlock"} -!84 = !DILocation(line: 10, column: 9, scope: !47) -!85 = !{!86} -!86 = distinct !{!86, !87, !"sorbet_rb_int_plus: argument 0"} -!87 = distinct !{!87, !"sorbet_rb_int_plus"} -!88 = distinct !DISubprogram(name: "func_Foo#bar.cold.1", linkageName: "func_Foo#bar.cold.1", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!89 = !DISubroutineType(types: !3) -!90 = !DILocation(line: 9, column: 11, scope: !88) -!91 = distinct !DISubprogram(name: "func_Foo#bar.cold.2", linkageName: "func_Foo#bar.cold.2", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!92 = distinct !DISubprogram(name: "func_Foo#bar.cold.3", linkageName: "func_Foo#bar.cold.3", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!93 = !DILocation(line: 9, column: 15, scope: !92) +!23 = !DILocation(line: 5, column: 1, scope: !14) +!24 = !{!25, !10, i64 0} +!25 = !{!"RBasic", !10, i64 0, !10, i64 8} +!26 = !DILocation(line: 16, column: 3, scope: !14) +!27 = !DILocation(line: 15, column: 10, scope: !14) +!28 = !DILocation(line: 9, column: 3, scope: !29, inlinedAt: !30) +!29 = distinct !DISubprogram(name: "Foo.", linkageName: "func_Foo.L62", scope: null, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!30 = distinct !DILocation(line: 5, column: 1, scope: !15) +!31 = !DILocation(line: 8, column: 8, scope: !32) +!32 = distinct !DISubprogram(name: "Foo.", linkageName: "func_Foo.L62$block_1", scope: !29, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!33 = !DILocation(line: 15, column: 10, scope: !15) +!34 = !DILocation(line: 18, column: 1, scope: !15) +!35 = !DILocation(line: 11, column: 5, scope: !36) +!36 = distinct !DISubprogram(name: "Foo#bar", linkageName: "func_Foo#bar", scope: null, file: !2, line: 9, type: !16, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!37 = !DILocation(line: 8, column: 3, scope: !29) +!38 = !DILocation(line: 8, column: 32, scope: !32) +!39 = !DILocation(line: 6, column: 3, scope: !29) +!40 = !DILocation(line: 9, column: 3, scope: !29) +!41 = !{!42, !10, i64 400} +!42 = !{!"rb_vm_struct", !10, i64 0, !43, i64 8, !5, i64 192, !5, i64 200, !5, i64 208, !46, i64 216, !6, i64 224, !44, i64 264, !44, i64 280, !44, i64 296, !44, i64 312, !10, i64 328, !11, i64 336, !11, i64 340, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 344, !11, i64 348, !10, i64 352, !6, i64 360, !10, i64 400, !10, i64 408, !10, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !5, i64 456, !5, i64 464, !47, i64 472, !48, i64 992, !5, i64 1016, !5, i64 1024, !11, i64 1032, !11, i64 1036, !44, i64 1040, !6, i64 1056, !10, i64 1096, !10, i64 1104, !10, i64 1112, !10, i64 1120, !10, i64 1128, !11, i64 1136, !5, i64 1144, !5, i64 1152, !5, i64 1160, !5, i64 1168, !5, i64 1176, !5, i64 1184, !11, i64 1192, !49, i64 1200, !6, i64 1232} +!43 = !{!"rb_global_vm_lock_struct", !5, i64 0, !6, i64 8, !44, i64 48, !5, i64 64, !11, i64 72, !6, i64 80, !6, i64 128, !11, i64 176, !11, i64 180} +!44 = !{!"list_head", !45, i64 0} +!45 = !{!"list_node", !5, i64 0, !5, i64 8} +!46 = !{!"long long", !6, i64 0} +!47 = !{!"", !6, i64 0} +!48 = !{!"rb_hook_list_struct", !5, i64 0, !11, i64 8, !11, i64 12, !11, i64 16} +!49 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24} +!50 = !DILocation(line: 0, scope: !15) +!51 = !DILocation(line: 5, column: 1, scope: !15) +!52 = !DILocation(line: 8, column: 3, scope: !29, inlinedAt: !30) +!53 = !DILocation(line: 6, column: 3, scope: !29, inlinedAt: !30) +!54 = !{!46, !46, i64 0} +!55 = !{!"branch_weights", i32 1, i32 10000} +!56 = !{!21, !5, i64 8} +!57 = !{!58, !11, i64 8} +!58 = !{!"rb_sorbet_param_struct", !59, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !5, i64 32, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !5, i64 56} +!59 = !{!"", !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 0, !11, i64 1, !11, i64 1} +!60 = !{!58, !11, i64 28} +!61 = !{!58, !11, i64 4} +!62 = !{!58, !5, i64 32} +!63 = !DILocation(line: 9, column: 3, scope: !36) +!64 = !{!"branch_weights", i32 4001, i32 4000000} +!65 = !DILocation(line: 0, scope: !36) +!66 = !DILocation(line: 9, column: 11, scope: !36) +!67 = !{!"branch_weights", i32 1, i32 2000} +!68 = !{!"branch_weights", i32 1073205, i32 2146410443} +!69 = !{!"branch_weights", i32 2000, i32 1} +!70 = !DILocation(line: 9, column: 15, scope: !36) +!71 = !{!72} +!72 = distinct !{!72, !73, !"sorbet_callBlock: argument 0"} +!73 = distinct !{!73, !"sorbet_callBlock"} +!74 = !DILocation(line: 10, column: 9, scope: !36) +!75 = !{!76} +!76 = distinct !{!76, !77, !"sorbet_rb_int_plus: argument 0"} +!77 = distinct !{!77, !"sorbet_rb_int_plus"} +!78 = distinct !DISubprogram(name: "func_Foo#bar.cold.1", linkageName: "func_Foo#bar.cold.1", scope: null, file: !2, type: !79, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!79 = !DISubroutineType(types: !3) +!80 = !DILocation(line: 9, column: 11, scope: !78) +!81 = distinct !DISubprogram(name: "func_Foo#bar.cold.2", linkageName: "func_Foo#bar.cold.2", scope: null, file: !2, type: !79, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!82 = distinct !DISubprogram(name: "func_Foo#bar.cold.3", linkageName: "func_Foo#bar.cold.3", scope: null, file: !2, type: !79, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!83 = !DILocation(line: 9, column: 15, scope: !82) diff --git a/test/testdata/compiler/boolean_ops.llo.exp b/test/testdata/compiler/boolean_ops.llo.exp index e63bfc0b5bf..833384e80df 100644 --- a/test/testdata/compiler/boolean_ops.llo.exp +++ b/test/testdata/compiler/boolean_ops.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,7 +85,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/boolean_ops.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/boolean_ops.rb" = private unnamed_addr constant [38 x i8] c"test/testdata/compiler/boolean_ops.rb\00", align 1 +@iseqEncodedArray = internal global [6 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"rubyIdPrecomputed_>" = internal unnamed_addr global i64 0, align 8 @"str_>" = private unnamed_addr constant [2 x i8] c">\00", align 1 @"ic_>" = internal global %struct.FunctionInlineCache zeroinitializer @@ -92,7 +97,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -151,9 +158,12 @@ entry: store i64 %4, i64* @"rubyStrFrozen_", align 8 %5 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([38 x i8], [38 x i8]* @"str_test/testdata/compiler/boolean_ops.rb", i64 0, i64 0), i64 noundef 37) #9 tail call void @rb_gc_register_mark_object(i64 %5) #9 + store i64 %5, i64* @"rubyStrFrozen_test/testdata/compiler/boolean_ops.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([6 x i64], [6 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 6) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %5, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 5, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/boolean_ops.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/boolean_ops.rb", align 8 + %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/boolean_ops.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %6, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_>.i" = load i64, i64* @"rubyIdPrecomputed_>", align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_>", i64 %"rubyId_>.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !8 @@ -175,26 +185,19 @@ entry: store i64 %17, i64* %15, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %10, %struct.rb_control_frame_struct* align 8 %12, %struct.rb_iseq_struct* %stackFrame.i) #9 %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %12, i64 0, i32 0 - %19 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %13, align 8, !tbaa !29 - %20 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %19, i64 0, i32 2 - %21 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %20, align 8, !tbaa !32 - %22 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %21, i64 0, i32 2 - %23 = load i64*, i64** %22, align 8, !tbaa !34 - %24 = getelementptr inbounds i64, i64* %23, i64 4 - %25 = getelementptr inbounds i64, i64* %24, i64 1 - store i64* %25, i64** %18, align 8, !dbg !43, !tbaa !14 - call void @llvm.experimental.noalias.scope.decl(metadata !44) #9, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !47) #9, !dbg !50 - %26 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !14 - %27 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %26, i64 0, i32 2, !dbg !13 - %28 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %27, align 8, !dbg !13, !tbaa !26 - %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 1, !dbg !13 - %30 = load i64*, i64** %29, align 8, !dbg !13, !tbaa !51 - %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !13 - store i64 %9, i64* %30, align 8, !dbg !13, !tbaa !4 - %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !13 - store i64* %32, i64** %29, align 8, !dbg !13, !tbaa !51 - store i64 20, i64* %31, align 8, !dbg !13, !tbaa !4 + store i64* getelementptr inbounds ([6 x i64], [6 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %18, align 8, !dbg !32, !tbaa !14 + call void @llvm.experimental.noalias.scope.decl(metadata !33) #9, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !36) #9, !dbg !39 + %19 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !14 + %20 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %19, i64 0, i32 2, !dbg !13 + %21 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %20, align 8, !dbg !13, !tbaa !26 + %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 1, !dbg !13 + %23 = load i64*, i64** %22, align 8, !dbg !13, !tbaa !40 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !13 + store i64 %9, i64* %23, align 8, !dbg !13, !tbaa !4 + %25 = getelementptr inbounds i64, i64* %24, i64 1, !dbg !13 + store i64* %25, i64** %22, align 8, !dbg !13, !tbaa !40 + store i64 20, i64* %24, align 8, !dbg !13, !tbaa !4 %send24.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #9, !dbg !13 ret void } @@ -248,23 +251,12 @@ attributes #9 = { nounwind } !29 = !{!30, !15, i64 16} !30 = !{!"rb_control_frame_struct", !15, i64 0, !15, i64 8, !15, i64 16, !5, i64 24, !15, i64 32, !15, i64 40, !15, i64 48} !31 = !{!30, !15, i64 32} -!32 = !{!33, !15, i64 16} -!33 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !15, i64 16, !6, i64 24} -!34 = !{!35, !15, i64 8} -!35 = !{!"rb_iseq_constant_body", !6, i64 0, !21, i64 4, !15, i64 8, !36, i64 16, !38, i64 64, !41, i64 120, !15, i64 152, !15, i64 160, !15, i64 168, !15, i64 176, !15, i64 184, !15, i64 192, !42, i64 200, !21, i64 232, !21, i64 236, !21, i64 240, !21, i64 244, !21, i64 248, !6, i64 252, !5, i64 256} -!36 = !{!"", !37, i64 0, !21, i64 4, !21, i64 8, !21, i64 12, !21, i64 16, !21, i64 20, !21, i64 24, !21, i64 28, !15, i64 32, !15, i64 40} -!37 = !{!"", !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 1, !21, i64 1} -!38 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !21, i64 32, !39, i64 36} -!39 = !{!"rb_code_location_struct", !40, i64 0, !40, i64 8} -!40 = !{!"rb_code_position_struct", !21, i64 0, !21, i64 4} -!41 = !{!"iseq_insn_info", !15, i64 0, !15, i64 8, !21, i64 16, !15, i64 24} -!42 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !15, i64 24} -!43 = !DILocation(line: 0, scope: !9) -!44 = !{!45} -!45 = distinct !{!45, !46, !"sorbet_rb_int_gt: argument 0"} -!46 = distinct !{!46, !"sorbet_rb_int_gt"} -!47 = !{!48} -!48 = distinct !{!48, !49, !"sorbet_bang: argument 0:thread"} -!49 = distinct !{!49, !"sorbet_bang"} -!50 = !DILocation(line: 5, column: 6, scope: !9) -!51 = !{!30, !15, i64 8} +!32 = !DILocation(line: 0, scope: !9) +!33 = !{!34} +!34 = distinct !{!34, !35, !"sorbet_rb_int_gt: argument 0"} +!35 = distinct !{!35, !"sorbet_rb_int_gt"} +!36 = !{!37} +!37 = distinct !{!37, !38, !"sorbet_bang: argument 0:thread"} +!38 = distinct !{!38, !"sorbet_bang"} +!39 = !DILocation(line: 5, column: 6, scope: !9) +!40 = !{!30, !15, i64 8} diff --git a/test/testdata/compiler/call_final.llo.exp b/test/testdata/compiler/call_final.llo.exp index 9ecf12f0f90..61a56cc48aa 100644 --- a/test/testdata/compiler/call_final.llo.exp +++ b/test/testdata/compiler/call_final.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/call_final.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/call_final.rb" = private unnamed_addr constant [37 x i8] c"test/testdata/compiler/call_final.rb\00", align 1 +@iseqEncodedArray = internal global [16 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @str_B = private unnamed_addr constant [2 x i8] c"B\00", align 1 @stackFramePrecomputed_func_A.foo = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @@ -138,7 +142,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -250,27 +256,29 @@ entry: %15 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([37 x i8], [37 x i8]* @"str_test/testdata/compiler/call_final.rb", i64 0, i64 0), i64 noundef 36) #15 tail call void @rb_gc_register_mark_object(i64 %15) #15 store i64 %15, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 16) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %15, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 15, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/call_final.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %17 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 noundef 3) #15 call void @rb_gc_register_mark_object(i64 %17) #15 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %"rubyStr_test/testdata/compiler/call_final.rb.i7.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/call_final.rb.i7.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 7, i32 noundef 9, i64* noundef nonnull %locals.i8.i, i32 noundef 0, i32 noundef 0) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/call_final.rb.i7.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i8.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.foo, align 8 %"rubyId_.i9.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i10.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/call_final.rb.i11.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 - %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i10.i", i64 %"rubyId_.i9.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i11.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i12.i, i32 noundef 0, i32 noundef 4) + %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i10.i", i64 %"rubyId_.i9.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i11.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i12.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %19, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %20 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #15 call void @rb_gc_register_mark_object(i64 %20) #15 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/call_final.rb.i13.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 - %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %20, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i13.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %20, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i13.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %21, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.$block_1", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !20 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !20 @@ -287,7 +295,7 @@ entry: call void @rb_gc_register_mark_object(i64 %23) #15 %rubyId_caller.i.i = load i64, i64* @rubyIdPrecomputed_caller, align 8 %"rubyStr_test/testdata/compiler/call_final.rb.i14.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 - %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %23, i64 %rubyId_caller.i.i, i64 %"rubyStr_test/testdata/compiler/call_final.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 12, i32 noundef 14, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 2) + %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %23, i64 %rubyId_caller.i.i, i64 %"rubyStr_test/testdata/compiler/call_final.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %24, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#caller", align 8 %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !22 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !22 @@ -296,7 +304,7 @@ entry: %"rubyId_.i16.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i17.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/call_final.rb.i18.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/call_final.rb", align 8 - %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i17.i", i64 %"rubyId_.i16.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i18.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 11, i32 noundef 11, i64* noundef nonnull %locals.i19.i, i32 noundef 0, i32 noundef 4) + %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i17.i", i64 %"rubyId_.i16.i", i64 %"rubyStr_test/testdata/compiler/call_final.rb.i18.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i19.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %25, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B.", align 8 %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !24 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !24 @@ -314,221 +322,188 @@ entry: store i64 %33, i64* %31, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %26, %struct.rb_control_frame_struct* align 8 %28, %struct.rb_iseq_struct* %stackFrame.i) #15 %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 0 - %35 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %29, align 8, !tbaa !31 - %36 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %35, i64 0, i32 2 - %37 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %36, align 8, !tbaa !34 - %38 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %37, i64 0, i32 2 - %39 = load i64*, i64** %38, align 8, !tbaa !36 - %40 = getelementptr inbounds i64, i64* %39, i64 4 - %41 = getelementptr inbounds i64, i64* %40, i64 1 - store i64* %41, i64** %34, align 8, !dbg !45, !tbaa !25 - %42 = load i64, i64* @rb_cObject, align 8, !dbg !46 - %43 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %42) #15, !dbg !46 - call void @sorbet_pushStaticInitFrame(i64 %43) #15, !dbg !46 - %44 = bitcast i64* %positional_table.i4.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %44) #15 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %34, align 8, !dbg !34, !tbaa !25 + %35 = load i64, i64* @rb_cObject, align 8, !dbg !35 + %36 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %35) #15, !dbg !35 + call void @sorbet_pushStaticInitFrame(i64 %36) #15, !dbg !35 + %37 = bitcast i64* %positional_table.i4.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %37) #15 %stackFrame.i1.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %45 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 - %46 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %45, i64 0, i32 2 - %47 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %46, align 8, !tbaa !27 - %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %47, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %48, align 8, !tbaa !31 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %47, i64 0, i32 4 - %50 = load i64*, i64** %49, align 8, !tbaa !33 - %51 = load i64, i64* %50, align 8, !tbaa !4 - %52 = and i64 %51, -33 - store i64 %52, i64* %50, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %45, %struct.rb_control_frame_struct* align 8 %47, %struct.rb_iseq_struct* %stackFrame.i1.i) #15 - %53 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %47, i64 0, i32 0 - %54 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %48, align 8, !tbaa !31 - %55 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %54, i64 0, i32 2 - %56 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %55, align 8, !tbaa !34 - %57 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %56, i64 0, i32 2 - %58 = load i64*, i64** %57, align 8, !tbaa !36 - %59 = getelementptr inbounds i64, i64* %58, i64 1 - %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !47 - store i64* %60, i64** %53, align 8, !dbg !47, !tbaa !25 - %rubyId_final.i.i = load i64, i64* @rubyIdPrecomputed_final, align 8, !dbg !48 - %rawSym.i2.i = call i64 @rb_id2sym(i64 %rubyId_final.i.i) #15, !dbg !48 - %61 = getelementptr inbounds i64, i64* %58, i64 2, !dbg !49 - %62 = getelementptr inbounds i64, i64* %61, i64 1, !dbg !49 - store i64* %62, i64** %53, align 8, !dbg !49, !tbaa !25 + %38 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 + %39 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %38, i64 0, i32 2 + %40 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %39, align 8, !tbaa !27 + %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %41, align 8, !tbaa !31 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 4 + %43 = load i64*, i64** %42, align 8, !tbaa !33 + %44 = load i64, i64* %43, align 8, !tbaa !4 + %45 = and i64 %44, -33 + store i64 %45, i64* %43, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %38, %struct.rb_control_frame_struct* align 8 %40, %struct.rb_iseq_struct* %stackFrame.i1.i) #15 + %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 0 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %46, align 8, !dbg !36, !tbaa !25 + %rubyId_final.i.i = load i64, i64* @rubyIdPrecomputed_final, align 8, !dbg !37 + %rawSym.i2.i = call i64 @rb_id2sym(i64 %rubyId_final.i.i) #15, !dbg !37 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %46, align 8, !dbg !38, !tbaa !25 %rubyId_foo.i.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !8 %rawSym28.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i1) #15, !dbg !8 %rubyId_normal.i3.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i3.i) #15, !dbg !8 - %63 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 - %64 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !50 - %needTakeSlowPath = icmp ne i64 %63, %64, !dbg !8 - br i1 %needTakeSlowPath, label %65, label %66, !dbg !8, !prof !52 + %47 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 + %48 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !39 + %needTakeSlowPath = icmp ne i64 %47, %48, !dbg !8 + br i1 %needTakeSlowPath, label %49, label %50, !dbg !8, !prof !41 -65: ; preds = %entry +49: ; preds = %entry call void @const_recompute_A(), !dbg !8 - br label %66, !dbg !8 + br label %50, !dbg !8 -66: ; preds = %entry, %65 - %67 = load i64, i64* @guarded_const_A, align 8, !dbg !8 - %68 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 - %69 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !50 - %guardUpdated = icmp eq i64 %68, %69, !dbg !8 +50: ; preds = %entry, %49 + %51 = load i64, i64* @guarded_const_A, align 8, !dbg !8 + %52 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 + %53 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !39 + %guardUpdated = icmp eq i64 %52, %53, !dbg !8 call void @llvm.assume(i1 %guardUpdated), !dbg !8 %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.foo, align 8, !dbg !8 - %70 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #13, !dbg !8 - %71 = bitcast i8* %70 to i16*, !dbg !8 - %72 = load i16, i16* %71, align 8, !dbg !8 - %73 = and i16 %72, -384, !dbg !8 - %74 = or i16 %73, 1, !dbg !8 - store i16 %74, i16* %71, align 8, !dbg !8 - %75 = getelementptr inbounds i8, i8* %70, i64 8, !dbg !8 - %76 = bitcast i8* %75 to i32*, !dbg !8 - store i32 1, i32* %76, align 8, !dbg !8, !tbaa !53 - %77 = getelementptr inbounds i8, i8* %70, i64 12, !dbg !8 - %78 = getelementptr inbounds i8, i8* %70, i64 4, !dbg !8 - %79 = bitcast i8* %78 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %77, i8 0, i64 20, i1 false) #15, !dbg !8 - store i32 1, i32* %79, align 4, !dbg !8, !tbaa !55 + %54 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #13, !dbg !8 + %55 = bitcast i8* %54 to i16*, !dbg !8 + %56 = load i16, i16* %55, align 8, !dbg !8 + %57 = and i16 %56, -384, !dbg !8 + %58 = or i16 %57, 1, !dbg !8 + store i16 %58, i16* %55, align 8, !dbg !8 + %59 = getelementptr inbounds i8, i8* %54, i64 8, !dbg !8 + %60 = bitcast i8* %59 to i32*, !dbg !8 + store i32 1, i32* %60, align 8, !dbg !8, !tbaa !42 + %61 = getelementptr inbounds i8, i8* %54, i64 12, !dbg !8 + %62 = getelementptr inbounds i8, i8* %54, i64 4, !dbg !8 + %63 = bitcast i8* %62 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %61, i8 0, i64 20, i1 false) #15, !dbg !8 + store i32 1, i32* %63, align 4, !dbg !8, !tbaa !45 %rubyId_n.i.i = load i64, i64* @rubyIdPrecomputed_n, align 8, !dbg !8 store i64 %rubyId_n.i.i, i64* %positional_table.i4.i, align 8, !dbg !8 - %80 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #13, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %80, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %44, i64 noundef 8, i1 noundef false) #15, !dbg !8 - %81 = getelementptr inbounds i8, i8* %70, i64 32, !dbg !8 - %82 = bitcast i8* %81 to i8**, !dbg !8 - store i8* %80, i8** %82, align 8, !dbg !8, !tbaa !56 - %83 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !8 - call void @rb_define_singleton_sorbet_method(i64 %67, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_A.foo, i8* nonnull %70, i8* %83) #15, !dbg !8 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %44) #15 - call void @sorbet_popRubyStack() #15, !dbg !46 - %84 = getelementptr inbounds i64, i64* %39, i64 10, !dbg !46 - %85 = getelementptr inbounds i64, i64* %84, i64 1, !dbg !46 - store i64* %85, i64** %34, align 8, !dbg !46, !tbaa !25 - %86 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_B, i64 0, i64 0), i64 %42) #15, !dbg !57 - call void @sorbet_pushStaticInitFrame(i64 %86) #15, !dbg !57 - %87 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %87) #15 + %64 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #13, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %64, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %37, i64 noundef 8, i1 noundef false) #15, !dbg !8 + %65 = getelementptr inbounds i8, i8* %54, i64 32, !dbg !8 + %66 = bitcast i8* %65 to i8**, !dbg !8 + store i8* %64, i8** %66, align 8, !dbg !8, !tbaa !46 + %67 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !8 + call void @rb_define_singleton_sorbet_method(i64 %51, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_A.foo, i8* nonnull %54, i8* %67) #15, !dbg !8 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %37) #15 + call void @sorbet_popRubyStack() #15, !dbg !35 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %34, align 8, !dbg !35, !tbaa !25 + %68 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_B, i64 0, i64 0), i64 %35) #15, !dbg !47 + call void @sorbet_pushStaticInitFrame(i64 %68) #15, !dbg !47 + %69 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %69) #15 %stackFrame.i.i2 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B.", align 8 - %88 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 - %89 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %88, i64 0, i32 2 - %90 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %89, align 8, !tbaa !27 - %91 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i2, %struct.rb_iseq_struct** %91, align 8, !tbaa !31 - %92 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 4 - %93 = load i64*, i64** %92, align 8, !tbaa !33 - %94 = load i64, i64* %93, align 8, !tbaa !4 - %95 = and i64 %94, -33 - store i64 %95, i64* %93, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %88, %struct.rb_control_frame_struct* align 8 %90, %struct.rb_iseq_struct* %stackFrame.i.i2) #15 - %96 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 0 - %97 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %91, align 8, !tbaa !31 - %98 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %97, i64 0, i32 2 - %99 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %98, align 8, !tbaa !34 - %100 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %99, i64 0, i32 2 - %101 = load i64*, i64** %100, align 8, !tbaa !36 - %102 = getelementptr inbounds i64, i64* %101, i64 1 - %103 = getelementptr inbounds i64, i64* %102, i64 1, !dbg !58 - store i64* %103, i64** %96, align 8, !dbg !58, !tbaa !25 + %70 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 + %71 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %70, i64 0, i32 2 + %72 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %71, align 8, !tbaa !27 + %73 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %72, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i2, %struct.rb_iseq_struct** %73, align 8, !tbaa !31 + %74 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %72, i64 0, i32 4 + %75 = load i64*, i64** %74, align 8, !tbaa !33 + %76 = load i64, i64* %75, align 8, !tbaa !4 + %77 = and i64 %76, -33 + store i64 %77, i64* %75, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %70, %struct.rb_control_frame_struct* align 8 %72, %struct.rb_iseq_struct* %stackFrame.i.i2) #15 + %78 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %72, i64 0, i32 0 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %78, align 8, !dbg !48, !tbaa !25 %rubyId_caller.i.i3 = load i64, i64* @rubyIdPrecomputed_caller, align 8, !dbg !15 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_caller.i.i3) #15, !dbg !15 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !15 %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #15, !dbg !15 - %104 = load i64, i64* @guard_epoch_B, align 8, !dbg !15 - %105 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !15, !tbaa !50 - %needTakeSlowPath4 = icmp ne i64 %104, %105, !dbg !15 - br i1 %needTakeSlowPath4, label %106, label %107, !dbg !15, !prof !52 + %79 = load i64, i64* @guard_epoch_B, align 8, !dbg !15 + %80 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !15, !tbaa !39 + %needTakeSlowPath4 = icmp ne i64 %79, %80, !dbg !15 + br i1 %needTakeSlowPath4, label %81, label %82, !dbg !15, !prof !41 -106: ; preds = %66 +81: ; preds = %50 call void @const_recompute_B(), !dbg !15 - br label %107, !dbg !15 + br label %82, !dbg !15 -107: ; preds = %66, %106 - %108 = load i64, i64* @guarded_const_B, align 8, !dbg !15 - %109 = load i64, i64* @guard_epoch_B, align 8, !dbg !15 - %110 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !15, !tbaa !50 - %guardUpdated5 = icmp eq i64 %109, %110, !dbg !15 +82: ; preds = %50, %81 + %83 = load i64, i64* @guarded_const_B, align 8, !dbg !15 + %84 = load i64, i64* @guard_epoch_B, align 8, !dbg !15 + %85 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !15, !tbaa !39 + %guardUpdated5 = icmp eq i64 %84, %85, !dbg !15 call void @llvm.assume(i1 %guardUpdated5), !dbg !15 %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#caller", align 8, !dbg !15 - %111 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #13, !dbg !15 - %112 = bitcast i8* %111 to i16*, !dbg !15 - %113 = load i16, i16* %112, align 8, !dbg !15 - %114 = and i16 %113, -384, !dbg !15 - %115 = or i16 %114, 1, !dbg !15 - store i16 %115, i16* %112, align 8, !dbg !15 - %116 = getelementptr inbounds i8, i8* %111, i64 8, !dbg !15 - %117 = bitcast i8* %116 to i32*, !dbg !15 - store i32 1, i32* %117, align 8, !dbg !15, !tbaa !53 - %118 = getelementptr inbounds i8, i8* %111, i64 12, !dbg !15 - %119 = getelementptr inbounds i8, i8* %111, i64 4, !dbg !15 - %120 = bitcast i8* %119 to i32*, !dbg !15 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %118, i8 0, i64 20, i1 false) #15, !dbg !15 - store i32 1, i32* %120, align 4, !dbg !15, !tbaa !55 + %86 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #13, !dbg !15 + %87 = bitcast i8* %86 to i16*, !dbg !15 + %88 = load i16, i16* %87, align 8, !dbg !15 + %89 = and i16 %88, -384, !dbg !15 + %90 = or i16 %89, 1, !dbg !15 + store i16 %90, i16* %87, align 8, !dbg !15 + %91 = getelementptr inbounds i8, i8* %86, i64 8, !dbg !15 + %92 = bitcast i8* %91 to i32*, !dbg !15 + store i32 1, i32* %92, align 8, !dbg !15, !tbaa !42 + %93 = getelementptr inbounds i8, i8* %86, i64 12, !dbg !15 + %94 = getelementptr inbounds i8, i8* %86, i64 4, !dbg !15 + %95 = bitcast i8* %94 to i32*, !dbg !15 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %93, i8 0, i64 20, i1 false) #15, !dbg !15 + store i32 1, i32* %95, align 4, !dbg !15, !tbaa !45 %rubyId_a.i.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !15 store i64 %rubyId_a.i.i, i64* %positional_table.i.i, align 8, !dbg !15 - %121 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #13, !dbg !15 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %121, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %87, i64 noundef 8, i1 noundef false) #15, !dbg !15 - %122 = getelementptr inbounds i8, i8* %111, i64 32, !dbg !15 - %123 = bitcast i8* %122 to i8**, !dbg !15 - store i8* %121, i8** %123, align 8, !dbg !15, !tbaa !56 - %124 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_caller, i64 0, i64 0)) #15, !dbg !15 - %125 = bitcast i8* %111 to %struct.rb_sorbet_param_struct*, !dbg !15 - %126 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !15 - call void @rb_add_method_sorbet(i64 %108, i64 %124, i64 (i32, i64*, i64)* noundef @"func_B#caller", %struct.rb_sorbet_param_struct* nonnull %125, i32 noundef 1, i8* %126) #15, !dbg !15 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %87) #15 - call void @sorbet_popRubyStack() #15, !dbg !57 + %96 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #13, !dbg !15 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %96, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %69, i64 noundef 8, i1 noundef false) #15, !dbg !15 + %97 = getelementptr inbounds i8, i8* %86, i64 32, !dbg !15 + %98 = bitcast i8* %97 to i8**, !dbg !15 + store i8* %96, i8** %98, align 8, !dbg !15, !tbaa !46 + %99 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_caller, i64 0, i64 0)) #15, !dbg !15 + %100 = bitcast i8* %86 to %struct.rb_sorbet_param_struct*, !dbg !15 + %101 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !15 + call void @rb_add_method_sorbet(i64 %83, i64 %99, i64 (i32, i64*, i64)* noundef @"func_B#caller", %struct.rb_sorbet_param_struct* nonnull %100, i32 noundef 1, i8* %101) #15, !dbg !15 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %69) #15 + call void @sorbet_popRubyStack() #15, !dbg !47 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @func_A.foo(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #8 !dbg !59 { +define i64 @func_A.foo(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #8 !dbg !49 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !27 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !31 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !34 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !36 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !25 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !60 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !60 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !60 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !60, !prof !61 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !tbaa !25 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !50 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !50 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !50 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !50, !prof !51 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !60 - unreachable, !dbg !60 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !50 + unreachable, !dbg !50 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_n = load i64, i64* %argArray, align 8, !dbg !60 - %11 = and i64 %rawArg_n, 1, !dbg !62 - %12 = icmp eq i64 %11, 0, !dbg !62 - br i1 %12, label %13, label %typeTestSuccess, !dbg !62, !prof !63 - -13: ; preds = %fillRequiredArgs - %14 = and i64 %rawArg_n, 7, !dbg !62 - %15 = icmp ne i64 %14, 0, !dbg !62 - %16 = and i64 %rawArg_n, -9, !dbg !62 - %17 = icmp eq i64 %16, 0, !dbg !62 - %18 = or i1 %15, %17, !dbg !62 - br i1 %18, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !62, !prof !64 - -sorbet_isa_Integer.exit: ; preds = %13 - %19 = inttoptr i64 %rawArg_n to %struct.iseq_inline_iv_cache_entry*, !dbg !62 - %20 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %19, i64 0, i32 0, !dbg !62 - %21 = load i64, i64* %20, align 8, !dbg !62, !tbaa !65 - %22 = and i64 %21, 31, !dbg !62 - %23 = icmp eq i64 %22, 10, !dbg !62 - br i1 %23, label %typeTestSuccess, label %codeRepl, !dbg !62, !prof !67 + %rawArg_n = load i64, i64* %argArray, align 8, !dbg !50 + %4 = and i64 %rawArg_n, 1, !dbg !52 + %5 = icmp eq i64 %4, 0, !dbg !52 + br i1 %5, label %6, label %typeTestSuccess, !dbg !52, !prof !53 + +6: ; preds = %fillRequiredArgs + %7 = and i64 %rawArg_n, 7, !dbg !52 + %8 = icmp ne i64 %7, 0, !dbg !52 + %9 = and i64 %rawArg_n, -9, !dbg !52 + %10 = icmp eq i64 %9, 0, !dbg !52 + %11 = or i1 %8, %10, !dbg !52 + br i1 %11, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !52, !prof !54 + +sorbet_isa_Integer.exit: ; preds = %6 + %12 = inttoptr i64 %rawArg_n to %struct.iseq_inline_iv_cache_entry*, !dbg !52 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !52 + %14 = load i64, i64* %13, align 8, !dbg !52, !tbaa !55 + %15 = and i64 %14, 31, !dbg !52 + %16 = icmp eq i64 %15, 10, !dbg !52 + br i1 %16, label %typeTestSuccess, label %codeRepl, !dbg !52, !prof !57 typeTestSuccess: ; preds = %fillRequiredArgs, %sorbet_isa_Integer.exit - %24 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !62 - store i64* %24, i64** %3, align 8, !dbg !62, !tbaa !25 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !52, !tbaa !25 ret i64 %rawArg_n -codeRepl: ; preds = %sorbet_isa_Integer.exit, %13 - tail call fastcc void @func_A.foo.cold.1(i64 %rawArg_n) #16, !dbg !62 +codeRepl: ; preds = %sorbet_isa_Integer.exit, %6 + tail call fastcc void @func_A.foo.cold.1(i64 %rawArg_n) #16, !dbg !52 unreachable } @@ -540,96 +515,80 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !27 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !31 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !34 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !36 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !25 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !68 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !68 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !68 - br i1 %or.cond, label %argCountFailBlock, label %fastFinalCall_foo, !dbg !68, !prof !61 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %3, align 8, !tbaa !25 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !58 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !58 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !58 + br i1 %or.cond, label %argCountFailBlock, label %fastFinalCall_foo, !dbg !58, !prof !51 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !68 - unreachable, !dbg !68 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !58 + unreachable, !dbg !58 fastFinalCall_foo: ; preds = %functionEntryInitializers - %rawArg_a = load i64, i64* %argArray, align 8, !dbg !68 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !69 - store i64* %11, i64** %3, align 8, !dbg !69, !tbaa !25 - %12 = load i64, i64* @guard_epoch_A, align 8, !dbg !22 - %13 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !50 - %needTakeSlowPath = icmp ne i64 %12, %13, !dbg !22 - br i1 %needTakeSlowPath, label %14, label %15, !dbg !22, !prof !52 - -14: ; preds = %fastFinalCall_foo + %rawArg_a = load i64, i64* %argArray, align 8, !dbg !58 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !dbg !59, !tbaa !25 + %4 = load i64, i64* @guard_epoch_A, align 8, !dbg !22 + %5 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !39 + %needTakeSlowPath = icmp ne i64 %4, %5, !dbg !22 + br i1 %needTakeSlowPath, label %6, label %7, !dbg !22, !prof !41 + +6: ; preds = %fastFinalCall_foo tail call void @const_recompute_A(), !dbg !22 - br label %15, !dbg !22 + br label %7, !dbg !22 -15: ; preds = %fastFinalCall_foo, %14 - %16 = load i64, i64* @guarded_const_A, align 8, !dbg !22 - %17 = load i64, i64* @guard_epoch_A, align 8, !dbg !22 - %18 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !50 - %guardUpdated = icmp eq i64 %17, %18, !dbg !22 +7: ; preds = %fastFinalCall_foo, %6 + %8 = load i64, i64* @guarded_const_A, align 8, !dbg !22 + %9 = load i64, i64* @guard_epoch_A, align 8, !dbg !22 + %10 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !39 + %guardUpdated = icmp eq i64 %9, %10, !dbg !22 tail call void @llvm.assume(i1 %guardUpdated), !dbg !22 %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !22 store i64 %rawArg_a, i64* %callArgs0Addr, align 8, !dbg !22 - %19 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !22 - %20 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.foo, align 8, !dbg !22 - %21 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_foo, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !22, !tbaa !70 - %22 = icmp eq %struct.rb_callable_method_entry_struct* %21, null, !dbg !22 - br i1 %22, label %23, label %sorbet_callFuncDirect.exit, !dbg !22, !prof !63 - -23: ; preds = %15 - tail call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_foo, i64 %16) #15, !dbg !22 + %11 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !22 + %12 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.foo, align 8, !dbg !22 + %13 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_foo, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !22, !tbaa !60 + %14 = icmp eq %struct.rb_callable_method_entry_struct* %13, null, !dbg !22 + br i1 %14, label %15, label %sorbet_callFuncDirect.exit, !dbg !22, !prof !53 + +15: ; preds = %7 + tail call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_foo, i64 %8) #15, !dbg !22 br label %sorbet_callFuncDirect.exit, !dbg !22 -sorbet_callFuncDirect.exit: ; preds = %15, %23 - tail call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_foo, i64 %16, %struct.rb_iseq_struct* %20) #15, !dbg !22 - %24 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 - %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2 - %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !tbaa !27 - %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 0 - %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 2 - %29 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %28, align 8, !tbaa !31 - %30 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %29, i64 0, i32 2 - %31 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %30, align 8, !tbaa !34 - %32 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %31, i64 0, i32 2 - %33 = load i64*, i64** %32, align 8, !tbaa !36 - %34 = getelementptr inbounds i64, i64* %33, i64 1 - store i64* %34, i64** %27, align 8, !tbaa !25 - %rawArg_n.i = load i64, i64* %19, align 8, !dbg !76 - %35 = and i64 %rawArg_n.i, 1, !dbg !78 - %36 = icmp eq i64 %35, 0, !dbg !78 - br i1 %36, label %37, label %afterFinalCall_foo, !dbg !78, !prof !63 - -37: ; preds = %sorbet_callFuncDirect.exit - %38 = and i64 %rawArg_n.i, 7, !dbg !78 - %39 = icmp ne i64 %38, 0, !dbg !78 - %40 = and i64 %rawArg_n.i, -9, !dbg !78 - %41 = icmp eq i64 %40, 0, !dbg !78 - %42 = or i1 %39, %41, !dbg !78 - br i1 %42, label %codeRepl, label %sorbet_isa_Integer.exit.i, !dbg !78, !prof !64 - -sorbet_isa_Integer.exit.i: ; preds = %37 - %43 = inttoptr i64 %rawArg_n.i to %struct.iseq_inline_iv_cache_entry*, !dbg !78 - %44 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %43, i64 0, i32 0, !dbg !78 - %45 = load i64, i64* %44, align 8, !dbg !78, !tbaa !65 - %46 = and i64 %45, 31, !dbg !78 - %47 = icmp eq i64 %46, 10, !dbg !78 - br i1 %47, label %afterFinalCall_foo, label %codeRepl, !dbg !78, !prof !67 - -codeRepl: ; preds = %37, %sorbet_isa_Integer.exit.i - tail call fastcc void @"func_B#caller.cold.1"(i64 %rawArg_n.i) #16, !dbg !78 +sorbet_callFuncDirect.exit: ; preds = %7, %15 + tail call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_foo, i64 %8, %struct.rb_iseq_struct* %12) #15, !dbg !22 + %16 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !25 + %17 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %16, i64 0, i32 2 + %18 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %17, align 8, !tbaa !27 + %19 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %18, i64 0, i32 0 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %19, align 8, !tbaa !25 + %rawArg_n.i = load i64, i64* %11, align 8, !dbg !66 + %20 = and i64 %rawArg_n.i, 1, !dbg !68 + %21 = icmp eq i64 %20, 0, !dbg !68 + br i1 %21, label %22, label %afterFinalCall_foo, !dbg !68, !prof !53 + +22: ; preds = %sorbet_callFuncDirect.exit + %23 = and i64 %rawArg_n.i, 7, !dbg !68 + %24 = icmp ne i64 %23, 0, !dbg !68 + %25 = and i64 %rawArg_n.i, -9, !dbg !68 + %26 = icmp eq i64 %25, 0, !dbg !68 + %27 = or i1 %24, %26, !dbg !68 + br i1 %27, label %codeRepl, label %sorbet_isa_Integer.exit.i, !dbg !68, !prof !54 + +sorbet_isa_Integer.exit.i: ; preds = %22 + %28 = inttoptr i64 %rawArg_n.i to %struct.iseq_inline_iv_cache_entry*, !dbg !68 + %29 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %28, i64 0, i32 0, !dbg !68 + %30 = load i64, i64* %29, align 8, !dbg !68, !tbaa !55 + %31 = and i64 %30, 31, !dbg !68 + %32 = icmp eq i64 %31, 10, !dbg !68 + br i1 %32, label %afterFinalCall_foo, label %codeRepl, !dbg !68, !prof !57 + +codeRepl: ; preds = %22, %sorbet_isa_Integer.exit.i + tail call fastcc void @"func_B#caller.cold.1"(i64 %rawArg_n.i) #16, !dbg !68 unreachable afterFinalCall_foo: ; preds = %sorbet_isa_Integer.exit.i, %sorbet_callFuncDirect.exit - %48 = getelementptr inbounds i64, i64* %34, i64 1, !dbg !78 - store i64* %48, i64** %27, align 8, !dbg !78, !tbaa !25 + store i64* getelementptr inbounds ([16 x i64], [16 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %19, align 8, !dbg !68, !tbaa !25 tail call void @sorbet_popRubyStack() #15, !dbg !22 ret i64 %rawArg_n.i } @@ -644,17 +603,17 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #5 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #5 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @func_A.foo.cold.1(i64 %rawArg_n) unnamed_addr #10 !dbg !79 { +define internal fastcc void @func_A.foo.cold.1(i64 %rawArg_n) unnamed_addr #10 !dbg !69 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_n, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !81 - unreachable, !dbg !81 + tail call void @sorbet_cast_failure(i64 %rawArg_n, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !71 + unreachable, !dbg !71 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_B#caller.cold.1"(i64 %rawArg_n.i) unnamed_addr #10 !dbg !82 { +define internal fastcc void @"func_B#caller.cold.1"(i64 %rawArg_n.i) unnamed_addr #10 !dbg !72 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_n.i, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #14, !dbg !83 - unreachable, !dbg !83 + tail call void @sorbet_cast_failure(i64 %rawArg_n.i, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #14, !dbg !73 + unreachable, !dbg !73 } ; Function Attrs: nofree nosync nounwind willreturn @@ -664,7 +623,7 @@ declare void @llvm.assume(i1 noundef) #11 define linkonce void @const_recompute_A() local_unnamed_addr #12 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !50 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !39 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -673,7 +632,7 @@ define linkonce void @const_recompute_A() local_unnamed_addr #12 { define linkonce void @const_recompute_B() local_unnamed_addr #12 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_B, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_B, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !50 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !39 store i64 %2, i64* @guard_epoch_B, align 8 ret void } @@ -733,53 +692,43 @@ attributes #16 = { noinline } !31 = !{!32, !26, i64 16} !32 = !{!"rb_control_frame_struct", !26, i64 0, !26, i64 8, !26, i64 16, !5, i64 24, !26, i64 32, !26, i64 40, !26, i64 48} !33 = !{!32, !26, i64 32} -!34 = !{!35, !26, i64 16} -!35 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !26, i64 16, !6, i64 24} -!36 = !{!37, !26, i64 8} -!37 = !{!"rb_iseq_constant_body", !6, i64 0, !29, i64 4, !26, i64 8, !38, i64 16, !40, i64 64, !43, i64 120, !26, i64 152, !26, i64 160, !26, i64 168, !26, i64 176, !26, i64 184, !26, i64 192, !44, i64 200, !29, i64 232, !29, i64 236, !29, i64 240, !29, i64 244, !29, i64 248, !6, i64 252, !5, i64 256} -!38 = !{!"", !39, i64 0, !29, i64 4, !29, i64 8, !29, i64 12, !29, i64 16, !29, i64 20, !29, i64 24, !29, i64 28, !26, i64 32, !26, i64 40} -!39 = !{!"", !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 1, !29, i64 1} -!40 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !29, i64 32, !41, i64 36} -!41 = !{!"rb_code_location_struct", !42, i64 0, !42, i64 8} -!42 = !{!"rb_code_position_struct", !29, i64 0, !29, i64 4} -!43 = !{!"iseq_insn_info", !26, i64 0, !26, i64 8, !29, i64 16, !26, i64 24} -!44 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !26, i64 24} -!45 = !DILocation(line: 0, scope: !14) -!46 = !DILocation(line: 5, column: 1, scope: !14) -!47 = !DILocation(line: 0, scope: !9, inlinedAt: !13) -!48 = !DILocation(line: 6, column: 30, scope: !9, inlinedAt: !13) -!49 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) -!50 = !{!51, !51, i64 0} -!51 = !{!"long long", !6, i64 0} -!52 = !{!"branch_weights", i32 1, i32 10000} -!53 = !{!54, !29, i64 8} -!54 = !{!"rb_sorbet_param_struct", !39, i64 0, !29, i64 4, !29, i64 8, !29, i64 12, !29, i64 16, !29, i64 20, !29, i64 24, !29, i64 28, !26, i64 32, !29, i64 40, !29, i64 44, !29, i64 48, !29, i64 52, !26, i64 56} -!55 = !{!54, !29, i64 4} -!56 = !{!54, !26, i64 32} -!57 = !DILocation(line: 11, column: 1, scope: !14) -!58 = !DILocation(line: 0, scope: !16, inlinedAt: !17) -!59 = distinct !DISubprogram(name: "A.foo", linkageName: "func_A.foo", scope: null, file: !2, line: 7, type: !10, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!60 = !DILocation(line: 7, column: 3, scope: !59) -!61 = !{!"branch_weights", i32 4001, i32 4000000} -!62 = !DILocation(line: 7, column: 16, scope: !59) -!63 = !{!"branch_weights", i32 1, i32 2000} -!64 = !{!"branch_weights", i32 1073205, i32 2146410443} -!65 = !{!66, !5, i64 0} -!66 = !{!"RBasic", !5, i64 0, !5, i64 8} -!67 = !{!"branch_weights", i32 2000, i32 1} -!68 = !DILocation(line: 12, column: 1, scope: !23) -!69 = !DILocation(line: 12, column: 12, scope: !23) -!70 = !{!71, !26, i64 32} -!71 = !{!"FunctionInlineCache", !72, i64 0} -!72 = !{!"rb_kwarg_call_data", !73, i64 0, !74, i64 64} -!73 = !{!"rb_call_cache", !51, i64 0, !6, i64 8, !26, i64 32, !5, i64 40, !26, i64 48, !6, i64 56} -!74 = !{!"rb_call_info_with_kwarg", !75, i64 0, !26, i64 16} -!75 = !{!"rb_call_info", !5, i64 0, !29, i64 8, !29, i64 12} -!76 = !DILocation(line: 7, column: 3, scope: !59, inlinedAt: !77) -!77 = distinct !DILocation(line: 13, column: 3, scope: !23) -!78 = !DILocation(line: 7, column: 16, scope: !59, inlinedAt: !77) -!79 = distinct !DISubprogram(name: "func_A.foo.cold.1", linkageName: "func_A.foo.cold.1", scope: null, file: !2, type: !80, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!80 = !DISubroutineType(types: !3) -!81 = !DILocation(line: 7, column: 16, scope: !79) -!82 = distinct !DISubprogram(name: "func_B#caller.cold.1", linkageName: "func_B#caller.cold.1", scope: null, file: !2, type: !80, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!83 = !DILocation(line: 7, column: 16, scope: !82) +!34 = !DILocation(line: 0, scope: !14) +!35 = !DILocation(line: 5, column: 1, scope: !14) +!36 = !DILocation(line: 0, scope: !9, inlinedAt: !13) +!37 = !DILocation(line: 6, column: 30, scope: !9, inlinedAt: !13) +!38 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) +!39 = !{!40, !40, i64 0} +!40 = !{!"long long", !6, i64 0} +!41 = !{!"branch_weights", i32 1, i32 10000} +!42 = !{!43, !29, i64 8} +!43 = !{!"rb_sorbet_param_struct", !44, i64 0, !29, i64 4, !29, i64 8, !29, i64 12, !29, i64 16, !29, i64 20, !29, i64 24, !29, i64 28, !26, i64 32, !29, i64 40, !29, i64 44, !29, i64 48, !29, i64 52, !26, i64 56} +!44 = !{!"", !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 0, !29, i64 1, !29, i64 1} +!45 = !{!43, !29, i64 4} +!46 = !{!43, !26, i64 32} +!47 = !DILocation(line: 11, column: 1, scope: !14) +!48 = !DILocation(line: 0, scope: !16, inlinedAt: !17) +!49 = distinct !DISubprogram(name: "A.foo", linkageName: "func_A.foo", scope: null, file: !2, line: 7, type: !10, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!50 = !DILocation(line: 7, column: 3, scope: !49) +!51 = !{!"branch_weights", i32 4001, i32 4000000} +!52 = !DILocation(line: 7, column: 16, scope: !49) +!53 = !{!"branch_weights", i32 1, i32 2000} +!54 = !{!"branch_weights", i32 1073205, i32 2146410443} +!55 = !{!56, !5, i64 0} +!56 = !{!"RBasic", !5, i64 0, !5, i64 8} +!57 = !{!"branch_weights", i32 2000, i32 1} +!58 = !DILocation(line: 12, column: 1, scope: !23) +!59 = !DILocation(line: 12, column: 12, scope: !23) +!60 = !{!61, !26, i64 32} +!61 = !{!"FunctionInlineCache", !62, i64 0} +!62 = !{!"rb_kwarg_call_data", !63, i64 0, !64, i64 64} +!63 = !{!"rb_call_cache", !40, i64 0, !6, i64 8, !26, i64 32, !5, i64 40, !26, i64 48, !6, i64 56} +!64 = !{!"rb_call_info_with_kwarg", !65, i64 0, !26, i64 16} +!65 = !{!"rb_call_info", !5, i64 0, !29, i64 8, !29, i64 12} +!66 = !DILocation(line: 7, column: 3, scope: !49, inlinedAt: !67) +!67 = distinct !DILocation(line: 13, column: 3, scope: !23) +!68 = !DILocation(line: 7, column: 16, scope: !49, inlinedAt: !67) +!69 = distinct !DISubprogram(name: "func_A.foo.cold.1", linkageName: "func_A.foo.cold.1", scope: null, file: !2, type: !70, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!70 = !DISubroutineType(types: !3) +!71 = !DILocation(line: 7, column: 16, scope: !69) +!72 = distinct !DISubprogram(name: "func_B#caller.cold.1", linkageName: "func_B#caller.cold.1", scope: null, file: !2, type: !70, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!73 = !DILocation(line: 7, column: 16, scope: !72) diff --git a/test/testdata/compiler/casts.llo.exp b/test/testdata/compiler/casts.llo.exp index 08791c70001..d1a0be65231 100644 --- a/test/testdata/compiler/casts.llo.exp +++ b/test/testdata/compiler/casts.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_fooAll = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/casts.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/casts.rb" = private unnamed_addr constant [32 x i8] c"test/testdata/compiler/casts.rb\00", align 1 +@iseqEncodedArray = internal global [30 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_Kernel = private unnamed_addr constant [7 x i8] c"Kernel\00", align 1 @str_T.cast = private unnamed_addr constant [7 x i8] c"T.cast\00", align 1 @"stackFramePrecomputed_func_Object#fooAny1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @@ -144,7 +148,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_readRealpath() local_unnamed_addr #2 @@ -217,299 +223,259 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !31 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !18 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !18 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !18 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !31 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !33 - store i64* %11, i64** %3, align 8, !dbg !33, !tbaa !12 - %12 = load i64, i64* @rb_mKernel, align 8, !dbg !34 - %13 = tail call i64 @rb_obj_is_kind_of(i64 %rawArg_arg, i64 %12), !dbg !34 - %14 = icmp eq i64 %13, 20, !dbg !34 - br i1 %14, label %typeTestSuccess, label %codeRepl, !dbg !34, !prof !35 + %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !18 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !dbg !20, !tbaa !12 + %4 = load i64, i64* @rb_mKernel, align 8, !dbg !21 + %5 = tail call i64 @rb_obj_is_kind_of(i64 %rawArg_arg, i64 %4), !dbg !21 + %6 = icmp eq i64 %5, 20, !dbg !21 + br i1 %6, label %typeTestSuccess, label %codeRepl, !dbg !21, !prof !22 typeTestSuccess: ; preds = %fillRequiredArgs ret i64 %rawArg_arg codeRepl: ; preds = %fillRequiredArgs - tail call fastcc void @"func_Object#fooAll.cold.1"(i64 %rawArg_arg) #16, !dbg !34 + tail call fastcc void @"func_Object#fooAll.cold.1"(i64 %rawArg_arg) #16, !dbg !21 unreachable } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#fooAny1"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !36 { +define i64 @"func_Object#fooAny1"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !23 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !37 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !37 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !37 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !37, !prof !32 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !24 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !24 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !24 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !24, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !37 - unreachable, !dbg !37 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !24 + unreachable, !dbg !24 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !37 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !38 - store i64* %11, i64** %3, align 8, !dbg !38, !tbaa !12 - %12 = and i64 %rawArg_arg, 1, !dbg !39 - %13 = icmp eq i64 %12, 0, !dbg !39 - br i1 %13, label %14, label %typeTestSuccess, !dbg !39, !prof !40 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %rawArg_arg, 7, !dbg !39 - %16 = icmp ne i64 %15, 0, !dbg !39 - %17 = and i64 %rawArg_arg, -9, !dbg !39 - %18 = icmp eq i64 %17, 0, !dbg !39 - %19 = or i1 %16, %18, !dbg !39 - br i1 %19, label %orRight, label %sorbet_isa_Integer.exit, !dbg !39 - -sorbet_isa_Integer.exit: ; preds = %14 - %20 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !39 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !39 - %22 = load i64, i64* %21, align 8, !dbg !39, !tbaa !41 - %23 = and i64 %22, 31, !dbg !39 - %24 = and i64 %rawArg_arg, 3, !dbg !39 - %25 = icmp eq i64 %24, 2, !dbg !39 - br i1 %25, label %typeTestSuccess, label %switch.early.test, !dbg !39 + %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !24 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !dbg !25, !tbaa !12 + %4 = and i64 %rawArg_arg, 1, !dbg !26 + %5 = icmp eq i64 %4, 0, !dbg !26 + br i1 %5, label %6, label %typeTestSuccess, !dbg !26, !prof !27 + +6: ; preds = %fillRequiredArgs + %7 = and i64 %rawArg_arg, 7, !dbg !26 + %8 = icmp ne i64 %7, 0, !dbg !26 + %9 = and i64 %rawArg_arg, -9, !dbg !26 + %10 = icmp eq i64 %9, 0, !dbg !26 + %11 = or i1 %8, %10, !dbg !26 + br i1 %11, label %orRight, label %sorbet_isa_Integer.exit, !dbg !26 + +sorbet_isa_Integer.exit: ; preds = %6 + %12 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !26 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !26 + %14 = load i64, i64* %13, align 8, !dbg !26, !tbaa !28 + %15 = and i64 %14, 31, !dbg !26 + %16 = and i64 %rawArg_arg, 3, !dbg !26 + %17 = icmp eq i64 %16, 2, !dbg !26 + br i1 %17, label %typeTestSuccess, label %switch.early.test, !dbg !26 switch.early.test: ; preds = %sorbet_isa_Integer.exit - switch i64 %23, label %codeRepl [ + switch i64 %15, label %codeRepl [ i64 10, label %typeTestSuccess i64 4, label %typeTestSuccess - ], !dbg !39 + ], !dbg !26 -orRight: ; preds = %14 - %26 = and i64 %rawArg_arg, 3, !dbg !39 - %27 = icmp eq i64 %26, 2, !dbg !39 - br i1 %27, label %typeTestSuccess, label %codeRepl, !dbg !39 +orRight: ; preds = %6 + %18 = and i64 %rawArg_arg, 3, !dbg !26 + %19 = icmp eq i64 %18, 2, !dbg !26 + br i1 %19, label %typeTestSuccess, label %codeRepl, !dbg !26 typeTestSuccess: ; preds = %switch.early.test, %switch.early.test, %sorbet_isa_Integer.exit, %orRight, %fillRequiredArgs ret i64 %rawArg_arg codeRepl: ; preds = %switch.early.test, %orRight - tail call fastcc void @"func_Object#fooAny1.cold.1"(i64 %rawArg_arg) #16, !dbg !39 + tail call fastcc void @"func_Object#fooAny1.cold.1"(i64 %rawArg_arg) #16, !dbg !26 unreachable } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#fooAny2"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !43 { +define i64 @"func_Object#fooAny2"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !30 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !44 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !44 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !44 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !44, !prof !32 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !31 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !44 - unreachable, !dbg !44 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !31 + unreachable, !dbg !31 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !44 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !45 - store i64* %11, i64** %3, align 8, !dbg !45, !tbaa !12 - %12 = and i64 %rawArg_arg, 3, !dbg !46 - %13 = icmp eq i64 %12, 2, !dbg !46 - br i1 %13, label %typeTestSuccess, label %14, !dbg !46 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %rawArg_arg, 7, !dbg !46 - %16 = icmp ne i64 %15, 0, !dbg !46 - %17 = and i64 %rawArg_arg, -9, !dbg !46 - %18 = icmp eq i64 %17, 0, !dbg !46 - %19 = or i1 %16, %18, !dbg !46 - br i1 %19, label %orRight, label %sorbet_isa_Float.exit, !dbg !46 - -sorbet_isa_Float.exit: ; preds = %14 - %20 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !46 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !46 - %22 = load i64, i64* %21, align 8, !dbg !46, !tbaa !41 - %23 = and i64 %22, 31, !dbg !46 - %24 = icmp ne i64 %23, 4, !dbg !46 - %25 = and i64 %rawArg_arg, 1, !dbg !46 - %26 = icmp eq i64 %25, 0, !dbg !46 - %or.cond18 = and i1 %24, %26, !dbg !46 - %or.cond18.not = xor i1 %or.cond18, true, !dbg !46 - %27 = icmp eq i64 %23, 10, !dbg !46 - %or.cond19 = or i1 %or.cond18.not, %27, !dbg !46 - br i1 %or.cond19, label %typeTestSuccess, label %codeRepl, !dbg !46, !prof !47 - -orRight: ; preds = %14 - %28 = and i64 %rawArg_arg, 1, !dbg !46 - %29 = icmp eq i64 %28, 0, !dbg !46 - br i1 %29, label %codeRepl, label %typeTestSuccess, !dbg !46, !prof !40 + %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !31 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %3, align 8, !dbg !32, !tbaa !12 + %4 = and i64 %rawArg_arg, 3, !dbg !33 + %5 = icmp eq i64 %4, 2, !dbg !33 + br i1 %5, label %typeTestSuccess, label %6, !dbg !33 + +6: ; preds = %fillRequiredArgs + %7 = and i64 %rawArg_arg, 7, !dbg !33 + %8 = icmp ne i64 %7, 0, !dbg !33 + %9 = and i64 %rawArg_arg, -9, !dbg !33 + %10 = icmp eq i64 %9, 0, !dbg !33 + %11 = or i1 %8, %10, !dbg !33 + br i1 %11, label %orRight, label %sorbet_isa_Float.exit, !dbg !33 + +sorbet_isa_Float.exit: ; preds = %6 + %12 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !33 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !33 + %14 = load i64, i64* %13, align 8, !dbg !33, !tbaa !28 + %15 = and i64 %14, 31, !dbg !33 + %16 = icmp ne i64 %15, 4, !dbg !33 + %17 = and i64 %rawArg_arg, 1, !dbg !33 + %18 = icmp eq i64 %17, 0, !dbg !33 + %or.cond16 = and i1 %16, %18, !dbg !33 + %or.cond16.not = xor i1 %or.cond16, true, !dbg !33 + %19 = icmp eq i64 %15, 10, !dbg !33 + %or.cond17 = or i1 %or.cond16.not, %19, !dbg !33 + br i1 %or.cond17, label %typeTestSuccess, label %codeRepl, !dbg !33, !prof !34 + +orRight: ; preds = %6 + %20 = and i64 %rawArg_arg, 1, !dbg !33 + %21 = icmp eq i64 %20, 0, !dbg !33 + br i1 %21, label %codeRepl, label %typeTestSuccess, !dbg !33, !prof !27 typeTestSuccess: ; preds = %orRight, %fillRequiredArgs, %sorbet_isa_Float.exit ret i64 %rawArg_arg codeRepl: ; preds = %sorbet_isa_Float.exit, %orRight - tail call fastcc void @"func_Object#fooAny2.cold.1"(i64 %rawArg_arg) #16, !dbg !46 + tail call fastcc void @"func_Object#fooAny2.cold.1"(i64 %rawArg_arg) #16, !dbg !33 unreachable } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#fooInt"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !48 { +define i64 @"func_Object#fooInt"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !35 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !49 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !49 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !49 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !49, !prof !32 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !36 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !36 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !36 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !36, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !49 - unreachable, !dbg !49 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !36 + unreachable, !dbg !36 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !49 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !50 - store i64* %11, i64** %3, align 8, !dbg !50, !tbaa !12 - %12 = and i64 %rawArg_arg, 1, !dbg !51 - %13 = icmp eq i64 %12, 0, !dbg !51 - br i1 %13, label %14, label %25, !dbg !51, !prof !40 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %rawArg_arg, 7, !dbg !51 - %16 = icmp ne i64 %15, 0, !dbg !51 - %17 = and i64 %rawArg_arg, -9, !dbg !51 - %18 = icmp eq i64 %17, 0, !dbg !51 - %19 = or i1 %16, %18, !dbg !51 - br i1 %19, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !51, !prof !52 - -sorbet_isa_Integer.exit: ; preds = %14 - %20 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !51 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !51 - %22 = load i64, i64* %21, align 8, !dbg !51, !tbaa !41 - %23 = and i64 %22, 31, !dbg !51 - %24 = icmp eq i64 %23, 10, !dbg !51 - br i1 %24, label %34, label %codeRepl, !dbg !51, !prof !35 - -codeRepl: ; preds = %sorbet_isa_Integer.exit, %14 - tail call fastcc void @"func_Object#fooInt.cold.1"(i64 %rawArg_arg) #16, !dbg !51 + %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !36 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %3, align 8, !dbg !37, !tbaa !12 + %4 = and i64 %rawArg_arg, 1, !dbg !38 + %5 = icmp eq i64 %4, 0, !dbg !38 + br i1 %5, label %6, label %17, !dbg !38, !prof !27 + +6: ; preds = %fillRequiredArgs + %7 = and i64 %rawArg_arg, 7, !dbg !38 + %8 = icmp ne i64 %7, 0, !dbg !38 + %9 = and i64 %rawArg_arg, -9, !dbg !38 + %10 = icmp eq i64 %9, 0, !dbg !38 + %11 = or i1 %8, %10, !dbg !38 + br i1 %11, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !38, !prof !39 + +sorbet_isa_Integer.exit: ; preds = %6 + %12 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !38 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !38 + %14 = load i64, i64* %13, align 8, !dbg !38, !tbaa !28 + %15 = and i64 %14, 31, !dbg !38 + %16 = icmp eq i64 %15, 10, !dbg !38 + br i1 %16, label %26, label %codeRepl, !dbg !38, !prof !22 + +codeRepl: ; preds = %sorbet_isa_Integer.exit, %6 + tail call fastcc void @"func_Object#fooInt.cold.1"(i64 %rawArg_arg) #16, !dbg !38 unreachable -25: ; preds = %fillRequiredArgs - tail call void @llvm.experimental.noalias.scope.decl(metadata !53), !dbg !51 - %26 = add nsw i64 %rawArg_arg, -1, !dbg !51 - %27 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %rawArg_arg, i64 %26) #17, !dbg !51 - %28 = extractvalue { i64, i1 } %27, 1, !dbg !51 - %29 = extractvalue { i64, i1 } %27, 0, !dbg !51 - br i1 %28, label %30, label %sorbet_rb_int_plus.exit, !dbg !51 - -30: ; preds = %25 - %31 = ashr i64 %29, 1, !dbg !51 - %32 = xor i64 %31, -9223372036854775808, !dbg !51 - %33 = tail call i64 @rb_int2big(i64 %32) #18, !dbg !51, !noalias !53 - br label %sorbet_rb_int_plus.exit, !dbg !51 - -34: ; preds = %sorbet_isa_Integer.exit - tail call void @llvm.experimental.noalias.scope.decl(metadata !56), !dbg !51 - %35 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %rawArg_arg, i64 %rawArg_arg) #18, !dbg !51, !noalias !53 - br label %sorbet_rb_int_plus.exit, !dbg !51 - -sorbet_rb_int_plus.exit: ; preds = %30, %25, %34 - %36 = phi i64 [ %35, %34 ], [ %33, %30 ], [ %29, %25 ], !dbg !51 - ret i64 %36 +17: ; preds = %fillRequiredArgs + tail call void @llvm.experimental.noalias.scope.decl(metadata !40), !dbg !38 + %18 = add nsw i64 %rawArg_arg, -1, !dbg !38 + %19 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %rawArg_arg, i64 %18) #17, !dbg !38 + %20 = extractvalue { i64, i1 } %19, 1, !dbg !38 + %21 = extractvalue { i64, i1 } %19, 0, !dbg !38 + br i1 %20, label %22, label %sorbet_rb_int_plus.exit, !dbg !38 + +22: ; preds = %17 + %23 = ashr i64 %21, 1, !dbg !38 + %24 = xor i64 %23, -9223372036854775808, !dbg !38 + %25 = tail call i64 @rb_int2big(i64 %24) #18, !dbg !38, !noalias !40 + br label %sorbet_rb_int_plus.exit, !dbg !38 + +26: ; preds = %sorbet_isa_Integer.exit + tail call void @llvm.experimental.noalias.scope.decl(metadata !43), !dbg !38 + %27 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %rawArg_arg, i64 %rawArg_arg) #18, !dbg !38, !noalias !40 + br label %sorbet_rb_int_plus.exit, !dbg !38 + +sorbet_rb_int_plus.exit: ; preds = %22, %17, %26 + %28 = phi i64 [ %27, %26 ], [ %25, %22 ], [ %21, %17 ], !dbg !38 + ret i64 %28 } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#fooArray"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !58 { +define i64 @"func_Object#fooArray"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !45 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !59 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !59 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !59 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !59, !prof !32 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 21), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !46 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !46 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !46 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !46, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !59 - unreachable, !dbg !59 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !46 + unreachable, !dbg !46 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !59 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !60 - store i64* %11, i64** %3, align 8, !dbg !60, !tbaa !12 - %12 = and i64 %rawArg_arg, 7, !dbg !61 - %13 = icmp ne i64 %12, 0, !dbg !61 - %14 = and i64 %rawArg_arg, -9, !dbg !61 - %15 = icmp eq i64 %14, 0, !dbg !61 - %16 = or i1 %13, %15, !dbg !61 - br i1 %16, label %codeRepl, label %sorbet_isa_Array.exit, !dbg !61, !prof !52 + %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !46 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 22), i64** %3, align 8, !dbg !47, !tbaa !12 + %4 = and i64 %rawArg_arg, 7, !dbg !48 + %5 = icmp ne i64 %4, 0, !dbg !48 + %6 = and i64 %rawArg_arg, -9, !dbg !48 + %7 = icmp eq i64 %6, 0, !dbg !48 + %8 = or i1 %5, %7, !dbg !48 + br i1 %8, label %codeRepl, label %sorbet_isa_Array.exit, !dbg !48, !prof !39 sorbet_isa_Array.exit: ; preds = %fillRequiredArgs - %17 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !61 - %18 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %17, i64 0, i32 0, !dbg !61 - %19 = load i64, i64* %18, align 8, !dbg !61, !tbaa !41 - %20 = and i64 %19, 31, !dbg !61 - %21 = icmp eq i64 %20, 7, !dbg !61 - br i1 %21, label %typeTestSuccess, label %codeRepl, !dbg !61, !prof !35 + %9 = inttoptr i64 %rawArg_arg to %struct.iseq_inline_iv_cache_entry*, !dbg !48 + %10 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %9, i64 0, i32 0, !dbg !48 + %11 = load i64, i64* %10, align 8, !dbg !48, !tbaa !28 + %12 = and i64 %11, 31, !dbg !48 + %13 = icmp eq i64 %12, 7, !dbg !48 + br i1 %13, label %typeTestSuccess, label %codeRepl, !dbg !48, !prof !22 typeTestSuccess: ; preds = %sorbet_isa_Array.exit ret i64 %rawArg_arg codeRepl: ; preds = %sorbet_isa_Array.exit, %fillRequiredArgs - tail call fastcc void @"func_Object#fooArray.cold.1"(i64 %rawArg_arg) #16, !dbg !61 + tail call fastcc void @"func_Object#fooArray.cold.1"(i64 %rawArg_arg) #16, !dbg !48 unreachable } @@ -517,11 +483,11 @@ codeRepl: ; preds = %sorbet_isa_Array.ex define void @Init_casts() local_unnamed_addr #10 { entry: %callArgs.i = alloca [4 x i64], align 8 - %positional_table.i = alloca i64, align 8, !dbg !62 - %positional_table88.i = alloca i64, align 8, !dbg !64 - %positional_table106.i = alloca i64, align 8, !dbg !65 - %positional_table124.i = alloca i64, align 8, !dbg !66 - %positional_table142.i = alloca i64, align 8, !dbg !67 + %positional_table.i = alloca i64, align 8, !dbg !49 + %positional_table88.i = alloca i64, align 8, !dbg !51 + %positional_table106.i = alloca i64, align 8, !dbg !52 + %positional_table124.i = alloca i64, align 8, !dbg !53 + %positional_table142.i = alloca i64, align 8, !dbg !54 %locals.i42.i = alloca i64, i32 0, align 8 %locals.i40.i = alloca i64, i32 0, align 8 %locals.i38.i = alloca i64, i32 0, align 8 @@ -558,75 +524,77 @@ entry: %13 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([32 x i8], [32 x i8]* @"str_test/testdata/compiler/casts.rb", i64 0, i64 0), i64 noundef 31) #18 tail call void @rb_gc_register_mark_object(i64 %13) #18 store i64 %13, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 30) %rubyId_fooAll.i.i = load i64, i64* @rubyIdPrecomputed_fooAll, align 8 %rubyStr_fooAll.i.i = load i64, i64* @rubyStrFrozen_fooAll, align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_fooAll.i.i, i64 %rubyId_fooAll.i.i, i64 %13, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 7, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 0) + %"rubyStr_test/testdata/compiler/casts.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_fooAll.i.i, i64 %rubyId_fooAll.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAll", align 8 %15 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_fooAny1, i64 0, i64 0), i64 noundef 7) #18 call void @rb_gc_register_mark_object(i64 %15) #18 %rubyId_fooAny1.i.i = load i64, i64* @rubyIdPrecomputed_fooAny1, align 8 %"rubyStr_test/testdata/compiler/casts.rb.i33.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_fooAny1.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i33.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 9, i32 noundef 11, i64* noundef nonnull %locals.i34.i, i32 noundef 0, i32 noundef 0) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_fooAny1.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i33.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i34.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAny1", align 8 %17 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_fooAny2, i64 0, i64 0), i64 noundef 7) #18 call void @rb_gc_register_mark_object(i64 %17) #18 %rubyId_fooAny2.i.i = load i64, i64* @rubyIdPrecomputed_fooAny2, align 8 %"rubyStr_test/testdata/compiler/casts.rb.i35.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %rubyId_fooAny2.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i35.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 13, i32 noundef 15, i64* noundef nonnull %locals.i36.i, i32 noundef 0, i32 noundef 0) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %rubyId_fooAny2.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i35.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i36.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAny2", align 8 %19 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_fooInt, i64 0, i64 0), i64 noundef 6) #18 call void @rb_gc_register_mark_object(i64 %19) #18 %rubyId_fooInt.i.i = load i64, i64* @rubyIdPrecomputed_fooInt, align 8 %"rubyStr_test/testdata/compiler/casts.rb.i37.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 - %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %rubyId_fooInt.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i37.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 17, i32 noundef 19, i64* noundef nonnull %locals.i38.i, i32 noundef 0, i32 noundef 2) + %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %rubyId_fooInt.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i37.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i38.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %20, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooInt", align 8 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !51 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !51 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !38 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !38 %21 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_fooArray, i64 0, i64 0), i64 noundef 8) #18 call void @rb_gc_register_mark_object(i64 %21) #18 %rubyId_fooArray.i.i = load i64, i64* @rubyIdPrecomputed_fooArray, align 8 %"rubyStr_test/testdata/compiler/casts.rb.i39.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 - %22 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %21, i64 %rubyId_fooArray.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i39.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 21, i32 noundef 23, i64* noundef nonnull %locals.i40.i, i32 noundef 0, i32 noundef 0) + %22 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %21, i64 %rubyId_fooArray.i.i, i64 %"rubyStr_test/testdata/compiler/casts.rb.i39.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i40.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %22, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooArray", align 8 %23 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #18 call void @rb_gc_register_mark_object(i64 %23) #18 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/casts.rb.i41.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/casts.rb", align 8 - %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %23, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/casts.rb.i41.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 29, i64* noundef nonnull %locals.i42.i, i32 noundef 0, i32 noundef 4) + %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %23, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/casts.rb.i41.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i42.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %24, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !62 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !62 - %rubyId_keep_def2.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !64 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.1, i64 %rubyId_keep_def2.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !64 - %rubyId_keep_def4.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !65 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.2, i64 %rubyId_keep_def4.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !65 - %rubyId_keep_def6.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !66 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.3, i64 %rubyId_keep_def6.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !66 - %rubyId_keep_def8.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !67 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.4, i64 %rubyId_keep_def8.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !67 - %rubyId_fooInt.i = load i64, i64* @rubyIdPrecomputed_fooInt, align 8, !dbg !68 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooInt, i64 %rubyId_fooInt.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !68 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !69 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !69 - %rubyId_fooAny1.i = load i64, i64* @rubyIdPrecomputed_fooAny1, align 8, !dbg !70 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooAny1, i64 %rubyId_fooAny1.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !70 - %rubyId_puts15.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !71 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 %rubyId_puts15.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !71 - %rubyId_fooAny2.i = load i64, i64* @rubyIdPrecomputed_fooAny2, align 8, !dbg !72 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooAny2, i64 %rubyId_fooAny2.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !72 - %rubyId_puts20.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !73 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 %rubyId_puts20.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !73 - %rubyId_fooAll.i = load i64, i64* @rubyIdPrecomputed_fooAll, align 8, !dbg !74 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooAll, i64 %rubyId_fooAll.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !74 - %rubyId_puts25.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !75 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 %rubyId_puts25.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !75 - %rubyId_fooArray.i = load i64, i64* @rubyIdPrecomputed_fooArray, align 8, !dbg !76 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooArray, i64 %rubyId_fooArray.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !76 - %rubyId_puts30.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !77 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.8, i64 %rubyId_puts30.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !77 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !49 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !49 + %rubyId_keep_def2.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !51 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.1, i64 %rubyId_keep_def2.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !51 + %rubyId_keep_def4.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !52 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.2, i64 %rubyId_keep_def4.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !52 + %rubyId_keep_def6.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !53 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.3, i64 %rubyId_keep_def6.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !53 + %rubyId_keep_def8.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !54 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.4, i64 %rubyId_keep_def8.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !54 + %rubyId_fooInt.i = load i64, i64* @rubyIdPrecomputed_fooInt, align 8, !dbg !55 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooInt, i64 %rubyId_fooInt.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !55 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !56 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !56 + %rubyId_fooAny1.i = load i64, i64* @rubyIdPrecomputed_fooAny1, align 8, !dbg !57 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooAny1, i64 %rubyId_fooAny1.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !57 + %rubyId_puts15.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !58 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 %rubyId_puts15.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !58 + %rubyId_fooAny2.i = load i64, i64* @rubyIdPrecomputed_fooAny2, align 8, !dbg !59 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooAny2, i64 %rubyId_fooAny2.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !59 + %rubyId_puts20.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !60 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 %rubyId_puts20.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !60 + %rubyId_fooAll.i = load i64, i64* @rubyIdPrecomputed_fooAll, align 8, !dbg !61 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooAll, i64 %rubyId_fooAll.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !61 + %rubyId_puts25.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !62 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 %rubyId_puts25.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !62 + %rubyId_fooArray.i = load i64, i64* @rubyIdPrecomputed_fooArray, align 8, !dbg !63 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fooArray, i64 %rubyId_fooArray.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !63 + %rubyId_puts30.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !64 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.8, i64 %rubyId_puts30.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !64 %25 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %26 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %25, i64 0, i32 18 - %27 = load i64, i64* %26, align 8, !tbaa !78 + %27 = load i64, i64* %26, align 8, !tbaa !65 %28 = bitcast [4 x i64]* %callArgs.i to i8* call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %28) %29 = bitcast i64* %positional_table.i to i8* @@ -644,315 +612,290 @@ entry: %35 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %34, i64 0, i32 2 %36 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %35, align 8, !tbaa !14 %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %37, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %37, align 8, !tbaa !74 %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 4 - %39 = load i64*, i64** %38, align 8, !tbaa !87 + %39 = load i64*, i64** %38, align 8, !tbaa !76 %40 = load i64, i64* %39, align 8, !tbaa !4 %41 = and i64 %40, -33 store i64 %41, i64* %39, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %34, %struct.rb_control_frame_struct* align 8 %36, %struct.rb_iseq_struct* %stackFrame.i) #18 %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 0 - %43 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %37, align 8, !tbaa !18 - %44 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %43, i64 0, i32 2 - %45 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %44, align 8, !tbaa !20 - %46 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %45, i64 0, i32 2 - %47 = load i64*, i64** %46, align 8, !tbaa !22 - %48 = getelementptr inbounds i64, i64* %47, i64 4 - %49 = getelementptr inbounds i64, i64* %48, i64 1 - store i64* %49, i64** %42, align 8, !dbg !88, !tbaa !12 - %rubyId_fooAll.i1 = load i64, i64* @rubyIdPrecomputed_fooAll, align 8, !dbg !62 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_fooAll.i1) #18, !dbg !62 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !62 - %rawSym73.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #18, !dbg !62 - %50 = load i64, i64* @rb_cObject, align 8, !dbg !62 - %stackFrame74.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAll", align 8, !dbg !62 - %51 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !62 - %52 = bitcast i8* %51 to i16*, !dbg !62 - %53 = load i16, i16* %52, align 8, !dbg !62 - %54 = and i16 %53, -384, !dbg !62 - %55 = or i16 %54, 1, !dbg !62 - store i16 %55, i16* %52, align 8, !dbg !62 - %56 = getelementptr inbounds i8, i8* %51, i64 8, !dbg !62 - %57 = bitcast i8* %56 to i32*, !dbg !62 - store i32 1, i32* %57, align 8, !dbg !62, !tbaa !89 - %58 = getelementptr inbounds i8, i8* %51, i64 12, !dbg !62 - %59 = getelementptr inbounds i8, i8* %51, i64 4, !dbg !62 - %60 = bitcast i8* %59 to i32*, !dbg !62 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %58, i8 0, i64 20, i1 false) #18, !dbg !62 - store i32 1, i32* %60, align 4, !dbg !62, !tbaa !91 - %rubyId_arg.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !62 - store i64 %rubyId_arg.i, i64* %positional_table.i, align 8, !dbg !62 - %61 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !62 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %61, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %29, i64 noundef 8, i1 noundef false) #18, !dbg !62 - %62 = getelementptr inbounds i8, i8* %51, i64 32, !dbg !62 - %63 = bitcast i8* %62 to i8**, !dbg !62 - store i8* %61, i8** %63, align 8, !dbg !62, !tbaa !92 - %64 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_fooAll, i64 0, i64 0)) #18, !dbg !62 - %65 = bitcast i8* %51 to %struct.rb_sorbet_param_struct*, !dbg !62 - %66 = bitcast %struct.rb_iseq_struct* %stackFrame74.i to i8*, !dbg !62 - call void @rb_add_method_sorbet(i64 %50, i64 %64, i64 (i32, i64*, i64)* noundef @"func_Object#fooAll", %struct.rb_sorbet_param_struct* nonnull %65, i32 noundef 1, i8* %66) #18, !dbg !62 - %67 = getelementptr inbounds i64, i64* %47, i64 8, !dbg !62 - %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !62 - store i64* %68, i64** %42, align 8, !dbg !62, !tbaa !12 - %rubyId_fooAny1.i2 = load i64, i64* @rubyIdPrecomputed_fooAny1, align 8, !dbg !64 - %rawSym79.i = call i64 @rb_id2sym(i64 %rubyId_fooAny1.i2) #18, !dbg !64 - %rubyId_normal80.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !64 - %rawSym81.i = call i64 @rb_id2sym(i64 %rubyId_normal80.i) #18, !dbg !64 - %stackFrame86.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAny1", align 8, !dbg !64 - %69 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !64 - %70 = bitcast i8* %69 to i16*, !dbg !64 - %71 = load i16, i16* %70, align 8, !dbg !64 - %72 = and i16 %71, -384, !dbg !64 - %73 = or i16 %72, 1, !dbg !64 - store i16 %73, i16* %70, align 8, !dbg !64 - %74 = getelementptr inbounds i8, i8* %69, i64 8, !dbg !64 - %75 = bitcast i8* %74 to i32*, !dbg !64 - store i32 1, i32* %75, align 8, !dbg !64, !tbaa !89 - %76 = getelementptr inbounds i8, i8* %69, i64 12, !dbg !64 - %77 = getelementptr inbounds i8, i8* %69, i64 4, !dbg !64 - %78 = bitcast i8* %77 to i32*, !dbg !64 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %76, i8 0, i64 20, i1 false) #18, !dbg !64 - store i32 1, i32* %78, align 4, !dbg !64, !tbaa !91 - %rubyId_arg89.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !64 - store i64 %rubyId_arg89.i, i64* %positional_table88.i, align 8, !dbg !64 - %79 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !64 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %79, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %30, i64 noundef 8, i1 noundef false) #18, !dbg !64 - %80 = getelementptr inbounds i8, i8* %69, i64 32, !dbg !64 - %81 = bitcast i8* %80 to i8**, !dbg !64 - store i8* %79, i8** %81, align 8, !dbg !64, !tbaa !92 - %82 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_fooAny1, i64 0, i64 0)) #18, !dbg !64 - %83 = bitcast i8* %69 to %struct.rb_sorbet_param_struct*, !dbg !64 - %84 = bitcast %struct.rb_iseq_struct* %stackFrame86.i to i8*, !dbg !64 - call void @rb_add_method_sorbet(i64 %50, i64 %82, i64 (i32, i64*, i64)* noundef @"func_Object#fooAny1", %struct.rb_sorbet_param_struct* nonnull %83, i32 noundef 1, i8* %84) #18, !dbg !64 - %85 = getelementptr inbounds i64, i64* %47, i64 12, !dbg !64 - %86 = getelementptr inbounds i64, i64* %85, i64 1, !dbg !64 - store i64* %86, i64** %42, align 8, !dbg !64, !tbaa !12 - %rubyId_fooAny2.i3 = load i64, i64* @rubyIdPrecomputed_fooAny2, align 8, !dbg !65 - %rawSym97.i = call i64 @rb_id2sym(i64 %rubyId_fooAny2.i3) #18, !dbg !65 - %rubyId_normal98.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !65 - %rawSym99.i = call i64 @rb_id2sym(i64 %rubyId_normal98.i) #18, !dbg !65 - %stackFrame104.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAny2", align 8, !dbg !65 - %87 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !65 - %88 = bitcast i8* %87 to i16*, !dbg !65 - %89 = load i16, i16* %88, align 8, !dbg !65 - %90 = and i16 %89, -384, !dbg !65 - %91 = or i16 %90, 1, !dbg !65 - store i16 %91, i16* %88, align 8, !dbg !65 - %92 = getelementptr inbounds i8, i8* %87, i64 8, !dbg !65 - %93 = bitcast i8* %92 to i32*, !dbg !65 - store i32 1, i32* %93, align 8, !dbg !65, !tbaa !89 - %94 = getelementptr inbounds i8, i8* %87, i64 12, !dbg !65 - %95 = getelementptr inbounds i8, i8* %87, i64 4, !dbg !65 - %96 = bitcast i8* %95 to i32*, !dbg !65 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %94, i8 0, i64 20, i1 false) #18, !dbg !65 - store i32 1, i32* %96, align 4, !dbg !65, !tbaa !91 - %rubyId_arg107.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !65 - store i64 %rubyId_arg107.i, i64* %positional_table106.i, align 8, !dbg !65 - %97 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !65 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %97, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %31, i64 noundef 8, i1 noundef false) #18, !dbg !65 - %98 = getelementptr inbounds i8, i8* %87, i64 32, !dbg !65 - %99 = bitcast i8* %98 to i8**, !dbg !65 - store i8* %97, i8** %99, align 8, !dbg !65, !tbaa !92 - %100 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_fooAny2, i64 0, i64 0)) #18, !dbg !65 - %101 = bitcast i8* %87 to %struct.rb_sorbet_param_struct*, !dbg !65 - %102 = bitcast %struct.rb_iseq_struct* %stackFrame104.i to i8*, !dbg !65 - call void @rb_add_method_sorbet(i64 %50, i64 %100, i64 (i32, i64*, i64)* noundef @"func_Object#fooAny2", %struct.rb_sorbet_param_struct* nonnull %101, i32 noundef 1, i8* %102) #18, !dbg !65 - %103 = getelementptr inbounds i64, i64* %47, i64 16, !dbg !65 - %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !65 - store i64* %104, i64** %42, align 8, !dbg !65, !tbaa !12 - %rubyId_fooInt.i4 = load i64, i64* @rubyIdPrecomputed_fooInt, align 8, !dbg !66 - %rawSym115.i = call i64 @rb_id2sym(i64 %rubyId_fooInt.i4) #18, !dbg !66 - %rubyId_normal116.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !66 - %rawSym117.i = call i64 @rb_id2sym(i64 %rubyId_normal116.i) #18, !dbg !66 - %stackFrame122.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooInt", align 8, !dbg !66 - %105 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !66 - %106 = bitcast i8* %105 to i16*, !dbg !66 - %107 = load i16, i16* %106, align 8, !dbg !66 - %108 = and i16 %107, -384, !dbg !66 - %109 = or i16 %108, 1, !dbg !66 - store i16 %109, i16* %106, align 8, !dbg !66 - %110 = getelementptr inbounds i8, i8* %105, i64 8, !dbg !66 - %111 = bitcast i8* %110 to i32*, !dbg !66 - store i32 1, i32* %111, align 8, !dbg !66, !tbaa !89 - %112 = getelementptr inbounds i8, i8* %105, i64 12, !dbg !66 - %113 = getelementptr inbounds i8, i8* %105, i64 4, !dbg !66 - %114 = bitcast i8* %113 to i32*, !dbg !66 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %112, i8 0, i64 20, i1 false) #18, !dbg !66 - store i32 1, i32* %114, align 4, !dbg !66, !tbaa !91 - %rubyId_arg125.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !66 - store i64 %rubyId_arg125.i, i64* %positional_table124.i, align 8, !dbg !66 - %115 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !66 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %115, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %32, i64 noundef 8, i1 noundef false) #18, !dbg !66 - %116 = getelementptr inbounds i8, i8* %105, i64 32, !dbg !66 - %117 = bitcast i8* %116 to i8**, !dbg !66 - store i8* %115, i8** %117, align 8, !dbg !66, !tbaa !92 - %118 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_fooInt, i64 0, i64 0)) #18, !dbg !66 - %119 = bitcast i8* %105 to %struct.rb_sorbet_param_struct*, !dbg !66 - %120 = bitcast %struct.rb_iseq_struct* %stackFrame122.i to i8*, !dbg !66 - call void @rb_add_method_sorbet(i64 %50, i64 %118, i64 (i32, i64*, i64)* noundef @"func_Object#fooInt", %struct.rb_sorbet_param_struct* nonnull %119, i32 noundef 1, i8* %120) #18, !dbg !66 - %121 = getelementptr inbounds i64, i64* %47, i64 20, !dbg !66 - %122 = getelementptr inbounds i64, i64* %121, i64 1, !dbg !66 - store i64* %122, i64** %42, align 8, !dbg !66, !tbaa !12 - %rubyId_fooArray.i5 = load i64, i64* @rubyIdPrecomputed_fooArray, align 8, !dbg !67 - %rawSym133.i = call i64 @rb_id2sym(i64 %rubyId_fooArray.i5) #18, !dbg !67 - %rubyId_normal134.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !67 - %rawSym135.i = call i64 @rb_id2sym(i64 %rubyId_normal134.i) #18, !dbg !67 - %stackFrame140.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooArray", align 8, !dbg !67 - %123 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !67 - %124 = bitcast i8* %123 to i16*, !dbg !67 - %125 = load i16, i16* %124, align 8, !dbg !67 - %126 = and i16 %125, -384, !dbg !67 - %127 = or i16 %126, 1, !dbg !67 - store i16 %127, i16* %124, align 8, !dbg !67 - %128 = getelementptr inbounds i8, i8* %123, i64 8, !dbg !67 - %129 = bitcast i8* %128 to i32*, !dbg !67 - store i32 1, i32* %129, align 8, !dbg !67, !tbaa !89 - %130 = getelementptr inbounds i8, i8* %123, i64 12, !dbg !67 - %131 = getelementptr inbounds i8, i8* %123, i64 4, !dbg !67 - %132 = bitcast i8* %131 to i32*, !dbg !67 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %130, i8 0, i64 20, i1 false) #18, !dbg !67 - store i32 1, i32* %132, align 4, !dbg !67, !tbaa !91 - %rubyId_arg143.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !67 - store i64 %rubyId_arg143.i, i64* %positional_table142.i, align 8, !dbg !67 - %133 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !67 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %133, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %33, i64 noundef 8, i1 noundef false) #18, !dbg !67 - %134 = getelementptr inbounds i8, i8* %123, i64 32, !dbg !67 - %135 = bitcast i8* %134 to i8**, !dbg !67 - store i8* %133, i8** %135, align 8, !dbg !67, !tbaa !92 - %136 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_fooArray, i64 0, i64 0)) #18, !dbg !67 - %137 = bitcast i8* %123 to %struct.rb_sorbet_param_struct*, !dbg !67 - %138 = bitcast %struct.rb_iseq_struct* %stackFrame140.i to i8*, !dbg !67 - call void @rb_add_method_sorbet(i64 %50, i64 %136, i64 (i32, i64*, i64)* noundef @"func_Object#fooArray", %struct.rb_sorbet_param_struct* nonnull %137, i32 noundef 1, i8* %138) #18, !dbg !67 - %139 = getelementptr inbounds i64, i64* %47, i64 24, !dbg !67 - %140 = getelementptr inbounds i64, i64* %139, i64 1, !dbg !67 - store i64* %140, i64** %42, align 8, !dbg !67, !tbaa !12 - %141 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !12 - %142 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %141, i64 0, i32 2, !dbg !68 - %143 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %142, align 8, !dbg !68, !tbaa !14 - %144 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %143, i64 0, i32 1, !dbg !68 - %145 = load i64*, i64** %144, align 8, !dbg !68, !tbaa !93 - %146 = getelementptr inbounds i64, i64* %145, i64 1, !dbg !68 - store i64 %27, i64* %145, align 8, !dbg !68, !tbaa !4 - %147 = getelementptr inbounds i64, i64* %146, i64 1, !dbg !68 - store i64* %147, i64** %144, align 8, !dbg !68, !tbaa !93 - store i64 5, i64* %146, align 8, !dbg !68, !tbaa !4 - %send156.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooInt, i64 0) #18, !dbg !68 - %148 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !69, !tbaa !12 - %149 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %148, i64 0, i32 2, !dbg !69 - %150 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %149, align 8, !dbg !69, !tbaa !14 - %151 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %150, i64 0, i32 1, !dbg !69 - %152 = load i64*, i64** %151, align 8, !dbg !69, !tbaa !93 - %153 = getelementptr inbounds i64, i64* %152, i64 1, !dbg !69 - store i64 %27, i64* %152, align 8, !dbg !69, !tbaa !4 - %154 = getelementptr inbounds i64, i64* %153, i64 1, !dbg !69 - store i64* %154, i64** %151, align 8, !dbg !69, !tbaa !93 - store i64 %send156.i, i64* %153, align 8, !dbg !69, !tbaa !4 - %send162.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #18, !dbg !69 - %155 = getelementptr inbounds i64, i64* %47, i64 25, !dbg !69 - %156 = getelementptr inbounds i64, i64* %155, i64 1, !dbg !69 - store i64* %156, i64** %42, align 8, !dbg !69, !tbaa !12 - %157 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !70, !tbaa !12 - %158 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %157, i64 0, i32 2, !dbg !70 - %159 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %158, align 8, !dbg !70, !tbaa !14 - %160 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %159, i64 0, i32 1, !dbg !70 - %161 = load i64*, i64** %160, align 8, !dbg !70, !tbaa !93 - %162 = getelementptr inbounds i64, i64* %161, i64 1, !dbg !70 - store i64 %27, i64* %161, align 8, !dbg !70, !tbaa !4 - %163 = getelementptr inbounds i64, i64* %162, i64 1, !dbg !70 - store i64* %163, i64** %160, align 8, !dbg !70, !tbaa !93 - store i64 5, i64* %162, align 8, !dbg !70, !tbaa !4 - %send169.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooAny1, i64 0) #18, !dbg !70 - %164 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !71, !tbaa !12 - %165 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %164, i64 0, i32 2, !dbg !71 - %166 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %165, align 8, !dbg !71, !tbaa !14 - %167 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %166, i64 0, i32 1, !dbg !71 - %168 = load i64*, i64** %167, align 8, !dbg !71, !tbaa !93 - %169 = getelementptr inbounds i64, i64* %168, i64 1, !dbg !71 - store i64 %27, i64* %168, align 8, !dbg !71, !tbaa !4 - %170 = getelementptr inbounds i64, i64* %169, i64 1, !dbg !71 - store i64* %170, i64** %167, align 8, !dbg !71, !tbaa !93 - store i64 %send169.i, i64* %169, align 8, !dbg !71, !tbaa !4 - %send176.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0) #18, !dbg !71 - %171 = getelementptr inbounds i64, i64* %47, i64 26, !dbg !71 - %172 = getelementptr inbounds i64, i64* %171, i64 1, !dbg !71 - store i64* %172, i64** %42, align 8, !dbg !71, !tbaa !12 - %173 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !12 - %174 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %173, i64 0, i32 2, !dbg !72 - %175 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %174, align 8, !dbg !72, !tbaa !14 - %176 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %175, i64 0, i32 1, !dbg !72 - %177 = load i64*, i64** %176, align 8, !dbg !72, !tbaa !93 - %178 = getelementptr inbounds i64, i64* %177, i64 1, !dbg !72 - store i64 %27, i64* %177, align 8, !dbg !72, !tbaa !4 - %179 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !72 - store i64* %179, i64** %176, align 8, !dbg !72, !tbaa !93 - store i64 5, i64* %178, align 8, !dbg !72, !tbaa !4 - %send183.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooAny2, i64 0) #18, !dbg !72 - %180 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !73, !tbaa !12 - %181 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %180, i64 0, i32 2, !dbg !73 - %182 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %181, align 8, !dbg !73, !tbaa !14 - %183 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %182, i64 0, i32 1, !dbg !73 - %184 = load i64*, i64** %183, align 8, !dbg !73, !tbaa !93 - %185 = getelementptr inbounds i64, i64* %184, i64 1, !dbg !73 - store i64 %27, i64* %184, align 8, !dbg !73, !tbaa !4 - %186 = getelementptr inbounds i64, i64* %185, i64 1, !dbg !73 - store i64* %186, i64** %183, align 8, !dbg !73, !tbaa !93 - store i64 %send183.i, i64* %185, align 8, !dbg !73, !tbaa !4 - %send190.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0) #18, !dbg !73 - %187 = getelementptr inbounds i64, i64* %47, i64 27, !dbg !73 - %188 = getelementptr inbounds i64, i64* %187, i64 1, !dbg !73 - store i64* %188, i64** %42, align 8, !dbg !73, !tbaa !12 - %189 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !74, !tbaa !12 - %190 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %189, i64 0, i32 2, !dbg !74 - %191 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %190, align 8, !dbg !74, !tbaa !14 - %192 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %191, i64 0, i32 1, !dbg !74 - %193 = load i64*, i64** %192, align 8, !dbg !74, !tbaa !93 - %194 = getelementptr inbounds i64, i64* %193, i64 1, !dbg !74 - store i64 %27, i64* %193, align 8, !dbg !74, !tbaa !4 - %195 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !74 - store i64* %195, i64** %192, align 8, !dbg !74, !tbaa !93 - store i64 5, i64* %194, align 8, !dbg !74, !tbaa !4 - %send197.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooAll, i64 0) #18, !dbg !74 - %196 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !12 - %197 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %196, i64 0, i32 2, !dbg !75 - %198 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %197, align 8, !dbg !75, !tbaa !14 - %199 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %198, i64 0, i32 1, !dbg !75 - %200 = load i64*, i64** %199, align 8, !dbg !75, !tbaa !93 - %201 = getelementptr inbounds i64, i64* %200, i64 1, !dbg !75 - store i64 %27, i64* %200, align 8, !dbg !75, !tbaa !4 - %202 = getelementptr inbounds i64, i64* %201, i64 1, !dbg !75 - store i64* %202, i64** %199, align 8, !dbg !75, !tbaa !93 - store i64 %send197.i, i64* %201, align 8, !dbg !75, !tbaa !4 - %send204.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 0) #18, !dbg !75 - %203 = getelementptr inbounds i64, i64* %47, i64 28, !dbg !75 - %204 = getelementptr inbounds i64, i64* %203, i64 1, !dbg !75 - store i64* %204, i64** %42, align 8, !dbg !75, !tbaa !12 - %callArgs0Addr.i = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i32 0, i64 0, !dbg !94 - store i64 5, i64* %callArgs0Addr.i, align 8, !dbg !94 - %205 = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i64 0, i64 0, !dbg !94 - call void @llvm.experimental.noalias.scope.decl(metadata !95) #18, !dbg !94 - %206 = call i64 @rb_ary_new_from_values(i64 noundef 1, i64* noundef nonnull %205) #18, !dbg !94 - %207 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !76, !tbaa !12 - %208 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %207, i64 0, i32 2, !dbg !76 - %209 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %208, align 8, !dbg !76, !tbaa !14 - %210 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %209, i64 0, i32 1, !dbg !76 - %211 = load i64*, i64** %210, align 8, !dbg !76, !tbaa !93 - %212 = getelementptr inbounds i64, i64* %211, i64 1, !dbg !76 - store i64 %27, i64* %211, align 8, !dbg !76, !tbaa !4 - %213 = getelementptr inbounds i64, i64* %212, i64 1, !dbg !76 - store i64* %213, i64** %210, align 8, !dbg !76, !tbaa !93 - store i64 %206, i64* %212, align 8, !dbg !76, !tbaa !4 - %send214.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooArray, i64 0) #18, !dbg !76 - %214 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !77, !tbaa !12 - %215 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %214, i64 0, i32 2, !dbg !77 - %216 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %215, align 8, !dbg !77, !tbaa !14 - %217 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %216, i64 0, i32 1, !dbg !77 - %218 = load i64*, i64** %217, align 8, !dbg !77, !tbaa !93 - %219 = getelementptr inbounds i64, i64* %218, i64 1, !dbg !77 - store i64 %27, i64* %218, align 8, !dbg !77, !tbaa !4 - %220 = getelementptr inbounds i64, i64* %219, i64 1, !dbg !77 - store i64* %220, i64** %217, align 8, !dbg !77, !tbaa !93 - store i64 %send214.i, i64* %219, align 8, !dbg !77, !tbaa !4 - %send221.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.8, i64 0) #18, !dbg !77 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %42, align 8, !dbg !77, !tbaa !12 + %rubyId_fooAll.i1 = load i64, i64* @rubyIdPrecomputed_fooAll, align 8, !dbg !49 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_fooAll.i1) #18, !dbg !49 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !49 + %rawSym73.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #18, !dbg !49 + %43 = load i64, i64* @rb_cObject, align 8, !dbg !49 + %stackFrame74.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAll", align 8, !dbg !49 + %44 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !49 + %45 = bitcast i8* %44 to i16*, !dbg !49 + %46 = load i16, i16* %45, align 8, !dbg !49 + %47 = and i16 %46, -384, !dbg !49 + %48 = or i16 %47, 1, !dbg !49 + store i16 %48, i16* %45, align 8, !dbg !49 + %49 = getelementptr inbounds i8, i8* %44, i64 8, !dbg !49 + %50 = bitcast i8* %49 to i32*, !dbg !49 + store i32 1, i32* %50, align 8, !dbg !49, !tbaa !78 + %51 = getelementptr inbounds i8, i8* %44, i64 12, !dbg !49 + %52 = getelementptr inbounds i8, i8* %44, i64 4, !dbg !49 + %53 = bitcast i8* %52 to i32*, !dbg !49 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %51, i8 0, i64 20, i1 false) #18, !dbg !49 + store i32 1, i32* %53, align 4, !dbg !49, !tbaa !81 + %rubyId_arg.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !49 + store i64 %rubyId_arg.i, i64* %positional_table.i, align 8, !dbg !49 + %54 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !49 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %54, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %29, i64 noundef 8, i1 noundef false) #18, !dbg !49 + %55 = getelementptr inbounds i8, i8* %44, i64 32, !dbg !49 + %56 = bitcast i8* %55 to i8**, !dbg !49 + store i8* %54, i8** %56, align 8, !dbg !49, !tbaa !82 + %57 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_fooAll, i64 0, i64 0)) #18, !dbg !49 + %58 = bitcast i8* %44 to %struct.rb_sorbet_param_struct*, !dbg !49 + %59 = bitcast %struct.rb_iseq_struct* %stackFrame74.i to i8*, !dbg !49 + call void @rb_add_method_sorbet(i64 %43, i64 %57, i64 (i32, i64*, i64)* noundef @"func_Object#fooAll", %struct.rb_sorbet_param_struct* nonnull %58, i32 noundef 1, i8* %59) #18, !dbg !49 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %42, align 8, !dbg !49, !tbaa !12 + %rubyId_fooAny1.i2 = load i64, i64* @rubyIdPrecomputed_fooAny1, align 8, !dbg !51 + %rawSym79.i = call i64 @rb_id2sym(i64 %rubyId_fooAny1.i2) #18, !dbg !51 + %rubyId_normal80.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !51 + %rawSym81.i = call i64 @rb_id2sym(i64 %rubyId_normal80.i) #18, !dbg !51 + %stackFrame86.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAny1", align 8, !dbg !51 + %60 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !51 + %61 = bitcast i8* %60 to i16*, !dbg !51 + %62 = load i16, i16* %61, align 8, !dbg !51 + %63 = and i16 %62, -384, !dbg !51 + %64 = or i16 %63, 1, !dbg !51 + store i16 %64, i16* %61, align 8, !dbg !51 + %65 = getelementptr inbounds i8, i8* %60, i64 8, !dbg !51 + %66 = bitcast i8* %65 to i32*, !dbg !51 + store i32 1, i32* %66, align 8, !dbg !51, !tbaa !78 + %67 = getelementptr inbounds i8, i8* %60, i64 12, !dbg !51 + %68 = getelementptr inbounds i8, i8* %60, i64 4, !dbg !51 + %69 = bitcast i8* %68 to i32*, !dbg !51 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %67, i8 0, i64 20, i1 false) #18, !dbg !51 + store i32 1, i32* %69, align 4, !dbg !51, !tbaa !81 + %rubyId_arg89.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !51 + store i64 %rubyId_arg89.i, i64* %positional_table88.i, align 8, !dbg !51 + %70 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !51 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %70, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %30, i64 noundef 8, i1 noundef false) #18, !dbg !51 + %71 = getelementptr inbounds i8, i8* %60, i64 32, !dbg !51 + %72 = bitcast i8* %71 to i8**, !dbg !51 + store i8* %70, i8** %72, align 8, !dbg !51, !tbaa !82 + %73 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_fooAny1, i64 0, i64 0)) #18, !dbg !51 + %74 = bitcast i8* %60 to %struct.rb_sorbet_param_struct*, !dbg !51 + %75 = bitcast %struct.rb_iseq_struct* %stackFrame86.i to i8*, !dbg !51 + call void @rb_add_method_sorbet(i64 %43, i64 %73, i64 (i32, i64*, i64)* noundef @"func_Object#fooAny1", %struct.rb_sorbet_param_struct* nonnull %74, i32 noundef 1, i8* %75) #18, !dbg !51 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %42, align 8, !dbg !51, !tbaa !12 + %rubyId_fooAny2.i3 = load i64, i64* @rubyIdPrecomputed_fooAny2, align 8, !dbg !52 + %rawSym97.i = call i64 @rb_id2sym(i64 %rubyId_fooAny2.i3) #18, !dbg !52 + %rubyId_normal98.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !52 + %rawSym99.i = call i64 @rb_id2sym(i64 %rubyId_normal98.i) #18, !dbg !52 + %stackFrame104.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooAny2", align 8, !dbg !52 + %76 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !52 + %77 = bitcast i8* %76 to i16*, !dbg !52 + %78 = load i16, i16* %77, align 8, !dbg !52 + %79 = and i16 %78, -384, !dbg !52 + %80 = or i16 %79, 1, !dbg !52 + store i16 %80, i16* %77, align 8, !dbg !52 + %81 = getelementptr inbounds i8, i8* %76, i64 8, !dbg !52 + %82 = bitcast i8* %81 to i32*, !dbg !52 + store i32 1, i32* %82, align 8, !dbg !52, !tbaa !78 + %83 = getelementptr inbounds i8, i8* %76, i64 12, !dbg !52 + %84 = getelementptr inbounds i8, i8* %76, i64 4, !dbg !52 + %85 = bitcast i8* %84 to i32*, !dbg !52 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %83, i8 0, i64 20, i1 false) #18, !dbg !52 + store i32 1, i32* %85, align 4, !dbg !52, !tbaa !81 + %rubyId_arg107.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !52 + store i64 %rubyId_arg107.i, i64* %positional_table106.i, align 8, !dbg !52 + %86 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !52 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %86, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %31, i64 noundef 8, i1 noundef false) #18, !dbg !52 + %87 = getelementptr inbounds i8, i8* %76, i64 32, !dbg !52 + %88 = bitcast i8* %87 to i8**, !dbg !52 + store i8* %86, i8** %88, align 8, !dbg !52, !tbaa !82 + %89 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_fooAny2, i64 0, i64 0)) #18, !dbg !52 + %90 = bitcast i8* %76 to %struct.rb_sorbet_param_struct*, !dbg !52 + %91 = bitcast %struct.rb_iseq_struct* %stackFrame104.i to i8*, !dbg !52 + call void @rb_add_method_sorbet(i64 %43, i64 %89, i64 (i32, i64*, i64)* noundef @"func_Object#fooAny2", %struct.rb_sorbet_param_struct* nonnull %90, i32 noundef 1, i8* %91) #18, !dbg !52 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %42, align 8, !dbg !52, !tbaa !12 + %rubyId_fooInt.i4 = load i64, i64* @rubyIdPrecomputed_fooInt, align 8, !dbg !53 + %rawSym115.i = call i64 @rb_id2sym(i64 %rubyId_fooInt.i4) #18, !dbg !53 + %rubyId_normal116.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !53 + %rawSym117.i = call i64 @rb_id2sym(i64 %rubyId_normal116.i) #18, !dbg !53 + %stackFrame122.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooInt", align 8, !dbg !53 + %92 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !53 + %93 = bitcast i8* %92 to i16*, !dbg !53 + %94 = load i16, i16* %93, align 8, !dbg !53 + %95 = and i16 %94, -384, !dbg !53 + %96 = or i16 %95, 1, !dbg !53 + store i16 %96, i16* %93, align 8, !dbg !53 + %97 = getelementptr inbounds i8, i8* %92, i64 8, !dbg !53 + %98 = bitcast i8* %97 to i32*, !dbg !53 + store i32 1, i32* %98, align 8, !dbg !53, !tbaa !78 + %99 = getelementptr inbounds i8, i8* %92, i64 12, !dbg !53 + %100 = getelementptr inbounds i8, i8* %92, i64 4, !dbg !53 + %101 = bitcast i8* %100 to i32*, !dbg !53 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %99, i8 0, i64 20, i1 false) #18, !dbg !53 + store i32 1, i32* %101, align 4, !dbg !53, !tbaa !81 + %rubyId_arg125.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !53 + store i64 %rubyId_arg125.i, i64* %positional_table124.i, align 8, !dbg !53 + %102 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !53 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %102, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %32, i64 noundef 8, i1 noundef false) #18, !dbg !53 + %103 = getelementptr inbounds i8, i8* %92, i64 32, !dbg !53 + %104 = bitcast i8* %103 to i8**, !dbg !53 + store i8* %102, i8** %104, align 8, !dbg !53, !tbaa !82 + %105 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_fooInt, i64 0, i64 0)) #18, !dbg !53 + %106 = bitcast i8* %92 to %struct.rb_sorbet_param_struct*, !dbg !53 + %107 = bitcast %struct.rb_iseq_struct* %stackFrame122.i to i8*, !dbg !53 + call void @rb_add_method_sorbet(i64 %43, i64 %105, i64 (i32, i64*, i64)* noundef @"func_Object#fooInt", %struct.rb_sorbet_param_struct* nonnull %106, i32 noundef 1, i8* %107) #18, !dbg !53 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 21), i64** %42, align 8, !dbg !53, !tbaa !12 + %rubyId_fooArray.i5 = load i64, i64* @rubyIdPrecomputed_fooArray, align 8, !dbg !54 + %rawSym133.i = call i64 @rb_id2sym(i64 %rubyId_fooArray.i5) #18, !dbg !54 + %rubyId_normal134.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !54 + %rawSym135.i = call i64 @rb_id2sym(i64 %rubyId_normal134.i) #18, !dbg !54 + %stackFrame140.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#fooArray", align 8, !dbg !54 + %108 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !54 + %109 = bitcast i8* %108 to i16*, !dbg !54 + %110 = load i16, i16* %109, align 8, !dbg !54 + %111 = and i16 %110, -384, !dbg !54 + %112 = or i16 %111, 1, !dbg !54 + store i16 %112, i16* %109, align 8, !dbg !54 + %113 = getelementptr inbounds i8, i8* %108, i64 8, !dbg !54 + %114 = bitcast i8* %113 to i32*, !dbg !54 + store i32 1, i32* %114, align 8, !dbg !54, !tbaa !78 + %115 = getelementptr inbounds i8, i8* %108, i64 12, !dbg !54 + %116 = getelementptr inbounds i8, i8* %108, i64 4, !dbg !54 + %117 = bitcast i8* %116 to i32*, !dbg !54 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %115, i8 0, i64 20, i1 false) #18, !dbg !54 + store i32 1, i32* %117, align 4, !dbg !54, !tbaa !81 + %rubyId_arg143.i = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !54 + store i64 %rubyId_arg143.i, i64* %positional_table142.i, align 8, !dbg !54 + %118 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !54 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %118, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %33, i64 noundef 8, i1 noundef false) #18, !dbg !54 + %119 = getelementptr inbounds i8, i8* %108, i64 32, !dbg !54 + %120 = bitcast i8* %119 to i8**, !dbg !54 + store i8* %118, i8** %120, align 8, !dbg !54, !tbaa !82 + %121 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_fooArray, i64 0, i64 0)) #18, !dbg !54 + %122 = bitcast i8* %108 to %struct.rb_sorbet_param_struct*, !dbg !54 + %123 = bitcast %struct.rb_iseq_struct* %stackFrame140.i to i8*, !dbg !54 + call void @rb_add_method_sorbet(i64 %43, i64 %121, i64 (i32, i64*, i64)* noundef @"func_Object#fooArray", %struct.rb_sorbet_param_struct* nonnull %122, i32 noundef 1, i8* %123) #18, !dbg !54 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 25), i64** %42, align 8, !dbg !54, !tbaa !12 + %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !55, !tbaa !12 + %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !55 + %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !55, !tbaa !14 + %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 1, !dbg !55 + %128 = load i64*, i64** %127, align 8, !dbg !55, !tbaa !83 + %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !55 + store i64 %27, i64* %128, align 8, !dbg !55, !tbaa !4 + %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !55 + store i64* %130, i64** %127, align 8, !dbg !55, !tbaa !83 + store i64 5, i64* %129, align 8, !dbg !55, !tbaa !4 + %send156.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooInt, i64 0) #18, !dbg !55 + %131 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !56, !tbaa !12 + %132 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %131, i64 0, i32 2, !dbg !56 + %133 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %132, align 8, !dbg !56, !tbaa !14 + %134 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %133, i64 0, i32 1, !dbg !56 + %135 = load i64*, i64** %134, align 8, !dbg !56, !tbaa !83 + %136 = getelementptr inbounds i64, i64* %135, i64 1, !dbg !56 + store i64 %27, i64* %135, align 8, !dbg !56, !tbaa !4 + %137 = getelementptr inbounds i64, i64* %136, i64 1, !dbg !56 + store i64* %137, i64** %134, align 8, !dbg !56, !tbaa !83 + store i64 %send156.i, i64* %136, align 8, !dbg !56, !tbaa !4 + %send162.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #18, !dbg !56 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 26), i64** %42, align 8, !dbg !56, !tbaa !12 + %138 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !57, !tbaa !12 + %139 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %138, i64 0, i32 2, !dbg !57 + %140 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %139, align 8, !dbg !57, !tbaa !14 + %141 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %140, i64 0, i32 1, !dbg !57 + %142 = load i64*, i64** %141, align 8, !dbg !57, !tbaa !83 + %143 = getelementptr inbounds i64, i64* %142, i64 1, !dbg !57 + store i64 %27, i64* %142, align 8, !dbg !57, !tbaa !4 + %144 = getelementptr inbounds i64, i64* %143, i64 1, !dbg !57 + store i64* %144, i64** %141, align 8, !dbg !57, !tbaa !83 + store i64 5, i64* %143, align 8, !dbg !57, !tbaa !4 + %send169.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooAny1, i64 0) #18, !dbg !57 + %145 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !58, !tbaa !12 + %146 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %145, i64 0, i32 2, !dbg !58 + %147 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %146, align 8, !dbg !58, !tbaa !14 + %148 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %147, i64 0, i32 1, !dbg !58 + %149 = load i64*, i64** %148, align 8, !dbg !58, !tbaa !83 + %150 = getelementptr inbounds i64, i64* %149, i64 1, !dbg !58 + store i64 %27, i64* %149, align 8, !dbg !58, !tbaa !4 + %151 = getelementptr inbounds i64, i64* %150, i64 1, !dbg !58 + store i64* %151, i64** %148, align 8, !dbg !58, !tbaa !83 + store i64 %send169.i, i64* %150, align 8, !dbg !58, !tbaa !4 + %send176.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0) #18, !dbg !58 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %42, align 8, !dbg !58, !tbaa !12 + %152 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !59, !tbaa !12 + %153 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %152, i64 0, i32 2, !dbg !59 + %154 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %153, align 8, !dbg !59, !tbaa !14 + %155 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %154, i64 0, i32 1, !dbg !59 + %156 = load i64*, i64** %155, align 8, !dbg !59, !tbaa !83 + %157 = getelementptr inbounds i64, i64* %156, i64 1, !dbg !59 + store i64 %27, i64* %156, align 8, !dbg !59, !tbaa !4 + %158 = getelementptr inbounds i64, i64* %157, i64 1, !dbg !59 + store i64* %158, i64** %155, align 8, !dbg !59, !tbaa !83 + store i64 5, i64* %157, align 8, !dbg !59, !tbaa !4 + %send183.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooAny2, i64 0) #18, !dbg !59 + %159 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !60, !tbaa !12 + %160 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %159, i64 0, i32 2, !dbg !60 + %161 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %160, align 8, !dbg !60, !tbaa !14 + %162 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %161, i64 0, i32 1, !dbg !60 + %163 = load i64*, i64** %162, align 8, !dbg !60, !tbaa !83 + %164 = getelementptr inbounds i64, i64* %163, i64 1, !dbg !60 + store i64 %27, i64* %163, align 8, !dbg !60, !tbaa !4 + %165 = getelementptr inbounds i64, i64* %164, i64 1, !dbg !60 + store i64* %165, i64** %162, align 8, !dbg !60, !tbaa !83 + store i64 %send183.i, i64* %164, align 8, !dbg !60, !tbaa !4 + %send190.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0) #18, !dbg !60 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 28), i64** %42, align 8, !dbg !60, !tbaa !12 + %166 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !12 + %167 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %166, i64 0, i32 2, !dbg !61 + %168 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %167, align 8, !dbg !61, !tbaa !14 + %169 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %168, i64 0, i32 1, !dbg !61 + %170 = load i64*, i64** %169, align 8, !dbg !61, !tbaa !83 + %171 = getelementptr inbounds i64, i64* %170, i64 1, !dbg !61 + store i64 %27, i64* %170, align 8, !dbg !61, !tbaa !4 + %172 = getelementptr inbounds i64, i64* %171, i64 1, !dbg !61 + store i64* %172, i64** %169, align 8, !dbg !61, !tbaa !83 + store i64 5, i64* %171, align 8, !dbg !61, !tbaa !4 + %send197.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooAll, i64 0) #18, !dbg !61 + %173 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !62, !tbaa !12 + %174 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %173, i64 0, i32 2, !dbg !62 + %175 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %174, align 8, !dbg !62, !tbaa !14 + %176 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %175, i64 0, i32 1, !dbg !62 + %177 = load i64*, i64** %176, align 8, !dbg !62, !tbaa !83 + %178 = getelementptr inbounds i64, i64* %177, i64 1, !dbg !62 + store i64 %27, i64* %177, align 8, !dbg !62, !tbaa !4 + %179 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !62 + store i64* %179, i64** %176, align 8, !dbg !62, !tbaa !83 + store i64 %send197.i, i64* %178, align 8, !dbg !62, !tbaa !4 + %send204.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 0) #18, !dbg !62 + store i64* getelementptr inbounds ([30 x i64], [30 x i64]* @iseqEncodedArray, i64 0, i64 29), i64** %42, align 8, !dbg !62, !tbaa !12 + %callArgs0Addr.i = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i32 0, i64 0, !dbg !84 + store i64 5, i64* %callArgs0Addr.i, align 8, !dbg !84 + %180 = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i64 0, i64 0, !dbg !84 + call void @llvm.experimental.noalias.scope.decl(metadata !85) #18, !dbg !84 + %181 = call i64 @rb_ary_new_from_values(i64 noundef 1, i64* noundef nonnull %180) #18, !dbg !84 + %182 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !12 + %183 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %182, i64 0, i32 2, !dbg !63 + %184 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %183, align 8, !dbg !63, !tbaa !14 + %185 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %184, i64 0, i32 1, !dbg !63 + %186 = load i64*, i64** %185, align 8, !dbg !63, !tbaa !83 + %187 = getelementptr inbounds i64, i64* %186, i64 1, !dbg !63 + store i64 %27, i64* %186, align 8, !dbg !63, !tbaa !4 + %188 = getelementptr inbounds i64, i64* %187, i64 1, !dbg !63 + store i64* %188, i64** %185, align 8, !dbg !63, !tbaa !83 + store i64 %181, i64* %187, align 8, !dbg !63, !tbaa !4 + %send214.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fooArray, i64 0) #18, !dbg !63 + %189 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !64, !tbaa !12 + %190 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %189, i64 0, i32 2, !dbg !64 + %191 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %190, align 8, !dbg !64, !tbaa !14 + %192 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %191, i64 0, i32 1, !dbg !64 + %193 = load i64*, i64** %192, align 8, !dbg !64, !tbaa !83 + %194 = getelementptr inbounds i64, i64* %193, i64 1, !dbg !64 + store i64 %27, i64* %193, align 8, !dbg !64, !tbaa !4 + %195 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !64 + store i64* %195, i64** %192, align 8, !dbg !64, !tbaa !83 + store i64 %send214.i, i64* %194, align 8, !dbg !64, !tbaa !4 + %send221.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.8, i64 0) #18, !dbg !64 call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %28) call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %29) call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %30) @@ -975,38 +918,38 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #6 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #6 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#fooAll.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !98 { +define internal fastcc void @"func_Object#fooAll.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !88 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_Kernel, i64 0, i64 0)) #1, !dbg !100 - unreachable, !dbg !100 + tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_Kernel, i64 0, i64 0)) #1, !dbg !90 + unreachable, !dbg !90 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#fooAny1.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !101 { +define internal fastcc void @"func_Object#fooAny1.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !91 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([22 x i8], [22 x i8]* @"str_T.any(Integer, Float)", i64 0, i64 0)) #1, !dbg !102 - unreachable, !dbg !102 + tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([22 x i8], [22 x i8]* @"str_T.any(Integer, Float)", i64 0, i64 0)) #1, !dbg !92 + unreachable, !dbg !92 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#fooAny2.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !103 { +define internal fastcc void @"func_Object#fooAny2.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !93 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([22 x i8], [22 x i8]* @"str_T.any(Float, Integer)", i64 0, i64 0)) #1, !dbg !104 - unreachable, !dbg !104 + tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([22 x i8], [22 x i8]* @"str_T.any(Float, Integer)", i64 0, i64 0)) #1, !dbg !94 + unreachable, !dbg !94 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#fooInt.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !105 { +define internal fastcc void @"func_Object#fooInt.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !95 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !106 - unreachable, !dbg !106 + tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !96 + unreachable, !dbg !96 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#fooArray.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !107 { +define internal fastcc void @"func_Object#fooArray.cold.1"(i64 %rawArg_arg) unnamed_addr #13 !dbg !97 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([18 x i8], [18 x i8]* @"str_T::Array[Integer]", i64 0, i64 0)) #1, !dbg !108 - unreachable, !dbg !108 + tail call void @sorbet_cast_failure(i64 %rawArg_arg, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([18 x i8], [18 x i8]* @"str_T::Array[Integer]", i64 0, i64 0)) #1, !dbg !98 + unreachable, !dbg !98 } attributes #0 = { cold noreturn } @@ -1050,94 +993,84 @@ attributes #18 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 5, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 4001, i32 4000000} -!33 = !DILocation(line: 5, column: 12, scope: !8) -!34 = !DILocation(line: 6, column: 3, scope: !8) -!35 = !{!"branch_weights", i32 2000, i32 1} -!36 = distinct !DISubprogram(name: "Object#fooAny1", linkageName: "func_Object#fooAny1", scope: null, file: !2, line: 9, type: !9, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!37 = !DILocation(line: 9, column: 1, scope: !36) -!38 = !DILocation(line: 9, column: 13, scope: !36) -!39 = !DILocation(line: 10, column: 3, scope: !36) -!40 = !{!"branch_weights", i32 1, i32 2000} -!41 = !{!42, !5, i64 0} -!42 = !{!"RBasic", !5, i64 0, !5, i64 8} -!43 = distinct !DISubprogram(name: "Object#fooAny2", linkageName: "func_Object#fooAny2", scope: null, file: !2, line: 13, type: !9, scopeLine: 13, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!44 = !DILocation(line: 13, column: 1, scope: !43) -!45 = !DILocation(line: 13, column: 13, scope: !43) -!46 = !DILocation(line: 14, column: 3, scope: !43) -!47 = !{!"branch_weights", i32 8008001, i32 1} -!48 = distinct !DISubprogram(name: "Object#fooInt", linkageName: "func_Object#fooInt", scope: null, file: !2, line: 17, type: !9, scopeLine: 17, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!49 = !DILocation(line: 17, column: 1, scope: !48) -!50 = !DILocation(line: 17, column: 12, scope: !48) -!51 = !DILocation(line: 18, column: 3, scope: !48) -!52 = !{!"branch_weights", i32 1073205, i32 2146410443} -!53 = !{!54} -!54 = distinct !{!54, !55, !"sorbet_rb_int_plus: argument 0"} -!55 = distinct !{!55, !"sorbet_rb_int_plus"} -!56 = !{!57} -!57 = distinct !{!57, !55, !"sorbet_rb_int_plus: argument 0:thread"} -!58 = distinct !DISubprogram(name: "Object#fooArray", linkageName: "func_Object#fooArray", scope: null, file: !2, line: 21, type: !9, scopeLine: 21, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!59 = !DILocation(line: 21, column: 1, scope: !58) -!60 = !DILocation(line: 21, column: 14, scope: !58) -!61 = !DILocation(line: 22, column: 3, scope: !58) -!62 = !DILocation(line: 5, column: 1, scope: !63) -!63 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!64 = !DILocation(line: 9, column: 1, scope: !63) -!65 = !DILocation(line: 13, column: 1, scope: !63) -!66 = !DILocation(line: 17, column: 1, scope: !63) -!67 = !DILocation(line: 21, column: 1, scope: !63) -!68 = !DILocation(line: 25, column: 6, scope: !63) -!69 = !DILocation(line: 25, column: 1, scope: !63) -!70 = !DILocation(line: 26, column: 6, scope: !63) -!71 = !DILocation(line: 26, column: 1, scope: !63) -!72 = !DILocation(line: 27, column: 6, scope: !63) -!73 = !DILocation(line: 27, column: 1, scope: !63) -!74 = !DILocation(line: 28, column: 6, scope: !63) -!75 = !DILocation(line: 28, column: 1, scope: !63) -!76 = !DILocation(line: 29, column: 6, scope: !63) -!77 = !DILocation(line: 29, column: 1, scope: !63) -!78 = !{!79, !5, i64 400} -!79 = !{!"rb_vm_struct", !5, i64 0, !80, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !83, i64 216, !6, i64 224, !81, i64 264, !81, i64 280, !81, i64 296, !81, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !84, i64 472, !85, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !81, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !86, i64 1200, !6, i64 1232} -!80 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !81, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!81 = !{!"list_head", !82, i64 0} -!82 = !{!"list_node", !13, i64 0, !13, i64 8} -!83 = !{!"long long", !6, i64 0} -!84 = !{!"", !6, i64 0} -!85 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!86 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!87 = !{!19, !13, i64 32} -!88 = !DILocation(line: 0, scope: !63) -!89 = !{!90, !16, i64 8} -!90 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!91 = !{!90, !16, i64 4} -!92 = !{!90, !13, i64 32} -!93 = !{!19, !13, i64 8} -!94 = !DILocation(line: 29, column: 15, scope: !63) -!95 = !{!96} -!96 = distinct !{!96, !97, !"sorbet_buildArrayIntrinsic: argument 0"} -!97 = distinct !{!97, !"sorbet_buildArrayIntrinsic"} -!98 = distinct !DISubprogram(name: "func_Object#fooAll.cold.1", linkageName: "func_Object#fooAll.cold.1", scope: null, file: !2, type: !99, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!99 = !DISubroutineType(types: !3) -!100 = !DILocation(line: 6, column: 3, scope: !98) -!101 = distinct !DISubprogram(name: "func_Object#fooAny1.cold.1", linkageName: "func_Object#fooAny1.cold.1", scope: null, file: !2, type: !99, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!102 = !DILocation(line: 10, column: 3, scope: !101) -!103 = distinct !DISubprogram(name: "func_Object#fooAny2.cold.1", linkageName: "func_Object#fooAny2.cold.1", scope: null, file: !2, type: !99, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!104 = !DILocation(line: 14, column: 3, scope: !103) -!105 = distinct !DISubprogram(name: "func_Object#fooInt.cold.1", linkageName: "func_Object#fooInt.cold.1", scope: null, file: !2, type: !99, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!106 = !DILocation(line: 18, column: 3, scope: !105) -!107 = distinct !DISubprogram(name: "func_Object#fooArray.cold.1", linkageName: "func_Object#fooArray.cold.1", scope: null, file: !2, type: !99, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!108 = !DILocation(line: 22, column: 3, scope: !107) +!18 = !DILocation(line: 5, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 4001, i32 4000000} +!20 = !DILocation(line: 5, column: 12, scope: !8) +!21 = !DILocation(line: 6, column: 3, scope: !8) +!22 = !{!"branch_weights", i32 2000, i32 1} +!23 = distinct !DISubprogram(name: "Object#fooAny1", linkageName: "func_Object#fooAny1", scope: null, file: !2, line: 9, type: !9, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!24 = !DILocation(line: 9, column: 1, scope: !23) +!25 = !DILocation(line: 9, column: 13, scope: !23) +!26 = !DILocation(line: 10, column: 3, scope: !23) +!27 = !{!"branch_weights", i32 1, i32 2000} +!28 = !{!29, !5, i64 0} +!29 = !{!"RBasic", !5, i64 0, !5, i64 8} +!30 = distinct !DISubprogram(name: "Object#fooAny2", linkageName: "func_Object#fooAny2", scope: null, file: !2, line: 13, type: !9, scopeLine: 13, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!31 = !DILocation(line: 13, column: 1, scope: !30) +!32 = !DILocation(line: 13, column: 13, scope: !30) +!33 = !DILocation(line: 14, column: 3, scope: !30) +!34 = !{!"branch_weights", i32 8008001, i32 1} +!35 = distinct !DISubprogram(name: "Object#fooInt", linkageName: "func_Object#fooInt", scope: null, file: !2, line: 17, type: !9, scopeLine: 17, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!36 = !DILocation(line: 17, column: 1, scope: !35) +!37 = !DILocation(line: 17, column: 12, scope: !35) +!38 = !DILocation(line: 18, column: 3, scope: !35) +!39 = !{!"branch_weights", i32 1073205, i32 2146410443} +!40 = !{!41} +!41 = distinct !{!41, !42, !"sorbet_rb_int_plus: argument 0"} +!42 = distinct !{!42, !"sorbet_rb_int_plus"} +!43 = !{!44} +!44 = distinct !{!44, !42, !"sorbet_rb_int_plus: argument 0:thread"} +!45 = distinct !DISubprogram(name: "Object#fooArray", linkageName: "func_Object#fooArray", scope: null, file: !2, line: 21, type: !9, scopeLine: 21, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!46 = !DILocation(line: 21, column: 1, scope: !45) +!47 = !DILocation(line: 21, column: 14, scope: !45) +!48 = !DILocation(line: 22, column: 3, scope: !45) +!49 = !DILocation(line: 5, column: 1, scope: !50) +!50 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!51 = !DILocation(line: 9, column: 1, scope: !50) +!52 = !DILocation(line: 13, column: 1, scope: !50) +!53 = !DILocation(line: 17, column: 1, scope: !50) +!54 = !DILocation(line: 21, column: 1, scope: !50) +!55 = !DILocation(line: 25, column: 6, scope: !50) +!56 = !DILocation(line: 25, column: 1, scope: !50) +!57 = !DILocation(line: 26, column: 6, scope: !50) +!58 = !DILocation(line: 26, column: 1, scope: !50) +!59 = !DILocation(line: 27, column: 6, scope: !50) +!60 = !DILocation(line: 27, column: 1, scope: !50) +!61 = !DILocation(line: 28, column: 6, scope: !50) +!62 = !DILocation(line: 28, column: 1, scope: !50) +!63 = !DILocation(line: 29, column: 6, scope: !50) +!64 = !DILocation(line: 29, column: 1, scope: !50) +!65 = !{!66, !5, i64 400} +!66 = !{!"rb_vm_struct", !5, i64 0, !67, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !70, i64 216, !6, i64 224, !68, i64 264, !68, i64 280, !68, i64 296, !68, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !71, i64 472, !72, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !68, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !73, i64 1200, !6, i64 1232} +!67 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !68, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!68 = !{!"list_head", !69, i64 0} +!69 = !{!"list_node", !13, i64 0, !13, i64 8} +!70 = !{!"long long", !6, i64 0} +!71 = !{!"", !6, i64 0} +!72 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!73 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!74 = !{!75, !13, i64 16} +!75 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!76 = !{!75, !13, i64 32} +!77 = !DILocation(line: 0, scope: !50) +!78 = !{!79, !16, i64 8} +!79 = !{!"rb_sorbet_param_struct", !80, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!80 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!81 = !{!79, !16, i64 4} +!82 = !{!79, !13, i64 32} +!83 = !{!75, !13, i64 8} +!84 = !DILocation(line: 29, column: 15, scope: !50) +!85 = !{!86} +!86 = distinct !{!86, !87, !"sorbet_buildArrayIntrinsic: argument 0"} +!87 = distinct !{!87, !"sorbet_buildArrayIntrinsic"} +!88 = distinct !DISubprogram(name: "func_Object#fooAll.cold.1", linkageName: "func_Object#fooAll.cold.1", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!89 = !DISubroutineType(types: !3) +!90 = !DILocation(line: 6, column: 3, scope: !88) +!91 = distinct !DISubprogram(name: "func_Object#fooAny1.cold.1", linkageName: "func_Object#fooAny1.cold.1", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!92 = !DILocation(line: 10, column: 3, scope: !91) +!93 = distinct !DISubprogram(name: "func_Object#fooAny2.cold.1", linkageName: "func_Object#fooAny2.cold.1", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!94 = !DILocation(line: 14, column: 3, scope: !93) +!95 = distinct !DISubprogram(name: "func_Object#fooInt.cold.1", linkageName: "func_Object#fooInt.cold.1", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!96 = !DILocation(line: 18, column: 3, scope: !95) +!97 = distinct !DISubprogram(name: "func_Object#fooArray.cold.1", linkageName: "func_Object#fooArray.cold.1", scope: null, file: !2, type: !89, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!98 = !DILocation(line: 22, column: 3, scope: !97) diff --git a/test/testdata/compiler/class.llo.exp b/test/testdata/compiler/class.llo.exp index 6b36b4819dd..62e74d8267a 100644 --- a/test/testdata/compiler/class.llo.exp +++ b/test/testdata/compiler/class.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } @ruby_current_execution_context_ptr = external local_unnamed_addr global %struct.rb_execution_context_struct*, align 8 @ruby_vm_global_constant_state = external local_unnamed_addr global i64, align 8 @@ -81,6 +83,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/class.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/class.rb" = private unnamed_addr constant [32 x i8] c"test/testdata/compiler/class.rb\00", align 1 +@iseqEncodedArray = internal global [10 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_Foo = private unnamed_addr constant [4 x i8] c"Foo\00", align 1 @str_Baz = private unnamed_addr constant [4 x i8] c"Baz\00", align 1 @"stackFramePrecomputed_func_Foo." = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @@ -91,7 +95,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @guarded_const_Foo = linkonce local_unnamed_addr global i64 0 @rb_cObject = external local_unnamed_addr constant i64 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #0 @@ -146,6 +152,7 @@ allocRubyIds: tail call fastcc void @"Constr_rubyIdPrecomputed_"() #11 tail call fastcc void @"Constr_rubyStrFrozen_"() #11 tail call fastcc void @"Constr_rubyStrFrozen_test/testdata/compiler/class.rb"() #11 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 10) tail call fastcc void @"Constr_stackFramePrecomputed_func_.$152"(i64 %realpath) tail call fastcc void @"Constr_stackFramePrecomputed_func_Foo."(i64 %realpath) tail call fastcc void @"Constr_stackFramePrecomputed_func_Foo::Bar."(i64 %realpath) @@ -160,7 +167,7 @@ entryInitializers: %"rubyStr_" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/class.rb" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/class.rb", align 8 %locals = alloca i64, i32 0, align 8 - %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 9, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 2) + %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %0, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 ret void } @@ -209,103 +216,75 @@ entry: store i64 %7, i64* %5, align 8, !tbaa !4 tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %0, %struct.rb_control_frame_struct* align 8 %2, %struct.rb_iseq_struct* %stackFrame.i) #11 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %3, align 8, !tbaa !14 - %10 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %9, i64 0, i32 2 - %11 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %10, align 8, !tbaa !17 - %12 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %11, i64 0, i32 2 - %13 = load i64*, i64** %12, align 8, !tbaa !19 - %14 = getelementptr inbounds i64, i64* %13, i64 3 - %15 = getelementptr inbounds i64, i64* %14, i64 1 - store i64* %15, i64** %8, align 8, !dbg !28, !tbaa !8 - %16 = tail call i64 @rb_define_module(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0)) #11, !dbg !33 - tail call void @sorbet_pushStaticInitFrame(i64 %16) #11, !dbg !33 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !dbg !17, !tbaa !8 + %9 = tail call i64 @rb_define_module(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0)) #11, !dbg !22 + tail call void @sorbet_pushStaticInitFrame(i64 %9) #11, !dbg !22 %stackFrame.i1.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 - %17 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !8 - %18 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %17, i64 0, i32 2 - %19 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %18, align 8, !tbaa !10 - %20 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %19, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %20, align 8, !tbaa !14 - %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %19, i64 0, i32 4 - %22 = load i64*, i64** %21, align 8, !tbaa !16 - %23 = load i64, i64* %22, align 8, !tbaa !4 - %24 = and i64 %23, -33 - store i64 %24, i64* %22, align 8, !tbaa !4 - tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %17, %struct.rb_control_frame_struct* align 8 %19, %struct.rb_iseq_struct* %stackFrame.i1.i) #11 - %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %19, i64 0, i32 0 - %26 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %20, align 8, !tbaa !14 - %27 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %26, i64 0, i32 2 - %28 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %27, align 8, !tbaa !17 - %29 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %28, i64 0, i32 2 - %30 = load i64*, i64** %29, align 8, !tbaa !19 - %31 = getelementptr inbounds i64, i64* %30, i64 1 - %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !34 - store i64* %32, i64** %25, align 8, !dbg !34, !tbaa !8 - %33 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !37 - %34 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !37, !tbaa !38 - %needTakeSlowPath = icmp ne i64 %33, %34, !dbg !37 - br i1 %needTakeSlowPath, label %35, label %36, !dbg !37, !prof !40 - -35: ; preds = %entry - tail call void @const_recompute_Foo(), !dbg !37 - br label %36, !dbg !37 - -36: ; preds = %entry, %35 - %37 = load i64, i64* @guarded_const_Foo, align 8, !dbg !37 - %38 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !37 - %39 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !37, !tbaa !38 - %guardUpdated = icmp eq i64 %38, %39, !dbg !37 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !37 - %40 = load i64, i64* @rb_cObject, align 8, !dbg !37 - %41 = tail call i64 @rb_define_class_under(i64 %37, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Bar, i64 0, i64 0), i64 %40) #11, !dbg !37 - tail call void @sorbet_pushStaticInitFrame(i64 %41) #11, !dbg !37 + %10 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !8 + %11 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %10, i64 0, i32 2 + %12 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %11, align 8, !tbaa !10 + %13 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %12, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %13, align 8, !tbaa !14 + %14 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %12, i64 0, i32 4 + %15 = load i64*, i64** %14, align 8, !tbaa !16 + %16 = load i64, i64* %15, align 8, !tbaa !4 + %17 = and i64 %16, -33 + store i64 %17, i64* %15, align 8, !tbaa !4 + tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %10, %struct.rb_control_frame_struct* align 8 %12, %struct.rb_iseq_struct* %stackFrame.i1.i) #11 + %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %12, i64 0, i32 0 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %18, align 8, !dbg !23, !tbaa !8 + %19 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !26 + %20 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !26, !tbaa !27 + %needTakeSlowPath = icmp ne i64 %19, %20, !dbg !26 + br i1 %needTakeSlowPath, label %21, label %22, !dbg !26, !prof !29 + +21: ; preds = %entry + tail call void @const_recompute_Foo(), !dbg !26 + br label %22, !dbg !26 + +22: ; preds = %entry, %21 + %23 = load i64, i64* @guarded_const_Foo, align 8, !dbg !26 + %24 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !26 + %25 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !26, !tbaa !27 + %guardUpdated = icmp eq i64 %24, %25, !dbg !26 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !26 + %26 = load i64, i64* @rb_cObject, align 8, !dbg !26 + %27 = tail call i64 @rb_define_class_under(i64 %23, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Bar, i64 0, i64 0), i64 %26) #11, !dbg !26 + tail call void @sorbet_pushStaticInitFrame(i64 %27) #11, !dbg !26 %stackFrame.i.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo::Bar.", align 8 - %42 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !8 - %43 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %42, i64 0, i32 2 - %44 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %43, align 8, !tbaa !10 - %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i.i, %struct.rb_iseq_struct** %45, align 8, !tbaa !14 - %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 4 - %47 = load i64*, i64** %46, align 8, !tbaa !16 - %48 = load i64, i64* %47, align 8, !tbaa !4 - %49 = and i64 %48, -33 - store i64 %49, i64* %47, align 8, !tbaa !4 - tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %42, %struct.rb_control_frame_struct* align 8 %44, %struct.rb_iseq_struct* %stackFrame.i.i.i) #11 - %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 0 - %51 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %45, align 8, !tbaa !14 - %52 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %51, i64 0, i32 2 - %53 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %52, align 8, !tbaa !17 - %54 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %53, i64 0, i32 2 - %55 = load i64*, i64** %54, align 8, !tbaa !19 - %56 = getelementptr inbounds i64, i64* %55, i64 1 - store i64* %56, i64** %50, align 8, !dbg !41, !tbaa !8 - tail call void @sorbet_popRubyStack() #11, !dbg !37 - tail call void @sorbet_popRubyStack() #11, !dbg !33 - %57 = getelementptr inbounds i64, i64* %13, i64 7, !dbg !33 - %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !33 - store i64* %58, i64** %8, align 8, !dbg !33, !tbaa !8 - %59 = tail call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Baz, i64 0, i64 0), i64 %40) #11, !dbg !44 - tail call void @sorbet_pushStaticInitFrame(i64 %59) #11, !dbg !44 + %28 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !8 + %29 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %28, i64 0, i32 2 + %30 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %29, align 8, !tbaa !10 + %31 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i.i, %struct.rb_iseq_struct** %31, align 8, !tbaa !14 + %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 4 + %33 = load i64*, i64** %32, align 8, !tbaa !16 + %34 = load i64, i64* %33, align 8, !tbaa !4 + %35 = and i64 %34, -33 + store i64 %35, i64* %33, align 8, !tbaa !4 + tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %28, %struct.rb_control_frame_struct* align 8 %30, %struct.rb_iseq_struct* %stackFrame.i.i.i) #11 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 0 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %36, align 8, !dbg !30, !tbaa !8 + tail call void @sorbet_popRubyStack() #11, !dbg !26 + tail call void @sorbet_popRubyStack() #11, !dbg !22 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %8, align 8, !dbg !22, !tbaa !8 + %37 = tail call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Baz, i64 0, i64 0), i64 %26) #11, !dbg !33 + tail call void @sorbet_pushStaticInitFrame(i64 %37) #11, !dbg !33 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Baz.", align 8 - %60 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !8 - %61 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %60, i64 0, i32 2 - %62 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %61, align 8, !tbaa !10 - %63 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %62, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %63, align 8, !tbaa !14 - %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %62, i64 0, i32 4 - %65 = load i64*, i64** %64, align 8, !tbaa !16 - %66 = load i64, i64* %65, align 8, !tbaa !4 - %67 = and i64 %66, -33 - store i64 %67, i64* %65, align 8, !tbaa !4 - tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %60, %struct.rb_control_frame_struct* align 8 %62, %struct.rb_iseq_struct* %stackFrame.i.i) #11 - %68 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %62, i64 0, i32 0 - %69 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %63, align 8, !tbaa !14 - %70 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %69, i64 0, i32 2 - %71 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %70, align 8, !tbaa !17 - %72 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %71, i64 0, i32 2 - %73 = load i64*, i64** %72, align 8, !tbaa !19 - %74 = getelementptr inbounds i64, i64* %73, i64 1 - store i64* %74, i64** %68, align 8, !dbg !45, !tbaa !8 - tail call void @sorbet_popRubyStack() #11, !dbg !44 + %38 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !8 + %39 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %38, i64 0, i32 2 + %40 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %39, align 8, !tbaa !10 + %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %41, align 8, !tbaa !14 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 4 + %43 = load i64*, i64** %42, align 8, !tbaa !16 + %44 = load i64, i64* %43, align 8, !tbaa !4 + %45 = and i64 %44, -33 + store i64 %45, i64* %43, align 8, !tbaa !4 + tail call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %38, %struct.rb_control_frame_struct* align 8 %40, %struct.rb_iseq_struct* %stackFrame.i.i) #11 + %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 0 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %46, align 8, !dbg !34, !tbaa !8 + tail call void @sorbet_popRubyStack() #11, !dbg !33 ret void } @@ -316,7 +295,7 @@ entryInitializers: %"rubyStr_" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/class.rb" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/class.rb", align 8 %locals = alloca i64, i32 0, align 8 - %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 4, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 2) + %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %0, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 ret void } @@ -328,7 +307,7 @@ entryInitializers: %"rubyStr_" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/class.rb" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/class.rb", align 8 %locals = alloca i64, i32 0, align 8 - %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 0) + %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %0, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo::Bar.", align 8 ret void } @@ -340,7 +319,7 @@ entryInitializers: %"rubyStr_" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/class.rb" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/class.rb", align 8 %locals = alloca i64, i32 0, align 8 - %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 8, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 0) + %0 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_", i64 %"rubyId_", i64 %"rubyStr_test/testdata/compiler/class.rb", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %0, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Baz.", align 8 ret void } @@ -352,7 +331,7 @@ declare void @llvm.assume(i1 noundef) #8 define linkonce void @const_recompute_Foo() local_unnamed_addr #5 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 3) store i64 %1, i64* @guarded_const_Foo, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !38 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !27 store i64 %2, i64* @guard_epoch_Foo, align 8 ret void } @@ -390,34 +369,23 @@ attributes #11 = { nounwind } !14 = !{!15, !9, i64 16} !15 = !{!"rb_control_frame_struct", !9, i64 0, !9, i64 8, !9, i64 16, !5, i64 24, !9, i64 32, !9, i64 40, !9, i64 48} !16 = !{!15, !9, i64 32} -!17 = !{!18, !9, i64 16} -!18 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !9, i64 16, !6, i64 24} -!19 = !{!20, !9, i64 8} -!20 = !{!"rb_iseq_constant_body", !6, i64 0, !12, i64 4, !9, i64 8, !21, i64 16, !23, i64 64, !26, i64 120, !9, i64 152, !9, i64 160, !9, i64 168, !9, i64 176, !9, i64 184, !9, i64 192, !27, i64 200, !12, i64 232, !12, i64 236, !12, i64 240, !12, i64 244, !12, i64 248, !6, i64 252, !5, i64 256} -!21 = !{!"", !22, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !9, i64 32, !9, i64 40} -!22 = !{!"", !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 0, !12, i64 1, !12, i64 1} -!23 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !12, i64 32, !24, i64 36} -!24 = !{!"rb_code_location_struct", !25, i64 0, !25, i64 8} -!25 = !{!"rb_code_position_struct", !12, i64 0, !12, i64 4} -!26 = !{!"iseq_insn_info", !9, i64 0, !9, i64 8, !12, i64 16, !9, i64 24} -!27 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !9, i64 24} -!28 = !DILocation(line: 0, scope: !29) -!29 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !30, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!30 = !DISubroutineType(types: !31) -!31 = !{!32} -!32 = !DIBasicType(name: "VALUE", size: 64, encoding: DW_ATE_signed) -!33 = !DILocation(line: 4, column: 1, scope: !29) +!17 = !DILocation(line: 0, scope: !18) +!18 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !19, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!19 = !DISubroutineType(types: !20) +!20 = !{!21} +!21 = !DIBasicType(name: "VALUE", size: 64, encoding: DW_ATE_signed) +!22 = !DILocation(line: 4, column: 1, scope: !18) +!23 = !DILocation(line: 0, scope: !24, inlinedAt: !25) +!24 = distinct !DISubprogram(name: "Foo.", linkageName: "func_Foo.L61", scope: null, file: !2, line: 4, type: !19, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!25 = distinct !DILocation(line: 4, column: 1, scope: !18) +!26 = !DILocation(line: 5, column: 3, scope: !24, inlinedAt: !25) +!27 = !{!28, !28, i64 0} +!28 = !{!"long long", !6, i64 0} +!29 = !{!"branch_weights", i32 1, i32 10000} +!30 = !DILocation(line: 0, scope: !31, inlinedAt: !32) +!31 = distinct !DISubprogram(name: "Bar.", linkageName: "func_Foo::Bar.L74", scope: null, file: !2, line: 5, type: !19, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!32 = distinct !DILocation(line: 5, column: 3, scope: !24, inlinedAt: !25) +!33 = !DILocation(line: 8, column: 1, scope: !18) !34 = !DILocation(line: 0, scope: !35, inlinedAt: !36) -!35 = distinct !DISubprogram(name: "Foo.", linkageName: "func_Foo.L61", scope: null, file: !2, line: 4, type: !30, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!36 = distinct !DILocation(line: 4, column: 1, scope: !29) -!37 = !DILocation(line: 5, column: 3, scope: !35, inlinedAt: !36) -!38 = !{!39, !39, i64 0} -!39 = !{!"long long", !6, i64 0} -!40 = !{!"branch_weights", i32 1, i32 10000} -!41 = !DILocation(line: 0, scope: !42, inlinedAt: !43) -!42 = distinct !DISubprogram(name: "Bar.", linkageName: "func_Foo::Bar.L74", scope: null, file: !2, line: 5, type: !30, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!43 = distinct !DILocation(line: 5, column: 3, scope: !35, inlinedAt: !36) -!44 = !DILocation(line: 8, column: 1, scope: !29) -!45 = !DILocation(line: 0, scope: !46, inlinedAt: !47) -!46 = distinct !DISubprogram(name: "Baz.", linkageName: "func_Baz.L94", scope: null, file: !2, line: 8, type: !30, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!47 = distinct !DILocation(line: 8, column: 1, scope: !29) +!35 = distinct !DISubprogram(name: "Baz.", linkageName: "func_Baz.L94", scope: null, file: !2, line: 8, type: !19, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!36 = distinct !DILocation(line: 8, column: 1, scope: !18) diff --git a/test/testdata/compiler/classfields.llo.exp b/test/testdata/compiler/classfields.llo.exp index 0d0c027bd78..0fde320c2d1 100644 --- a/test/testdata/compiler/classfields.llo.exp +++ b/test/testdata/compiler/classfields.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/classfields.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/classfields.rb" = private unnamed_addr constant [38 x i8] c"test/testdata/compiler/classfields.rb\00", align 1 +@iseqEncodedArray = internal global [29 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_B = private unnamed_addr constant [2 x i8] c"B\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_new = internal unnamed_addr global i64 0, align 8 @@ -128,7 +132,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -232,9 +238,11 @@ entry: %11 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([38 x i8], [38 x i8]* @"str_test/testdata/compiler/classfields.rb", i64 0, i64 0), i64 noundef 37) #13 tail call void @rb_gc_register_mark_object(i64 %11) #13 store i64 %11, i64* @"rubyStrFrozen_test/testdata/compiler/classfields.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 29) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %11, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 28, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/classfields.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/classfields.rb", align 8 + %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/classfields.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %12, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !15 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !15 @@ -254,24 +262,24 @@ entry: call void @rb_gc_register_mark_object(i64 %13) #13 %rubyId_write.i.i = load i64, i64* @rubyIdPrecomputed_write, align 8 %"rubyStr_test/testdata/compiler/classfields.rb.i15.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/classfields.rb", align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_write.i.i, i64 %"rubyStr_test/testdata/compiler/classfields.rb.i15.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 7, i32 noundef 9, i64* noundef nonnull %locals.i16.i, i32 noundef 0, i32 noundef 0) + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_write.i.i, i64 %"rubyStr_test/testdata/compiler/classfields.rb.i15.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i16.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#write", align 8 %15 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0), i64 noundef 4) #13 call void @rb_gc_register_mark_object(i64 %15) #13 store i64 %15, i64* @rubyStrFrozen_read, align 8 %rubyId_read.i.i = load i64, i64* @rubyIdPrecomputed_read, align 8 %"rubyStr_test/testdata/compiler/classfields.rb.i17.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/classfields.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_read.i.i, i64 %"rubyStr_test/testdata/compiler/classfields.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 16, i32 noundef 18, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 0) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_read.i.i, i64 %"rubyStr_test/testdata/compiler/classfields.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#read", align 8 %rubyId_read.i19.i = load i64, i64* @rubyIdPrecomputed_read, align 8 %rubyStr_read.i20.i = load i64, i64* @rubyStrFrozen_read, align 8 %"rubyStr_test/testdata/compiler/classfields.rb.i21.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/classfields.rb", align 8 - %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_read.i20.i, i64 %rubyId_read.i19.i, i64 %"rubyStr_test/testdata/compiler/classfields.rb.i21.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 19, i32 noundef 21, i64* noundef nonnull %locals.i22.i, i32 noundef 0, i32 noundef 0) + %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_read.i20.i, i64 %rubyId_read.i19.i, i64 %"rubyStr_test/testdata/compiler/classfields.rb.i21.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i22.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %17, %struct.rb_iseq_struct** @stackFramePrecomputed_func_B.read, align 8 %"rubyId_.i23.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i24.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/classfields.rb.i25.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/classfields.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i24.i", i64 %"rubyId_.i23.i", i64 %"rubyStr_test/testdata/compiler/classfields.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i26.i, i32 noundef 0, i32 noundef 4) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i24.i", i64 %"rubyId_.i23.i", i64 %"rubyStr_test/testdata/compiler/classfields.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i26.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B.", align 8 %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !20 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !20 @@ -295,297 +303,294 @@ entry: store i64 %29, i64* %27, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %22, %struct.rb_control_frame_struct* align 8 %24, %struct.rb_iseq_struct* %stackFrame.i) #13 %30 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 0 - %31 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %25, align 8, !tbaa !38 - %32 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %31, i64 0, i32 2 - %33 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %32, align 8, !tbaa !41 - %34 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %33, i64 0, i32 2 - %35 = load i64*, i64** %34, align 8, !tbaa !43 - %36 = getelementptr inbounds i64, i64* %35, i64 4 - %37 = getelementptr inbounds i64, i64* %36, i64 1 - store i64* %37, i64** %30, align 8, !dbg !52, !tbaa !23 - %38 = load i64, i64* @rb_cObject, align 8, !dbg !53 - %39 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_B, i64 0, i64 0), i64 %38) #13, !dbg !53 - call void @sorbet_pushStaticInitFrame(i64 %39) #13, !dbg !53 - %40 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %40) #13 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %30, align 8, !dbg !41, !tbaa !23 + %31 = load i64, i64* @rb_cObject, align 8, !dbg !42 + %32 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_B, i64 0, i64 0), i64 %31) #13, !dbg !42 + call void @sorbet_pushStaticInitFrame(i64 %32) #13, !dbg !42 + %33 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %33) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B.", align 8 - %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !23 - %42 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %41, i64 0, i32 2 - %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !tbaa !35 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %44, align 8, !tbaa !38 - %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 4 - %46 = load i64*, i64** %45, align 8, !tbaa !40 - %47 = load i64, i64* %46, align 8, !tbaa !4 - %48 = and i64 %47, -33 - store i64 %48, i64* %46, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %41, %struct.rb_control_frame_struct* align 8 %43, %struct.rb_iseq_struct* %stackFrame.i.i) #13 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 0 - %50 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %44, align 8, !tbaa !38 - %51 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %50, i64 0, i32 2 - %52 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %51, align 8, !tbaa !41 - %53 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %52, i64 0, i32 2 - %54 = load i64*, i64** %53, align 8, !tbaa !43 - %55 = getelementptr inbounds i64, i64* %54, i64 2, !dbg !54 - %56 = getelementptr inbounds i64, i64* %55, i64 1, !dbg !54 - store i64* %56, i64** %49, align 8, !dbg !54, !tbaa !23 + %34 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !23 + %35 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %34, i64 0, i32 2 + %36 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %35, align 8, !tbaa !35 + %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %37, align 8, !tbaa !38 + %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 4 + %39 = load i64*, i64** %38, align 8, !tbaa !40 + %40 = load i64, i64* %39, align 8, !tbaa !4 + %41 = and i64 %40, -33 + store i64 %41, i64* %39, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %34, %struct.rb_control_frame_struct* align 8 %36, %struct.rb_iseq_struct* %stackFrame.i.i) #13 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 0 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %42, align 8, !dbg !43, !tbaa !23 %rubyId_write.i.i1 = load i64, i64* @rubyIdPrecomputed_write, align 8, !dbg !8 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_write.i.i1) #13, !dbg !8 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !8 - %57 = load i64, i64* @guard_epoch_B, align 8, !dbg !8 - %58 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !55 - %needTakeSlowPath = icmp ne i64 %57, %58, !dbg !8 - br i1 %needTakeSlowPath, label %59, label %60, !dbg !8, !prof !56 + %43 = load i64, i64* @guard_epoch_B, align 8, !dbg !8 + %44 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !44 + %needTakeSlowPath = icmp ne i64 %43, %44, !dbg !8 + br i1 %needTakeSlowPath, label %45, label %46, !dbg !8, !prof !45 -59: ; preds = %entry +45: ; preds = %entry call void @const_recompute_B(), !dbg !8 - br label %60, !dbg !8 + br label %46, !dbg !8 -60: ; preds = %entry, %59 - %61 = load i64, i64* @guarded_const_B, align 8, !dbg !8 - %62 = load i64, i64* @guard_epoch_B, align 8, !dbg !8 - %63 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !55 - %guardUpdated = icmp eq i64 %62, %63, !dbg !8 +46: ; preds = %entry, %45 + %47 = load i64, i64* @guarded_const_B, align 8, !dbg !8 + %48 = load i64, i64* @guard_epoch_B, align 8, !dbg !8 + %49 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !44 + %guardUpdated = icmp eq i64 %48, %49, !dbg !8 call void @llvm.assume(i1 %guardUpdated), !dbg !8 %stackFrame26.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#write", align 8, !dbg !8 - %64 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !8 - %65 = bitcast i8* %64 to i16*, !dbg !8 - %66 = load i16, i16* %65, align 8, !dbg !8 - %67 = and i16 %66, -384, !dbg !8 - %68 = or i16 %67, 1, !dbg !8 - store i16 %68, i16* %65, align 8, !dbg !8 - %69 = getelementptr inbounds i8, i8* %64, i64 8, !dbg !8 - %70 = bitcast i8* %69 to i32*, !dbg !8 - store i32 1, i32* %70, align 8, !dbg !8, !tbaa !57 - %71 = getelementptr inbounds i8, i8* %64, i64 12, !dbg !8 - %72 = getelementptr inbounds i8, i8* %64, i64 4, !dbg !8 - %73 = bitcast i8* %72 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %71, i8 0, i64 20, i1 false) #13, !dbg !8 - store i32 1, i32* %73, align 4, !dbg !8, !tbaa !59 + %50 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !8 + %51 = bitcast i8* %50 to i16*, !dbg !8 + %52 = load i16, i16* %51, align 8, !dbg !8 + %53 = and i16 %52, -384, !dbg !8 + %54 = or i16 %53, 1, !dbg !8 + store i16 %54, i16* %51, align 8, !dbg !8 + %55 = getelementptr inbounds i8, i8* %50, i64 8, !dbg !8 + %56 = bitcast i8* %55 to i32*, !dbg !8 + store i32 1, i32* %56, align 8, !dbg !8, !tbaa !46 + %57 = getelementptr inbounds i8, i8* %50, i64 12, !dbg !8 + %58 = getelementptr inbounds i8, i8* %50, i64 4, !dbg !8 + %59 = bitcast i8* %58 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %57, i8 0, i64 20, i1 false) #13, !dbg !8 + store i32 1, i32* %59, align 4, !dbg !8, !tbaa !49 %rubyId_a.i.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !8 store i64 %rubyId_a.i.i, i64* %positional_table.i.i, align 8, !dbg !8 - %74 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %74, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %40, i64 noundef 8, i1 noundef false) #13, !dbg !8 - %75 = getelementptr inbounds i8, i8* %64, i64 32, !dbg !8 - %76 = bitcast i8* %75 to i8**, !dbg !8 - store i8* %74, i8** %76, align 8, !dbg !8, !tbaa !60 - %77 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_write, i64 0, i64 0)) #13, !dbg !8 - %78 = bitcast i8* %64 to %struct.rb_sorbet_param_struct*, !dbg !8 - %79 = bitcast %struct.rb_iseq_struct* %stackFrame26.i.i to i8*, !dbg !8 - call void @rb_add_method_sorbet(i64 %61, i64 %77, i64 (i32, i64*, i64)* noundef @"func_B#write", %struct.rb_sorbet_param_struct* nonnull %78, i32 noundef 1, i8* %79) #13, !dbg !8 - %80 = getelementptr inbounds i64, i64* %54, i64 11, !dbg !8 - %81 = getelementptr inbounds i64, i64* %80, i64 1, !dbg !8 - store i64* %81, i64** %49, align 8, !dbg !8, !tbaa !23 - %rubyId_read.i.i2 = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !61 - %rawSym31.i.i = call i64 @rb_id2sym(i64 %rubyId_read.i.i2) #13, !dbg !61 - %rubyId_normal32.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !61 - %rawSym33.i.i = call i64 @rb_id2sym(i64 %rubyId_normal32.i.i) #13, !dbg !61 - %stackFrame38.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#read", align 8, !dbg !61 - %82 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !61 - %83 = bitcast i8* %82 to i16*, !dbg !61 - %84 = load i16, i16* %83, align 8, !dbg !61 - %85 = and i16 %84, -384, !dbg !61 - store i16 %85, i16* %83, align 8, !dbg !61 - %86 = getelementptr inbounds i8, i8* %82, i64 4, !dbg !61 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %86, i8 0, i64 28, i1 false) #13, !dbg !61 - %87 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0)) #13, !dbg !61 - %88 = bitcast i8* %82 to %struct.rb_sorbet_param_struct*, !dbg !61 - %89 = bitcast %struct.rb_iseq_struct* %stackFrame38.i.i to i8*, !dbg !61 - call void @rb_add_method_sorbet(i64 %61, i64 %87, i64 (i32, i64*, i64)* noundef @"func_B#read", %struct.rb_sorbet_param_struct* nonnull %88, i32 noundef 1, i8* %89) #13, !dbg !61 - %90 = getelementptr inbounds i64, i64* %54, i64 14, !dbg !61 - %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !61 - store i64* %91, i64** %49, align 8, !dbg !61, !tbaa !23 - %rubyId_read47.i.i = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !62 - %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_read47.i.i) #13, !dbg !62 - %rubyId_normal49.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !62 - %rawSym50.i.i = call i64 @rb_id2sym(i64 %rubyId_normal49.i.i) #13, !dbg !62 - %stackFrame52.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_B.read, align 8, !dbg !62 - %92 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !62 - %93 = bitcast i8* %92 to i16*, !dbg !62 - %94 = load i16, i16* %93, align 8, !dbg !62 - %95 = and i16 %94, -384, !dbg !62 - store i16 %95, i16* %93, align 8, !dbg !62 - %96 = getelementptr inbounds i8, i8* %92, i64 4, !dbg !62 - %97 = bitcast %struct.rb_iseq_struct* %stackFrame52.i.i to i8*, !dbg !62 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %96, i8 0, i64 28, i1 false) #13, !dbg !62 - call void @rb_define_singleton_sorbet_method(i64 %61, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_B.read, i8* nonnull %92, i8* %97) #13, !dbg !62 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %40) #13 - call void @sorbet_popRubyStack() #13, !dbg !53 - %98 = getelementptr inbounds i64, i64* %35, i64 24, !dbg !53 - %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !53 - store i64* %99, i64** %30, align 8, !dbg !53, !tbaa !23 - %100 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !23 - %101 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %100, i64 0, i32 2, !dbg !15 - %102 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %101, align 8, !dbg !15, !tbaa !35 - %103 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %102, i64 0, i32 1, !dbg !15 - %104 = load i64*, i64** %103, align 8, !dbg !15, !tbaa !63 - %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !15 - store i64* %105, i64** %103, align 8, !dbg !15, !tbaa !63 - store i64 %61, i64* %104, align 8, !dbg !15, !tbaa !4 + %60 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %60, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %33, i64 noundef 8, i1 noundef false) #13, !dbg !8 + %61 = getelementptr inbounds i8, i8* %50, i64 32, !dbg !8 + %62 = bitcast i8* %61 to i8**, !dbg !8 + store i8* %60, i8** %62, align 8, !dbg !8, !tbaa !50 + %63 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_write, i64 0, i64 0)) #13, !dbg !8 + %64 = bitcast i8* %50 to %struct.rb_sorbet_param_struct*, !dbg !8 + %65 = bitcast %struct.rb_iseq_struct* %stackFrame26.i.i to i8*, !dbg !8 + call void @rb_add_method_sorbet(i64 %47, i64 %63, i64 (i32, i64*, i64)* noundef @"func_B#write", %struct.rb_sorbet_param_struct* nonnull %64, i32 noundef 1, i8* %65) #13, !dbg !8 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %42, align 8, !dbg !8, !tbaa !23 + %rubyId_read.i.i2 = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !51 + %rawSym31.i.i = call i64 @rb_id2sym(i64 %rubyId_read.i.i2) #13, !dbg !51 + %rubyId_normal32.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !51 + %rawSym33.i.i = call i64 @rb_id2sym(i64 %rubyId_normal32.i.i) #13, !dbg !51 + %stackFrame38.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_B#read", align 8, !dbg !51 + %66 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !51 + %67 = bitcast i8* %66 to i16*, !dbg !51 + %68 = load i16, i16* %67, align 8, !dbg !51 + %69 = and i16 %68, -384, !dbg !51 + store i16 %69, i16* %67, align 8, !dbg !51 + %70 = getelementptr inbounds i8, i8* %66, i64 4, !dbg !51 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %70, i8 0, i64 28, i1 false) #13, !dbg !51 + %71 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0)) #13, !dbg !51 + %72 = bitcast i8* %66 to %struct.rb_sorbet_param_struct*, !dbg !51 + %73 = bitcast %struct.rb_iseq_struct* %stackFrame38.i.i to i8*, !dbg !51 + call void @rb_add_method_sorbet(i64 %47, i64 %71, i64 (i32, i64*, i64)* noundef @"func_B#read", %struct.rb_sorbet_param_struct* nonnull %72, i32 noundef 1, i8* %73) #13, !dbg !51 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %42, align 8, !dbg !51, !tbaa !23 + %rubyId_read47.i.i = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !52 + %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_read47.i.i) #13, !dbg !52 + %rubyId_normal49.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !52 + %rawSym50.i.i = call i64 @rb_id2sym(i64 %rubyId_normal49.i.i) #13, !dbg !52 + %stackFrame52.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_B.read, align 8, !dbg !52 + %74 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !52 + %75 = bitcast i8* %74 to i16*, !dbg !52 + %76 = load i16, i16* %75, align 8, !dbg !52 + %77 = and i16 %76, -384, !dbg !52 + store i16 %77, i16* %75, align 8, !dbg !52 + %78 = getelementptr inbounds i8, i8* %74, i64 4, !dbg !52 + %79 = bitcast %struct.rb_iseq_struct* %stackFrame52.i.i to i8*, !dbg !52 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %78, i8 0, i64 28, i1 false) #13, !dbg !52 + call void @rb_define_singleton_sorbet_method(i64 %47, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_B.read, i8* nonnull %74, i8* %79) #13, !dbg !52 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %33) #13 + call void @sorbet_popRubyStack() #13, !dbg !42 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 25), i64** %30, align 8, !dbg !42, !tbaa !23 + %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !23 + %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !15 + %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !15, !tbaa !35 + %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 1, !dbg !15 + %84 = load i64*, i64** %83, align 8, !dbg !15, !tbaa !53 + %85 = getelementptr inbounds i64, i64* %84, i64 1, !dbg !15 + store i64* %85, i64** %83, align 8, !dbg !15, !tbaa !53 + store i64 %47, i64* %84, align 8, !dbg !15, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #13, !dbg !15 - %106 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !23 - %107 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %106, i64 0, i32 2, !dbg !15 - %108 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %107, align 8, !dbg !15, !tbaa !35 - %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %108, i64 0, i32 1, !dbg !15 - %110 = load i64*, i64** %109, align 8, !dbg !15, !tbaa !63 - %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !15 - store i64 %send.i, i64* %110, align 8, !dbg !15, !tbaa !4 - %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !15 - store i64* %112, i64** %109, align 8, !dbg !15, !tbaa !63 - store i64 3, i64* %111, align 8, !dbg !15, !tbaa !4 + %86 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !23 + %87 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %86, i64 0, i32 2, !dbg !15 + %88 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %87, align 8, !dbg !15, !tbaa !35 + %89 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %88, i64 0, i32 1, !dbg !15 + %90 = load i64*, i64** %89, align 8, !dbg !15, !tbaa !53 + %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !15 + store i64 %send.i, i64* %90, align 8, !dbg !15, !tbaa !4 + %92 = getelementptr inbounds i64, i64* %91, i64 1, !dbg !15 + store i64* %92, i64** %89, align 8, !dbg !15, !tbaa !53 + store i64 3, i64* %91, align 8, !dbg !15, !tbaa !4 %send36.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_write, i64 0) #13, !dbg !15 - %113 = getelementptr inbounds i64, i64* %35, i64 26, !dbg !15 - %114 = getelementptr inbounds i64, i64* %113, i64 1, !dbg !15 - store i64* %114, i64** %30, align 8, !dbg !15, !tbaa !23 - %115 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !23 - %116 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %115, i64 0, i32 2, !dbg !16 - %117 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %116, align 8, !dbg !16, !tbaa !35 - %118 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %117, i64 0, i32 1, !dbg !16 - %119 = load i64*, i64** %118, align 8, !dbg !16, !tbaa !63 - %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !16 - store i64* %120, i64** %118, align 8, !dbg !16, !tbaa !63 - store i64 %61, i64* %119, align 8, !dbg !16, !tbaa !4 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %30, align 8, !dbg !15, !tbaa !23 + %93 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !23 + %94 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %93, i64 0, i32 2, !dbg !16 + %95 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %94, align 8, !dbg !16, !tbaa !35 + %96 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %95, i64 0, i32 1, !dbg !16 + %97 = load i64*, i64** %96, align 8, !dbg !16, !tbaa !53 + %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !16 + store i64* %98, i64** %96, align 8, !dbg !16, !tbaa !53 + store i64 %47, i64* %97, align 8, !dbg !16, !tbaa !4 %send40.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read, i64 0) #13, !dbg !16 - %121 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !23 - %122 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %121, i64 0, i32 2, !dbg !17 - %123 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %122, align 8, !dbg !17, !tbaa !35 - %124 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %123, i64 0, i32 1, !dbg !17 - %125 = load i64*, i64** %124, align 8, !dbg !17, !tbaa !63 - %126 = getelementptr inbounds i64, i64* %125, i64 1, !dbg !17 - store i64 %21, i64* %125, align 8, !dbg !17, !tbaa !4 - %127 = getelementptr inbounds i64, i64* %126, i64 1, !dbg !17 - store i64* %127, i64** %124, align 8, !dbg !17, !tbaa !63 - store i64 %send40.i, i64* %126, align 8, !dbg !17, !tbaa !4 + %99 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !23 + %100 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %99, i64 0, i32 2, !dbg !17 + %101 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %100, align 8, !dbg !17, !tbaa !35 + %102 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %101, i64 0, i32 1, !dbg !17 + %103 = load i64*, i64** %102, align 8, !dbg !17, !tbaa !53 + %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !17 + store i64 %21, i64* %103, align 8, !dbg !17, !tbaa !4 + %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !17 + store i64* %105, i64** %102, align 8, !dbg !17, !tbaa !53 + store i64 %send40.i, i64* %104, align 8, !dbg !17, !tbaa !4 %send46.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !17 - %128 = getelementptr inbounds i64, i64* %35, i64 27, !dbg !17 - %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !17 - store i64* %129, i64** %30, align 8, !dbg !17, !tbaa !23 - %130 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !23 - %131 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %130, i64 0, i32 2, !dbg !18 - %132 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %131, align 8, !dbg !18, !tbaa !35 - %133 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %132, i64 0, i32 1, !dbg !18 - %134 = load i64*, i64** %133, align 8, !dbg !18, !tbaa !63 - %135 = getelementptr inbounds i64, i64* %134, i64 1, !dbg !18 - store i64* %135, i64** %133, align 8, !dbg !18, !tbaa !63 - store i64 %61, i64* %134, align 8, !dbg !18, !tbaa !4 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 28), i64** %30, align 8, !dbg !17, !tbaa !23 + %106 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !23 + %107 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %106, i64 0, i32 2, !dbg !18 + %108 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %107, align 8, !dbg !18, !tbaa !35 + %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %108, i64 0, i32 1, !dbg !18 + %110 = load i64*, i64** %109, align 8, !dbg !18, !tbaa !53 + %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !18 + store i64* %111, i64** %109, align 8, !dbg !18, !tbaa !53 + store i64 %47, i64* %110, align 8, !dbg !18, !tbaa !4 %send51.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new.1, i64 0) #13, !dbg !18 - %136 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !23 - %137 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %136, i64 0, i32 2, !dbg !18 - %138 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %137, align 8, !dbg !18, !tbaa !35 - %139 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %138, i64 0, i32 1, !dbg !18 - %140 = load i64*, i64** %139, align 8, !dbg !18, !tbaa !63 - %141 = getelementptr inbounds i64, i64* %140, i64 1, !dbg !18 - store i64* %141, i64** %139, align 8, !dbg !18, !tbaa !63 - store i64 %send51.i, i64* %140, align 8, !dbg !18, !tbaa !4 + %112 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !23 + %113 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %112, i64 0, i32 2, !dbg !18 + %114 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %113, align 8, !dbg !18, !tbaa !35 + %115 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %114, i64 0, i32 1, !dbg !18 + %116 = load i64*, i64** %115, align 8, !dbg !18, !tbaa !53 + %117 = getelementptr inbounds i64, i64* %116, i64 1, !dbg !18 + store i64* %117, i64** %115, align 8, !dbg !18, !tbaa !53 + store i64 %send51.i, i64* %116, align 8, !dbg !18, !tbaa !4 %send57.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read.2, i64 0) #13, !dbg !18 - %142 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !23 - %143 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %142, i64 0, i32 2, !dbg !19 - %144 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %143, align 8, !dbg !19, !tbaa !35 - %145 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %144, i64 0, i32 1, !dbg !19 - %146 = load i64*, i64** %145, align 8, !dbg !19, !tbaa !63 - %147 = getelementptr inbounds i64, i64* %146, i64 1, !dbg !19 - store i64 %21, i64* %146, align 8, !dbg !19, !tbaa !4 - %148 = getelementptr inbounds i64, i64* %147, i64 1, !dbg !19 - store i64* %148, i64** %145, align 8, !dbg !19, !tbaa !63 - store i64 %send57.i, i64* %147, align 8, !dbg !19, !tbaa !4 + %118 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !23 + %119 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %118, i64 0, i32 2, !dbg !19 + %120 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %119, align 8, !dbg !19, !tbaa !35 + %121 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 1, !dbg !19 + %122 = load i64*, i64** %121, align 8, !dbg !19, !tbaa !53 + %123 = getelementptr inbounds i64, i64* %122, i64 1, !dbg !19 + store i64 %21, i64* %122, align 8, !dbg !19, !tbaa !4 + %124 = getelementptr inbounds i64, i64* %123, i64 1, !dbg !19 + store i64* %124, i64** %121, align 8, !dbg !19, !tbaa !53 + store i64 %send57.i, i64* %123, align 8, !dbg !19, !tbaa !4 %send64.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0) #13, !dbg !19 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_B#write"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !64 { +define i64 @"func_B#write"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !54 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !23 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !35 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !38 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !41 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !43 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !23 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !65 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !65 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !65 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !65, !prof !66 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !tbaa !23 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !55 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !55 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !55 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !55, !prof !56 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !65 - unreachable, !dbg !65 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !55 + unreachable, !dbg !55 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_a = load i64, i64* %argArray, align 8, !dbg !65 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !67 - store i64* %11, i64** %3, align 8, !dbg !67, !tbaa !23 - %12 = load i64, i64* @guard_epoch_B, align 8, !dbg !68 - %13 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !68, !tbaa !55 - %needTakeSlowPath = icmp ne i64 %12, %13, !dbg !68 - br i1 %needTakeSlowPath, label %14, label %15, !dbg !68, !prof !56 - -14: ; preds = %fillRequiredArgs - tail call void @const_recompute_B(), !dbg !68 - br label %15, !dbg !68 + %rawArg_a = load i64, i64* %argArray, align 8, !dbg !55 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !57, !tbaa !23 + %4 = load i64, i64* @guard_epoch_B, align 8, !dbg !58 + %5 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !58, !tbaa !44 + %needTakeSlowPath = icmp ne i64 %4, %5, !dbg !58 + br i1 %needTakeSlowPath, label %6, label %7, !dbg !58, !prof !45 + +6: ; preds = %fillRequiredArgs + tail call void @const_recompute_B(), !dbg !58 + br label %7, !dbg !58 + +7: ; preds = %fillRequiredArgs, %6 + %8 = load i64, i64* @guarded_const_B, align 8, !dbg !58 + %9 = load i64, i64* @guard_epoch_B, align 8, !dbg !58 + %10 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !58, !tbaa !44 + %guardUpdated = icmp eq i64 %9, %10, !dbg !58 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !58 + %"rubyId_@@f" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !58 + tail call void @rb_cvar_set(i64 %8, i64 %"rubyId_@@f", i64 %rawArg_a) #13, !dbg !58 + %"rubyId_@@f7" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !59 + %11 = tail call i64 @rb_cvar_get(i64 %8, i64 %"rubyId_@@f7") #13, !dbg !59 + ret i64 %11 +} -15: ; preds = %fillRequiredArgs, %14 - %16 = load i64, i64* @guarded_const_B, align 8, !dbg !68 - %17 = load i64, i64* @guard_epoch_B, align 8, !dbg !68 - %18 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !68, !tbaa !55 - %guardUpdated = icmp eq i64 %17, %18, !dbg !68 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !68 - %"rubyId_@@f" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !68 - tail call void @rb_cvar_set(i64 %16, i64 %"rubyId_@@f", i64 %rawArg_a) #13, !dbg !68 - %"rubyId_@@f7" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !69 - %19 = tail call i64 @rb_cvar_get(i64 %16, i64 %"rubyId_@@f7") #13, !dbg !69 - ret i64 %19 +; Function Attrs: nounwind sspreq uwtable +define i64 @"func_B#read"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !60 { +functionEntryInitializers: + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !23 + %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !35 + %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %3, align 8, !tbaa !23 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !61 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !61, !prof !62 + +argCountFailBlock: ; preds = %functionEntryInitializers + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !61 + unreachable, !dbg !61 + +fillRequiredArgs: ; preds = %functionEntryInitializers + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %3, align 8, !dbg !63, !tbaa !23 + %4 = load i64, i64* @guard_epoch_B, align 8, !dbg !64 + %5 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !64, !tbaa !44 + %needTakeSlowPath = icmp ne i64 %4, %5, !dbg !64 + br i1 %needTakeSlowPath, label %6, label %7, !dbg !64, !prof !45 + +6: ; preds = %fillRequiredArgs + tail call void @const_recompute_B(), !dbg !64 + br label %7, !dbg !64 + +7: ; preds = %fillRequiredArgs, %6 + %8 = load i64, i64* @guarded_const_B, align 8, !dbg !64 + %9 = load i64, i64* @guard_epoch_B, align 8, !dbg !64 + %10 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !64, !tbaa !44 + %guardUpdated = icmp eq i64 %9, %10, !dbg !64 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !64 + %"rubyId_@@f" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !64 + %11 = tail call i64 @rb_cvar_get(i64 %8, i64 %"rubyId_@@f") #13, !dbg !64 + ret i64 %11 } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_B#read"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !70 { +define i64 @func_B.read(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !65 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !23 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !35 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !38 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !41 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !43 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !23 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !71 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !71, !prof !72 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %3, align 8, !tbaa !23 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !66 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !66, !prof !62 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !71 - unreachable, !dbg !71 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !66 + unreachable, !dbg !66 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !73 - store i64* %11, i64** %3, align 8, !dbg !73, !tbaa !23 - %12 = load i64, i64* @guard_epoch_B, align 8, !dbg !74 - %13 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !74, !tbaa !55 - %needTakeSlowPath = icmp ne i64 %12, %13, !dbg !74 - br i1 %needTakeSlowPath, label %14, label %15, !dbg !74, !prof !56 - -14: ; preds = %fillRequiredArgs - tail call void @const_recompute_B(), !dbg !74 - br label %15, !dbg !74 - -15: ; preds = %fillRequiredArgs, %14 - %16 = load i64, i64* @guarded_const_B, align 8, !dbg !74 - %17 = load i64, i64* @guard_epoch_B, align 8, !dbg !74 - %18 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !74, !tbaa !55 - %guardUpdated = icmp eq i64 %17, %18, !dbg !74 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !74 - %"rubyId_@@f" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !74 - %19 = tail call i64 @rb_cvar_get(i64 %16, i64 %"rubyId_@@f") #13, !dbg !74 - ret i64 %19 + store i64* getelementptr inbounds ([29 x i64], [29 x i64]* @iseqEncodedArray, i64 0, i64 20), i64** %3, align 8, !dbg !67, !tbaa !23 + %4 = load i64, i64* @guard_epoch_B, align 8, !dbg !68 + %5 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !68, !tbaa !44 + %needTakeSlowPath = icmp ne i64 %4, %5, !dbg !68 + br i1 %needTakeSlowPath, label %6, label %7, !dbg !68, !prof !45 + +6: ; preds = %fillRequiredArgs + tail call void @const_recompute_B(), !dbg !68 + br label %7, !dbg !68 + +7: ; preds = %fillRequiredArgs, %6 + %8 = load i64, i64* @guarded_const_B, align 8, !dbg !68 + %9 = load i64, i64* @guard_epoch_B, align 8, !dbg !68 + %10 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !68, !tbaa !44 + %guardUpdated = icmp eq i64 %9, %10, !dbg !68 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !68 + %"rubyId_@@f" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !68 + %11 = tail call i64 @rb_cvar_get(i64 %8, i64 %"rubyId_@@f") #13, !dbg !68 + ret i64 %11 } ; Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly @@ -597,50 +602,6 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #4 ; Function Attrs: argmemonly nofree nosync nounwind willreturn declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #4 -; Function Attrs: nounwind sspreq uwtable -define i64 @func_B.read(i32 %0, i64* nocapture nofree readnone %1, i64 %2) #7 { - %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !23 - %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2 - %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !35 - %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 0 - %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 2 - %9 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %8, align 8, !tbaa !38 - %10 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %9, i64 0, i32 2 - %11 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %10, align 8, !tbaa !41 - %12 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %11, i64 0, i32 2 - %13 = load i64*, i64** %12, align 8, !tbaa !43 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %7, align 8, !tbaa !23 - %tooManyArgs.i = icmp ugt i32 %0, 0, !dbg !71 - br i1 %tooManyArgs.i, label %argCountFailBlock.i, label %"func_B#read.exit", !dbg !71, !prof !72 - -argCountFailBlock.i: ; preds = %3 - tail call void @sorbet_raiseArity(i32 %0, i32 noundef 0, i32 noundef 0) #12, !dbg !71 - unreachable, !dbg !71 - -"func_B#read.exit": ; preds = %3 - %15 = getelementptr inbounds i64, i64* %14, i64 1, !dbg !73 - store i64* %15, i64** %7, align 8, !dbg !73, !tbaa !23 - %16 = load i64, i64* @guard_epoch_B, align 8, !dbg !74 - %17 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !74, !tbaa !55 - %needTakeSlowPath = icmp ne i64 %16, %17, !dbg !74 - br i1 %needTakeSlowPath, label %18, label %19, !dbg !74, !prof !56 - -18: ; preds = %"func_B#read.exit" - tail call void @const_recompute_B(), !dbg !74 - br label %19, !dbg !74 - -19: ; preds = %"func_B#read.exit", %18 - %20 = load i64, i64* @guarded_const_B, align 8, !dbg !74 - %21 = load i64, i64* @guard_epoch_B, align 8, !dbg !74 - %22 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !74, !tbaa !55 - %guardUpdated = icmp eq i64 %21, %22, !dbg !74 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !74 - %"rubyId_@@f.i" = load i64, i64* @"rubyIdPrecomputed_@@f", align 8, !dbg !74 - %23 = tail call i64 @rb_cvar_get(i64 %20, i64 %"rubyId_@@f.i") #13, !dbg !74 - ret i64 %23 -} - ; Function Attrs: nofree nosync nounwind willreturn declare void @llvm.assume(i1 noundef) #9 @@ -648,7 +609,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @const_recompute_B() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_B, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_B, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !55 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !44 store i64 %2, i64* @guard_epoch_B, align 8 ret void } @@ -712,37 +673,31 @@ attributes #13 = { nounwind } !38 = !{!39, !24, i64 16} !39 = !{!"rb_control_frame_struct", !24, i64 0, !24, i64 8, !24, i64 16, !5, i64 24, !24, i64 32, !24, i64 40, !24, i64 48} !40 = !{!39, !24, i64 32} -!41 = !{!42, !24, i64 16} -!42 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !24, i64 16, !6, i64 24} -!43 = !{!44, !24, i64 8} -!44 = !{!"rb_iseq_constant_body", !6, i64 0, !30, i64 4, !24, i64 8, !45, i64 16, !47, i64 64, !50, i64 120, !24, i64 152, !24, i64 160, !24, i64 168, !24, i64 176, !24, i64 184, !24, i64 192, !51, i64 200, !30, i64 232, !30, i64 236, !30, i64 240, !30, i64 244, !30, i64 248, !6, i64 252, !5, i64 256} -!45 = !{!"", !46, i64 0, !30, i64 4, !30, i64 8, !30, i64 12, !30, i64 16, !30, i64 20, !30, i64 24, !30, i64 28, !24, i64 32, !24, i64 40} -!46 = !{!"", !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 1, !30, i64 1} -!47 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !30, i64 32, !48, i64 36} -!48 = !{!"rb_code_location_struct", !49, i64 0, !49, i64 8} -!49 = !{!"rb_code_position_struct", !30, i64 0, !30, i64 4} -!50 = !{!"iseq_insn_info", !24, i64 0, !24, i64 8, !30, i64 16, !24, i64 24} -!51 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !24, i64 24} -!52 = !DILocation(line: 0, scope: !14) -!53 = !DILocation(line: 5, column: 1, scope: !14) -!54 = !DILocation(line: 0, scope: !9, inlinedAt: !13) -!55 = !{!31, !31, i64 0} -!56 = !{!"branch_weights", i32 1, i32 10000} -!57 = !{!58, !30, i64 8} -!58 = !{!"rb_sorbet_param_struct", !46, i64 0, !30, i64 4, !30, i64 8, !30, i64 12, !30, i64 16, !30, i64 20, !30, i64 24, !30, i64 28, !24, i64 32, !30, i64 40, !30, i64 44, !30, i64 48, !30, i64 52, !24, i64 56} -!59 = !{!58, !30, i64 4} -!60 = !{!58, !24, i64 32} -!61 = !DILocation(line: 16, column: 3, scope: !9, inlinedAt: !13) -!62 = !DILocation(line: 19, column: 3, scope: !9, inlinedAt: !13) -!63 = !{!39, !24, i64 8} -!64 = distinct !DISubprogram(name: "B#write", linkageName: "func_B#write", scope: null, file: !2, line: 7, type: !10, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!65 = !DILocation(line: 7, column: 3, scope: !64) -!66 = !{!"branch_weights", i32 4001, i32 4000000} -!67 = !DILocation(line: 7, column: 13, scope: !64) -!68 = !DILocation(line: 8, column: 11, scope: !64) -!69 = !DILocation(line: 8, column: 5, scope: !64) -!70 = distinct !DISubprogram(name: "B#read", linkageName: "func_B#read", scope: null, file: !2, line: 16, type: !10, scopeLine: 16, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!71 = !DILocation(line: 16, column: 3, scope: !70) -!72 = !{!"branch_weights", i32 1, i32 2000} -!73 = !DILocation(line: 0, scope: !70) -!74 = !DILocation(line: 17, column: 5, scope: !70) +!41 = !DILocation(line: 0, scope: !14) +!42 = !DILocation(line: 5, column: 1, scope: !14) +!43 = !DILocation(line: 0, scope: !9, inlinedAt: !13) +!44 = !{!31, !31, i64 0} +!45 = !{!"branch_weights", i32 1, i32 10000} +!46 = !{!47, !30, i64 8} +!47 = !{!"rb_sorbet_param_struct", !48, i64 0, !30, i64 4, !30, i64 8, !30, i64 12, !30, i64 16, !30, i64 20, !30, i64 24, !30, i64 28, !24, i64 32, !30, i64 40, !30, i64 44, !30, i64 48, !30, i64 52, !24, i64 56} +!48 = !{!"", !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 1, !30, i64 1} +!49 = !{!47, !30, i64 4} +!50 = !{!47, !24, i64 32} +!51 = !DILocation(line: 16, column: 3, scope: !9, inlinedAt: !13) +!52 = !DILocation(line: 19, column: 3, scope: !9, inlinedAt: !13) +!53 = !{!39, !24, i64 8} +!54 = distinct !DISubprogram(name: "B#write", linkageName: "func_B#write", scope: null, file: !2, line: 7, type: !10, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!55 = !DILocation(line: 7, column: 3, scope: !54) +!56 = !{!"branch_weights", i32 4001, i32 4000000} +!57 = !DILocation(line: 7, column: 13, scope: !54) +!58 = !DILocation(line: 8, column: 11, scope: !54) +!59 = !DILocation(line: 8, column: 5, scope: !54) +!60 = distinct !DISubprogram(name: "B#read", linkageName: "func_B#read", scope: null, file: !2, line: 16, type: !10, scopeLine: 16, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!61 = !DILocation(line: 16, column: 3, scope: !60) +!62 = !{!"branch_weights", i32 1, i32 2000} +!63 = !DILocation(line: 0, scope: !60) +!64 = !DILocation(line: 17, column: 5, scope: !60) +!65 = distinct !DISubprogram(name: "B.read", linkageName: "func_B.read", scope: null, file: !2, line: 19, type: !10, scopeLine: 19, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!66 = !DILocation(line: 19, column: 3, scope: !65) +!67 = !DILocation(line: 0, scope: !65) +!68 = !DILocation(line: 20, column: 5, scope: !65) diff --git a/test/testdata/compiler/constant_cache.llo.exp b/test/testdata/compiler/constant_cache.llo.exp index fb220a1020a..52f14cc9d8e 100644 --- a/test/testdata/compiler/constant_cache.llo.exp +++ b/test/testdata/compiler/constant_cache.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_foo = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/constant_cache.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/constant_cache.rb" = private unnamed_addr constant [41 x i8] c"test/testdata/compiler/constant_cache.rb\00", align 1 +@iseqEncodedArray = internal global [13 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @ic_puts = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @@ -112,7 +116,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -175,92 +181,78 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !31 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !18 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !33 - store i64* %11, i64** %3, align 8, !dbg !33, !tbaa !12 - %12 = load i64, i64* @guard_epoch_A, align 8, !dbg !34 - %13 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !34, !tbaa !35 - %needTakeSlowPath = icmp ne i64 %12, %13, !dbg !34 - br i1 %needTakeSlowPath, label %14, label %15, !dbg !34, !prof !37 - -14: ; preds = %fillRequiredArgs - tail call void @const_recompute_A(), !dbg !34 - br label %15, !dbg !34 - -15: ; preds = %fillRequiredArgs, %14 - %16 = load i64, i64* @guarded_const_A, align 8, !dbg !34 - %17 = load i64, i64* @guard_epoch_A, align 8, !dbg !34 - %18 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !34, !tbaa !35 - %guardUpdated = icmp eq i64 %17, %18, !dbg !34 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !34 - %19 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 - %20 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %19, i64 0, i32 2, !dbg !34 - %21 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %20, align 8, !dbg !34, !tbaa !14 - %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 1, !dbg !34 - %23 = load i64*, i64** %22, align 8, !dbg !34, !tbaa !38 - %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !34 - store i64 %selfRaw, i64* %23, align 8, !dbg !34, !tbaa !4 - %25 = getelementptr inbounds i64, i64* %24, i64 1, !dbg !34 - store i64* %25, i64** %22, align 8, !dbg !34, !tbaa !38 - store i64 %16, i64* %24, align 8, !dbg !34, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !34 - %26 = getelementptr inbounds i64, i64* %9, i64 2, !dbg !34 - %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !34 - store i64* %27, i64** %3, align 8, !dbg !34, !tbaa !12 - %28 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !12 - %29 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %28, i64 0, i32 2, !dbg !39 - %30 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %29, align 8, !dbg !39, !tbaa !14 - %31 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 1, !dbg !39 - %32 = load i64*, i64** %31, align 8, !dbg !39, !tbaa !38 - %33 = getelementptr inbounds i64, i64* %32, i64 1, !dbg !39 - store i64 %selfRaw, i64* %32, align 8, !dbg !39, !tbaa !4 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !39 - store i64* %34, i64** %31, align 8, !dbg !39, !tbaa !38 - store i64 %16, i64* %33, align 8, !dbg !39, !tbaa !4 - %send21 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0), !dbg !39 - %35 = getelementptr inbounds i64, i64* %9, i64 3, !dbg !39 - %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !39 - store i64* %36, i64** %3, align 8, !dbg !39, !tbaa !12 - %37 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !12 - %38 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %37, i64 0, i32 2, !dbg !40 - %39 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %38, align 8, !dbg !40, !tbaa !14 - %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %39, i64 0, i32 1, !dbg !40 - %41 = load i64*, i64** %40, align 8, !dbg !40, !tbaa !38 - %42 = getelementptr inbounds i64, i64* %41, i64 1, !dbg !40 - store i64 %selfRaw, i64* %41, align 8, !dbg !40, !tbaa !4 - %43 = getelementptr inbounds i64, i64* %42, i64 1, !dbg !40 - store i64* %43, i64** %40, align 8, !dbg !40, !tbaa !38 - store i64 %16, i64* %42, align 8, !dbg !40, !tbaa !4 - %send27 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0), !dbg !40 - %44 = getelementptr inbounds i64, i64* %9, i64 4, !dbg !40 - %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !40 - store i64* %45, i64** %3, align 8, !dbg !40, !tbaa !12 - %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !41, !tbaa !12 - %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !41 - %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !41, !tbaa !14 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 1, !dbg !41 - %50 = load i64*, i64** %49, align 8, !dbg !41, !tbaa !38 - %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !41 - store i64 %selfRaw, i64* %50, align 8, !dbg !41, !tbaa !4 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !41 - store i64* %52, i64** %49, align 8, !dbg !41, !tbaa !38 - store i64 %16, i64* %51, align 8, !dbg !41, !tbaa !4 - %send33 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0), !dbg !41 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !dbg !20, !tbaa !12 + %4 = load i64, i64* @guard_epoch_A, align 8, !dbg !21 + %5 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !21, !tbaa !22 + %needTakeSlowPath = icmp ne i64 %4, %5, !dbg !21 + br i1 %needTakeSlowPath, label %6, label %7, !dbg !21, !prof !24 + +6: ; preds = %fillRequiredArgs + tail call void @const_recompute_A(), !dbg !21 + br label %7, !dbg !21 + +7: ; preds = %fillRequiredArgs, %6 + %8 = load i64, i64* @guarded_const_A, align 8, !dbg !21 + %9 = load i64, i64* @guard_epoch_A, align 8, !dbg !21 + %10 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !21, !tbaa !22 + %guardUpdated = icmp eq i64 %9, %10, !dbg !21 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !21 + %11 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !12 + %12 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %11, i64 0, i32 2, !dbg !21 + %13 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %12, align 8, !dbg !21, !tbaa !14 + %14 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %13, i64 0, i32 1, !dbg !21 + %15 = load i64*, i64** %14, align 8, !dbg !21, !tbaa !25 + %16 = getelementptr inbounds i64, i64* %15, i64 1, !dbg !21 + store i64 %selfRaw, i64* %15, align 8, !dbg !21, !tbaa !4 + %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !21 + store i64* %17, i64** %14, align 8, !dbg !21, !tbaa !25 + store i64 %8, i64* %16, align 8, !dbg !21, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !21 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !dbg !21, !tbaa !12 + %18 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !27, !tbaa !12 + %19 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %18, i64 0, i32 2, !dbg !27 + %20 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %19, align 8, !dbg !27, !tbaa !14 + %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 1, !dbg !27 + %22 = load i64*, i64** %21, align 8, !dbg !27, !tbaa !25 + %23 = getelementptr inbounds i64, i64* %22, i64 1, !dbg !27 + store i64 %selfRaw, i64* %22, align 8, !dbg !27, !tbaa !4 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !27 + store i64* %24, i64** %21, align 8, !dbg !27, !tbaa !25 + store i64 %8, i64* %23, align 8, !dbg !27, !tbaa !4 + %send21 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0), !dbg !27 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !27, !tbaa !12 + %25 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !12 + %26 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %25, i64 0, i32 2, !dbg !28 + %27 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %26, align 8, !dbg !28, !tbaa !14 + %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 1, !dbg !28 + %29 = load i64*, i64** %28, align 8, !dbg !28, !tbaa !25 + %30 = getelementptr inbounds i64, i64* %29, i64 1, !dbg !28 + store i64 %selfRaw, i64* %29, align 8, !dbg !28, !tbaa !4 + %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !28 + store i64* %31, i64** %28, align 8, !dbg !28, !tbaa !25 + store i64 %8, i64* %30, align 8, !dbg !28, !tbaa !4 + %send27 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0), !dbg !28 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !28, !tbaa !12 + %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !29, !tbaa !12 + %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !29 + %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !29, !tbaa !14 + %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 1, !dbg !29 + %36 = load i64*, i64** %35, align 8, !dbg !29, !tbaa !25 + %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !29 + store i64 %selfRaw, i64* %36, align 8, !dbg !29, !tbaa !4 + %38 = getelementptr inbounds i64, i64* %37, i64 1, !dbg !29 + store i64* %38, i64** %35, align 8, !dbg !29, !tbaa !25 + store i64 %8, i64* %37, align 8, !dbg !29, !tbaa !4 + %send33 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0), !dbg !29 ret i64 %send33 } @@ -287,113 +279,98 @@ entry: %6 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([41 x i8], [41 x i8]* @"str_test/testdata/compiler/constant_cache.rb", i64 0, i64 0), i64 noundef 40) #12 tail call void @rb_gc_register_mark_object(i64 %6) #12 store i64 %6, i64* @"rubyStrFrozen_test/testdata/compiler/constant_cache.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 13) %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %rubyStr_foo.i.i = load i64, i64* @rubyStrFrozen_foo, align 8 - %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i.i, i64 %rubyId_foo.i.i, i64 %6, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 10, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/constant_cache.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/constant_cache.rb", align 8 + %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i.i, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/constant_cache.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %7, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !34 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 - %rubyId_puts1.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts1.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !39 - %rubyId_puts4.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !40 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 %rubyId_puts4.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !40 - %rubyId_puts7.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !41 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 %rubyId_puts7.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !41 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !21 + %rubyId_puts1.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !27 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts1.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !27 + %rubyId_puts4.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 %rubyId_puts4.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !28 + %rubyId_puts7.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !29 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 %rubyId_puts7.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !29 %8 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #12 call void @rb_gc_register_mark_object(i64 %8) #12 store i64 %8, i64* @"rubyStrFrozen_", align 8 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/constant_cache.rb.i13.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/constant_cache.rb", align 8 - %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %8, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/constant_cache.rb.i13.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 12, i64* noundef nonnull %locals.i14.i, i32 noundef 0, i32 noundef 4) + %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %8, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/constant_cache.rb.i13.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i14.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %9, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !42 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !42 - %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !44 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !44 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !30 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !30 + %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !32 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !32 %"rubyId_.i15.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i16.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/constant_cache.rb.i17.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/constant_cache.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i16.i", i64 %"rubyId_.i15.i", i64 %"rubyStr_test/testdata/compiler/constant_cache.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 4, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 0) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i16.i", i64 %"rubyId_.i15.i", i64 %"rubyStr_test/testdata/compiler/constant_cache.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %11 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %12 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %11, i64 0, i32 18 - %13 = load i64, i64* %12, align 8, !tbaa !45 + %13 = load i64, i64* %12, align 8, !tbaa !33 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2 %16 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %15, align 8, !tbaa !14 %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %17, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %17, align 8, !tbaa !41 %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 4 - %19 = load i64*, i64** %18, align 8, !tbaa !53 + %19 = load i64*, i64** %18, align 8, !tbaa !42 %20 = load i64, i64* %19, align 8, !tbaa !4 %21 = and i64 %20, -33 store i64 %21, i64* %19, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %14, %struct.rb_control_frame_struct* align 8 %16, %struct.rb_iseq_struct* %stackFrame.i) #12 %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 0 - %23 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %17, align 8, !tbaa !18 - %24 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %23, i64 0, i32 2 - %25 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %24, align 8, !tbaa !20 - %26 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %25, i64 0, i32 2 - %27 = load i64*, i64** %26, align 8, !tbaa !22 - %28 = getelementptr inbounds i64, i64* %27, i64 3 - %29 = getelementptr inbounds i64, i64* %28, i64 1 - store i64* %29, i64** %22, align 8, !dbg !54, !tbaa !12 - %30 = load i64, i64* @rb_cObject, align 8, !dbg !55 - %31 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %30) #12, !dbg !55 - call void @sorbet_pushStaticInitFrame(i64 %31) #12, !dbg !55 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %22, align 8, !dbg !43, !tbaa !12 + %23 = load i64, i64* @rb_cObject, align 8, !dbg !44 + %24 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %23) #12, !dbg !44 + call void @sorbet_pushStaticInitFrame(i64 %24) #12, !dbg !44 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 - %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2 - %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !tbaa !14 - %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %35, align 8, !tbaa !18 - %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 4 - %37 = load i64*, i64** %36, align 8, !tbaa !53 - %38 = load i64, i64* %37, align 8, !tbaa !4 - %39 = and i64 %38, -33 - store i64 %39, i64* %37, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %32, %struct.rb_control_frame_struct* align 8 %34, %struct.rb_iseq_struct* %stackFrame.i.i) #12 - %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 0 - %41 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %35, align 8, !tbaa !18 - %42 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %41, i64 0, i32 2 - %43 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %42, align 8, !tbaa !20 - %44 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %43, i64 0, i32 2 - %45 = load i64*, i64** %44, align 8, !tbaa !22 - %46 = getelementptr inbounds i64, i64* %45, i64 1 - store i64* %46, i64** %40, align 8, !dbg !56, !tbaa !12 - call void @sorbet_popRubyStack() #12, !dbg !55 - %47 = getelementptr inbounds i64, i64* %27, i64 4, !dbg !55 - %48 = getelementptr inbounds i64, i64* %47, i64 1, !dbg !55 - store i64* %48, i64** %22, align 8, !dbg !55, !tbaa !12 - %rubyId_foo.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !42 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i1) #12, !dbg !42 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !42 - %rawSym18.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #12, !dbg !42 - %stackFrame20.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8, !dbg !42 - %49 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !42 - %50 = bitcast i8* %49 to i16*, !dbg !42 - %51 = load i16, i16* %50, align 8, !dbg !42 - %52 = and i16 %51, -384, !dbg !42 - store i16 %52, i16* %50, align 8, !dbg !42 - %53 = getelementptr inbounds i8, i8* %49, i64 4, !dbg !42 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %53, i8 0, i64 28, i1 false) #12, !dbg !42 - %54 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #12, !dbg !42 - %55 = bitcast i8* %49 to %struct.rb_sorbet_param_struct*, !dbg !42 - %56 = bitcast %struct.rb_iseq_struct* %stackFrame20.i to i8*, !dbg !42 - call void @rb_add_method_sorbet(i64 %30, i64 %54, i64 (i32, i64*, i64)* noundef @"func_Object#foo", %struct.rb_sorbet_param_struct* nonnull %55, i32 noundef 1, i8* %56) #12, !dbg !42 - %57 = getelementptr inbounds i64, i64* %27, i64 11, !dbg !42 - %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !42 - store i64* %58, i64** %22, align 8, !dbg !42, !tbaa !12 - %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !44, !tbaa !12 - %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2, !dbg !44 - %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !dbg !44, !tbaa !14 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 1, !dbg !44 - %63 = load i64*, i64** %62, align 8, !dbg !44, !tbaa !38 - %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !44 - store i64* %64, i64** %62, align 8, !dbg !44, !tbaa !38 - store i64 %13, i64* %63, align 8, !dbg !44, !tbaa !4 - %send29.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #12, !dbg !44 + %25 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 + %26 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %25, i64 0, i32 2 + %27 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %26, align 8, !tbaa !14 + %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %28, align 8, !tbaa !41 + %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 4 + %30 = load i64*, i64** %29, align 8, !tbaa !42 + %31 = load i64, i64* %30, align 8, !tbaa !4 + %32 = and i64 %31, -33 + store i64 %32, i64* %30, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %25, %struct.rb_control_frame_struct* align 8 %27, %struct.rb_iseq_struct* %stackFrame.i.i) #12 + %33 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 0 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %33, align 8, !dbg !45, !tbaa !12 + call void @sorbet_popRubyStack() #12, !dbg !44 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %22, align 8, !dbg !44, !tbaa !12 + %rubyId_foo.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !30 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i1) #12, !dbg !30 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !30 + %rawSym18.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #12, !dbg !30 + %stackFrame20.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8, !dbg !30 + %34 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !30 + %35 = bitcast i8* %34 to i16*, !dbg !30 + %36 = load i16, i16* %35, align 8, !dbg !30 + %37 = and i16 %36, -384, !dbg !30 + store i16 %37, i16* %35, align 8, !dbg !30 + %38 = getelementptr inbounds i8, i8* %34, i64 4, !dbg !30 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %38, i8 0, i64 28, i1 false) #12, !dbg !30 + %39 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #12, !dbg !30 + %40 = bitcast i8* %34 to %struct.rb_sorbet_param_struct*, !dbg !30 + %41 = bitcast %struct.rb_iseq_struct* %stackFrame20.i to i8*, !dbg !30 + call void @rb_add_method_sorbet(i64 %23, i64 %39, i64 (i32, i64*, i64)* noundef @"func_Object#foo", %struct.rb_sorbet_param_struct* nonnull %40, i32 noundef 1, i8* %41) #12, !dbg !30 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %22, align 8, !dbg !30, !tbaa !12 + %42 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !32, !tbaa !12 + %43 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %42, i64 0, i32 2, !dbg !32 + %44 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %43, align 8, !dbg !32, !tbaa !14 + %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 1, !dbg !32 + %46 = load i64*, i64** %45, align 8, !dbg !32, !tbaa !25 + %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !32 + store i64* %47, i64** %45, align 8, !dbg !32, !tbaa !25 + store i64 %13, i64* %46, align 8, !dbg !32, !tbaa !4 + %send29.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #12, !dbg !32 ret void } @@ -407,7 +384,7 @@ declare void @llvm.assume(i1 noundef) #8 define linkonce void @const_recompute_A() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !35 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !22 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -447,44 +424,33 @@ attributes #12 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 5, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 1, i32 2000} -!33 = !DILocation(line: 0, scope: !8) -!34 = !DILocation(line: 6, column: 3, scope: !8) -!35 = !{!36, !36, i64 0} -!36 = !{!"long long", !6, i64 0} -!37 = !{!"branch_weights", i32 1, i32 10000} -!38 = !{!19, !13, i64 8} -!39 = !DILocation(line: 7, column: 3, scope: !8) -!40 = !DILocation(line: 8, column: 3, scope: !8) -!41 = !DILocation(line: 9, column: 3, scope: !8) -!42 = !DILocation(line: 5, column: 1, scope: !43) -!43 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!44 = !DILocation(line: 12, column: 1, scope: !43) -!45 = !{!46, !5, i64 400} -!46 = !{!"rb_vm_struct", !5, i64 0, !47, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !36, i64 216, !6, i64 224, !48, i64 264, !48, i64 280, !48, i64 296, !48, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !50, i64 472, !51, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !48, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !52, i64 1200, !6, i64 1232} -!47 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !48, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!48 = !{!"list_head", !49, i64 0} -!49 = !{!"list_node", !13, i64 0, !13, i64 8} -!50 = !{!"", !6, i64 0} -!51 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!52 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!53 = !{!19, !13, i64 32} -!54 = !DILocation(line: 0, scope: !43) -!55 = !DILocation(line: 4, column: 1, scope: !43) -!56 = !DILocation(line: 0, scope: !57, inlinedAt: !58) -!57 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L61", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!58 = distinct !DILocation(line: 4, column: 1, scope: !43) +!18 = !DILocation(line: 5, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 1, i32 2000} +!20 = !DILocation(line: 0, scope: !8) +!21 = !DILocation(line: 6, column: 3, scope: !8) +!22 = !{!23, !23, i64 0} +!23 = !{!"long long", !6, i64 0} +!24 = !{!"branch_weights", i32 1, i32 10000} +!25 = !{!26, !13, i64 8} +!26 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!27 = !DILocation(line: 7, column: 3, scope: !8) +!28 = !DILocation(line: 8, column: 3, scope: !8) +!29 = !DILocation(line: 9, column: 3, scope: !8) +!30 = !DILocation(line: 5, column: 1, scope: !31) +!31 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!32 = !DILocation(line: 12, column: 1, scope: !31) +!33 = !{!34, !5, i64 400} +!34 = !{!"rb_vm_struct", !5, i64 0, !35, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !23, i64 216, !6, i64 224, !36, i64 264, !36, i64 280, !36, i64 296, !36, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !38, i64 472, !39, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !36, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !40, i64 1200, !6, i64 1232} +!35 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !36, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!36 = !{!"list_head", !37, i64 0} +!37 = !{!"list_node", !13, i64 0, !13, i64 8} +!38 = !{!"", !6, i64 0} +!39 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!40 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!41 = !{!26, !13, i64 16} +!42 = !{!26, !13, i64 32} +!43 = !DILocation(line: 0, scope: !31) +!44 = !DILocation(line: 4, column: 1, scope: !31) +!45 = !DILocation(line: 0, scope: !46, inlinedAt: !47) +!46 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L61", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!47 = distinct !DILocation(line: 4, column: 1, scope: !31) diff --git a/test/testdata/compiler/custom_plus.llo.exp b/test/testdata/compiler/custom_plus.llo.exp index f6e44a9f420..97db9cbc97c 100644 --- a/test/testdata/compiler/custom_plus.llo.exp +++ b/test/testdata/compiler/custom_plus.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_delegate = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/custom_plus.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/custom_plus.rb" = private unnamed_addr constant [38 x i8] c"test/testdata/compiler/custom_plus.rb\00", align 1 +@iseqEncodedArray = internal global [23 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"ic_+" = internal global %struct.FunctionInlineCache zeroinitializer @"rubyIdPrecomputed_+" = internal unnamed_addr global i64 0, align 8 @"str_+" = private unnamed_addr constant [2 x i8] c"+\00", align 1 @@ -129,7 +133,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -198,101 +204,87 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !31 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !18 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !18 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !18 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 BB2: ; preds = %fillRequiredArgs - %11 = getelementptr inbounds i64, i64* %9, i64 2 - %12 = getelementptr inbounds i64, i64* %11, i64 1 - store i64* %12, i64** %3, align 8, !tbaa !12 - %rubyStr_ok = load i64, i64* @rubyStrFrozen_ok, align 8, !dbg !33 - %13 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 - %14 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %13, i64 0, i32 2, !dbg !34 - %15 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %14, align 8, !dbg !34, !tbaa !14 - %16 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %15, i64 0, i32 1, !dbg !34 - %17 = load i64*, i64** %16, align 8, !dbg !34, !tbaa !35 - %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !34 - store i64 %selfRaw, i64* %17, align 8, !dbg !34, !tbaa !4 - %19 = getelementptr inbounds i64, i64* %18, i64 1, !dbg !34 - store i64* %19, i64** %16, align 8, !dbg !34, !tbaa !35 - store i64 %rubyStr_ok, i64* %18, align 8, !dbg !34, !tbaa !4 - br label %BB4, !dbg !34 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %3, align 8, !tbaa !12 + %rubyStr_ok = load i64, i64* @rubyStrFrozen_ok, align 8, !dbg !20 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !12 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !21 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !21, !tbaa !14 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 1, !dbg !21 + %8 = load i64*, i64** %7, align 8, !dbg !21, !tbaa !22 + %9 = getelementptr inbounds i64, i64* %8, i64 1, !dbg !21 + store i64 %selfRaw, i64* %8, align 8, !dbg !21, !tbaa !4 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !21 + store i64* %10, i64** %7, align 8, !dbg !21, !tbaa !22 + store i64 %rubyStr_ok, i64* %9, align 8, !dbg !21, !tbaa !4 + br label %BB4, !dbg !21 BB3: ; preds = %fillRequiredArgs - %20 = getelementptr inbounds i64, i64* %9, i64 4 - %21 = getelementptr inbounds i64, i64* %20, i64 1 - store i64* %21, i64** %3, align 8, !tbaa !12 - %rubyStr_fail = load i64, i64* @rubyStrFrozen_fail, align 8, !dbg !36 - %22 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !12 - %23 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %22, i64 0, i32 2, !dbg !37 - %24 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %23, align 8, !dbg !37, !tbaa !14 - %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 1, !dbg !37 - %26 = load i64*, i64** %25, align 8, !dbg !37, !tbaa !35 - %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !37 - store i64 %selfRaw, i64* %26, align 8, !dbg !37, !tbaa !4 - %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !37 - store i64* %28, i64** %25, align 8, !dbg !37, !tbaa !35 - store i64 %rubyStr_fail, i64* %27, align 8, !dbg !37, !tbaa !4 - br label %BB4, !dbg !37 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %3, align 8, !tbaa !12 + %rubyStr_fail = load i64, i64* @rubyStrFrozen_fail, align 8, !dbg !24 + %11 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !12 + %12 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %11, i64 0, i32 2, !dbg !25 + %13 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %12, align 8, !dbg !25, !tbaa !14 + %14 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %13, i64 0, i32 1, !dbg !25 + %15 = load i64*, i64** %14, align 8, !dbg !25, !tbaa !22 + %16 = getelementptr inbounds i64, i64* %15, i64 1, !dbg !25 + store i64 %selfRaw, i64* %15, align 8, !dbg !25, !tbaa !4 + %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !25 + store i64* %17, i64** %14, align 8, !dbg !25, !tbaa !22 + store i64 %rubyStr_fail, i64* %16, align 8, !dbg !25, !tbaa !4 + br label %BB4, !dbg !25 BB4: ; preds = %BB2, %BB3 %ic_puts.1.sink = phi %struct.FunctionInlineCache* [ @ic_puts.1, %BB2 ], [ @ic_puts, %BB3 ] - %send34 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef %ic_puts.1.sink, i64 0), !dbg !38 - %29 = getelementptr inbounds i64, i64* %9, i64 6 - %30 = getelementptr inbounds i64, i64* %29, i64 1 - store i64* %30, i64** %3, align 8, !tbaa !12 + %send34 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef %ic_puts.1.sink, i64 0), !dbg !26 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 20), i64** %3, align 8, !tbaa !12 ret i64 %send34 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_a = load i64, i64* %argArray, align 8, !dbg !31 - %31 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !39 - store i64* %31, i64** %3, align 8, !dbg !39, !tbaa !12 - %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !12 - %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !40 - %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !40, !tbaa !14 - %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 1, !dbg !40 - %36 = load i64*, i64** %35, align 8, !dbg !40, !tbaa !35 - %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !40 - store i64 %rawArg_a, i64* %36, align 8, !dbg !40, !tbaa !4 - %38 = getelementptr inbounds i64, i64* %37, i64 1, !dbg !40 - store i64* %38, i64** %35, align 8, !dbg !40, !tbaa !35 - store i64 3, i64* %37, align 8, !dbg !40, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !40 - %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !12 - %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !40 - %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !40, !tbaa !14 - %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 1, !dbg !40 - %43 = load i64*, i64** %42, align 8, !dbg !40, !tbaa !35 - %44 = getelementptr inbounds i64, i64* %43, i64 1, !dbg !40 - store i64 %send, i64* %43, align 8, !dbg !40, !tbaa !4 - %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !40 - store i64* %45, i64** %42, align 8, !dbg !40, !tbaa !35 - store i64 %rawArg_a, i64* %44, align 8, !dbg !40, !tbaa !4 - %send20 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_==", i64 0), !dbg !40 - %46 = and i64 %send20, -9, !dbg !40 - %47 = icmp ne i64 %46, 0, !dbg !40 - br i1 %47, label %BB2, label %BB3, !dbg !40 + %rawArg_a = load i64, i64* %argArray, align 8, !dbg !18 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %3, align 8, !dbg !27, !tbaa !12 + %18 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !12 + %19 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %18, i64 0, i32 2, !dbg !28 + %20 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %19, align 8, !dbg !28, !tbaa !14 + %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 1, !dbg !28 + %22 = load i64*, i64** %21, align 8, !dbg !28, !tbaa !22 + %23 = getelementptr inbounds i64, i64* %22, i64 1, !dbg !28 + store i64 %rawArg_a, i64* %22, align 8, !dbg !28, !tbaa !4 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !28 + store i64* %24, i64** %21, align 8, !dbg !28, !tbaa !22 + store i64 3, i64* %23, align 8, !dbg !28, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !28 + %25 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !12 + %26 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %25, i64 0, i32 2, !dbg !28 + %27 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %26, align 8, !dbg !28, !tbaa !14 + %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 1, !dbg !28 + %29 = load i64*, i64** %28, align 8, !dbg !28, !tbaa !22 + %30 = getelementptr inbounds i64, i64* %29, i64 1, !dbg !28 + store i64 %send, i64* %29, align 8, !dbg !28, !tbaa !4 + %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !28 + store i64* %31, i64** %28, align 8, !dbg !28, !tbaa !22 + store i64 %rawArg_a, i64* %30, align 8, !dbg !28, !tbaa !4 + %send20 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_==", i64 0), !dbg !28 + %32 = and i64 %send20, -9, !dbg !28 + %33 = icmp ne i64 %32, 0, !dbg !28 + br i1 %33, label %BB2, label %BB3, !dbg !28 } ; Function Attrs: sspreq define void @Init_custom_plus() local_unnamed_addr #7 { entry: - %positional_table.i.i = alloca i64, align 8, !dbg !41 - %positional_table.i = alloca i64, align 8, !dbg !45 + %positional_table.i.i = alloca i64, align 8, !dbg !29 + %positional_table.i = alloca i64, align 8, !dbg !33 %locals.i19.i = alloca i64, i32 0, align 8 %locals.i15.i = alloca i64, i32 0, align 8 %locals.i13.i = alloca i64, i32 0, align 8 @@ -324,53 +316,55 @@ entry: %11 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([38 x i8], [38 x i8]* @"str_test/testdata/compiler/custom_plus.rb", i64 0, i64 0), i64 noundef 37) #13 tail call void @rb_gc_register_mark_object(i64 %11) #13 store i64 %11, i64* @"rubyStrFrozen_test/testdata/compiler/custom_plus.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 23) %rubyId_delegate.i.i = load i64, i64* @rubyIdPrecomputed_delegate, align 8 %rubyStr_delegate.i.i = load i64, i64* @rubyStrFrozen_delegate, align 8 - %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_delegate.i.i, i64 %rubyId_delegate.i.i, i64 %11, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 14, i32 noundef 20, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/custom_plus.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/custom_plus.rb", align 8 + %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_delegate.i.i, i64 %rubyId_delegate.i.i, i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %12, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#delegate", align 8 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !40 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !40 - %"rubyId_==.i" = load i64, i64* @"rubyIdPrecomputed_==", align 8, !dbg !40 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_==", i64 %"rubyId_==.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !40 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !28 + %"rubyId_==.i" = load i64, i64* @"rubyIdPrecomputed_==", align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_==", i64 %"rubyId_==.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !28 %13 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_fail, i64 0, i64 0), i64 noundef 4) #13 call void @rb_gc_register_mark_object(i64 %13) #13 store i64 %13, i64* @rubyStrFrozen_fail, align 8 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !25 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 %14 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_ok, i64 0, i64 0), i64 noundef 2) #13 call void @rb_gc_register_mark_object(i64 %14) #13 store i64 %14, i64* @rubyStrFrozen_ok, align 8 - %rubyId_puts3.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !34 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts3.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 + %rubyId_puts3.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts3.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !21 %15 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #13 call void @rb_gc_register_mark_object(i64 %15) #13 store i64 %15, i64* @"rubyStrFrozen_", align 8 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/custom_plus.rb.i12.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/custom_plus.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i12.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 22, i64* noundef nonnull %locals.i13.i, i32 noundef 0, i32 noundef 4) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i12.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i13.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !46 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !46 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !45 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !45 - %rubyId_delegate.i = load i64, i64* @rubyIdPrecomputed_delegate, align 8, !dbg !47 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_delegate, i64 %rubyId_delegate.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !47 + %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !34 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !34 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !33 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !33 + %rubyId_delegate.i = load i64, i64* @rubyIdPrecomputed_delegate, align 8, !dbg !35 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_delegate, i64 %rubyId_delegate.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 %17 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @"str_+", i64 0, i64 0), i64 noundef 1) #13 call void @rb_gc_register_mark_object(i64 %17) #13 %"rubyId_+.i.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8 %"rubyStr_test/testdata/compiler/custom_plus.rb.i14.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/custom_plus.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %"rubyId_+.i.i", i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 7, i32 noundef 9, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 0) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %"rubyId_+.i.i", i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#+", align 8 %"rubyId_.i16.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i17.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/custom_plus.rb.i18.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/custom_plus.rb", align 8 - %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i17.i", i64 %"rubyId_.i16.i", i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i18.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 6, i32 noundef 6, i64* noundef nonnull %locals.i19.i, i32 noundef 0, i32 noundef 4) + %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i17.i", i64 %"rubyId_.i16.i", i64 %"rubyStr_test/testdata/compiler/custom_plus.rb.i18.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i19.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %19, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %rubyId_keep_def10.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.2, i64 %rubyId_keep_def10.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !48 + %rubyId_keep_def10.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !36 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.2, i64 %rubyId_keep_def10.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !36 %20 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %21 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %20, i64 0, i32 18 - %22 = load i64, i64* %21, align 8, !tbaa !49 + %22 = load i64, i64* %21, align 8, !tbaa !37 %23 = bitcast i64* %positional_table.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %23) %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 @@ -378,185 +372,157 @@ entry: %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2 %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !tbaa !14 %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %27, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %27, align 8, !tbaa !46 %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4 - %29 = load i64*, i64** %28, align 8, !tbaa !58 + %29 = load i64*, i64** %28, align 8, !tbaa !47 %30 = load i64, i64* %29, align 8, !tbaa !4 %31 = and i64 %30, -33 store i64 %31, i64* %29, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %24, %struct.rb_control_frame_struct* align 8 %26, %struct.rb_iseq_struct* %stackFrame.i) #13 %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 0 - %33 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %27, align 8, !tbaa !18 - %34 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %33, i64 0, i32 2 - %35 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %34, align 8, !tbaa !20 - %36 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %35, i64 0, i32 2 - %37 = load i64*, i64** %36, align 8, !tbaa !22 - %38 = getelementptr inbounds i64, i64* %37, i64 5 - %39 = getelementptr inbounds i64, i64* %38, i64 1 - store i64* %39, i64** %32, align 8, !dbg !59, !tbaa !12 - %40 = load i64, i64* @rb_cObject, align 8, !dbg !60 - %41 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %40) #13, !dbg !60 - call void @sorbet_pushStaticInitFrame(i64 %41) #13, !dbg !60 - %42 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %42) #13 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %32, align 8, !dbg !48, !tbaa !12 + %33 = load i64, i64* @rb_cObject, align 8, !dbg !49 + %34 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %33) #13, !dbg !49 + call void @sorbet_pushStaticInitFrame(i64 %34) #13, !dbg !49 + %35 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %35) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %43 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 - %44 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %43, i64 0, i32 2 - %45 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %44, align 8, !tbaa !14 - %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %46, align 8, !tbaa !18 - %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 4 - %48 = load i64*, i64** %47, align 8, !tbaa !58 - %49 = load i64, i64* %48, align 8, !tbaa !4 - %50 = and i64 %49, -33 - store i64 %50, i64* %48, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %43, %struct.rb_control_frame_struct* align 8 %45, %struct.rb_iseq_struct* %stackFrame.i.i) #13 - %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 0 - %52 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %46, align 8, !tbaa !18 - %53 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %52, i64 0, i32 2 - %54 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %53, align 8, !tbaa !20 - %55 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %54, i64 0, i32 2 - %56 = load i64*, i64** %55, align 8, !tbaa !22 - %57 = getelementptr inbounds i64, i64* %56, i64 1 - %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !61 - store i64* %58, i64** %51, align 8, !dbg !61, !tbaa !12 - %"rubyId_+.i.i1" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !41 - %rawSym.i.i = call i64 @rb_id2sym(i64 %"rubyId_+.i.i1") #13, !dbg !41 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !41 - %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !41 - %59 = load i64, i64* @guard_epoch_A, align 8, !dbg !41 - %60 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !41, !tbaa !62 - %needTakeSlowPath = icmp ne i64 %59, %60, !dbg !41 - br i1 %needTakeSlowPath, label %61, label %62, !dbg !41, !prof !63 - -61: ; preds = %entry - call void @const_recompute_A(), !dbg !41 - br label %62, !dbg !41 - -62: ; preds = %entry, %61 - %63 = load i64, i64* @guarded_const_A, align 8, !dbg !41 - %64 = load i64, i64* @guard_epoch_A, align 8, !dbg !41 - %65 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !41, !tbaa !62 - %guardUpdated = icmp eq i64 %64, %65, !dbg !41 - call void @llvm.assume(i1 %guardUpdated), !dbg !41 - %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#+", align 8, !dbg !41 - %66 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !41 - %67 = bitcast i8* %66 to i16*, !dbg !41 - %68 = load i16, i16* %67, align 8, !dbg !41 - %69 = and i16 %68, -384, !dbg !41 - %70 = or i16 %69, 1, !dbg !41 - store i16 %70, i16* %67, align 8, !dbg !41 - %71 = getelementptr inbounds i8, i8* %66, i64 8, !dbg !41 - %72 = bitcast i8* %71 to i32*, !dbg !41 - store i32 1, i32* %72, align 8, !dbg !41, !tbaa !64 - %73 = getelementptr inbounds i8, i8* %66, i64 12, !dbg !41 - %74 = getelementptr inbounds i8, i8* %66, i64 4, !dbg !41 - %75 = bitcast i8* %74 to i32*, !dbg !41 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %73, i8 0, i64 20, i1 false) #13, !dbg !41 - store i32 1, i32* %75, align 4, !dbg !41, !tbaa !66 - %rubyId_b.i.i = load i64, i64* @rubyIdPrecomputed_b, align 8, !dbg !41 - store i64 %rubyId_b.i.i, i64* %positional_table.i.i, align 8, !dbg !41 - %76 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !41 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %76, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %42, i64 noundef 8, i1 noundef false) #13, !dbg !41 - %77 = getelementptr inbounds i8, i8* %66, i64 32, !dbg !41 - %78 = bitcast i8* %77 to i8**, !dbg !41 - store i8* %76, i8** %78, align 8, !dbg !41, !tbaa !67 - %79 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @"str_+", i64 0, i64 0)) #13, !dbg !41 - %80 = bitcast i8* %66 to %struct.rb_sorbet_param_struct*, !dbg !41 - %81 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !41 - call void @rb_add_method_sorbet(i64 %63, i64 %79, i64 (i32, i64*, i64)* noundef @"func_A#+", %struct.rb_sorbet_param_struct* nonnull %80, i32 noundef 1, i8* %81) #13, !dbg !41 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %42) #13 - call void @sorbet_popRubyStack() #13, !dbg !60 - %82 = getelementptr inbounds i64, i64* %37, i64 11, !dbg !60 - %83 = getelementptr inbounds i64, i64* %82, i64 1, !dbg !60 - store i64* %83, i64** %32, align 8, !dbg !60, !tbaa !12 - %84 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !46, !tbaa !12 - %85 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %84, i64 0, i32 2, !dbg !46 - %86 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %85, align 8, !dbg !46, !tbaa !14 - %87 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %86, i64 0, i32 1, !dbg !46 - %88 = load i64*, i64** %87, align 8, !dbg !46, !tbaa !35 - %89 = getelementptr inbounds i64, i64* %88, i64 1, !dbg !46 - store i64* %89, i64** %87, align 8, !dbg !46, !tbaa !35 - store i64 %63, i64* %88, align 8, !dbg !46, !tbaa !4 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #13, !dbg !46 - %90 = getelementptr inbounds i64, i64* %37, i64 13, !dbg !46 - %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !46 - store i64* %91, i64** %32, align 8, !dbg !46, !tbaa !12 - %rubyId_delegate.i2 = load i64, i64* @rubyIdPrecomputed_delegate, align 8, !dbg !45 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_delegate.i2) #13, !dbg !45 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !45 - %rawSym22.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #13, !dbg !45 - %stackFrame24.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#delegate", align 8, !dbg !45 - %92 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !45 - %93 = bitcast i8* %92 to i16*, !dbg !45 - %94 = load i16, i16* %93, align 8, !dbg !45 - %95 = and i16 %94, -384, !dbg !45 - %96 = or i16 %95, 1, !dbg !45 - store i16 %96, i16* %93, align 8, !dbg !45 - %97 = getelementptr inbounds i8, i8* %92, i64 8, !dbg !45 - %98 = bitcast i8* %97 to i32*, !dbg !45 - store i32 1, i32* %98, align 8, !dbg !45, !tbaa !64 - %99 = getelementptr inbounds i8, i8* %92, i64 12, !dbg !45 - %100 = getelementptr inbounds i8, i8* %92, i64 4, !dbg !45 - %101 = bitcast i8* %100 to i32*, !dbg !45 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %99, i8 0, i64 20, i1 false) #13, !dbg !45 - store i32 1, i32* %101, align 4, !dbg !45, !tbaa !66 - %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !45 - store i64 %rubyId_a.i, i64* %positional_table.i, align 8, !dbg !45 - %102 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !45 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %102, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %23, i64 noundef 8, i1 noundef false) #13, !dbg !45 - %103 = getelementptr inbounds i8, i8* %92, i64 32, !dbg !45 - %104 = bitcast i8* %103 to i8**, !dbg !45 - store i8* %102, i8** %104, align 8, !dbg !45, !tbaa !67 - %105 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_delegate, i64 0, i64 0)) #13, !dbg !45 - %106 = bitcast i8* %92 to %struct.rb_sorbet_param_struct*, !dbg !45 - %107 = bitcast %struct.rb_iseq_struct* %stackFrame24.i to i8*, !dbg !45 - call void @rb_add_method_sorbet(i64 %40, i64 %105, i64 (i32, i64*, i64)* noundef @"func_Object#delegate", %struct.rb_sorbet_param_struct* nonnull %106, i32 noundef 1, i8* %107) #13, !dbg !45 - %108 = getelementptr inbounds i64, i64* %37, i64 21, !dbg !45 - %109 = getelementptr inbounds i64, i64* %108, i64 1, !dbg !45 - store i64* %109, i64** %32, align 8, !dbg !45, !tbaa !12 - %110 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !47, !tbaa !12 - %111 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %110, i64 0, i32 2, !dbg !47 - %112 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %111, align 8, !dbg !47, !tbaa !14 - %113 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %112, i64 0, i32 1, !dbg !47 - %114 = load i64*, i64** %113, align 8, !dbg !47, !tbaa !35 - %115 = getelementptr inbounds i64, i64* %114, i64 1, !dbg !47 - store i64 %22, i64* %114, align 8, !dbg !47, !tbaa !4 - %116 = getelementptr inbounds i64, i64* %115, i64 1, !dbg !47 - store i64* %116, i64** %113, align 8, !dbg !47, !tbaa !35 - store i64 %send.i, i64* %115, align 8, !dbg !47, !tbaa !4 - %send37.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_delegate, i64 0) #13, !dbg !47 + %36 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 + %37 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %36, i64 0, i32 2 + %38 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %37, align 8, !tbaa !14 + %39 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %39, align 8, !tbaa !46 + %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 4 + %41 = load i64*, i64** %40, align 8, !tbaa !47 + %42 = load i64, i64* %41, align 8, !tbaa !4 + %43 = and i64 %42, -33 + store i64 %43, i64* %41, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %36, %struct.rb_control_frame_struct* align 8 %38, %struct.rb_iseq_struct* %stackFrame.i.i) #13 + %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 0 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %44, align 8, !dbg !50, !tbaa !12 + %"rubyId_+.i.i1" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !29 + %rawSym.i.i = call i64 @rb_id2sym(i64 %"rubyId_+.i.i1") #13, !dbg !29 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !29 + %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !29 + %45 = load i64, i64* @guard_epoch_A, align 8, !dbg !29 + %46 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !29, !tbaa !51 + %needTakeSlowPath = icmp ne i64 %45, %46, !dbg !29 + br i1 %needTakeSlowPath, label %47, label %48, !dbg !29, !prof !52 + +47: ; preds = %entry + call void @const_recompute_A(), !dbg !29 + br label %48, !dbg !29 + +48: ; preds = %entry, %47 + %49 = load i64, i64* @guarded_const_A, align 8, !dbg !29 + %50 = load i64, i64* @guard_epoch_A, align 8, !dbg !29 + %51 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !29, !tbaa !51 + %guardUpdated = icmp eq i64 %50, %51, !dbg !29 + call void @llvm.assume(i1 %guardUpdated), !dbg !29 + %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#+", align 8, !dbg !29 + %52 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !29 + %53 = bitcast i8* %52 to i16*, !dbg !29 + %54 = load i16, i16* %53, align 8, !dbg !29 + %55 = and i16 %54, -384, !dbg !29 + %56 = or i16 %55, 1, !dbg !29 + store i16 %56, i16* %53, align 8, !dbg !29 + %57 = getelementptr inbounds i8, i8* %52, i64 8, !dbg !29 + %58 = bitcast i8* %57 to i32*, !dbg !29 + store i32 1, i32* %58, align 8, !dbg !29, !tbaa !53 + %59 = getelementptr inbounds i8, i8* %52, i64 12, !dbg !29 + %60 = getelementptr inbounds i8, i8* %52, i64 4, !dbg !29 + %61 = bitcast i8* %60 to i32*, !dbg !29 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %59, i8 0, i64 20, i1 false) #13, !dbg !29 + store i32 1, i32* %61, align 4, !dbg !29, !tbaa !56 + %rubyId_b.i.i = load i64, i64* @rubyIdPrecomputed_b, align 8, !dbg !29 + store i64 %rubyId_b.i.i, i64* %positional_table.i.i, align 8, !dbg !29 + %62 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !29 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %62, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %35, i64 noundef 8, i1 noundef false) #13, !dbg !29 + %63 = getelementptr inbounds i8, i8* %52, i64 32, !dbg !29 + %64 = bitcast i8* %63 to i8**, !dbg !29 + store i8* %62, i8** %64, align 8, !dbg !29, !tbaa !57 + %65 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @"str_+", i64 0, i64 0)) #13, !dbg !29 + %66 = bitcast i8* %52 to %struct.rb_sorbet_param_struct*, !dbg !29 + %67 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !29 + call void @rb_add_method_sorbet(i64 %49, i64 %65, i64 (i32, i64*, i64)* noundef @"func_A#+", %struct.rb_sorbet_param_struct* nonnull %66, i32 noundef 1, i8* %67) #13, !dbg !29 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %35) #13 + call void @sorbet_popRubyStack() #13, !dbg !49 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %32, align 8, !dbg !49, !tbaa !12 + %68 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 + %69 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %68, i64 0, i32 2, !dbg !34 + %70 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %69, align 8, !dbg !34, !tbaa !14 + %71 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %70, i64 0, i32 1, !dbg !34 + %72 = load i64*, i64** %71, align 8, !dbg !34, !tbaa !22 + %73 = getelementptr inbounds i64, i64* %72, i64 1, !dbg !34 + store i64* %73, i64** %71, align 8, !dbg !34, !tbaa !22 + store i64 %49, i64* %72, align 8, !dbg !34, !tbaa !4 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #13, !dbg !34 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %32, align 8, !dbg !34, !tbaa !12 + %rubyId_delegate.i2 = load i64, i64* @rubyIdPrecomputed_delegate, align 8, !dbg !33 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_delegate.i2) #13, !dbg !33 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !33 + %rawSym22.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #13, !dbg !33 + %stackFrame24.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#delegate", align 8, !dbg !33 + %74 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !33 + %75 = bitcast i8* %74 to i16*, !dbg !33 + %76 = load i16, i16* %75, align 8, !dbg !33 + %77 = and i16 %76, -384, !dbg !33 + %78 = or i16 %77, 1, !dbg !33 + store i16 %78, i16* %75, align 8, !dbg !33 + %79 = getelementptr inbounds i8, i8* %74, i64 8, !dbg !33 + %80 = bitcast i8* %79 to i32*, !dbg !33 + store i32 1, i32* %80, align 8, !dbg !33, !tbaa !53 + %81 = getelementptr inbounds i8, i8* %74, i64 12, !dbg !33 + %82 = getelementptr inbounds i8, i8* %74, i64 4, !dbg !33 + %83 = bitcast i8* %82 to i32*, !dbg !33 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %81, i8 0, i64 20, i1 false) #13, !dbg !33 + store i32 1, i32* %83, align 4, !dbg !33, !tbaa !56 + %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !33 + store i64 %rubyId_a.i, i64* %positional_table.i, align 8, !dbg !33 + %84 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !33 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %84, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %23, i64 noundef 8, i1 noundef false) #13, !dbg !33 + %85 = getelementptr inbounds i8, i8* %74, i64 32, !dbg !33 + %86 = bitcast i8* %85 to i8**, !dbg !33 + store i8* %84, i8** %86, align 8, !dbg !33, !tbaa !57 + %87 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_delegate, i64 0, i64 0)) #13, !dbg !33 + %88 = bitcast i8* %74 to %struct.rb_sorbet_param_struct*, !dbg !33 + %89 = bitcast %struct.rb_iseq_struct* %stackFrame24.i to i8*, !dbg !33 + call void @rb_add_method_sorbet(i64 %33, i64 %87, i64 (i32, i64*, i64)* noundef @"func_Object#delegate", %struct.rb_sorbet_param_struct* nonnull %88, i32 noundef 1, i8* %89) #13, !dbg !33 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 22), i64** %32, align 8, !dbg !33, !tbaa !12 + %90 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !12 + %91 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %90, i64 0, i32 2, !dbg !35 + %92 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %91, align 8, !dbg !35, !tbaa !14 + %93 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %92, i64 0, i32 1, !dbg !35 + %94 = load i64*, i64** %93, align 8, !dbg !35, !tbaa !22 + %95 = getelementptr inbounds i64, i64* %94, i64 1, !dbg !35 + store i64 %22, i64* %94, align 8, !dbg !35, !tbaa !4 + %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !35 + store i64* %96, i64** %93, align 8, !dbg !35, !tbaa !22 + store i64 %send.i, i64* %95, align 8, !dbg !35, !tbaa !4 + %send37.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_delegate, i64 0) #13, !dbg !35 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %23) ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_A#+"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 returned %selfRaw) #6 !dbg !68 { +define i64 @"func_A#+"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 returned %selfRaw) #6 !dbg !58 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !69 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !69 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !69 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !69, !prof !32 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !59 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !59 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !59 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !59, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !69 - unreachable, !dbg !69 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !59 + unreachable, !dbg !59 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !70 - store i64* %11, i64** %3, align 8, !dbg !70, !tbaa !12 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !60, !tbaa !12 ret i64 %selfRaw } @@ -576,7 +542,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @const_recompute_A() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !62 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !51 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -617,56 +583,46 @@ attributes #13 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} +!18 = !DILocation(line: 14, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 4001, i32 4000000} +!20 = !DILocation(line: 16, column: 10, scope: !8) +!21 = !DILocation(line: 16, column: 5, scope: !8) !22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 14, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 4001, i32 4000000} -!33 = !DILocation(line: 16, column: 10, scope: !8) -!34 = !DILocation(line: 16, column: 5, scope: !8) -!35 = !{!19, !13, i64 8} -!36 = !DILocation(line: 18, column: 10, scope: !8) -!37 = !DILocation(line: 18, column: 5, scope: !8) -!38 = !DILocation(line: 0, scope: !8) -!39 = !DILocation(line: 14, column: 14, scope: !8) -!40 = !DILocation(line: 15, column: 6, scope: !8) -!41 = !DILocation(line: 7, column: 3, scope: !42, inlinedAt: !43) -!42 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L79", scope: null, file: !2, line: 6, type: !9, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!43 = distinct !DILocation(line: 6, column: 1, scope: !44) -!44 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 6, type: !9, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!45 = !DILocation(line: 14, column: 1, scope: !44) -!46 = !DILocation(line: 12, column: 5, scope: !44) -!47 = !DILocation(line: 22, column: 1, scope: !44) -!48 = !DILocation(line: 7, column: 3, scope: !42) -!49 = !{!50, !5, i64 400} -!50 = !{!"rb_vm_struct", !5, i64 0, !51, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !54, i64 216, !6, i64 224, !52, i64 264, !52, i64 280, !52, i64 296, !52, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !55, i64 472, !56, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !52, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !57, i64 1200, !6, i64 1232} -!51 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !52, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!52 = !{!"list_head", !53, i64 0} -!53 = !{!"list_node", !13, i64 0, !13, i64 8} -!54 = !{!"long long", !6, i64 0} -!55 = !{!"", !6, i64 0} -!56 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!57 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!58 = !{!19, !13, i64 32} -!59 = !DILocation(line: 0, scope: !44) -!60 = !DILocation(line: 6, column: 1, scope: !44) -!61 = !DILocation(line: 0, scope: !42, inlinedAt: !43) -!62 = !{!54, !54, i64 0} -!63 = !{!"branch_weights", i32 1, i32 10000} -!64 = !{!65, !16, i64 8} -!65 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!66 = !{!65, !16, i64 4} -!67 = !{!65, !13, i64 32} -!68 = distinct !DISubprogram(name: "A#+", linkageName: "func_A#+", scope: null, file: !2, line: 7, type: !9, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!69 = !DILocation(line: 7, column: 3, scope: !68) -!70 = !DILocation(line: 0, scope: !68) +!23 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!24 = !DILocation(line: 18, column: 10, scope: !8) +!25 = !DILocation(line: 18, column: 5, scope: !8) +!26 = !DILocation(line: 0, scope: !8) +!27 = !DILocation(line: 14, column: 14, scope: !8) +!28 = !DILocation(line: 15, column: 6, scope: !8) +!29 = !DILocation(line: 7, column: 3, scope: !30, inlinedAt: !31) +!30 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L79", scope: null, file: !2, line: 6, type: !9, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!31 = distinct !DILocation(line: 6, column: 1, scope: !32) +!32 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 6, type: !9, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!33 = !DILocation(line: 14, column: 1, scope: !32) +!34 = !DILocation(line: 12, column: 5, scope: !32) +!35 = !DILocation(line: 22, column: 1, scope: !32) +!36 = !DILocation(line: 7, column: 3, scope: !30) +!37 = !{!38, !5, i64 400} +!38 = !{!"rb_vm_struct", !5, i64 0, !39, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !42, i64 216, !6, i64 224, !40, i64 264, !40, i64 280, !40, i64 296, !40, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !43, i64 472, !44, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !40, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !45, i64 1200, !6, i64 1232} +!39 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !40, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!40 = !{!"list_head", !41, i64 0} +!41 = !{!"list_node", !13, i64 0, !13, i64 8} +!42 = !{!"long long", !6, i64 0} +!43 = !{!"", !6, i64 0} +!44 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!45 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!46 = !{!23, !13, i64 16} +!47 = !{!23, !13, i64 32} +!48 = !DILocation(line: 0, scope: !32) +!49 = !DILocation(line: 6, column: 1, scope: !32) +!50 = !DILocation(line: 0, scope: !30, inlinedAt: !31) +!51 = !{!42, !42, i64 0} +!52 = !{!"branch_weights", i32 1, i32 10000} +!53 = !{!54, !16, i64 8} +!54 = !{!"rb_sorbet_param_struct", !55, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!55 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!56 = !{!54, !16, i64 4} +!57 = !{!54, !13, i64 32} +!58 = distinct !DISubprogram(name: "A#+", linkageName: "func_A#+", scope: null, file: !2, line: 7, type: !9, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!59 = !DILocation(line: 7, column: 3, scope: !58) +!60 = !DILocation(line: 0, scope: !58) diff --git a/test/testdata/compiler/direct_call.llo.exp b/test/testdata/compiler/direct_call.llo.exp index 9c3242e735f..2b85a1891f9 100644 --- a/test/testdata/compiler/direct_call.llo.exp +++ b/test/testdata/compiler/direct_call.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -86,6 +88,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_foo = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/direct_call.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/direct_call.rb" = private unnamed_addr constant [38 x i8] c"test/testdata/compiler/direct_call.rb\00", align 1 +@iseqEncodedArray = internal global [13 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_Object#bar" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @rubyIdPrecomputed_bar = internal unnamed_addr global i64 0, align 8 @str_bar = private unnamed_addr constant [4 x i8] c"bar\00", align 1 @@ -108,7 +112,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_readRealpath() local_unnamed_addr #1 @@ -163,61 +169,45 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !31 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !18 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !33 - store i64* %11, i64** %3, align 8, !dbg !33, !tbaa !12 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !dbg !20, !tbaa !12 ret i64 3 } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#bar"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #5 !dbg !34 { +define i64 @"func_Object#bar"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #5 !dbg !21 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !35 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !35, !prof !32 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !22 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !22, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !35 - unreachable, !dbg !35 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !22 + unreachable, !dbg !22 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !36 - store i64* %11, i64** %3, align 8, !dbg !36, !tbaa !12 - %12 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !12 - %13 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %12, i64 0, i32 2, !dbg !37 - %14 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %13, align 8, !dbg !37, !tbaa !14 - %15 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 1, !dbg !37 - %16 = load i64*, i64** %15, align 8, !dbg !37, !tbaa !38 - %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !37 - store i64* %17, i64** %15, align 8, !dbg !37, !tbaa !38 - store i64 %selfRaw, i64* %16, align 8, !dbg !37, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0), !dbg !37 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !23, !tbaa !12 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !12 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !24 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !24, !tbaa !14 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 1, !dbg !24 + %8 = load i64*, i64** %7, align 8, !dbg !24, !tbaa !25 + %9 = getelementptr inbounds i64, i64* %8, i64 1, !dbg !24 + store i64* %9, i64** %7, align 8, !dbg !24, !tbaa !25 + store i64 %selfRaw, i64* %8, align 8, !dbg !24, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0), !dbg !24 ret i64 %send } @@ -246,115 +236,106 @@ entry: %7 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([38 x i8], [38 x i8]* @"str_test/testdata/compiler/direct_call.rb", i64 0, i64 0), i64 noundef 37) #10 tail call void @rb_gc_register_mark_object(i64 %7) #10 store i64 %7, i64* @"rubyStrFrozen_test/testdata/compiler/direct_call.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 13) %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %rubyStr_foo.i.i = load i64, i64* @rubyStrFrozen_foo, align 8 - %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i.i, i64 %rubyId_foo.i.i, i64 %7, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 6, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 0) + %"rubyStr_test/testdata/compiler/direct_call.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/direct_call.rb", align 8 + %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_foo.i.i, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/direct_call.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %8, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8 %9 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0), i64 noundef 3) #10 call void @rb_gc_register_mark_object(i64 %9) #10 %rubyId_bar.i.i = load i64, i64* @rubyIdPrecomputed_bar, align 8 %"rubyStr_test/testdata/compiler/direct_call.rb.i8.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/direct_call.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %rubyId_bar.i.i, i64 %"rubyStr_test/testdata/compiler/direct_call.rb.i8.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 10, i64* noundef nonnull %locals.i9.i, i32 noundef 0, i32 noundef 1) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %rubyId_bar.i.i, i64 %"rubyStr_test/testdata/compiler/direct_call.rb.i8.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i9.i, i32 noundef 0, i32 noundef 1) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#bar", align 8 - %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !37 + %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !24 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !24 %11 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #10 call void @rb_gc_register_mark_object(i64 %11) #10 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/direct_call.rb.i10.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/direct_call.rb", align 8 - %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %11, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/direct_call.rb.i10.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 12, i64* noundef nonnull %locals.i11.i, i32 noundef 0, i32 noundef 4) + %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %11, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/direct_call.rb.i10.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i11.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %12, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !39 - %rubyId_keep_def2.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !41 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.1, i64 %rubyId_keep_def2.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !41 - %rubyId_bar.i = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !42 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 %rubyId_bar.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !42 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !43 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !43 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !27 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !27 + %rubyId_keep_def2.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !29 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.1, i64 %rubyId_keep_def2.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !29 + %rubyId_bar.i = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !30 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 %rubyId_bar.i, i32 noundef 20, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !30 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !31 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !31 %13 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %14 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %13, i64 0, i32 18 - %15 = load i64, i64* %14, align 8, !tbaa !44 + %15 = load i64, i64* %14, align 8, !tbaa !32 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %16 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %17 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %16, i64 0, i32 2 %18 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %17, align 8, !tbaa !14 %19 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %18, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %19, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %19, align 8, !tbaa !41 %20 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %18, i64 0, i32 4 - %21 = load i64*, i64** %20, align 8, !tbaa !53 + %21 = load i64*, i64** %20, align 8, !tbaa !42 %22 = load i64, i64* %21, align 8, !tbaa !4 %23 = and i64 %22, -33 store i64 %23, i64* %21, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %16, %struct.rb_control_frame_struct* align 8 %18, %struct.rb_iseq_struct* %stackFrame.i) #10 %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %18, i64 0, i32 0 - %25 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %19, align 8, !tbaa !18 - %26 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %25, i64 0, i32 2 - %27 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %26, align 8, !tbaa !20 - %28 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %27, i64 0, i32 2 - %29 = load i64*, i64** %28, align 8, !tbaa !22 - %30 = getelementptr inbounds i64, i64* %29, i64 3 - %31 = getelementptr inbounds i64, i64* %30, i64 1 - store i64* %31, i64** %24, align 8, !dbg !54, !tbaa !12 - %rubyId_foo.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !39 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i1) #10, !dbg !39 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !39 - %rawSym21.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #10, !dbg !39 - %32 = load i64, i64* @rb_cObject, align 8, !dbg !39 - %stackFrame22.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8, !dbg !39 - %33 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #8, !dbg !39 - %34 = bitcast i8* %33 to i16*, !dbg !39 - %35 = load i16, i16* %34, align 8, !dbg !39 - %36 = and i16 %35, -384, !dbg !39 - store i16 %36, i16* %34, align 8, !dbg !39 - %37 = getelementptr inbounds i8, i8* %33, i64 4, !dbg !39 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %37, i8 0, i64 28, i1 false) #10, !dbg !39 - %38 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #10, !dbg !39 - %39 = bitcast i8* %33 to %struct.rb_sorbet_param_struct*, !dbg !39 - %40 = bitcast %struct.rb_iseq_struct* %stackFrame22.i to i8*, !dbg !39 - call void @rb_add_method_sorbet(i64 %32, i64 %38, i64 (i32, i64*, i64)* noundef @"func_Object#foo", %struct.rb_sorbet_param_struct* nonnull %39, i32 noundef 1, i8* %40) #10, !dbg !39 - %41 = getelementptr inbounds i64, i64* %29, i64 7, !dbg !39 - %42 = getelementptr inbounds i64, i64* %41, i64 1, !dbg !39 - store i64* %42, i64** %24, align 8, !dbg !39, !tbaa !12 - %rubyId_bar.i2 = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !41 - %rawSym27.i = call i64 @rb_id2sym(i64 %rubyId_bar.i2) #10, !dbg !41 - %rubyId_normal28.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !41 - %rawSym29.i = call i64 @rb_id2sym(i64 %rubyId_normal28.i) #10, !dbg !41 - %stackFrame34.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#bar", align 8, !dbg !41 - %43 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #8, !dbg !41 - %44 = bitcast i8* %43 to i16*, !dbg !41 - %45 = load i16, i16* %44, align 8, !dbg !41 - %46 = and i16 %45, -384, !dbg !41 - store i16 %46, i16* %44, align 8, !dbg !41 - %47 = getelementptr inbounds i8, i8* %43, i64 4, !dbg !41 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %47, i8 0, i64 28, i1 false) #10, !dbg !41 - %48 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0)) #10, !dbg !41 - %49 = bitcast i8* %43 to %struct.rb_sorbet_param_struct*, !dbg !41 - %50 = bitcast %struct.rb_iseq_struct* %stackFrame34.i to i8*, !dbg !41 - call void @rb_add_method_sorbet(i64 %32, i64 %48, i64 (i32, i64*, i64)* noundef @"func_Object#bar", %struct.rb_sorbet_param_struct* nonnull %49, i32 noundef 1, i8* %50) #10, !dbg !41 - %51 = getelementptr inbounds i64, i64* %29, i64 11, !dbg !41 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !41 - store i64* %52, i64** %24, align 8, !dbg !41, !tbaa !12 - %53 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !42, !tbaa !12 - %54 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %53, i64 0, i32 2, !dbg !42 - %55 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %54, align 8, !dbg !42, !tbaa !14 - %56 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %55, i64 0, i32 1, !dbg !42 - %57 = load i64*, i64** %56, align 8, !dbg !42, !tbaa !38 - %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !42 - store i64* %58, i64** %56, align 8, !dbg !42, !tbaa !38 - store i64 %15, i64* %57, align 8, !dbg !42, !tbaa !4 - %send47.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 0) #10, !dbg !42 - %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !43, !tbaa !12 - %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2, !dbg !43 - %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !dbg !43, !tbaa !14 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 1, !dbg !43 - %63 = load i64*, i64** %62, align 8, !dbg !43, !tbaa !38 - %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !43 - store i64 %15, i64* %63, align 8, !dbg !43, !tbaa !4 - %65 = getelementptr inbounds i64, i64* %64, i64 1, !dbg !43 - store i64* %65, i64** %62, align 8, !dbg !43, !tbaa !38 - store i64 %send47.i, i64* %64, align 8, !dbg !43, !tbaa !4 - %send53.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !43 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %24, align 8, !dbg !43, !tbaa !12 + %rubyId_foo.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !27 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i1) #10, !dbg !27 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !27 + %rawSym21.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #10, !dbg !27 + %25 = load i64, i64* @rb_cObject, align 8, !dbg !27 + %stackFrame22.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#foo", align 8, !dbg !27 + %26 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #8, !dbg !27 + %27 = bitcast i8* %26 to i16*, !dbg !27 + %28 = load i16, i16* %27, align 8, !dbg !27 + %29 = and i16 %28, -384, !dbg !27 + store i16 %29, i16* %27, align 8, !dbg !27 + %30 = getelementptr inbounds i8, i8* %26, i64 4, !dbg !27 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %30, i8 0, i64 28, i1 false) #10, !dbg !27 + %31 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #10, !dbg !27 + %32 = bitcast i8* %26 to %struct.rb_sorbet_param_struct*, !dbg !27 + %33 = bitcast %struct.rb_iseq_struct* %stackFrame22.i to i8*, !dbg !27 + call void @rb_add_method_sorbet(i64 %25, i64 %31, i64 (i32, i64*, i64)* noundef @"func_Object#foo", %struct.rb_sorbet_param_struct* nonnull %32, i32 noundef 1, i8* %33) #10, !dbg !27 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %24, align 8, !dbg !27, !tbaa !12 + %rubyId_bar.i2 = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !29 + %rawSym27.i = call i64 @rb_id2sym(i64 %rubyId_bar.i2) #10, !dbg !29 + %rubyId_normal28.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !29 + %rawSym29.i = call i64 @rb_id2sym(i64 %rubyId_normal28.i) #10, !dbg !29 + %stackFrame34.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#bar", align 8, !dbg !29 + %34 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #8, !dbg !29 + %35 = bitcast i8* %34 to i16*, !dbg !29 + %36 = load i16, i16* %35, align 8, !dbg !29 + %37 = and i16 %36, -384, !dbg !29 + store i16 %37, i16* %35, align 8, !dbg !29 + %38 = getelementptr inbounds i8, i8* %34, i64 4, !dbg !29 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %38, i8 0, i64 28, i1 false) #10, !dbg !29 + %39 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0)) #10, !dbg !29 + %40 = bitcast i8* %34 to %struct.rb_sorbet_param_struct*, !dbg !29 + %41 = bitcast %struct.rb_iseq_struct* %stackFrame34.i to i8*, !dbg !29 + call void @rb_add_method_sorbet(i64 %25, i64 %39, i64 (i32, i64*, i64)* noundef @"func_Object#bar", %struct.rb_sorbet_param_struct* nonnull %40, i32 noundef 1, i8* %41) #10, !dbg !29 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %24, align 8, !dbg !29, !tbaa !12 + %42 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !12 + %43 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %42, i64 0, i32 2, !dbg !30 + %44 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %43, align 8, !dbg !30, !tbaa !14 + %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 1, !dbg !30 + %46 = load i64*, i64** %45, align 8, !dbg !30, !tbaa !25 + %47 = getelementptr inbounds i64, i64* %46, i64 1, !dbg !30 + store i64* %47, i64** %45, align 8, !dbg !30, !tbaa !25 + store i64 %15, i64* %46, align 8, !dbg !30, !tbaa !4 + %send47.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 0) #10, !dbg !30 + %48 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !12 + %49 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %48, i64 0, i32 2, !dbg !31 + %50 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %49, align 8, !dbg !31, !tbaa !14 + %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %50, i64 0, i32 1, !dbg !31 + %52 = load i64*, i64** %51, align 8, !dbg !31, !tbaa !25 + %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !31 + store i64 %15, i64* %52, align 8, !dbg !31, !tbaa !4 + %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !31 + store i64* %54, i64** %51, align 8, !dbg !31, !tbaa !25 + store i64 %send47.i, i64* %53, align 8, !dbg !31, !tbaa !4 + %send53.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !31 ret void } @@ -394,40 +375,29 @@ attributes #10 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 4, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 1, i32 2000} -!33 = !DILocation(line: 0, scope: !8) -!34 = distinct !DISubprogram(name: "Object#bar", linkageName: "func_Object#bar", scope: null, file: !2, line: 8, type: !9, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!35 = !DILocation(line: 8, column: 1, scope: !34) -!36 = !DILocation(line: 0, scope: !34) -!37 = !DILocation(line: 9, column: 3, scope: !34) -!38 = !{!19, !13, i64 8} -!39 = !DILocation(line: 4, column: 1, scope: !40) -!40 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!41 = !DILocation(line: 8, column: 1, scope: !40) -!42 = !DILocation(line: 12, column: 6, scope: !40) -!43 = !DILocation(line: 12, column: 1, scope: !40) -!44 = !{!45, !5, i64 400} -!45 = !{!"rb_vm_struct", !5, i64 0, !46, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !49, i64 216, !6, i64 224, !47, i64 264, !47, i64 280, !47, i64 296, !47, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !50, i64 472, !51, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !47, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !52, i64 1200, !6, i64 1232} -!46 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !47, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!47 = !{!"list_head", !48, i64 0} -!48 = !{!"list_node", !13, i64 0, !13, i64 8} -!49 = !{!"long long", !6, i64 0} -!50 = !{!"", !6, i64 0} -!51 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!52 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!53 = !{!19, !13, i64 32} -!54 = !DILocation(line: 0, scope: !40) +!18 = !DILocation(line: 4, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 1, i32 2000} +!20 = !DILocation(line: 0, scope: !8) +!21 = distinct !DISubprogram(name: "Object#bar", linkageName: "func_Object#bar", scope: null, file: !2, line: 8, type: !9, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!22 = !DILocation(line: 8, column: 1, scope: !21) +!23 = !DILocation(line: 0, scope: !21) +!24 = !DILocation(line: 9, column: 3, scope: !21) +!25 = !{!26, !13, i64 8} +!26 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!27 = !DILocation(line: 4, column: 1, scope: !28) +!28 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!29 = !DILocation(line: 8, column: 1, scope: !28) +!30 = !DILocation(line: 12, column: 6, scope: !28) +!31 = !DILocation(line: 12, column: 1, scope: !28) +!32 = !{!33, !5, i64 400} +!33 = !{!"rb_vm_struct", !5, i64 0, !34, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !37, i64 216, !6, i64 224, !35, i64 264, !35, i64 280, !35, i64 296, !35, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !38, i64 472, !39, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !35, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !40, i64 1200, !6, i64 1232} +!34 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !35, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!35 = !{!"list_head", !36, i64 0} +!36 = !{!"list_node", !13, i64 0, !13, i64 8} +!37 = !{!"long long", !6, i64 0} +!38 = !{!"", !6, i64 0} +!39 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!40 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!41 = !{!26, !13, i64 16} +!42 = !{!26, !13, i64 32} +!43 = !DILocation(line: 0, scope: !28) diff --git a/test/testdata/compiler/exceptions/basic.llo.exp b/test/testdata/compiler/exceptions/basic.llo.exp index 96ecb878dff..75c5cce682f 100644 --- a/test/testdata/compiler/exceptions/basic.llo.exp +++ b/test/testdata/compiler/exceptions/basic.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,12 +69,13 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.ExceptionClosure = type { i64 (i64**, i64*, i64)*, i64**, i64*, i64, i64* } +%struct.ExceptionClosure = type { i64 (i64**, i64)*, i64**, i64, i64* } @ruby_current_vm_ptr = external local_unnamed_addr global %struct.rb_vm_struct*, align 8 @ruby_current_execution_context_ptr = external local_unnamed_addr global %struct.rb_execution_context_struct*, align 8 @@ -89,6 +91,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/exceptions/basic.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/exceptions/basic.rb" = private unnamed_addr constant [43 x i8] c"test/testdata/compiler/exceptions/basic.rb\00", align 1 +@iseqEncodedArray = internal global [28 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @"rubyStrFrozen_=== no-raise ===" = internal unnamed_addr global i64 0, align 8 @"str_=== no-raise ===" = private unnamed_addr constant [17 x i8] c"=== no-raise ===\00", align 1 @@ -153,7 +157,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -215,31 +221,29 @@ declare void @rb_set_errinfo(i64) local_unnamed_addr #1 define internal noundef i64 @sorbet_applyExceptionClosure(i64 %0) #5 { %2 = inttoptr i64 %0 to %struct.ExceptionClosure* %3 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 0 - %4 = load i64 (i64**, i64*, i64)*, i64 (i64**, i64*, i64)** %3, align 8, !tbaa !4 + %4 = load i64 (i64**, i64)*, i64 (i64**, i64)** %3, align 8, !tbaa !4 %5 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 1 %6 = load i64**, i64*** %5, align 8, !tbaa !10 %7 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 2 - %8 = load i64*, i64** %7, align 8, !tbaa !11 - %9 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 3 - %10 = load i64, i64* %9, align 8, !tbaa !12 - %11 = tail call i64 %4(i64** %6, i64* %8, i64 %10) #13 - %12 = icmp eq i64 %11, 52 - br i1 %12, label %16, label %13 - -13: ; preds = %1 - %14 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 4 - %15 = load i64*, i64** %14, align 8, !tbaa !13 - store i64 %11, i64* %15, align 8, !tbaa !14 - br label %16 - -16: ; preds = %13, %1 + %8 = load i64, i64* %7, align 8, !tbaa !11 + %9 = tail call i64 %4(i64** %6, i64 %8) #13 + %10 = icmp eq i64 %9, 52 + br i1 %10, label %14, label %11 + +11: ; preds = %1 + %12 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 3 + %13 = load i64*, i64** %12, align 8, !tbaa !12 + store i64 %9, i64* %13, align 8, !tbaa !13 + br label %14 + +14: ; preds = %11, %1 ret i64 52 } ; Function Attrs: nofree norecurse nosync nounwind ssp uwtable willreturn writeonly define internal noundef i64 @sorbet_rescueStoreException(i64 %0, i64 %1) #6 { %3 = inttoptr i64 %0 to i64* - store i64 %1, i64* %3, align 8, !tbaa !14 + store i64 %1, i64* %3, align 8, !tbaa !13 ret i64 52 } @@ -250,14 +254,14 @@ declare void @rb_exc_raise(i64) local_unnamed_addr #0 ; Function Attrs: nounwind ssp uwtable define weak i32 @sorbet_getIsReleaseBuild() local_unnamed_addr #5 { - %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !14 + %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !13 tail call void (i64, i8*, ...) @rb_raise(i64 %1, i8* noundef getelementptr inbounds ([93 x i8], [93 x i8]* @.str.9, i64 0, i64 0)) #14 unreachable } ; Function Attrs: nounwind ssp uwtable define weak i8* @sorbet_getBuildSCMRevision() local_unnamed_addr #5 { - %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !14 + %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !13 tail call void (i64, i8*, ...) @rb_raise(i64 %1, i8* noundef getelementptr inbounds ([95 x i8], [95 x i8]* @.str.8, i64 0, i64 0)) #14 unreachable } @@ -267,7 +271,7 @@ declare i64 @rb_errinfo() local_unnamed_addr #1 ; Function Attrs: sspreq define void @Init_basic() local_unnamed_addr #7 { entry: - %positional_table.i.i = alloca i64, align 8, !dbg !15 + %positional_table.i.i = alloca i64, align 8, !dbg !14 %locals.i34.i = alloca i64, i32 0, align 8 %locals.i27.i = alloca i64, i32 5, align 8 %locals.i.i = alloca i64, i32 0, align 8 @@ -306,24 +310,26 @@ entry: %15 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([43 x i8], [43 x i8]* @"str_test/testdata/compiler/exceptions/basic.rb", i64 0, i64 0), i64 noundef 42) #13 tail call void @rb_gc_register_mark_object(i64 %15) #13 store i64 %15, i64* @"rubyStrFrozen_test/testdata/compiler/exceptions/basic.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 28) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %15, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 27, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/exceptions/basic.rb", align 8 + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %17 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_=== no-raise ===", i64 0, i64 0), i64 noundef 16) #13 call void @rb_gc_register_mark_object(i64 %17) #13 store i64 %17, i64* @"rubyStrFrozen_=== no-raise ===", align 8 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !22 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !22 - %rubyId_test.i = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !23 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test, i64 %rubyId_test.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !23 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !21 + %rubyId_test.i = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !22 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test, i64 %rubyId_test.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !22 %18 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([14 x i8], [14 x i8]* @"str_=== raise ===", i64 0, i64 0), i64 noundef 13) #13 call void @rb_gc_register_mark_object(i64 %18) #13 store i64 %18, i64* @"rubyStrFrozen_=== raise ===", align 8 - %rubyId_puts2.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !24 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts2.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 - %rubyId_test5.i = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !25 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test.2, i64 %rubyId_test5.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 + %rubyId_puts2.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !23 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts2.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !23 + %rubyId_test5.i = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !24 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test.2, i64 %rubyId_test5.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 %19 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_test, i64 0, i64 0), i64 noundef 4) #13 call void @rb_gc_register_mark_object(i64 %19) #13 %20 = bitcast i64* %locals.i27.i to i8* @@ -344,7 +350,7 @@ entry: %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %24 = getelementptr i64, i64* %locals.i27.i, i32 4 store i64 %"rubyId_.i.i", i64* %24, align 8 - %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %rubyId_test.i.i, i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 6, i32 noundef 20, i64* noundef nonnull align 8 %locals.i27.i, i32 noundef 5, i32 noundef 2) + %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %rubyId_test.i.i, i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i27.i, i32 noundef 5, i32 noundef 2) store %struct.rb_iseq_struct* %25, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.test, align 8 call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %20) %26 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @"str_rescue for", i64 0, i64 0), i64 noundef 10) #13 @@ -352,870 +358,795 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.test, align 8 %"rubyId_rescue for.i.i" = load i64, i64* @"rubyIdPrecomputed_rescue for", align 8 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i28.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/exceptions/basic.rb", align 8 - %27 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %26, i64 %"rubyId_rescue for.i.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i28.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 4, i32 noundef 6, i32 noundef 20, i64* noundef null, i32 noundef 0, i32 noundef 2) + %27 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %26, i64 %"rubyId_rescue for.i.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i28.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 4, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %27, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.test$block_2", align 8 %28 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @"str_ensure for", i64 0, i64 0), i64 noundef 10) #13 call void @rb_gc_register_mark_object(i64 %28) #13 %stackFrame.i29.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.test, align 8 %"rubyId_ensure for.i.i" = load i64, i64* @"rubyIdPrecomputed_ensure for", align 8 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i30.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/exceptions/basic.rb", align 8 - %29 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %28, i64 %"rubyId_ensure for.i.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i29.i, i32 noundef 5, i32 noundef 6, i32 noundef 20, i64* noundef null, i32 noundef 0, i32 noundef 2) + %29 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %28, i64 %"rubyId_ensure for.i.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i29.i, i32 noundef 5, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %29, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.test$block_3", align 8 %30 = call i64 @sorbet_getConstant(i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @sorbet_getTRetry.retry, i64 0, i64 0), i64 noundef 25) #13 store i64 %30, i64* @"", align 8 %31 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_begin, i64 0, i64 0), i64 noundef 5) #13 call void @rb_gc_register_mark_object(i64 %31) #13 store i64 %31, i64* @rubyStrFrozen_begin, align 8 - %rubyId_puts7.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !26 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 %rubyId_puts7.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !26 - %rubyId_puts10.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !29 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 %rubyId_puts10.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !29 + %rubyId_puts7.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !25 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 %rubyId_puts7.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 + %rubyId_puts10.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 %rubyId_puts10.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !28 %32 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 noundef 3) #13 call void @rb_gc_register_mark_object(i64 %32) #13 store i64 %32, i64* @rubyStrFrozen_foo, align 8 - %rubyId_raise.i = load i64, i64* @rubyIdPrecomputed_raise, align 8, !dbg !30 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_raise, i64 %rubyId_raise.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !30 + %rubyId_raise.i = load i64, i64* @rubyIdPrecomputed_raise, align 8, !dbg !29 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_raise, i64 %rubyId_raise.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !29 %33 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_else, i64 0, i64 0), i64 noundef 4) #13 call void @rb_gc_register_mark_object(i64 %33) #13 store i64 %33, i64* @rubyStrFrozen_else, align 8 - %rubyId_puts15.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !31 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 %rubyId_puts15.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !31 - %"rubyId_is_a?.i" = load i64, i64* @"rubyIdPrecomputed_is_a?", align 8, !dbg !33 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 %"rubyId_is_a?.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !33 - %rubyId_puts19.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !35 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 %rubyId_puts19.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 + %rubyId_puts15.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !30 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 %rubyId_puts15.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !30 + %"rubyId_is_a?.i" = load i64, i64* @"rubyIdPrecomputed_is_a?", align 8, !dbg !32 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 %"rubyId_is_a?.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !32 + %rubyId_puts19.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !34 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 %rubyId_puts19.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 %34 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_ensure, i64 0, i64 0), i64 noundef 6) #13 call void @rb_gc_register_mark_object(i64 %34) #13 store i64 %34, i64* @rubyStrFrozen_ensure, align 8 - %rubyId_puts22.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !36 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 %rubyId_puts22.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !36 + %rubyId_puts22.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !35 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 %rubyId_puts22.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 %"rubyId_.i31.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i32.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i33.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/exceptions/basic.rb", align 8 - %35 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i32.i", i64 %"rubyId_.i31.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i33.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i34.i, i32 noundef 0, i32 noundef 4) + %35 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i32.i", i64 %"rubyId_.i31.i", i64 %"rubyStr_test/testdata/compiler/exceptions/basic.rb.i33.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i34.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %35, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !38 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !38 - %36 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !39 + %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !37 + %36 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !38 %37 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %36, i64 0, i32 18 - %38 = load i64, i64* %37, align 8, !tbaa !40 + %38 = load i64, i64* %37, align 8, !tbaa !39 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2 - %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !tbaa !50 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !tbaa !49 %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %42, align 8, !tbaa !53 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %42, align 8, !tbaa !52 %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 4 - %44 = load i64*, i64** %43, align 8, !tbaa !55 - %45 = load i64, i64* %44, align 8, !tbaa !14 + %44 = load i64*, i64** %43, align 8, !tbaa !54 + %45 = load i64, i64* %44, align 8, !tbaa !13 %46 = and i64 %45, -33 - store i64 %46, i64* %44, align 8, !tbaa !14 + store i64 %46, i64* %44, align 8, !tbaa !13 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %39, %struct.rb_control_frame_struct* align 8 %41, %struct.rb_iseq_struct* %stackFrame.i) #13 %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 0 - %48 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %42, align 8, !tbaa !53 - %49 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %48, i64 0, i32 2 - %50 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %49, align 8, !tbaa !56 - %51 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %50, i64 0, i32 2 - %52 = load i64*, i64** %51, align 8, !tbaa !58 - %53 = getelementptr inbounds i64, i64* %52, i64 4 - %54 = getelementptr inbounds i64, i64* %53, i64 1 - store i64* %54, i64** %47, align 8, !dbg !67, !tbaa !39 - %55 = load i64, i64* @rb_cObject, align 8, !dbg !68 - %56 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %55) #13, !dbg !68 - call void @sorbet_pushStaticInitFrame(i64 %56) #13, !dbg !68 - %57 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %57) #13 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %47, align 8, !dbg !55, !tbaa !38 + %48 = load i64, i64* @rb_cObject, align 8, !dbg !56 + %49 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %48) #13, !dbg !56 + call void @sorbet_pushStaticInitFrame(i64 %49) #13, !dbg !56 + %50 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %50) #13 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %58 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 - %59 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %58, i64 0, i32 2 - %60 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %59, align 8, !tbaa !50 - %61 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %60, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %61, align 8, !tbaa !53 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %60, i64 0, i32 4 - %63 = load i64*, i64** %62, align 8, !tbaa !55 - %64 = load i64, i64* %63, align 8, !tbaa !14 - %65 = and i64 %64, -33 - store i64 %65, i64* %63, align 8, !tbaa !14 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %58, %struct.rb_control_frame_struct* align 8 %60, %struct.rb_iseq_struct* %stackFrame.i.i1) #13 - %66 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %60, i64 0, i32 0 - %67 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %61, align 8, !tbaa !53 - %68 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %67, i64 0, i32 2 - %69 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %68, align 8, !tbaa !56 - %70 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %69, i64 0, i32 2 - %71 = load i64*, i64** %70, align 8, !tbaa !58 - %72 = getelementptr inbounds i64, i64* %71, i64 1 - %73 = getelementptr inbounds i64, i64* %72, i64 1, !dbg !69 - store i64* %73, i64** %66, align 8, !dbg !69, !tbaa !39 - %rubyId_test.i.i2 = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !15 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_test.i.i2) #13, !dbg !15 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !15 - %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !15 - %74 = load i64, i64* @guard_epoch_A, align 8, !dbg !15 - %75 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !15, !tbaa !70 - %needTakeSlowPath = icmp ne i64 %74, %75, !dbg !15 - br i1 %needTakeSlowPath, label %76, label %77, !dbg !15, !prof !71 - -76: ; preds = %entry - call void @const_recompute_A(), !dbg !15 - br label %77, !dbg !15 - -77: ; preds = %entry, %76 - %78 = load i64, i64* @guarded_const_A, align 8, !dbg !15 - %79 = load i64, i64* @guard_epoch_A, align 8, !dbg !15 - %80 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !15, !tbaa !70 - %guardUpdated = icmp eq i64 %79, %80, !dbg !15 - call void @llvm.assume(i1 %guardUpdated), !dbg !15 - %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.test, align 8, !dbg !15 - %81 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #12, !dbg !15 - %82 = bitcast i8* %81 to i16*, !dbg !15 - %83 = load i16, i16* %82, align 8, !dbg !15 - %84 = and i16 %83, -384, !dbg !15 - %85 = or i16 %84, 1, !dbg !15 - store i16 %85, i16* %82, align 8, !dbg !15 - %86 = getelementptr inbounds i8, i8* %81, i64 8, !dbg !15 - %87 = bitcast i8* %86 to i32*, !dbg !15 - store i32 1, i32* %87, align 8, !dbg !15, !tbaa !72 - %88 = getelementptr inbounds i8, i8* %81, i64 12, !dbg !15 - %89 = getelementptr inbounds i8, i8* %81, i64 4, !dbg !15 - %90 = bitcast i8* %89 to i32*, !dbg !15 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %88, i8 0, i64 20, i1 false) #13, !dbg !15 - store i32 1, i32* %90, align 4, !dbg !15, !tbaa !74 - %rubyId_x.i.i3 = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !15 - store i64 %rubyId_x.i.i3, i64* %positional_table.i.i, align 8, !dbg !15 - %91 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #12, !dbg !15 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %91, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %57, i64 noundef 8, i1 noundef false) #13, !dbg !15 - %92 = getelementptr inbounds i8, i8* %81, i64 32, !dbg !15 - %93 = bitcast i8* %92 to i8**, !dbg !15 - store i8* %91, i8** %93, align 8, !dbg !15, !tbaa !75 - %94 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !15 - call void @rb_define_singleton_sorbet_method(i64 %78, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_test, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_A.test, i8* nonnull %81, i8* %94) #13, !dbg !15 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %57) #13 - call void @sorbet_popRubyStack() #13, !dbg !68 - %95 = getelementptr inbounds i64, i64* %52, i64 22, !dbg !68 - %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !68 - store i64* %96, i64** %47, align 8, !dbg !68, !tbaa !39 - %"rubyStr_=== no-raise ===.i" = load i64, i64* @"rubyStrFrozen_=== no-raise ===", align 8, !dbg !76 - %97 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !39 - %98 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %97, i64 0, i32 2, !dbg !22 - %99 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %98, align 8, !dbg !22, !tbaa !50 - %100 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %99, i64 0, i32 1, !dbg !22 - %101 = load i64*, i64** %100, align 8, !dbg !22, !tbaa !77 - %102 = getelementptr inbounds i64, i64* %101, i64 1, !dbg !22 - store i64 %38, i64* %101, align 8, !dbg !22, !tbaa !14 - %103 = getelementptr inbounds i64, i64* %102, i64 1, !dbg !22 - store i64* %103, i64** %100, align 8, !dbg !22, !tbaa !77 - store i64 %"rubyStr_=== no-raise ===.i", i64* %102, align 8, !dbg !22, !tbaa !14 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !22 - %104 = getelementptr inbounds i64, i64* %52, i64 23, !dbg !22 - %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !22 - store i64* %105, i64** %47, align 8, !dbg !22, !tbaa !39 - %106 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !39 - %107 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %106, i64 0, i32 2, !dbg !23 - %108 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %107, align 8, !dbg !23, !tbaa !50 - %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %108, i64 0, i32 1, !dbg !23 - %110 = load i64*, i64** %109, align 8, !dbg !23, !tbaa !77 - %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !23 - store i64 %78, i64* %110, align 8, !dbg !23, !tbaa !14 - %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !23 - store i64* %112, i64** %109, align 8, !dbg !23, !tbaa !77 - store i64 0, i64* %111, align 8, !dbg !23, !tbaa !14 - %send35.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test, i64 0) #13, !dbg !23 - %113 = getelementptr inbounds i64, i64* %52, i64 25, !dbg !23 - %114 = getelementptr inbounds i64, i64* %113, i64 1, !dbg !23 - store i64* %114, i64** %47, align 8, !dbg !23, !tbaa !39 - %"rubyStr_=== raise ===.i" = load i64, i64* @"rubyStrFrozen_=== raise ===", align 8, !dbg !78 - %115 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !39 - %116 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %115, i64 0, i32 2, !dbg !24 - %117 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %116, align 8, !dbg !24, !tbaa !50 - %118 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %117, i64 0, i32 1, !dbg !24 - %119 = load i64*, i64** %118, align 8, !dbg !24, !tbaa !77 - %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !24 - store i64 %38, i64* %119, align 8, !dbg !24, !tbaa !14 - %121 = getelementptr inbounds i64, i64* %120, i64 1, !dbg !24 - store i64* %121, i64** %118, align 8, !dbg !24, !tbaa !77 - store i64 %"rubyStr_=== raise ===.i", i64* %120, align 8, !dbg !24, !tbaa !14 - %send42.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0) #13, !dbg !24 - %122 = getelementptr inbounds i64, i64* %52, i64 26, !dbg !24 - %123 = getelementptr inbounds i64, i64* %122, i64 1, !dbg !24 - store i64* %123, i64** %47, align 8, !dbg !24, !tbaa !39 - %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !39 - %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !25 - %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !25, !tbaa !50 - %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 1, !dbg !25 - %128 = load i64*, i64** %127, align 8, !dbg !25, !tbaa !77 - %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !25 - store i64 %78, i64* %128, align 8, !dbg !25, !tbaa !14 - %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !25 - store i64* %130, i64** %127, align 8, !dbg !25, !tbaa !77 - store i64 20, i64* %129, align 8, !dbg !25, !tbaa !14 - %send48.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test.2, i64 0) #13, !dbg !25 + %51 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 + %52 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %51, i64 0, i32 2 + %53 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %52, align 8, !tbaa !49 + %54 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %53, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %54, align 8, !tbaa !52 + %55 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %53, i64 0, i32 4 + %56 = load i64*, i64** %55, align 8, !tbaa !54 + %57 = load i64, i64* %56, align 8, !tbaa !13 + %58 = and i64 %57, -33 + store i64 %58, i64* %56, align 8, !tbaa !13 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %51, %struct.rb_control_frame_struct* align 8 %53, %struct.rb_iseq_struct* %stackFrame.i.i1) #13 + %59 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %53, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %59, align 8, !dbg !57, !tbaa !38 + %rubyId_test.i.i2 = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !14 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_test.i.i2) #13, !dbg !14 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !14 + %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !14 + %60 = load i64, i64* @guard_epoch_A, align 8, !dbg !14 + %61 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !14, !tbaa !58 + %needTakeSlowPath = icmp ne i64 %60, %61, !dbg !14 + br i1 %needTakeSlowPath, label %62, label %63, !dbg !14, !prof !59 + +62: ; preds = %entry + call void @const_recompute_A(), !dbg !14 + br label %63, !dbg !14 + +63: ; preds = %entry, %62 + %64 = load i64, i64* @guarded_const_A, align 8, !dbg !14 + %65 = load i64, i64* @guard_epoch_A, align 8, !dbg !14 + %66 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !14, !tbaa !58 + %guardUpdated = icmp eq i64 %65, %66, !dbg !14 + call void @llvm.assume(i1 %guardUpdated), !dbg !14 + %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_A.test, align 8, !dbg !14 + %67 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #12, !dbg !14 + %68 = bitcast i8* %67 to i16*, !dbg !14 + %69 = load i16, i16* %68, align 8, !dbg !14 + %70 = and i16 %69, -384, !dbg !14 + %71 = or i16 %70, 1, !dbg !14 + store i16 %71, i16* %68, align 8, !dbg !14 + %72 = getelementptr inbounds i8, i8* %67, i64 8, !dbg !14 + %73 = bitcast i8* %72 to i32*, !dbg !14 + store i32 1, i32* %73, align 8, !dbg !14, !tbaa !60 + %74 = getelementptr inbounds i8, i8* %67, i64 12, !dbg !14 + %75 = getelementptr inbounds i8, i8* %67, i64 4, !dbg !14 + %76 = bitcast i8* %75 to i32*, !dbg !14 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %74, i8 0, i64 20, i1 false) #13, !dbg !14 + store i32 1, i32* %76, align 4, !dbg !14, !tbaa !63 + %rubyId_x.i.i3 = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !14 + store i64 %rubyId_x.i.i3, i64* %positional_table.i.i, align 8, !dbg !14 + %77 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #12, !dbg !14 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %77, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %50, i64 noundef 8, i1 noundef false) #13, !dbg !14 + %78 = getelementptr inbounds i8, i8* %67, i64 32, !dbg !14 + %79 = bitcast i8* %78 to i8**, !dbg !14 + store i8* %77, i8** %79, align 8, !dbg !14, !tbaa !64 + %80 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !14 + call void @rb_define_singleton_sorbet_method(i64 %64, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_test, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_A.test, i8* nonnull %67, i8* %80) #13, !dbg !14 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %50) #13 + call void @sorbet_popRubyStack() #13, !dbg !56 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 23), i64** %47, align 8, !dbg !56, !tbaa !38 + %"rubyStr_=== no-raise ===.i" = load i64, i64* @"rubyStrFrozen_=== no-raise ===", align 8, !dbg !65 + %81 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !38 + %82 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %81, i64 0, i32 2, !dbg !21 + %83 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %82, align 8, !dbg !21, !tbaa !49 + %84 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %83, i64 0, i32 1, !dbg !21 + %85 = load i64*, i64** %84, align 8, !dbg !21, !tbaa !66 + %86 = getelementptr inbounds i64, i64* %85, i64 1, !dbg !21 + store i64 %38, i64* %85, align 8, !dbg !21, !tbaa !13 + %87 = getelementptr inbounds i64, i64* %86, i64 1, !dbg !21 + store i64* %87, i64** %84, align 8, !dbg !21, !tbaa !66 + store i64 %"rubyStr_=== no-raise ===.i", i64* %86, align 8, !dbg !21, !tbaa !13 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !21 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 24), i64** %47, align 8, !dbg !21, !tbaa !38 + %88 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !38 + %89 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %88, i64 0, i32 2, !dbg !22 + %90 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %89, align 8, !dbg !22, !tbaa !49 + %91 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 1, !dbg !22 + %92 = load i64*, i64** %91, align 8, !dbg !22, !tbaa !66 + %93 = getelementptr inbounds i64, i64* %92, i64 1, !dbg !22 + store i64 %64, i64* %92, align 8, !dbg !22, !tbaa !13 + %94 = getelementptr inbounds i64, i64* %93, i64 1, !dbg !22 + store i64* %94, i64** %91, align 8, !dbg !22, !tbaa !66 + store i64 0, i64* %93, align 8, !dbg !22, !tbaa !13 + %send35.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test, i64 0) #13, !dbg !22 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 26), i64** %47, align 8, !dbg !22, !tbaa !38 + %"rubyStr_=== raise ===.i" = load i64, i64* @"rubyStrFrozen_=== raise ===", align 8, !dbg !67 + %95 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !38 + %96 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %95, i64 0, i32 2, !dbg !23 + %97 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %96, align 8, !dbg !23, !tbaa !49 + %98 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %97, i64 0, i32 1, !dbg !23 + %99 = load i64*, i64** %98, align 8, !dbg !23, !tbaa !66 + %100 = getelementptr inbounds i64, i64* %99, i64 1, !dbg !23 + store i64 %38, i64* %99, align 8, !dbg !23, !tbaa !13 + %101 = getelementptr inbounds i64, i64* %100, i64 1, !dbg !23 + store i64* %101, i64** %98, align 8, !dbg !23, !tbaa !66 + store i64 %"rubyStr_=== raise ===.i", i64* %100, align 8, !dbg !23, !tbaa !13 + %send42.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0) #13, !dbg !23 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %47, align 8, !dbg !23, !tbaa !38 + %102 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !38 + %103 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %102, i64 0, i32 2, !dbg !24 + %104 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %103, align 8, !dbg !24, !tbaa !49 + %105 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %104, i64 0, i32 1, !dbg !24 + %106 = load i64*, i64** %105, align 8, !dbg !24, !tbaa !66 + %107 = getelementptr inbounds i64, i64* %106, i64 1, !dbg !24 + store i64 %64, i64* %106, align 8, !dbg !24, !tbaa !13 + %108 = getelementptr inbounds i64, i64* %107, i64 1, !dbg !24 + store i64* %108, i64** %105, align 8, !dbg !24, !tbaa !66 + store i64 20, i64* %107, align 8, !dbg !24, !tbaa !13 + %send48.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test.2, i64 0) #13, !dbg !24 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @func_A.test(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #8 !dbg !28 { +define i64 @func_A.test(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #8 !dbg !27 { functionEntryInitializers: %0 = alloca i64, align 8 %1 = alloca %struct.ExceptionClosure, align 8 %2 = alloca i64, align 8 %3 = alloca %struct.ExceptionClosure, align 8 - %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2 - %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !50 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !49 %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 0 - %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 2 - %9 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %8, align 8, !tbaa !53 - %10 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %9, i64 0, i32 2 - %11 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %10, align 8, !tbaa !56 - %12 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %11, i64 0, i32 2 - %13 = load i64*, i64** %12, align 8, !tbaa !58 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %7, align 8, !tbaa !39 - %exceptionValue = alloca i64, align 8, !dbg !79 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !80 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !80 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !80 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !80, !prof !81 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %7, align 8, !tbaa !38 + %exceptionValue = alloca i64, align 8, !dbg !68 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !69 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !69 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !69 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !69, !prof !70 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !80 - unreachable, !dbg !80 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !69 + unreachable, !dbg !69 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_x = load i64, i64* %argArray, align 8, !dbg !80 - %15 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !80, !tbaa !39 - %16 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %15, i64 0, i32 2, !dbg !80 - %17 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %16, align 8, !dbg !80, !tbaa !50 - %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 4, !dbg !80 - %19 = load i64*, i64** %18, align 8, !dbg !80, !tbaa !55 - %20 = load i64, i64* %19, align 8, !dbg !80, !tbaa !14 - %21 = and i64 %20, 8, !dbg !80 - %22 = icmp eq i64 %21, 0, !dbg !80 - br i1 %22, label %23, label %25, !dbg !80, !prof !82 - -23: ; preds = %fillRequiredArgs - %24 = getelementptr inbounds i64, i64* %19, i64 -4, !dbg !80 - store i64 %rawArg_x, i64* %24, align 8, !dbg !80, !tbaa !14 - br label %sorbet_writeLocal.exit, !dbg !80 - -25: ; preds = %fillRequiredArgs - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %19, i32 noundef -4, i64 %rawArg_x) #13, !dbg !80 - br label %sorbet_writeLocal.exit, !dbg !80 - -sorbet_writeLocal.exit: ; preds = %23, %25 - %26 = getelementptr inbounds i64, i64* %13, i64 2, !dbg !83 - %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !83 - store i64* %27, i64** %7, align 8, !dbg !83, !tbaa !39 - %previousException = tail call i64 @rb_errinfo(), !dbg !79 - %28 = bitcast i64* %0 to i8* - %29 = bitcast %struct.ExceptionClosure* %1 to i8* - %30 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 0 - %31 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 1 - %32 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 2 - %33 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 3 - %34 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 4 - %35 = icmp eq i64 %previousException, 8 - %36 = ptrtoint %struct.ExceptionClosure* %1 to i64 - %37 = ptrtoint i64* %exceptionValue to i64 - %38 = bitcast i64* %2 to i8* - %39 = bitcast %struct.ExceptionClosure* %3 to i8* - %40 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 0 - %41 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 1 - %42 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 2 - %43 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 3 - %44 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 4 - %45 = ptrtoint %struct.ExceptionClosure* %3 to i64 - br i1 %35, label %exception-entry.us, label %exception-entry, !dbg !79 + %rawArg_x = load i64, i64* %argArray, align 8, !dbg !69 + %8 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !69, !tbaa !38 + %9 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %8, i64 0, i32 2, !dbg !69 + %10 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %9, align 8, !dbg !69, !tbaa !49 + %11 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %10, i64 0, i32 4, !dbg !69 + %12 = load i64*, i64** %11, align 8, !dbg !69, !tbaa !54 + %13 = load i64, i64* %12, align 8, !dbg !69, !tbaa !13 + %14 = and i64 %13, 8, !dbg !69 + %15 = icmp eq i64 %14, 0, !dbg !69 + br i1 %15, label %16, label %18, !dbg !69, !prof !71 + +16: ; preds = %fillRequiredArgs + %17 = getelementptr inbounds i64, i64* %12, i64 -4, !dbg !69 + store i64 %rawArg_x, i64* %17, align 8, !dbg !69, !tbaa !13 + br label %sorbet_writeLocal.exit, !dbg !69 + +18: ; preds = %fillRequiredArgs + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %12, i32 noundef -4, i64 %rawArg_x) #13, !dbg !69 + br label %sorbet_writeLocal.exit, !dbg !69 + +sorbet_writeLocal.exit: ; preds = %16, %18 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %7, align 8, !dbg !72, !tbaa !38 + %previousException = tail call i64 @rb_errinfo(), !dbg !68 + %19 = bitcast i64* %0 to i8* + %20 = bitcast %struct.ExceptionClosure* %1 to i8* + %21 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 0 + %22 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 1 + %23 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 2 + %24 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 3 + %25 = icmp eq i64 %previousException, 8 + %26 = ptrtoint %struct.ExceptionClosure* %1 to i64 + %27 = ptrtoint i64* %exceptionValue to i64 + %28 = bitcast i64* %2 to i8* + %29 = bitcast %struct.ExceptionClosure* %3 to i8* + %30 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 0 + %31 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 1 + %32 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 2 + %33 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 3 + %34 = ptrtoint %struct.ExceptionClosure* %3 to i64 + br i1 %25, label %exception-entry.us, label %exception-entry, !dbg !68 exception-entry.us: ; preds = %sorbet_writeLocal.exit, %sorbet_try.exit.us - %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !79 - %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !79, !tbaa !50 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 4, !dbg !79 - %50 = load i64*, i64** %49, align 8, !dbg !79, !tbaa !55 - %51 = load i64, i64* %50, align 8, !dbg !79, !tbaa !14 - %52 = and i64 %51, 8, !dbg !79 - %53 = icmp eq i64 %52, 0, !dbg !79 - br i1 %53, label %55, label %54, !dbg !79, !prof !82 - -54: ; preds = %exception-entry.us - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %50, i32 noundef -3, i64 noundef 8) #13, !dbg !79 - br label %sorbet_writeLocal.exit35.us, !dbg !79 - -55: ; preds = %exception-entry.us - %56 = getelementptr inbounds i64, i64* %50, i64 -3, !dbg !79 - store i64 8, i64* %56, align 8, !dbg !79, !tbaa !14 - br label %sorbet_writeLocal.exit35.us, !dbg !79 - -sorbet_writeLocal.exit35.us: ; preds = %55, %54 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #13, !dbg !79 - store i64 52, i64* %0, align 8, !dbg !79, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %29) #13, !dbg !79 - store i64 (i64**, i64*, i64)* @"func_A.test$block_1", i64 (i64**, i64*, i64)** %30, align 8, !dbg !79, !tbaa !4 - store i64** %7, i64*** %31, align 8, !dbg !79, !tbaa !10 - store i64* %13, i64** %32, align 8, !dbg !79, !tbaa !11 - store i64 0, i64* %33, align 8, !dbg !79, !tbaa !12 - store i64* %0, i64** %34, align 8, !dbg !79, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !79, !tbaa !14 - %57 = load i64, i64* @rb_eException, align 8, !dbg !79, !tbaa !14 - %58 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %36, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %57, i32 0) #13, !dbg !79 - %59 = load i64, i64* %0, align 8, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %29) #13, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !79 - %isReturnValue.us = icmp ne i64 %59, 52, !dbg !79 - br i1 %isReturnValue.us, label %exception-body-return, label %exception-body-continue.us, !dbg !79 - -exception-body-continue.us: ; preds = %sorbet_writeLocal.exit35.us - %60 = load i64, i64* %exceptionValue, align 8, !dbg !79 - %61 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %62 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %61, i64 0, i32 2, !dbg !79 - %63 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %62, align 8, !dbg !79, !tbaa !50 - %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %63, i64 0, i32 4, !dbg !79 - %65 = load i64*, i64** %64, align 8, !dbg !79, !tbaa !55 - %66 = load i64, i64* %65, align 8, !dbg !79, !tbaa !14 - %67 = and i64 %66, 8, !dbg !79 - %68 = icmp eq i64 %67, 0, !dbg !79 - br i1 %68, label %70, label %69, !dbg !79, !prof !82 - -69: ; preds = %exception-body-continue.us - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %65, i32 noundef -3, i64 %60) #13, !dbg !79 - br label %sorbet_writeLocal.exit36.us, !dbg !79 - -70: ; preds = %exception-body-continue.us - %71 = getelementptr inbounds i64, i64* %65, i64 -3, !dbg !79 - store i64 %60, i64* %71, align 8, !dbg !79, !tbaa !14 - br label %sorbet_writeLocal.exit36.us, !dbg !79 - -sorbet_writeLocal.exit36.us: ; preds = %70, %69 - %72 = icmp ne i64 %60, 8, !dbg !79 - %handler.us = select i1 %72, i64 (i64**, i64*, i64)* @"func_A.test$block_2", i64 (i64**, i64*, i64)* @"func_A.test$block_4", !dbg !79 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %38) #13, !dbg !79 - store i64 52, i64* %2, align 8, !dbg !79, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %39) #13, !dbg !79 - store i64 (i64**, i64*, i64)* %handler.us, i64 (i64**, i64*, i64)** %40, align 8, !dbg !79, !tbaa !4 - store i64** %7, i64*** %41, align 8, !dbg !79, !tbaa !10 - store i64* %13, i64** %42, align 8, !dbg !79, !tbaa !11 - store i64 0, i64* %43, align 8, !dbg !79, !tbaa !12 - store i64* %2, i64** %44, align 8, !dbg !79, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !79, !tbaa !14 - %73 = icmp eq i64 %60, 8, !dbg !79 - br i1 %73, label %sorbet_try.exit.us, label %74, !dbg !79 - -74: ; preds = %sorbet_writeLocal.exit36.us - call void @rb_set_errinfo(i64 %60) #13, !dbg !79 - br label %sorbet_try.exit.us, !dbg !79 - -sorbet_try.exit.us: ; preds = %74, %sorbet_writeLocal.exit36.us - %75 = load i64, i64* @rb_eException, align 8, !dbg !79, !tbaa !14 - %76 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %45, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %75, i32 0) #13, !dbg !79 - %77 = load i64, i64* %2, align 8, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %39) #13, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %38) #13, !dbg !79 - %78 = load i64, i64* %exceptionValue, align 8, !dbg !79 - %79 = icmp ne i64 %78, 8, !dbg !79 - %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !79 - %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !79, !tbaa !50 - %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 4, !dbg !79 - %84 = load i64*, i64** %83, align 8, !dbg !79, !tbaa !55 - %85 = getelementptr inbounds i64, i64* %84, i64 -3, !dbg !79 - %86 = load i64, i64* %85, align 8, !dbg !79, !tbaa !14 - %87 = icmp ne i64 %86, 8, !dbg !79 - %88 = select i1 %87, i64 %86, i64 8, !dbg !79 - %89 = select i1 %79, i64 %78, i64 %88, !dbg !79 - call void @rb_set_errinfo(i64 %89), !dbg !79 - %".us" = load i64, i64* @"", align 8, !dbg !79 - %shouldRetry.us = icmp eq i64 %77, %".us", !dbg !79 - %90 = and i1 %72, %shouldRetry.us, !dbg !79 - br i1 %90, label %exception-entry.us, label %exception-ensure, !dbg !79 + %35 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %36 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %35, i64 0, i32 2, !dbg !68 + %37 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %36, align 8, !dbg !68, !tbaa !49 + %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 4, !dbg !68 + %39 = load i64*, i64** %38, align 8, !dbg !68, !tbaa !54 + %40 = load i64, i64* %39, align 8, !dbg !68, !tbaa !13 + %41 = and i64 %40, 8, !dbg !68 + %42 = icmp eq i64 %41, 0, !dbg !68 + br i1 %42, label %44, label %43, !dbg !68, !prof !71 + +43: ; preds = %exception-entry.us + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %39, i32 noundef -3, i64 noundef 8) #13, !dbg !68 + br label %sorbet_writeLocal.exit28.us, !dbg !68 + +44: ; preds = %exception-entry.us + %45 = getelementptr inbounds i64, i64* %39, i64 -3, !dbg !68 + store i64 8, i64* %45, align 8, !dbg !68, !tbaa !13 + br label %sorbet_writeLocal.exit28.us, !dbg !68 + +sorbet_writeLocal.exit28.us: ; preds = %44, %43 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %19) #13, !dbg !68 + store i64 52, i64* %0, align 8, !dbg !68, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %20) #13, !dbg !68 + store i64 (i64**, i64)* @"func_A.test$block_1", i64 (i64**, i64)** %21, align 8, !dbg !68, !tbaa !4 + store i64** %7, i64*** %22, align 8, !dbg !68, !tbaa !10 + store i64 0, i64* %23, align 8, !dbg !68, !tbaa !11 + store i64* %0, i64** %24, align 8, !dbg !68, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !68, !tbaa !13 + %46 = load i64, i64* @rb_eException, align 8, !dbg !68, !tbaa !13 + %47 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %26, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %46, i32 0) #13, !dbg !68 + %48 = load i64, i64* %0, align 8, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %20) #13, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !68 + %isReturnValue.us = icmp ne i64 %48, 52, !dbg !68 + br i1 %isReturnValue.us, label %exception-body-return, label %exception-body-continue.us, !dbg !68 + +exception-body-continue.us: ; preds = %sorbet_writeLocal.exit28.us + %49 = load i64, i64* %exceptionValue, align 8, !dbg !68 + %50 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %51 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %50, i64 0, i32 2, !dbg !68 + %52 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %51, align 8, !dbg !68, !tbaa !49 + %53 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %52, i64 0, i32 4, !dbg !68 + %54 = load i64*, i64** %53, align 8, !dbg !68, !tbaa !54 + %55 = load i64, i64* %54, align 8, !dbg !68, !tbaa !13 + %56 = and i64 %55, 8, !dbg !68 + %57 = icmp eq i64 %56, 0, !dbg !68 + br i1 %57, label %59, label %58, !dbg !68, !prof !71 + +58: ; preds = %exception-body-continue.us + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %54, i32 noundef -3, i64 %49) #13, !dbg !68 + br label %sorbet_writeLocal.exit29.us, !dbg !68 + +59: ; preds = %exception-body-continue.us + %60 = getelementptr inbounds i64, i64* %54, i64 -3, !dbg !68 + store i64 %49, i64* %60, align 8, !dbg !68, !tbaa !13 + br label %sorbet_writeLocal.exit29.us, !dbg !68 + +sorbet_writeLocal.exit29.us: ; preds = %59, %58 + %61 = icmp ne i64 %49, 8, !dbg !68 + %handler.us = select i1 %61, i64 (i64**, i64)* @"func_A.test$block_2", i64 (i64**, i64)* @"func_A.test$block_4", !dbg !68 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #13, !dbg !68 + store i64 52, i64* %2, align 8, !dbg !68, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %29) #13, !dbg !68 + store i64 (i64**, i64)* %handler.us, i64 (i64**, i64)** %30, align 8, !dbg !68, !tbaa !4 + store i64** %7, i64*** %31, align 8, !dbg !68, !tbaa !10 + store i64 0, i64* %32, align 8, !dbg !68, !tbaa !11 + store i64* %2, i64** %33, align 8, !dbg !68, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !68, !tbaa !13 + %62 = icmp eq i64 %49, 8, !dbg !68 + br i1 %62, label %sorbet_try.exit.us, label %63, !dbg !68 + +63: ; preds = %sorbet_writeLocal.exit29.us + call void @rb_set_errinfo(i64 %49) #13, !dbg !68 + br label %sorbet_try.exit.us, !dbg !68 + +sorbet_try.exit.us: ; preds = %63, %sorbet_writeLocal.exit29.us + %64 = load i64, i64* @rb_eException, align 8, !dbg !68, !tbaa !13 + %65 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %34, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %64, i32 0) #13, !dbg !68 + %66 = load i64, i64* %2, align 8, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %29) #13, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !68 + %67 = load i64, i64* %exceptionValue, align 8, !dbg !68 + %68 = icmp ne i64 %67, 8, !dbg !68 + %69 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2, !dbg !68 + %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !dbg !68, !tbaa !49 + %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 4, !dbg !68 + %73 = load i64*, i64** %72, align 8, !dbg !68, !tbaa !54 + %74 = getelementptr inbounds i64, i64* %73, i64 -3, !dbg !68 + %75 = load i64, i64* %74, align 8, !dbg !68, !tbaa !13 + %76 = icmp ne i64 %75, 8, !dbg !68 + %77 = select i1 %76, i64 %75, i64 8, !dbg !68 + %78 = select i1 %68, i64 %67, i64 %77, !dbg !68 + call void @rb_set_errinfo(i64 %78), !dbg !68 + %".us" = load i64, i64* @"", align 8, !dbg !68 + %shouldRetry.us = icmp eq i64 %66, %".us", !dbg !68 + %79 = and i1 %61, %shouldRetry.us, !dbg !68 + br i1 %79, label %exception-entry.us, label %exception-ensure, !dbg !68 exception-entry: ; preds = %sorbet_writeLocal.exit, %sorbet_try.exit - %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !79 - %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !79, !tbaa !50 - %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 4, !dbg !79 - %95 = load i64*, i64** %94, align 8, !dbg !79, !tbaa !55 - %96 = load i64, i64* %95, align 8, !dbg !79, !tbaa !14 - %97 = and i64 %96, 8, !dbg !79 - %98 = icmp eq i64 %97, 0, !dbg !79 - br i1 %98, label %99, label %101, !dbg !79, !prof !82 - -99: ; preds = %exception-entry - %100 = getelementptr inbounds i64, i64* %95, i64 -3, !dbg !79 - store i64 8, i64* %100, align 8, !dbg !79, !tbaa !14 - br label %sorbet_writeLocal.exit35, !dbg !79 - -101: ; preds = %exception-entry - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %95, i32 noundef -3, i64 noundef 8) #13, !dbg !79 - br label %sorbet_writeLocal.exit35, !dbg !79 - -sorbet_writeLocal.exit35: ; preds = %99, %101 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #13, !dbg !79 - store i64 52, i64* %0, align 8, !dbg !79, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %29) #13, !dbg !79 - store i64 (i64**, i64*, i64)* @"func_A.test$block_1", i64 (i64**, i64*, i64)** %30, align 8, !dbg !79, !tbaa !4 - store i64** %7, i64*** %31, align 8, !dbg !79, !tbaa !10 - store i64* %13, i64** %32, align 8, !dbg !79, !tbaa !11 - store i64 0, i64* %33, align 8, !dbg !79, !tbaa !12 - store i64* %0, i64** %34, align 8, !dbg !79, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !79, !tbaa !14 - call void @rb_set_errinfo(i64 %previousException) #13, !dbg !79 - %102 = load i64, i64* @rb_eException, align 8, !dbg !79, !tbaa !14 - %103 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %36, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %102, i32 0) #13, !dbg !79 - %104 = load i64, i64* %0, align 8, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %29) #13, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !79 - %isReturnValue = icmp ne i64 %104, 52, !dbg !79 - br i1 %isReturnValue, label %exception-body-return, label %exception-body-continue, !dbg !79 - -exception-body-return: ; preds = %sorbet_writeLocal.exit35, %sorbet_writeLocal.exit35.us - %.lcssa = phi i64 [ %59, %sorbet_writeLocal.exit35.us ], [ %104, %sorbet_writeLocal.exit35 ], !dbg !79 - call void @rb_set_errinfo(i64 %previousException), !dbg !79 - %105 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 - %106 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %105, i64 0, i32 2 - %107 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %106, align 8, !tbaa !50 - %108 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 3 - %109 = load i64, i64* %108, align 8, !tbaa !84 - %stackFrame.i40 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.test$block_3", align 8 - call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %105, %struct.rb_control_frame_struct* %107, %struct.rb_iseq_struct* %stackFrame.i40) #13 - %110 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 0 - %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 2 - %112 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %111, align 8, !tbaa !53 - %113 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %112, i64 0, i32 2 - %114 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %113, align 8, !tbaa !56 - %115 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %114, i64 0, i32 2 - %116 = load i64*, i64** %115, align 8, !tbaa !58 - %117 = getelementptr inbounds i64, i64* %116, i64 12 - %118 = getelementptr inbounds i64, i64* %117, i64 1 - store i64* %118, i64** %110, align 8, !tbaa !39 - %rubyStr_ensure.i41 = load i64, i64* @rubyStrFrozen_ensure, align 8, !dbg !85 - %119 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !87, !tbaa !39 - %120 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %119, i64 0, i32 2, !dbg !87 - %121 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %120, align 8, !dbg !87, !tbaa !50 - %122 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %121, i64 0, i32 1, !dbg !87 - %123 = load i64*, i64** %122, align 8, !dbg !87, !tbaa !77 - %124 = getelementptr inbounds i64, i64* %123, i64 1, !dbg !87 - store i64 %109, i64* %123, align 8, !dbg !87, !tbaa !14 - %125 = getelementptr inbounds i64, i64* %124, i64 1, !dbg !87 - store i64* %125, i64** %122, align 8, !dbg !87, !tbaa !77 - store i64 %rubyStr_ensure.i41, i64* %124, align 8, !dbg !87, !tbaa !14 - %send.i42 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 0), !dbg !87 + %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !68 + %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !68, !tbaa !49 + %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 4, !dbg !68 + %84 = load i64*, i64** %83, align 8, !dbg !68, !tbaa !54 + %85 = load i64, i64* %84, align 8, !dbg !68, !tbaa !13 + %86 = and i64 %85, 8, !dbg !68 + %87 = icmp eq i64 %86, 0, !dbg !68 + br i1 %87, label %88, label %90, !dbg !68, !prof !71 + +88: ; preds = %exception-entry + %89 = getelementptr inbounds i64, i64* %84, i64 -3, !dbg !68 + store i64 8, i64* %89, align 8, !dbg !68, !tbaa !13 + br label %sorbet_writeLocal.exit28, !dbg !68 + +90: ; preds = %exception-entry + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %84, i32 noundef -3, i64 noundef 8) #13, !dbg !68 + br label %sorbet_writeLocal.exit28, !dbg !68 + +sorbet_writeLocal.exit28: ; preds = %88, %90 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %19) #13, !dbg !68 + store i64 52, i64* %0, align 8, !dbg !68, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %20) #13, !dbg !68 + store i64 (i64**, i64)* @"func_A.test$block_1", i64 (i64**, i64)** %21, align 8, !dbg !68, !tbaa !4 + store i64** %7, i64*** %22, align 8, !dbg !68, !tbaa !10 + store i64 0, i64* %23, align 8, !dbg !68, !tbaa !11 + store i64* %0, i64** %24, align 8, !dbg !68, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !68, !tbaa !13 + call void @rb_set_errinfo(i64 %previousException) #13, !dbg !68 + %91 = load i64, i64* @rb_eException, align 8, !dbg !68, !tbaa !13 + %92 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %26, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %91, i32 0) #13, !dbg !68 + %93 = load i64, i64* %0, align 8, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %20) #13, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !68 + %isReturnValue = icmp ne i64 %93, 52, !dbg !68 + br i1 %isReturnValue, label %exception-body-return, label %exception-body-continue, !dbg !68 + +exception-body-return: ; preds = %sorbet_writeLocal.exit28, %sorbet_writeLocal.exit28.us + %.lcssa = phi i64 [ %48, %sorbet_writeLocal.exit28.us ], [ %93, %sorbet_writeLocal.exit28 ], !dbg !68 + call void @rb_set_errinfo(i64 %previousException), !dbg !68 + %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 + %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2 + %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !tbaa !49 + %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 3 + %98 = load i64, i64* %97, align 8, !tbaa !73 + %stackFrame.i33 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.test$block_3", align 8 + call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %94, %struct.rb_control_frame_struct* %96, %struct.rb_iseq_struct* %stackFrame.i33) #13 + %99 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %99, align 8, !tbaa !38 + %rubyStr_ensure.i34 = load i64, i64* @rubyStrFrozen_ensure, align 8, !dbg !74 + %100 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !76, !tbaa !38 + %101 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %100, i64 0, i32 2, !dbg !76 + %102 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %101, align 8, !dbg !76, !tbaa !49 + %103 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %102, i64 0, i32 1, !dbg !76 + %104 = load i64*, i64** %103, align 8, !dbg !76, !tbaa !66 + %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !76 + store i64 %98, i64* %104, align 8, !dbg !76, !tbaa !13 + %106 = getelementptr inbounds i64, i64* %105, i64 1, !dbg !76 + store i64* %106, i64** %103, align 8, !dbg !76, !tbaa !66 + store i64 %rubyStr_ensure.i34, i64* %105, align 8, !dbg !76, !tbaa !13 + %send.i35 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 0), !dbg !76 call void @sorbet_popRubyStack() - ret i64 %.lcssa, !dbg !79 - -exception-body-continue: ; preds = %sorbet_writeLocal.exit35 - %126 = load i64, i64* %exceptionValue, align 8, !dbg !79 - %127 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %128 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %127, i64 0, i32 2, !dbg !79 - %129 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %128, align 8, !dbg !79, !tbaa !50 - %130 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %129, i64 0, i32 4, !dbg !79 - %131 = load i64*, i64** %130, align 8, !dbg !79, !tbaa !55 - %132 = load i64, i64* %131, align 8, !dbg !79, !tbaa !14 - %133 = and i64 %132, 8, !dbg !79 - %134 = icmp eq i64 %133, 0, !dbg !79 - br i1 %134, label %135, label %137, !dbg !79, !prof !82 - -135: ; preds = %exception-body-continue - %136 = getelementptr inbounds i64, i64* %131, i64 -3, !dbg !79 - store i64 %126, i64* %136, align 8, !dbg !79, !tbaa !14 - br label %sorbet_writeLocal.exit36, !dbg !79 - -137: ; preds = %exception-body-continue - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %131, i32 noundef -3, i64 %126) #13, !dbg !79 - br label %sorbet_writeLocal.exit36, !dbg !79 - -sorbet_writeLocal.exit36: ; preds = %135, %137 - %138 = icmp ne i64 %126, 8, !dbg !79 - %handler = select i1 %138, i64 (i64**, i64*, i64)* @"func_A.test$block_2", i64 (i64**, i64*, i64)* @"func_A.test$block_4", !dbg !79 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %38) #13, !dbg !79 - store i64 52, i64* %2, align 8, !dbg !79, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %39) #13, !dbg !79 - store i64 (i64**, i64*, i64)* %handler, i64 (i64**, i64*, i64)** %40, align 8, !dbg !79, !tbaa !4 - store i64** %7, i64*** %41, align 8, !dbg !79, !tbaa !10 - store i64* %13, i64** %42, align 8, !dbg !79, !tbaa !11 - store i64 0, i64* %43, align 8, !dbg !79, !tbaa !12 - store i64* %2, i64** %44, align 8, !dbg !79, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !79, !tbaa !14 - %139 = icmp eq i64 %126, 8, !dbg !79 - br i1 %139, label %sorbet_try.exit, label %140, !dbg !79 - -140: ; preds = %sorbet_writeLocal.exit36 - call void @rb_set_errinfo(i64 %126) #13, !dbg !79 - br label %sorbet_try.exit, !dbg !79 - -sorbet_try.exit: ; preds = %sorbet_writeLocal.exit36, %140 - %141 = load i64, i64* @rb_eException, align 8, !dbg !79, !tbaa !14 - %142 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %45, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %141, i32 0) #13, !dbg !79 - %143 = load i64, i64* %2, align 8, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %39) #13, !dbg !79 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %38) #13, !dbg !79 - %144 = load i64, i64* %exceptionValue, align 8, !dbg !79 - %145 = icmp ne i64 %144, 8, !dbg !79 - %146 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %147 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %146, i64 0, i32 2, !dbg !79 - %148 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %147, align 8, !dbg !79, !tbaa !50 - %149 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %148, i64 0, i32 4, !dbg !79 - %150 = load i64*, i64** %149, align 8, !dbg !79, !tbaa !55 - %151 = getelementptr inbounds i64, i64* %150, i64 -3, !dbg !79 - %152 = load i64, i64* %151, align 8, !dbg !79, !tbaa !14 - %153 = icmp ne i64 %152, 8, !dbg !79 - %154 = select i1 %153, i64 %152, i64 %previousException, !dbg !79 - %155 = select i1 %145, i64 %144, i64 %154, !dbg !79 - call void @rb_set_errinfo(i64 %155), !dbg !79 - %"" = load i64, i64* @"", align 8, !dbg !79 - %shouldRetry = icmp eq i64 %143, %"", !dbg !79 - %156 = and i1 %138, %shouldRetry, !dbg !79 - br i1 %156, label %exception-entry, label %exception-ensure, !dbg !79 + ret i64 %.lcssa, !dbg !68 + +exception-body-continue: ; preds = %sorbet_writeLocal.exit28 + %107 = load i64, i64* %exceptionValue, align 8, !dbg !68 + %108 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %109 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %108, i64 0, i32 2, !dbg !68 + %110 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %109, align 8, !dbg !68, !tbaa !49 + %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 4, !dbg !68 + %112 = load i64*, i64** %111, align 8, !dbg !68, !tbaa !54 + %113 = load i64, i64* %112, align 8, !dbg !68, !tbaa !13 + %114 = and i64 %113, 8, !dbg !68 + %115 = icmp eq i64 %114, 0, !dbg !68 + br i1 %115, label %116, label %118, !dbg !68, !prof !71 + +116: ; preds = %exception-body-continue + %117 = getelementptr inbounds i64, i64* %112, i64 -3, !dbg !68 + store i64 %107, i64* %117, align 8, !dbg !68, !tbaa !13 + br label %sorbet_writeLocal.exit29, !dbg !68 + +118: ; preds = %exception-body-continue + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %112, i32 noundef -3, i64 %107) #13, !dbg !68 + br label %sorbet_writeLocal.exit29, !dbg !68 + +sorbet_writeLocal.exit29: ; preds = %116, %118 + %119 = icmp ne i64 %107, 8, !dbg !68 + %handler = select i1 %119, i64 (i64**, i64)* @"func_A.test$block_2", i64 (i64**, i64)* @"func_A.test$block_4", !dbg !68 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #13, !dbg !68 + store i64 52, i64* %2, align 8, !dbg !68, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %29) #13, !dbg !68 + store i64 (i64**, i64)* %handler, i64 (i64**, i64)** %30, align 8, !dbg !68, !tbaa !4 + store i64** %7, i64*** %31, align 8, !dbg !68, !tbaa !10 + store i64 0, i64* %32, align 8, !dbg !68, !tbaa !11 + store i64* %2, i64** %33, align 8, !dbg !68, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !68, !tbaa !13 + %120 = icmp eq i64 %107, 8, !dbg !68 + br i1 %120, label %sorbet_try.exit, label %121, !dbg !68 + +121: ; preds = %sorbet_writeLocal.exit29 + call void @rb_set_errinfo(i64 %107) #13, !dbg !68 + br label %sorbet_try.exit, !dbg !68 + +sorbet_try.exit: ; preds = %sorbet_writeLocal.exit29, %121 + %122 = load i64, i64* @rb_eException, align 8, !dbg !68, !tbaa !13 + %123 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %34, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %122, i32 0) #13, !dbg !68 + %124 = load i64, i64* %2, align 8, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %29) #13, !dbg !68 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #13, !dbg !68 + %125 = load i64, i64* %exceptionValue, align 8, !dbg !68 + %126 = icmp ne i64 %125, 8, !dbg !68 + %127 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %128 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %127, i64 0, i32 2, !dbg !68 + %129 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %128, align 8, !dbg !68, !tbaa !49 + %130 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %129, i64 0, i32 4, !dbg !68 + %131 = load i64*, i64** %130, align 8, !dbg !68, !tbaa !54 + %132 = getelementptr inbounds i64, i64* %131, i64 -3, !dbg !68 + %133 = load i64, i64* %132, align 8, !dbg !68, !tbaa !13 + %134 = icmp ne i64 %133, 8, !dbg !68 + %135 = select i1 %134, i64 %133, i64 %previousException, !dbg !68 + %136 = select i1 %126, i64 %125, i64 %135, !dbg !68 + call void @rb_set_errinfo(i64 %136), !dbg !68 + %"" = load i64, i64* @"", align 8, !dbg !68 + %shouldRetry = icmp eq i64 %124, %"", !dbg !68 + %137 = and i1 %119, %shouldRetry, !dbg !68 + br i1 %137, label %exception-entry, label %exception-ensure, !dbg !68 exception-ensure: ; preds = %sorbet_try.exit, %sorbet_try.exit.us - %.lcssa46 = phi i64 [ %77, %sorbet_try.exit.us ], [ %143, %sorbet_try.exit ], !dbg !79 - %.lcssa45 = phi i64 [ %89, %sorbet_try.exit.us ], [ %155, %sorbet_try.exit ], !dbg !79 - %157 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 - %158 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %157, i64 0, i32 2 - %159 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %158, align 8, !tbaa !50 - %160 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %159, i64 0, i32 3 - %161 = load i64, i64* %160, align 8, !tbaa !84 + %.lcssa39 = phi i64 [ %66, %sorbet_try.exit.us ], [ %124, %sorbet_try.exit ], !dbg !68 + %.lcssa38 = phi i64 [ %78, %sorbet_try.exit.us ], [ %136, %sorbet_try.exit ], !dbg !68 + %138 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 + %139 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %138, i64 0, i32 2 + %140 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %139, align 8, !tbaa !49 + %141 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %140, i64 0, i32 3 + %142 = load i64, i64* %141, align 8, !tbaa !73 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.test$block_3", align 8 - call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %157, %struct.rb_control_frame_struct* %159, %struct.rb_iseq_struct* %stackFrame.i) #13 - %162 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %159, i64 0, i32 0 - %163 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %159, i64 0, i32 2 - %164 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %163, align 8, !tbaa !53 - %165 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %164, i64 0, i32 2 - %166 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %165, align 8, !tbaa !56 - %167 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %166, i64 0, i32 2 - %168 = load i64*, i64** %167, align 8, !tbaa !58 - %169 = getelementptr inbounds i64, i64* %168, i64 12 - %170 = getelementptr inbounds i64, i64* %169, i64 1 - store i64* %170, i64** %162, align 8, !tbaa !39 - %rubyStr_ensure.i = load i64, i64* @rubyStrFrozen_ensure, align 8, !dbg !88 - %171 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !90, !tbaa !39 - %172 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %171, i64 0, i32 2, !dbg !90 - %173 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %172, align 8, !dbg !90, !tbaa !50 - %174 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %173, i64 0, i32 1, !dbg !90 - %175 = load i64*, i64** %174, align 8, !dbg !90, !tbaa !77 - %176 = getelementptr inbounds i64, i64* %175, i64 1, !dbg !90 - store i64 %161, i64* %175, align 8, !dbg !90, !tbaa !14 - %177 = getelementptr inbounds i64, i64* %176, i64 1, !dbg !90 - store i64* %177, i64** %174, align 8, !dbg !90, !tbaa !77 - store i64 %rubyStr_ensure.i, i64* %176, align 8, !dbg !90, !tbaa !14 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 0), !dbg !90 + call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %138, %struct.rb_control_frame_struct* %140, %struct.rb_iseq_struct* %stackFrame.i) #13 + %143 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %140, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %143, align 8, !tbaa !38 + %rubyStr_ensure.i = load i64, i64* @rubyStrFrozen_ensure, align 8, !dbg !77 + %144 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !38 + %145 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %144, i64 0, i32 2, !dbg !79 + %146 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %145, align 8, !dbg !79, !tbaa !49 + %147 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %146, i64 0, i32 1, !dbg !79 + %148 = load i64*, i64** %147, align 8, !dbg !79, !tbaa !66 + %149 = getelementptr inbounds i64, i64* %148, i64 1, !dbg !79 + store i64 %142, i64* %148, align 8, !dbg !79, !tbaa !13 + %150 = getelementptr inbounds i64, i64* %149, i64 1, !dbg !79 + store i64* %150, i64** %147, align 8, !dbg !79, !tbaa !66 + store i64 %rubyStr_ensure.i, i64* %149, align 8, !dbg !79, !tbaa !13 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.7, i64 0), !dbg !79 call void @sorbet_popRubyStack() - %isReturnValue17 = icmp ne i64 %.lcssa46, 52, !dbg !79 - br i1 %isReturnValue17, label %exception-return, label %exception-continue, !dbg !79 + %isReturnValue17 = icmp ne i64 %.lcssa39, 52, !dbg !68 + br i1 %isReturnValue17, label %exception-return, label %exception-continue, !dbg !68 exception-continue: ; preds = %exception-ensure - %178 = icmp eq i64 %.lcssa45, 8, !dbg !79 - br i1 %178, label %sorbet_raiseIfNotNil.exit37, label %179, !dbg !79 - -179: ; preds = %exception-continue - call void @rb_exc_raise(i64 %.lcssa45) #14, !dbg !79 - unreachable, !dbg !79 - -sorbet_raiseIfNotNil.exit37: ; preds = %exception-continue - %180 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !39 - %181 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %180, i64 0, i32 2, !dbg !79 - %182 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %181, align 8, !dbg !79, !tbaa !50 - %183 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %182, i64 0, i32 4, !dbg !79 - %184 = load i64*, i64** %183, align 8, !dbg !79, !tbaa !55 - %185 = getelementptr inbounds i64, i64* %184, i64 -3, !dbg !79 - %186 = load i64, i64* %185, align 8, !dbg !79, !tbaa !14 - %187 = icmp eq i64 %186, 8, !dbg !79 - br i1 %187, label %sorbet_raiseIfNotNil.exit, label %188, !dbg !79 - -188: ; preds = %sorbet_raiseIfNotNil.exit37 - call void @rb_exc_raise(i64 %186) #14, !dbg !79 - unreachable, !dbg !79 - -sorbet_raiseIfNotNil.exit: ; preds = %sorbet_raiseIfNotNil.exit37 - %189 = getelementptr inbounds i64, i64* %13, i64 14 - %190 = getelementptr inbounds i64, i64* %189, i64 1 - store i64* %190, i64** %7, align 8, !tbaa !39 - %191 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !91, !tbaa !39 - %192 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %191, i64 0, i32 2, !dbg !91 - %193 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %192, align 8, !dbg !91, !tbaa !50 - %194 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %193, i64 0, i32 4, !dbg !91 - %195 = load i64*, i64** %194, align 8, !dbg !91, !tbaa !55 - %196 = getelementptr inbounds i64, i64* %195, i64 -5, !dbg !91 - %197 = load i64, i64* %196, align 8, !dbg !91, !tbaa !14 - ret i64 %197 + %151 = icmp eq i64 %.lcssa38, 8, !dbg !68 + br i1 %151, label %sorbet_raiseIfNotNil.exit30, label %152, !dbg !68 + +152: ; preds = %exception-continue + call void @rb_exc_raise(i64 %.lcssa38) #14, !dbg !68 + unreachable, !dbg !68 + +sorbet_raiseIfNotNil.exit30: ; preds = %exception-continue + %153 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !68, !tbaa !38 + %154 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %153, i64 0, i32 2, !dbg !68 + %155 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %154, align 8, !dbg !68, !tbaa !49 + %156 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %155, i64 0, i32 4, !dbg !68 + %157 = load i64*, i64** %156, align 8, !dbg !68, !tbaa !54 + %158 = getelementptr inbounds i64, i64* %157, i64 -3, !dbg !68 + %159 = load i64, i64* %158, align 8, !dbg !68, !tbaa !13 + %160 = icmp eq i64 %159, 8, !dbg !68 + br i1 %160, label %sorbet_raiseIfNotNil.exit, label %161, !dbg !68 + +161: ; preds = %sorbet_raiseIfNotNil.exit30 + call void @rb_exc_raise(i64 %159) #14, !dbg !68 + unreachable, !dbg !68 + +sorbet_raiseIfNotNil.exit: ; preds = %sorbet_raiseIfNotNil.exit30 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 20), i64** %7, align 8, !tbaa !38 + %162 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !80, !tbaa !38 + %163 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %162, i64 0, i32 2, !dbg !80 + %164 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %163, align 8, !dbg !80, !tbaa !49 + %165 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %164, i64 0, i32 4, !dbg !80 + %166 = load i64*, i64** %165, align 8, !dbg !80, !tbaa !54 + %167 = getelementptr inbounds i64, i64* %166, i64 -5, !dbg !80 + %168 = load i64, i64* %167, align 8, !dbg !80, !tbaa !13 + ret i64 %168 exception-return: ; preds = %exception-ensure - ret i64 %.lcssa46, !dbg !79 + ret i64 %.lcssa39, !dbg !68 } ; Function Attrs: ssp -define internal noundef i64 @"func_A.test$block_1"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64* %iseq_encoded, i64 %localsOffset) #9 !dbg !27 { +define internal noundef i64 @"func_A.test$block_1"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64 %localsOffset) #9 !dbg !26 { functionEntryInitializers: - %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 - %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !50 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !49 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 3 - %4 = load i64, i64* %3, align 8, !tbaa !84 - %5 = getelementptr inbounds i64, i64* %iseq_encoded, i64 2 - %6 = getelementptr inbounds i64, i64* %5, i64 1 - store i64* %6, i64** %pc, align 8, !tbaa !39 - %rubyStr_begin = load i64, i64* @rubyStrFrozen_begin, align 8, !dbg !92 - %7 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !26, !tbaa !39 - %8 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %7, i64 0, i32 2, !dbg !26 - %9 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %8, align 8, !dbg !26, !tbaa !50 - %10 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %9, i64 0, i32 1, !dbg !26 - %11 = load i64*, i64** %10, align 8, !dbg !26, !tbaa !77 - %12 = getelementptr inbounds i64, i64* %11, i64 1, !dbg !26 - store i64 %4, i64* %11, align 8, !dbg !26, !tbaa !14 - %13 = getelementptr inbounds i64, i64* %12, i64 1, !dbg !26 - store i64* %13, i64** %10, align 8, !dbg !26, !tbaa !77 - store i64 %rubyStr_begin, i64* %12, align 8, !dbg !26, !tbaa !14 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0), !dbg !26 - %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !26, !tbaa !39 - %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2, !dbg !26 - %16 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %15, align 8, !dbg !26, !tbaa !50 - %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 4, !dbg !26 - %18 = load i64*, i64** %17, align 8, !dbg !26, !tbaa !55 - %19 = getelementptr inbounds i64, i64* %18, i64 -4, !dbg !26 - %20 = load i64, i64* %19, align 8, !dbg !26, !tbaa !14 - %21 = and i64 %20, -9, !dbg !26 - %22 = icmp ne i64 %21, 0, !dbg !26 - br i1 %22, label %BB5, label %BB7, !dbg !26 + %4 = load i64, i64* %3, align 8, !tbaa !73 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %pc, align 8, !tbaa !38 + %rubyStr_begin = load i64, i64* @rubyStrFrozen_begin, align 8, !dbg !81 + %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !38 + %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 2, !dbg !25 + %7 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %6, align 8, !dbg !25, !tbaa !49 + %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %7, i64 0, i32 1, !dbg !25 + %9 = load i64*, i64** %8, align 8, !dbg !25, !tbaa !66 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !25 + store i64 %4, i64* %9, align 8, !dbg !25, !tbaa !13 + %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !25 + store i64* %11, i64** %8, align 8, !dbg !25, !tbaa !66 + store i64 %rubyStr_begin, i64* %10, align 8, !dbg !25, !tbaa !13 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0), !dbg !25 + %12 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !38 + %13 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %12, i64 0, i32 2, !dbg !25 + %14 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %13, align 8, !dbg !25, !tbaa !49 + %15 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 4, !dbg !25 + %16 = load i64*, i64** %15, align 8, !dbg !25, !tbaa !54 + %17 = getelementptr inbounds i64, i64* %16, i64 -4, !dbg !25 + %18 = load i64, i64* %17, align 8, !dbg !25, !tbaa !13 + %19 = and i64 %18, -9, !dbg !25 + %20 = icmp ne i64 %19, 0, !dbg !25 + br i1 %20, label %BB5, label %BB7, !dbg !25 BB5: ; preds = %functionEntryInitializers - %23 = getelementptr inbounds i64, i64* %iseq_encoded, i64 4 - %24 = getelementptr inbounds i64, i64* %23, i64 1 - store i64* %24, i64** %pc, align 8, !tbaa !39 - %25 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !29, !tbaa !39 - %26 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %25, i64 0, i32 2, !dbg !29 - %27 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %26, align 8, !dbg !29, !tbaa !50 - %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 4, !dbg !29 - %29 = load i64*, i64** %28, align 8, !dbg !29, !tbaa !55 - %30 = getelementptr inbounds i64, i64* %29, i64 -4, !dbg !29 - %31 = load i64, i64* %30, align 8, !dbg !29, !tbaa !14 - %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 1, !dbg !29 - %33 = load i64*, i64** %32, align 8, !dbg !29, !tbaa !77 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !29 - store i64 %4, i64* %33, align 8, !dbg !29, !tbaa !14 - %35 = getelementptr inbounds i64, i64* %34, i64 1, !dbg !29 - store i64* %35, i64** %32, align 8, !dbg !29, !tbaa !77 - store i64 %31, i64* %34, align 8, !dbg !29, !tbaa !14 - %send15 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 0), !dbg !29 - %36 = getelementptr inbounds i64, i64* %iseq_encoded, i64 5, !dbg !29 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %pc, align 8, !tbaa !38 + %21 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !38 + %22 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %21, i64 0, i32 2, !dbg !28 + %23 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %22, align 8, !dbg !28, !tbaa !49 + %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 4, !dbg !28 + %25 = load i64*, i64** %24, align 8, !dbg !28, !tbaa !54 + %26 = getelementptr inbounds i64, i64* %25, i64 -4, !dbg !28 + %27 = load i64, i64* %26, align 8, !dbg !28, !tbaa !13 + %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 1, !dbg !28 + %29 = load i64*, i64** %28, align 8, !dbg !28, !tbaa !66 + %30 = getelementptr inbounds i64, i64* %29, i64 1, !dbg !28 + store i64 %4, i64* %29, align 8, !dbg !28, !tbaa !13 + %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !28 + store i64* %31, i64** %28, align 8, !dbg !28, !tbaa !66 + store i64 %27, i64* %30, align 8, !dbg !28, !tbaa !13 + %send15 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 0), !dbg !28 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %pc, align 8, !dbg !28, !tbaa !38 + %rubyStr_foo = load i64, i64* @rubyStrFrozen_foo, align 8, !dbg !82 + %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !29, !tbaa !38 + %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !29 + %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !29, !tbaa !49 + %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 1, !dbg !29 + %36 = load i64*, i64** %35, align 8, !dbg !29, !tbaa !66 %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !29 - store i64* %37, i64** %pc, align 8, !dbg !29, !tbaa !39 - %rubyStr_foo = load i64, i64* @rubyStrFrozen_foo, align 8, !dbg !93 - %38 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !39 - %39 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %38, i64 0, i32 2, !dbg !30 - %40 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %39, align 8, !dbg !30, !tbaa !50 - %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %40, i64 0, i32 1, !dbg !30 - %42 = load i64*, i64** %41, align 8, !dbg !30, !tbaa !77 - %43 = getelementptr inbounds i64, i64* %42, i64 1, !dbg !30 - store i64 %4, i64* %42, align 8, !dbg !30, !tbaa !14 - %44 = getelementptr inbounds i64, i64* %43, i64 1, !dbg !30 - store i64* %44, i64** %41, align 8, !dbg !30, !tbaa !77 - store i64 %rubyStr_foo, i64* %43, align 8, !dbg !30, !tbaa !14 - %send21 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_raise, i64 0), !dbg !30 - %45 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !39 - %46 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %45, i64 0, i32 2, !dbg !30 - %47 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %46, align 8, !dbg !30, !tbaa !50 - %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %47, i64 0, i32 4, !dbg !30 - %49 = load i64*, i64** %48, align 8, !dbg !30, !tbaa !55 - %50 = load i64, i64* %49, align 8, !dbg !30, !tbaa !14 - %51 = and i64 %50, 8, !dbg !30 - %52 = icmp eq i64 %51, 0, !dbg !30 - br i1 %52, label %53, label %55, !dbg !30, !prof !82 - -53: ; preds = %BB5 - %54 = getelementptr inbounds i64, i64* %49, i64 -5, !dbg !30 - store i64 %send21, i64* %54, align 8, !dbg !30, !tbaa !14 - br label %BB7, !dbg !30 - -55: ; preds = %BB5 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %49, i32 noundef -5, i64 %send21) #13, !dbg !30 - br label %BB7, !dbg !30 - -BB7: ; preds = %55, %53, %functionEntryInitializers - store i64* %6, i64** %pc, align 8, !tbaa !39 + store i64 %4, i64* %36, align 8, !dbg !29, !tbaa !13 + %38 = getelementptr inbounds i64, i64* %37, i64 1, !dbg !29 + store i64* %38, i64** %35, align 8, !dbg !29, !tbaa !66 + store i64 %rubyStr_foo, i64* %37, align 8, !dbg !29, !tbaa !13 + %send21 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_raise, i64 0), !dbg !29 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !29, !tbaa !38 + %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !29 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !29, !tbaa !49 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 4, !dbg !29 + %43 = load i64*, i64** %42, align 8, !dbg !29, !tbaa !54 + %44 = load i64, i64* %43, align 8, !dbg !29, !tbaa !13 + %45 = and i64 %44, 8, !dbg !29 + %46 = icmp eq i64 %45, 0, !dbg !29 + br i1 %46, label %47, label %49, !dbg !29, !prof !71 + +47: ; preds = %BB5 + %48 = getelementptr inbounds i64, i64* %43, i64 -5, !dbg !29 + store i64 %send21, i64* %48, align 8, !dbg !29, !tbaa !13 + br label %BB7, !dbg !29 + +49: ; preds = %BB5 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %43, i32 noundef -5, i64 %send21) #13, !dbg !29 + br label %BB7, !dbg !29 + +BB7: ; preds = %49, %47, %functionEntryInitializers + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %pc, align 8, !tbaa !38 ret i64 52 } ; Function Attrs: ssp -define internal noundef i64 @"func_A.test$block_2"(i64** nocapture nofree readnone %pc, i64* nocapture nofree readnone %iseq_encoded, i64 %localsOffset) #9 !dbg !34 { -vm_get_ep.exit34: - %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 +define internal noundef i64 @"func_A.test$block_2"(i64** nocapture nofree readnone %pc, i64 %localsOffset) #9 !dbg !33 { +vm_get_ep.exit30: + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 - %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !50 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !49 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 3 - %4 = load i64, i64* %3, align 8, !tbaa !84 + %4 = load i64, i64* %3, align 8, !tbaa !73 %stackFrame = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.test$block_2", align 8 tail call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %0, %struct.rb_control_frame_struct* %2, %struct.rb_iseq_struct* %stackFrame) #13 %5 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %6 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %7 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %6, align 8, !tbaa !53 - %8 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %7, i64 0, i32 2 - %9 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %8, align 8, !tbaa !56 - %10 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %9, i64 0, i32 2 - %11 = load i64*, i64** %10, align 8, !tbaa !58 - %12 = getelementptr inbounds i64, i64* %11, i64 7 - %13 = getelementptr inbounds i64, i64* %12, i64 1 - store i64* %13, i64** %5, align 8, !tbaa !39 - %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !33, !tbaa !39 - %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2, !dbg !33 - %16 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %15, align 8, !dbg !33, !tbaa !50 - %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 4, !dbg !33 - %18 = load i64*, i64** %17, align 8, !dbg !33 - %19 = getelementptr inbounds i64, i64* %18, i64 -1, !dbg !33 - %20 = load i64, i64* %19, align 8, !dbg !33, !tbaa !14 - %21 = and i64 %20, -4, !dbg !33 - %22 = inttoptr i64 %21 to i64*, !dbg !33 - %23 = getelementptr inbounds i64, i64* %22, i64 -3, !dbg !33 - %24 = load i64, i64* %23, align 8, !dbg !33, !tbaa !14 - %25 = load i64, i64* @rb_eStandardError, align 8, !dbg !33 - %26 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 1, !dbg !33 - %27 = load i64*, i64** %26, align 8, !dbg !33, !tbaa !77 - %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !33 - store i64 %24, i64* %27, align 8, !dbg !33, !tbaa !14 - %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !33 - store i64* %29, i64** %26, align 8, !dbg !33, !tbaa !77 - store i64 %25, i64* %28, align 8, !dbg !33, !tbaa !14 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 0), !dbg !33 - %30 = and i64 %send, -9, !dbg !33 - %31 = icmp ne i64 %30, 0, !dbg !33 - br i1 %31, label %vm_get_ep.exit32, label %vm_get_ep.exit, !dbg !33 - -blockExit: ; preds = %87, %85, %70, %68 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %5, align 8, !tbaa !38 + %6 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !32, !tbaa !38 + %7 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %6, i64 0, i32 2, !dbg !32 + %8 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %7, align 8, !dbg !32, !tbaa !49 + %9 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %8, i64 0, i32 4, !dbg !32 + %10 = load i64*, i64** %9, align 8, !dbg !32 + %11 = getelementptr inbounds i64, i64* %10, i64 -1, !dbg !32 + %12 = load i64, i64* %11, align 8, !dbg !32, !tbaa !13 + %13 = and i64 %12, -4, !dbg !32 + %14 = inttoptr i64 %13 to i64*, !dbg !32 + %15 = getelementptr inbounds i64, i64* %14, i64 -3, !dbg !32 + %16 = load i64, i64* %15, align 8, !dbg !32, !tbaa !13 + %17 = load i64, i64* @rb_eStandardError, align 8, !dbg !32 + %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %8, i64 0, i32 1, !dbg !32 + %19 = load i64*, i64** %18, align 8, !dbg !32, !tbaa !66 + %20 = getelementptr inbounds i64, i64* %19, i64 1, !dbg !32 + store i64 %16, i64* %19, align 8, !dbg !32, !tbaa !13 + %21 = getelementptr inbounds i64, i64* %20, i64 1, !dbg !32 + store i64* %21, i64** %18, align 8, !dbg !32, !tbaa !66 + store i64 %17, i64* %20, align 8, !dbg !32, !tbaa !13 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 0), !dbg !32 + %22 = and i64 %send, -9, !dbg !32 + %23 = icmp ne i64 %22, 0, !dbg !32 + br i1 %23, label %vm_get_ep.exit28, label %vm_get_ep.exit, !dbg !32 + +blockExit: ; preds = %75, %73, %60, %58 tail call void @sorbet_popRubyStack() ret i64 52 -vm_get_ep.exit32: ; preds = %vm_get_ep.exit34 - %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !94, !tbaa !39 - %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !94 - %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !94, !tbaa !50 - %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 4, !dbg !94 - %36 = load i64*, i64** %35, align 8, !dbg !94 - %37 = getelementptr inbounds i64, i64* %36, i64 -1, !dbg !94 - %38 = load i64, i64* %37, align 8, !dbg !94, !tbaa !14 - %39 = and i64 %38, -4, !dbg !94 - %40 = inttoptr i64 %39 to i64*, !dbg !94 - %41 = load i64, i64* %40, align 8, !dbg !94, !tbaa !14 - %42 = and i64 %41, 8, !dbg !94 - %43 = icmp eq i64 %42, 0, !dbg !94 - br i1 %43, label %44, label %46, !dbg !94, !prof !82 - -44: ; preds = %vm_get_ep.exit32 - %45 = getelementptr inbounds i64, i64* %40, i64 -3, !dbg !94 - store i64 8, i64* %45, align 8, !dbg !94, !tbaa !14 - br label %vm_get_ep.exit30, !dbg !94 - -46: ; preds = %vm_get_ep.exit32 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %40, i32 noundef -3, i64 noundef 8) #13, !dbg !94 - br label %vm_get_ep.exit30, !dbg !94 - -vm_get_ep.exit30: ; preds = %44, %46 - %47 = getelementptr inbounds i64, i64* %11, i64 8, !dbg !95 - %48 = getelementptr inbounds i64, i64* %47, i64 1, !dbg !95 - store i64* %48, i64** %5, align 8, !dbg !95, !tbaa !39 - %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !39 - %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2, !dbg !35 - %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !dbg !35, !tbaa !50 - %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 1, !dbg !35 - %53 = load i64*, i64** %52, align 8, !dbg !35, !tbaa !77 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !35 - store i64 %4, i64* %53, align 8, !dbg !35, !tbaa !14 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !35 - store i64* %55, i64** %52, align 8, !dbg !35, !tbaa !77 - store i64 %24, i64* %54, align 8, !dbg !35, !tbaa !14 - %send16 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0), !dbg !35 - %56 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !39 - %57 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %56, i64 0, i32 2, !dbg !35 - %58 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %57, align 8, !dbg !35, !tbaa !50 - %59 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %58, i64 0, i32 4, !dbg !35 - %60 = load i64*, i64** %59, align 8, !dbg !35 - %61 = getelementptr inbounds i64, i64* %60, i64 -1, !dbg !35 - %62 = load i64, i64* %61, align 8, !dbg !35, !tbaa !14 - %63 = and i64 %62, -4, !dbg !35 - %64 = inttoptr i64 %63 to i64*, !dbg !35 - %65 = load i64, i64* %64, align 8, !dbg !35, !tbaa !14 - %66 = and i64 %65, 8, !dbg !35 - %67 = icmp eq i64 %66, 0, !dbg !35 - br i1 %67, label %68, label %70, !dbg !35, !prof !82 - -68: ; preds = %vm_get_ep.exit30 - %69 = getelementptr inbounds i64, i64* %64, i64 -5, !dbg !35 - store i64 %send16, i64* %69, align 8, !dbg !35, !tbaa !14 - br label %blockExit, !dbg !35 - -70: ; preds = %vm_get_ep.exit30 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %64, i32 noundef -5, i64 %send16) #13, !dbg !35 - br label %blockExit, !dbg !35 - -vm_get_ep.exit: ; preds = %vm_get_ep.exit34 - %71 = getelementptr inbounds i64, i64* %11, i64 2 - %72 = getelementptr inbounds i64, i64* %71, i64 1 - store i64* %72, i64** %5, align 8, !tbaa !39 - %73 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !96, !tbaa !39 - %74 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %73, i64 0, i32 2, !dbg !96 - %75 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %74, align 8, !dbg !96, !tbaa !50 - %76 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %75, i64 0, i32 4, !dbg !96 - %77 = load i64*, i64** %76, align 8, !dbg !96 - %78 = getelementptr inbounds i64, i64* %77, i64 -1, !dbg !96 - %79 = load i64, i64* %78, align 8, !dbg !96, !tbaa !14 - %80 = and i64 %79, -4, !dbg !96 - %81 = inttoptr i64 %80 to i64*, !dbg !96 - %82 = load i64, i64* %81, align 8, !dbg !96, !tbaa !14 - %83 = and i64 %82, 8, !dbg !96 - %84 = icmp eq i64 %83, 0, !dbg !96 - br i1 %84, label %85, label %87, !dbg !96, !prof !82 - -85: ; preds = %vm_get_ep.exit - %86 = getelementptr inbounds i64, i64* %81, i64 -7, !dbg !96 - store i64 20, i64* %86, align 8, !dbg !96, !tbaa !14 - br label %blockExit, !dbg !96 - -87: ; preds = %vm_get_ep.exit - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %81, i32 noundef -7, i64 noundef 20) #13, !dbg !96 - br label %blockExit, !dbg !96 +vm_get_ep.exit28: ; preds = %vm_get_ep.exit30 + %24 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !83, !tbaa !38 + %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2, !dbg !83 + %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !dbg !83, !tbaa !49 + %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4, !dbg !83 + %28 = load i64*, i64** %27, align 8, !dbg !83 + %29 = getelementptr inbounds i64, i64* %28, i64 -1, !dbg !83 + %30 = load i64, i64* %29, align 8, !dbg !83, !tbaa !13 + %31 = and i64 %30, -4, !dbg !83 + %32 = inttoptr i64 %31 to i64*, !dbg !83 + %33 = load i64, i64* %32, align 8, !dbg !83, !tbaa !13 + %34 = and i64 %33, 8, !dbg !83 + %35 = icmp eq i64 %34, 0, !dbg !83 + br i1 %35, label %36, label %38, !dbg !83, !prof !71 + +36: ; preds = %vm_get_ep.exit28 + %37 = getelementptr inbounds i64, i64* %32, i64 -3, !dbg !83 + store i64 8, i64* %37, align 8, !dbg !83, !tbaa !13 + br label %vm_get_ep.exit26, !dbg !83 + +38: ; preds = %vm_get_ep.exit28 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %32, i32 noundef -3, i64 noundef 8) #13, !dbg !83 + br label %vm_get_ep.exit26, !dbg !83 + +vm_get_ep.exit26: ; preds = %36, %38 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %5, align 8, !dbg !84, !tbaa !38 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !38 + %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !34 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !34, !tbaa !49 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 1, !dbg !34 + %43 = load i64*, i64** %42, align 8, !dbg !34, !tbaa !66 + %44 = getelementptr inbounds i64, i64* %43, i64 1, !dbg !34 + store i64 %4, i64* %43, align 8, !dbg !34, !tbaa !13 + %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !34 + store i64* %45, i64** %42, align 8, !dbg !34, !tbaa !66 + store i64 %16, i64* %44, align 8, !dbg !34, !tbaa !13 + %send16 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0), !dbg !34 + %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !38 + %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !34 + %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !34, !tbaa !49 + %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 4, !dbg !34 + %50 = load i64*, i64** %49, align 8, !dbg !34 + %51 = getelementptr inbounds i64, i64* %50, i64 -1, !dbg !34 + %52 = load i64, i64* %51, align 8, !dbg !34, !tbaa !13 + %53 = and i64 %52, -4, !dbg !34 + %54 = inttoptr i64 %53 to i64*, !dbg !34 + %55 = load i64, i64* %54, align 8, !dbg !34, !tbaa !13 + %56 = and i64 %55, 8, !dbg !34 + %57 = icmp eq i64 %56, 0, !dbg !34 + br i1 %57, label %58, label %60, !dbg !34, !prof !71 + +58: ; preds = %vm_get_ep.exit26 + %59 = getelementptr inbounds i64, i64* %54, i64 -5, !dbg !34 + store i64 %send16, i64* %59, align 8, !dbg !34, !tbaa !13 + br label %blockExit, !dbg !34 + +60: ; preds = %vm_get_ep.exit26 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %54, i32 noundef -5, i64 %send16) #13, !dbg !34 + br label %blockExit, !dbg !34 + +vm_get_ep.exit: ; preds = %vm_get_ep.exit30 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %5, align 8, !tbaa !38 + %61 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !85, !tbaa !38 + %62 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %61, i64 0, i32 2, !dbg !85 + %63 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %62, align 8, !dbg !85, !tbaa !49 + %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %63, i64 0, i32 4, !dbg !85 + %65 = load i64*, i64** %64, align 8, !dbg !85 + %66 = getelementptr inbounds i64, i64* %65, i64 -1, !dbg !85 + %67 = load i64, i64* %66, align 8, !dbg !85, !tbaa !13 + %68 = and i64 %67, -4, !dbg !85 + %69 = inttoptr i64 %68 to i64*, !dbg !85 + %70 = load i64, i64* %69, align 8, !dbg !85, !tbaa !13 + %71 = and i64 %70, 8, !dbg !85 + %72 = icmp eq i64 %71, 0, !dbg !85 + br i1 %72, label %73, label %75, !dbg !85, !prof !71 + +73: ; preds = %vm_get_ep.exit + %74 = getelementptr inbounds i64, i64* %69, i64 -7, !dbg !85 + store i64 20, i64* %74, align 8, !dbg !85, !tbaa !13 + br label %blockExit, !dbg !85 + +75: ; preds = %vm_get_ep.exit + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %69, i32 noundef -7, i64 noundef 20) #13, !dbg !85 + br label %blockExit, !dbg !85 } ; Function Attrs: ssp -define internal noundef i64 @"func_A.test$block_4"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64* %iseq_encoded, i64 %localsOffset) #9 !dbg !32 { +define internal noundef i64 @"func_A.test$block_4"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64 %localsOffset) #9 !dbg !31 { functionEntryInitializers: - %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !39 + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !38 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 - %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !50 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !49 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 3 - %4 = load i64, i64* %3, align 8, !tbaa !84 - %5 = getelementptr inbounds i64, i64* %iseq_encoded, i64 10 - %6 = getelementptr inbounds i64, i64* %5, i64 1 - store i64* %6, i64** %pc, align 8, !tbaa !39 - %rubyStr_else = load i64, i64* @rubyStrFrozen_else, align 8, !dbg !97 - %7 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !39 - %8 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %7, i64 0, i32 2, !dbg !31 - %9 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %8, align 8, !dbg !31, !tbaa !50 - %10 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %9, i64 0, i32 1, !dbg !31 - %11 = load i64*, i64** %10, align 8, !dbg !31, !tbaa !77 - %12 = getelementptr inbounds i64, i64* %11, i64 1, !dbg !31 - store i64 %4, i64* %11, align 8, !dbg !31, !tbaa !14 - %13 = getelementptr inbounds i64, i64* %12, i64 1, !dbg !31 - store i64* %13, i64** %10, align 8, !dbg !31, !tbaa !77 - store i64 %rubyStr_else, i64* %12, align 8, !dbg !31, !tbaa !14 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0), !dbg !31 - %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !39 - %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2, !dbg !31 - %16 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %15, align 8, !dbg !31, !tbaa !50 - %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 4, !dbg !31 - %18 = load i64*, i64** %17, align 8, !dbg !31, !tbaa !55 - %19 = load i64, i64* %18, align 8, !dbg !31, !tbaa !14 - %20 = and i64 %19, 8, !dbg !31 - %21 = icmp eq i64 %20, 0, !dbg !31 - br i1 %21, label %22, label %24, !dbg !31, !prof !82 + %4 = load i64, i64* %3, align 8, !tbaa !73 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %pc, align 8, !tbaa !38 + %rubyStr_else = load i64, i64* @rubyStrFrozen_else, align 8, !dbg !86 + %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !38 + %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 2, !dbg !30 + %7 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %6, align 8, !dbg !30, !tbaa !49 + %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %7, i64 0, i32 1, !dbg !30 + %9 = load i64*, i64** %8, align 8, !dbg !30, !tbaa !66 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !30 + store i64 %4, i64* %9, align 8, !dbg !30, !tbaa !13 + %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !30 + store i64* %11, i64** %8, align 8, !dbg !30, !tbaa !66 + store i64 %rubyStr_else, i64* %10, align 8, !dbg !30, !tbaa !13 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0), !dbg !30 + %12 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !38 + %13 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %12, i64 0, i32 2, !dbg !30 + %14 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %13, align 8, !dbg !30, !tbaa !49 + %15 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 4, !dbg !30 + %16 = load i64*, i64** %15, align 8, !dbg !30, !tbaa !54 + %17 = load i64, i64* %16, align 8, !dbg !30, !tbaa !13 + %18 = and i64 %17, 8, !dbg !30 + %19 = icmp eq i64 %18, 0, !dbg !30 + br i1 %19, label %20, label %22, !dbg !30, !prof !71 + +20: ; preds = %functionEntryInitializers + %21 = getelementptr inbounds i64, i64* %16, i64 -5, !dbg !30 + store i64 %send, i64* %21, align 8, !dbg !30, !tbaa !13 + br label %sorbet_writeLocal.exit, !dbg !30 22: ; preds = %functionEntryInitializers - %23 = getelementptr inbounds i64, i64* %18, i64 -5, !dbg !31 - store i64 %send, i64* %23, align 8, !dbg !31, !tbaa !14 - br label %sorbet_writeLocal.exit, !dbg !31 - -24: ; preds = %functionEntryInitializers - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %18, i32 noundef -5, i64 %send) #13, !dbg !31 - br label %sorbet_writeLocal.exit, !dbg !31 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %16, i32 noundef -5, i64 %send) #13, !dbg !30 + br label %sorbet_writeLocal.exit, !dbg !30 -sorbet_writeLocal.exit: ; preds = %22, %24 +sorbet_writeLocal.exit: ; preds = %20, %22 ret i64 52 } @@ -1229,7 +1160,7 @@ declare void @llvm.assume(i1 noundef) #11 define linkonce void @const_recompute_A() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !70 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !58 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -1258,96 +1189,85 @@ attributes #14 = { noreturn nounwind } !2 = !DIFile(filename: "test/testdata/compiler/exceptions/basic.rb", directory: ".") !3 = !{} !4 = !{!5, !6, i64 0} -!5 = !{!"ExceptionClosure", !6, i64 0, !6, i64 8, !6, i64 16, !9, i64 24, !6, i64 32} +!5 = !{!"ExceptionClosure", !6, i64 0, !6, i64 8, !9, i64 16, !6, i64 24} !6 = !{!"any pointer", !7, i64 0} !7 = !{!"omnipotent char", !8, i64 0} !8 = !{!"Simple C/C++ TBAA"} !9 = !{!"long", !7, i64 0} !10 = !{!5, !6, i64 8} -!11 = !{!5, !6, i64 16} -!12 = !{!5, !9, i64 24} -!13 = !{!5, !6, i64 32} -!14 = !{!9, !9, i64 0} -!15 = !DILocation(line: 6, column: 3, scope: !16, inlinedAt: !20) -!16 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L62", scope: null, file: !2, line: 5, type: !17, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!17 = !DISubroutineType(types: !18) -!18 = !{!19} -!19 = !DIBasicType(name: "VALUE", size: 64, encoding: DW_ATE_signed) -!20 = distinct !DILocation(line: 5, column: 1, scope: !21) -!21 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !17, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!22 = !DILocation(line: 23, column: 1, scope: !21) -!23 = !DILocation(line: 24, column: 1, scope: !21) -!24 = !DILocation(line: 26, column: 1, scope: !21) -!25 = !DILocation(line: 27, column: 1, scope: !21) -!26 = !DILocation(line: 8, column: 7, scope: !27) -!27 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_1", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!28 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test", scope: null, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!29 = !DILocation(line: 10, column: 9, scope: !27) -!30 = !DILocation(line: 11, column: 9, scope: !27) -!31 = !DILocation(line: 16, column: 7, scope: !32) -!32 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_4", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!33 = !DILocation(line: 13, column: 15, scope: !34) -!34 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_2", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!35 = !DILocation(line: 14, column: 7, scope: !34) -!36 = !DILocation(line: 18, column: 7, scope: !37) -!37 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_3", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!38 = !DILocation(line: 6, column: 3, scope: !16) -!39 = !{!6, !6, i64 0} -!40 = !{!41, !9, i64 400} -!41 = !{!"rb_vm_struct", !9, i64 0, !42, i64 8, !6, i64 192, !6, i64 200, !6, i64 208, !46, i64 216, !7, i64 224, !43, i64 264, !43, i64 280, !43, i64 296, !43, i64 312, !9, i64 328, !45, i64 336, !45, i64 340, !45, i64 344, !45, i64 344, !45, i64 344, !45, i64 344, !45, i64 348, !9, i64 352, !7, i64 360, !9, i64 400, !9, i64 408, !9, i64 416, !9, i64 424, !9, i64 432, !9, i64 440, !9, i64 448, !6, i64 456, !6, i64 464, !47, i64 472, !48, i64 992, !6, i64 1016, !6, i64 1024, !45, i64 1032, !45, i64 1036, !43, i64 1040, !7, i64 1056, !9, i64 1096, !9, i64 1104, !9, i64 1112, !9, i64 1120, !9, i64 1128, !45, i64 1136, !6, i64 1144, !6, i64 1152, !6, i64 1160, !6, i64 1168, !6, i64 1176, !6, i64 1184, !45, i64 1192, !49, i64 1200, !7, i64 1232} -!42 = !{!"rb_global_vm_lock_struct", !6, i64 0, !7, i64 8, !43, i64 48, !6, i64 64, !45, i64 72, !7, i64 80, !7, i64 128, !45, i64 176, !45, i64 180} -!43 = !{!"list_head", !44, i64 0} -!44 = !{!"list_node", !6, i64 0, !6, i64 8} -!45 = !{!"int", !7, i64 0} -!46 = !{!"long long", !7, i64 0} -!47 = !{!"", !7, i64 0} -!48 = !{!"rb_hook_list_struct", !6, i64 0, !45, i64 8, !45, i64 12, !45, i64 16} -!49 = !{!"", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24} -!50 = !{!51, !6, i64 16} -!51 = !{!"rb_execution_context_struct", !6, i64 0, !9, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !45, i64 40, !45, i64 44, !6, i64 48, !6, i64 56, !6, i64 64, !9, i64 72, !9, i64 80, !6, i64 88, !9, i64 96, !6, i64 104, !6, i64 112, !9, i64 120, !9, i64 128, !7, i64 136, !7, i64 137, !9, i64 144, !52, i64 152} -!52 = !{!"", !6, i64 0, !6, i64 8, !9, i64 16, !7, i64 24} -!53 = !{!54, !6, i64 16} -!54 = !{!"rb_control_frame_struct", !6, i64 0, !6, i64 8, !6, i64 16, !9, i64 24, !6, i64 32, !6, i64 40, !6, i64 48} -!55 = !{!54, !6, i64 32} -!56 = !{!57, !6, i64 16} -!57 = !{!"rb_iseq_struct", !9, i64 0, !9, i64 8, !6, i64 16, !7, i64 24} -!58 = !{!59, !6, i64 8} -!59 = !{!"rb_iseq_constant_body", !7, i64 0, !45, i64 4, !6, i64 8, !60, i64 16, !62, i64 64, !65, i64 120, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !66, i64 200, !45, i64 232, !45, i64 236, !45, i64 240, !45, i64 244, !45, i64 248, !7, i64 252, !9, i64 256} -!60 = !{!"", !61, i64 0, !45, i64 4, !45, i64 8, !45, i64 12, !45, i64 16, !45, i64 20, !45, i64 24, !45, i64 28, !6, i64 32, !6, i64 40} -!61 = !{!"", !45, i64 0, !45, i64 0, !45, i64 0, !45, i64 0, !45, i64 0, !45, i64 0, !45, i64 0, !45, i64 0, !45, i64 1, !45, i64 1} -!62 = !{!"rb_iseq_location_struct", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !45, i64 32, !63, i64 36} -!63 = !{!"rb_code_location_struct", !64, i64 0, !64, i64 8} -!64 = !{!"rb_code_position_struct", !45, i64 0, !45, i64 4} -!65 = !{!"iseq_insn_info", !6, i64 0, !6, i64 8, !45, i64 16, !6, i64 24} -!66 = !{!"", !9, i64 0, !9, i64 8, !9, i64 16, !6, i64 24} -!67 = !DILocation(line: 0, scope: !21) -!68 = !DILocation(line: 5, column: 1, scope: !21) -!69 = !DILocation(line: 0, scope: !16, inlinedAt: !20) -!70 = !{!46, !46, i64 0} -!71 = !{!"branch_weights", i32 1, i32 10000} -!72 = !{!73, !45, i64 8} -!73 = !{!"rb_sorbet_param_struct", !61, i64 0, !45, i64 4, !45, i64 8, !45, i64 12, !45, i64 16, !45, i64 20, !45, i64 24, !45, i64 28, !6, i64 32, !45, i64 40, !45, i64 44, !45, i64 48, !45, i64 52, !6, i64 56} -!74 = !{!73, !45, i64 4} -!75 = !{!73, !6, i64 32} -!76 = !DILocation(line: 23, column: 6, scope: !21) -!77 = !{!54, !6, i64 8} -!78 = !DILocation(line: 26, column: 6, scope: !21) -!79 = !DILocation(line: 8, column: 7, scope: !28) -!80 = !DILocation(line: 6, column: 3, scope: !28) -!81 = !{!"branch_weights", i32 4001, i32 4000000} -!82 = !{!"branch_weights", i32 2000, i32 1} -!83 = !DILocation(line: 0, scope: !28) -!84 = !{!54, !9, i64 24} -!85 = !DILocation(line: 18, column: 12, scope: !37, inlinedAt: !86) -!86 = distinct !DILocation(line: 8, column: 7, scope: !28) -!87 = !DILocation(line: 18, column: 7, scope: !37, inlinedAt: !86) -!88 = !DILocation(line: 18, column: 12, scope: !37, inlinedAt: !89) -!89 = distinct !DILocation(line: 8, column: 7, scope: !28) -!90 = !DILocation(line: 18, column: 7, scope: !37, inlinedAt: !89) -!91 = !DILocation(line: 20, column: 3, scope: !28) -!92 = !DILocation(line: 8, column: 12, scope: !27) -!93 = !DILocation(line: 11, column: 15, scope: !27) -!94 = !DILocation(line: 0, scope: !34) -!95 = !DILocation(line: 13, column: 5, scope: !34) -!96 = !DILocation(line: 8, column: 7, scope: !34) -!97 = !DILocation(line: 16, column: 12, scope: !32) +!11 = !{!5, !9, i64 16} +!12 = !{!5, !6, i64 24} +!13 = !{!9, !9, i64 0} +!14 = !DILocation(line: 6, column: 3, scope: !15, inlinedAt: !19) +!15 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L62", scope: null, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!16 = !DISubroutineType(types: !17) +!17 = !{!18} +!18 = !DIBasicType(name: "VALUE", size: 64, encoding: DW_ATE_signed) +!19 = distinct !DILocation(line: 5, column: 1, scope: !20) +!20 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!21 = !DILocation(line: 23, column: 1, scope: !20) +!22 = !DILocation(line: 24, column: 1, scope: !20) +!23 = !DILocation(line: 26, column: 1, scope: !20) +!24 = !DILocation(line: 27, column: 1, scope: !20) +!25 = !DILocation(line: 8, column: 7, scope: !26) +!26 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_1", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!27 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test", scope: null, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!28 = !DILocation(line: 10, column: 9, scope: !26) +!29 = !DILocation(line: 11, column: 9, scope: !26) +!30 = !DILocation(line: 16, column: 7, scope: !31) +!31 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_4", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!32 = !DILocation(line: 13, column: 15, scope: !33) +!33 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_2", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!34 = !DILocation(line: 14, column: 7, scope: !33) +!35 = !DILocation(line: 18, column: 7, scope: !36) +!36 = distinct !DISubprogram(name: "A.test", linkageName: "func_A.test$block_3", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!37 = !DILocation(line: 6, column: 3, scope: !15) +!38 = !{!6, !6, i64 0} +!39 = !{!40, !9, i64 400} +!40 = !{!"rb_vm_struct", !9, i64 0, !41, i64 8, !6, i64 192, !6, i64 200, !6, i64 208, !45, i64 216, !7, i64 224, !42, i64 264, !42, i64 280, !42, i64 296, !42, i64 312, !9, i64 328, !44, i64 336, !44, i64 340, !44, i64 344, !44, i64 344, !44, i64 344, !44, i64 344, !44, i64 348, !9, i64 352, !7, i64 360, !9, i64 400, !9, i64 408, !9, i64 416, !9, i64 424, !9, i64 432, !9, i64 440, !9, i64 448, !6, i64 456, !6, i64 464, !46, i64 472, !47, i64 992, !6, i64 1016, !6, i64 1024, !44, i64 1032, !44, i64 1036, !42, i64 1040, !7, i64 1056, !9, i64 1096, !9, i64 1104, !9, i64 1112, !9, i64 1120, !9, i64 1128, !44, i64 1136, !6, i64 1144, !6, i64 1152, !6, i64 1160, !6, i64 1168, !6, i64 1176, !6, i64 1184, !44, i64 1192, !48, i64 1200, !7, i64 1232} +!41 = !{!"rb_global_vm_lock_struct", !6, i64 0, !7, i64 8, !42, i64 48, !6, i64 64, !44, i64 72, !7, i64 80, !7, i64 128, !44, i64 176, !44, i64 180} +!42 = !{!"list_head", !43, i64 0} +!43 = !{!"list_node", !6, i64 0, !6, i64 8} +!44 = !{!"int", !7, i64 0} +!45 = !{!"long long", !7, i64 0} +!46 = !{!"", !7, i64 0} +!47 = !{!"rb_hook_list_struct", !6, i64 0, !44, i64 8, !44, i64 12, !44, i64 16} +!48 = !{!"", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24} +!49 = !{!50, !6, i64 16} +!50 = !{!"rb_execution_context_struct", !6, i64 0, !9, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !44, i64 40, !44, i64 44, !6, i64 48, !6, i64 56, !6, i64 64, !9, i64 72, !9, i64 80, !6, i64 88, !9, i64 96, !6, i64 104, !6, i64 112, !9, i64 120, !9, i64 128, !7, i64 136, !7, i64 137, !9, i64 144, !51, i64 152} +!51 = !{!"", !6, i64 0, !6, i64 8, !9, i64 16, !7, i64 24} +!52 = !{!53, !6, i64 16} +!53 = !{!"rb_control_frame_struct", !6, i64 0, !6, i64 8, !6, i64 16, !9, i64 24, !6, i64 32, !6, i64 40, !6, i64 48} +!54 = !{!53, !6, i64 32} +!55 = !DILocation(line: 0, scope: !20) +!56 = !DILocation(line: 5, column: 1, scope: !20) +!57 = !DILocation(line: 0, scope: !15, inlinedAt: !19) +!58 = !{!45, !45, i64 0} +!59 = !{!"branch_weights", i32 1, i32 10000} +!60 = !{!61, !44, i64 8} +!61 = !{!"rb_sorbet_param_struct", !62, i64 0, !44, i64 4, !44, i64 8, !44, i64 12, !44, i64 16, !44, i64 20, !44, i64 24, !44, i64 28, !6, i64 32, !44, i64 40, !44, i64 44, !44, i64 48, !44, i64 52, !6, i64 56} +!62 = !{!"", !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 1, !44, i64 1} +!63 = !{!61, !44, i64 4} +!64 = !{!61, !6, i64 32} +!65 = !DILocation(line: 23, column: 6, scope: !20) +!66 = !{!53, !6, i64 8} +!67 = !DILocation(line: 26, column: 6, scope: !20) +!68 = !DILocation(line: 8, column: 7, scope: !27) +!69 = !DILocation(line: 6, column: 3, scope: !27) +!70 = !{!"branch_weights", i32 4001, i32 4000000} +!71 = !{!"branch_weights", i32 2000, i32 1} +!72 = !DILocation(line: 0, scope: !27) +!73 = !{!53, !9, i64 24} +!74 = !DILocation(line: 18, column: 12, scope: !36, inlinedAt: !75) +!75 = distinct !DILocation(line: 8, column: 7, scope: !27) +!76 = !DILocation(line: 18, column: 7, scope: !36, inlinedAt: !75) +!77 = !DILocation(line: 18, column: 12, scope: !36, inlinedAt: !78) +!78 = distinct !DILocation(line: 8, column: 7, scope: !27) +!79 = !DILocation(line: 18, column: 7, scope: !36, inlinedAt: !78) +!80 = !DILocation(line: 20, column: 3, scope: !27) +!81 = !DILocation(line: 8, column: 12, scope: !26) +!82 = !DILocation(line: 11, column: 15, scope: !26) +!83 = !DILocation(line: 0, scope: !33) +!84 = !DILocation(line: 13, column: 5, scope: !33) +!85 = !DILocation(line: 8, column: 7, scope: !33) +!86 = !DILocation(line: 16, column: 12, scope: !31) diff --git a/test/testdata/compiler/final_method_child_class.llo.exp b/test/testdata/compiler/final_method_child_class.llo.exp index 4ffcf4751a8..3ea1e36bf3f 100644 --- a/test/testdata/compiler/final_method_child_class.llo.exp +++ b/test/testdata/compiler/final_method_child_class.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/final_method_child_class.rb" = private unnamed_addr constant [51 x i8] c"test/testdata/compiler/final_method_child_class.rb\00", align 1 +@iseqEncodedArray = internal global [21 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_Parent = private unnamed_addr constant [7 x i8] c"Parent\00", align 1 @str_Child = private unnamed_addr constant [6 x i8] c"Child\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @@ -139,7 +143,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -231,9 +237,11 @@ entry: %12 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([51 x i8], [51 x i8]* @"str_test/testdata/compiler/final_method_child_class.rb", i64 0, i64 0), i64 noundef 50) #12 tail call void @rb_gc_register_mark_object(i64 %12) #12 store i64 %12, i64* @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 21) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %12, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 20, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb", align 8 + %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %13, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !8 @@ -243,7 +251,7 @@ entry: call void @rb_gc_register_mark_object(i64 %14) #12 %rubyId_final_method.i.i = load i64, i64* @rubyIdPrecomputed_final_method, align 8 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i13.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb", align 8 - %15 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %14, i64 %rubyId_final_method.i.i, i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i13.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 10, i32 noundef 12, i64* noundef nonnull %locals.i14.i, i32 noundef 0, i32 noundef 2) + %15 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %14, i64 %rubyId_final_method.i.i, i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i13.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i14.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %15, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent#final_method", align 8 %16 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([14 x i8], [14 x i8]* @"str_final method!", i64 0, i64 0), i64 noundef 13) #12 call void @rb_gc_register_mark_object(i64 %16) #12 @@ -255,14 +263,14 @@ entry: %"rubyId_.i15.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i16.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i17.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i16.i", i64 %"rubyId_.i15.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 4) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i16.i", i64 %"rubyId_.i15.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent.", align 8 %19 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #12 call void @rb_gc_register_mark_object(i64 %19) #12 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i19.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb", align 8 - %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i19.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i19.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %20, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent.$block_1", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !15 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !15 @@ -277,7 +285,7 @@ entry: %"rubyId_.i20.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i21.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i22.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/final_method_child_class.rb", align 8 - %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i21.i", i64 %"rubyId_.i20.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i22.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 15, i32 noundef 15, i64* noundef nonnull %locals.i23.i, i32 noundef 0, i32 noundef 0) + %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i21.i", i64 %"rubyId_.i20.i", i64 %"rubyStr_test/testdata/compiler/final_method_child_class.rb.i22.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i23.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %21, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Child.", align 8 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %22 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !22 @@ -292,194 +300,164 @@ entry: store i64 %29, i64* %27, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %22, %struct.rb_control_frame_struct* align 8 %24, %struct.rb_iseq_struct* %stackFrame.i) #12 %30 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 0 - %31 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %25, align 8, !tbaa !28 - %32 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %31, i64 0, i32 2 - %33 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %32, align 8, !tbaa !31 - %34 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %33, i64 0, i32 2 - %35 = load i64*, i64** %34, align 8, !tbaa !33 - %36 = getelementptr inbounds i64, i64* %35, i64 4 - %37 = getelementptr inbounds i64, i64* %36, i64 1 - store i64* %37, i64** %30, align 8, !dbg !42, !tbaa !22 - %38 = load i64, i64* @rb_cObject, align 8, !dbg !43 - %39 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_Parent, i64 0, i64 0), i64 %38) #12, !dbg !43 - call void @sorbet_pushStaticInitFrame(i64 %39) #12, !dbg !43 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %30, align 8, !dbg !31, !tbaa !22 + %31 = load i64, i64* @rb_cObject, align 8, !dbg !32 + %32 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_Parent, i64 0, i64 0), i64 %31) #12, !dbg !32 + call void @sorbet_pushStaticInitFrame(i64 %32) #12, !dbg !32 %stackFrame.i1.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent.", align 8 - %40 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !22 - %41 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %40, i64 0, i32 2 - %42 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %41, align 8, !tbaa !24 - %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %43, align 8, !tbaa !28 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 4 - %45 = load i64*, i64** %44, align 8, !tbaa !30 - %46 = load i64, i64* %45, align 8, !tbaa !4 - %47 = and i64 %46, -33 - store i64 %47, i64* %45, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %40, %struct.rb_control_frame_struct* align 8 %42, %struct.rb_iseq_struct* %stackFrame.i1.i) #12 - %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 0 - %49 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %43, align 8, !tbaa !28 - %50 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %49, i64 0, i32 2 - %51 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %50, align 8, !tbaa !31 - %52 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %51, i64 0, i32 2 - %53 = load i64*, i64** %52, align 8, !tbaa !33 - %54 = getelementptr inbounds i64, i64* %53, i64 1 - %55 = getelementptr inbounds i64, i64* %53, i64 4, !dbg !44 - %56 = getelementptr inbounds i64, i64* %55, i64 1, !dbg !44 - store i64* %56, i64** %48, align 8, !dbg !44, !tbaa !22 - %rubyId_final.i.i = load i64, i64* @rubyIdPrecomputed_final, align 8, !dbg !46 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_final.i.i) #12, !dbg !46 - %57 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !47 - store i64* %57, i64** %48, align 8, !dbg !47, !tbaa !22 - %58 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !48 - %59 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !48, !tbaa !49 - %needTakeSlowPath = icmp ne i64 %58, %59, !dbg !48 - br i1 %needTakeSlowPath, label %60, label %61, !dbg !48, !prof !51 - -60: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !48 - br label %61, !dbg !48 - -61: ; preds = %entry, %60 - %62 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !48 - %63 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !48 - %64 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !48, !tbaa !49 - %guardUpdated = icmp eq i64 %63, %64, !dbg !48 - call void @llvm.assume(i1 %guardUpdated), !dbg !48 - %65 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !22 - %66 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %65, i64 0, i32 2, !dbg !48 - %67 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %66, align 8, !dbg !48, !tbaa !24 - %68 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %67, i64 0, i32 1, !dbg !48 - %69 = load i64*, i64** %68, align 8, !dbg !48, !tbaa !52 - %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !48 - store i64 %39, i64* %69, align 8, !dbg !48, !tbaa !4 - %71 = getelementptr inbounds i64, i64* %70, i64 1, !dbg !48 - store i64* %71, i64** %68, align 8, !dbg !48, !tbaa !52 - store i64 %62, i64* %70, align 8, !dbg !48, !tbaa !4 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #12, !dbg !48 - %72 = getelementptr inbounds i64, i64* %53, i64 2, !dbg !48 - %73 = getelementptr inbounds i64, i64* %72, i64 1, !dbg !48 - store i64* %73, i64** %48, align 8, !dbg !48, !tbaa !22 - %74 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !53 - %75 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !53, !tbaa !49 - %needTakeSlowPath3 = icmp ne i64 %74, %75, !dbg !53 - br i1 %needTakeSlowPath3, label %76, label %77, !dbg !53, !prof !51 - -76: ; preds = %61 - call void @"const_recompute_T::Helpers"(), !dbg !53 - br label %77, !dbg !53 - -77: ; preds = %61, %76 - %78 = load i64, i64* @"guarded_const_T::Helpers", align 8, !dbg !53 - %79 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !53 - %80 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !53, !tbaa !49 - %guardUpdated4 = icmp eq i64 %79, %80, !dbg !53 - call void @llvm.assume(i1 %guardUpdated4), !dbg !53 - %81 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !53, !tbaa !22 - %82 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %81, i64 0, i32 2, !dbg !53 - %83 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %82, align 8, !dbg !53, !tbaa !24 - %84 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %83, i64 0, i32 1, !dbg !53 - %85 = load i64*, i64** %84, align 8, !dbg !53, !tbaa !52 - %86 = getelementptr inbounds i64, i64* %85, i64 1, !dbg !53 - store i64 %39, i64* %85, align 8, !dbg !53, !tbaa !4 - %87 = getelementptr inbounds i64, i64* %86, i64 1, !dbg !53 - store i64* %87, i64** %84, align 8, !dbg !53, !tbaa !52 - store i64 %78, i64* %86, align 8, !dbg !53, !tbaa !4 - %send43.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend.1, i64 0) #12, !dbg !53 - %88 = getelementptr inbounds i64, i64* %53, i64 5, !dbg !53 - %89 = getelementptr inbounds i64, i64* %88, i64 1, !dbg !53 - store i64* %89, i64** %48, align 8, !dbg !53, !tbaa !22 - %rubyId_final_method.i.i1 = load i64, i64* @rubyIdPrecomputed_final_method, align 8, !dbg !54 - %rawSym44.i.i = call i64 @rb_id2sym(i64 %rubyId_final_method.i.i1) #12, !dbg !54 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !54 - %rawSym45.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #12, !dbg !54 - %90 = load i64, i64* @guard_epoch_Parent, align 8, !dbg !54 - %91 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !54, !tbaa !49 - %needTakeSlowPath5 = icmp ne i64 %90, %91, !dbg !54 - br i1 %needTakeSlowPath5, label %92, label %93, !dbg !54, !prof !51 - -92: ; preds = %77 - call void @const_recompute_Parent(), !dbg !54 - br label %93, !dbg !54 - -93: ; preds = %77, %92 - %94 = load i64, i64* @guarded_const_Parent, align 8, !dbg !54 - %95 = load i64, i64* @guard_epoch_Parent, align 8, !dbg !54 - %96 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !54, !tbaa !49 - %guardUpdated6 = icmp eq i64 %95, %96, !dbg !54 - call void @llvm.assume(i1 %guardUpdated6), !dbg !54 - %stackFrame47.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent#final_method", align 8, !dbg !54 - %97 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !54 - %98 = bitcast i8* %97 to i16*, !dbg !54 - %99 = load i16, i16* %98, align 8, !dbg !54 - %100 = and i16 %99, -384, !dbg !54 - store i16 %100, i16* %98, align 8, !dbg !54 - %101 = getelementptr inbounds i8, i8* %97, i64 4, !dbg !54 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %101, i8 0, i64 28, i1 false) #12, !dbg !54 - %102 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @str_final_method, i64 0, i64 0)) #12, !dbg !54 - %103 = bitcast i8* %97 to %struct.rb_sorbet_param_struct*, !dbg !54 - %104 = bitcast %struct.rb_iseq_struct* %stackFrame47.i.i to i8*, !dbg !54 - call void @rb_add_method_sorbet(i64 %94, i64 %102, i64 (i32, i64*, i64)* noundef @"func_Parent#final_method", %struct.rb_sorbet_param_struct* nonnull %103, i32 noundef 1, i8* %104) #12, !dbg !54 - call void @sorbet_popRubyStack() #12, !dbg !43 - %105 = getelementptr inbounds i64, i64* %35, i64 14, !dbg !43 - %106 = getelementptr inbounds i64, i64* %105, i64 1, !dbg !43 - store i64* %106, i64** %30, align 8, !dbg !43, !tbaa !22 - %107 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_Child, i64 0, i64 0), i64 %94) #12, !dbg !55 - call void @sorbet_pushStaticInitFrame(i64 %107) #12, !dbg !55 + %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !22 + %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2 + %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !tbaa !24 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %36, align 8, !tbaa !28 + %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 4 + %38 = load i64*, i64** %37, align 8, !tbaa !30 + %39 = load i64, i64* %38, align 8, !tbaa !4 + %40 = and i64 %39, -33 + store i64 %40, i64* %38, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %33, %struct.rb_control_frame_struct* align 8 %35, %struct.rb_iseq_struct* %stackFrame.i1.i) #12 + %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 0 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %41, align 8, !dbg !33, !tbaa !22 + %rubyId_final.i.i = load i64, i64* @rubyIdPrecomputed_final, align 8, !dbg !35 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_final.i.i) #12, !dbg !35 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %41, align 8, !dbg !36, !tbaa !22 + %42 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !37 + %43 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !37, !tbaa !38 + %needTakeSlowPath = icmp ne i64 %42, %43, !dbg !37 + br i1 %needTakeSlowPath, label %44, label %45, !dbg !37, !prof !40 + +44: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !37 + br label %45, !dbg !37 + +45: ; preds = %entry, %44 + %46 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !37 + %47 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !37 + %48 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !37, !tbaa !38 + %guardUpdated = icmp eq i64 %47, %48, !dbg !37 + call void @llvm.assume(i1 %guardUpdated), !dbg !37 + %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !22 + %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2, !dbg !37 + %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !dbg !37, !tbaa !24 + %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 1, !dbg !37 + %53 = load i64*, i64** %52, align 8, !dbg !37, !tbaa !41 + %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !37 + store i64 %32, i64* %53, align 8, !dbg !37, !tbaa !4 + %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !37 + store i64* %55, i64** %52, align 8, !dbg !37, !tbaa !41 + store i64 %46, i64* %54, align 8, !dbg !37, !tbaa !4 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #12, !dbg !37 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %41, align 8, !dbg !37, !tbaa !22 + %56 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !42 + %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !42, !tbaa !38 + %needTakeSlowPath3 = icmp ne i64 %56, %57, !dbg !42 + br i1 %needTakeSlowPath3, label %58, label %59, !dbg !42, !prof !40 + +58: ; preds = %45 + call void @"const_recompute_T::Helpers"(), !dbg !42 + br label %59, !dbg !42 + +59: ; preds = %45, %58 + %60 = load i64, i64* @"guarded_const_T::Helpers", align 8, !dbg !42 + %61 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !42 + %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !42, !tbaa !38 + %guardUpdated4 = icmp eq i64 %61, %62, !dbg !42 + call void @llvm.assume(i1 %guardUpdated4), !dbg !42 + %63 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !42, !tbaa !22 + %64 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %63, i64 0, i32 2, !dbg !42 + %65 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %64, align 8, !dbg !42, !tbaa !24 + %66 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %65, i64 0, i32 1, !dbg !42 + %67 = load i64*, i64** %66, align 8, !dbg !42, !tbaa !41 + %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !42 + store i64 %32, i64* %67, align 8, !dbg !42, !tbaa !4 + %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !42 + store i64* %69, i64** %66, align 8, !dbg !42, !tbaa !41 + store i64 %60, i64* %68, align 8, !dbg !42, !tbaa !4 + %send43.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend.1, i64 0) #12, !dbg !42 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %41, align 8, !dbg !42, !tbaa !22 + %rubyId_final_method.i.i1 = load i64, i64* @rubyIdPrecomputed_final_method, align 8, !dbg !43 + %rawSym44.i.i = call i64 @rb_id2sym(i64 %rubyId_final_method.i.i1) #12, !dbg !43 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !43 + %rawSym45.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #12, !dbg !43 + %70 = load i64, i64* @guard_epoch_Parent, align 8, !dbg !43 + %71 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !43, !tbaa !38 + %needTakeSlowPath5 = icmp ne i64 %70, %71, !dbg !43 + br i1 %needTakeSlowPath5, label %72, label %73, !dbg !43, !prof !40 + +72: ; preds = %59 + call void @const_recompute_Parent(), !dbg !43 + br label %73, !dbg !43 + +73: ; preds = %59, %72 + %74 = load i64, i64* @guarded_const_Parent, align 8, !dbg !43 + %75 = load i64, i64* @guard_epoch_Parent, align 8, !dbg !43 + %76 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !43, !tbaa !38 + %guardUpdated6 = icmp eq i64 %75, %76, !dbg !43 + call void @llvm.assume(i1 %guardUpdated6), !dbg !43 + %stackFrame47.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Parent#final_method", align 8, !dbg !43 + %77 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !43 + %78 = bitcast i8* %77 to i16*, !dbg !43 + %79 = load i16, i16* %78, align 8, !dbg !43 + %80 = and i16 %79, -384, !dbg !43 + store i16 %80, i16* %78, align 8, !dbg !43 + %81 = getelementptr inbounds i8, i8* %77, i64 4, !dbg !43 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %81, i8 0, i64 28, i1 false) #12, !dbg !43 + %82 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @str_final_method, i64 0, i64 0)) #12, !dbg !43 + %83 = bitcast i8* %77 to %struct.rb_sorbet_param_struct*, !dbg !43 + %84 = bitcast %struct.rb_iseq_struct* %stackFrame47.i.i to i8*, !dbg !43 + call void @rb_add_method_sorbet(i64 %74, i64 %82, i64 (i32, i64*, i64)* noundef @"func_Parent#final_method", %struct.rb_sorbet_param_struct* nonnull %83, i32 noundef 1, i8* %84) #12, !dbg !43 + call void @sorbet_popRubyStack() #12, !dbg !32 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %30, align 8, !dbg !32, !tbaa !22 + %85 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_Child, i64 0, i64 0), i64 %74) #12, !dbg !44 + call void @sorbet_pushStaticInitFrame(i64 %85) #12, !dbg !44 %stackFrame.i.i2 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Child.", align 8 - %108 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !22 - %109 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %108, i64 0, i32 2 - %110 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %109, align 8, !tbaa !24 - %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i2, %struct.rb_iseq_struct** %111, align 8, !tbaa !28 - %112 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 4 - %113 = load i64*, i64** %112, align 8, !tbaa !30 - %114 = load i64, i64* %113, align 8, !tbaa !4 - %115 = and i64 %114, -33 - store i64 %115, i64* %113, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %108, %struct.rb_control_frame_struct* align 8 %110, %struct.rb_iseq_struct* %stackFrame.i.i2) #12 - %116 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 0 - %117 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %111, align 8, !tbaa !28 - %118 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %117, i64 0, i32 2 - %119 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %118, align 8, !tbaa !31 - %120 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %119, i64 0, i32 2 - %121 = load i64*, i64** %120, align 8, !tbaa !33 - %122 = getelementptr inbounds i64, i64* %121, i64 1 - store i64* %122, i64** %116, align 8, !dbg !56, !tbaa !22 - call void @sorbet_popRubyStack() #12, !dbg !55 - %123 = getelementptr inbounds i64, i64* %35, i64 19, !dbg !55 - %124 = getelementptr inbounds i64, i64* %123, i64 1, !dbg !55 - store i64* %124, i64** %30, align 8, !dbg !55, !tbaa !22 - %125 = load i64, i64* @guard_epoch_Child, align 8, !dbg !8 - %126 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !49 - %needTakeSlowPath7 = icmp ne i64 %125, %126, !dbg !8 - br i1 %needTakeSlowPath7, label %127, label %128, !dbg !8, !prof !51 - -127: ; preds = %93 + %86 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !22 + %87 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %86, i64 0, i32 2 + %88 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %87, align 8, !tbaa !24 + %89 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %88, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i2, %struct.rb_iseq_struct** %89, align 8, !tbaa !28 + %90 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %88, i64 0, i32 4 + %91 = load i64*, i64** %90, align 8, !tbaa !30 + %92 = load i64, i64* %91, align 8, !tbaa !4 + %93 = and i64 %92, -33 + store i64 %93, i64* %91, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %86, %struct.rb_control_frame_struct* align 8 %88, %struct.rb_iseq_struct* %stackFrame.i.i2) #12 + %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %88, i64 0, i32 0 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %94, align 8, !dbg !45, !tbaa !22 + call void @sorbet_popRubyStack() #12, !dbg !44 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 20), i64** %30, align 8, !dbg !44, !tbaa !22 + %95 = load i64, i64* @guard_epoch_Child, align 8, !dbg !8 + %96 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !38 + %needTakeSlowPath7 = icmp ne i64 %95, %96, !dbg !8 + br i1 %needTakeSlowPath7, label %97, label %98, !dbg !8, !prof !40 + +97: ; preds = %73 call void @const_recompute_Child(), !dbg !8 - br label %128, !dbg !8 + br label %98, !dbg !8 -128: ; preds = %93, %127 - %129 = load i64, i64* @guarded_const_Child, align 8, !dbg !8 - %130 = load i64, i64* @guard_epoch_Child, align 8, !dbg !8 - %131 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !49 - %guardUpdated8 = icmp eq i64 %130, %131, !dbg !8 +98: ; preds = %73, %97 + %99 = load i64, i64* @guarded_const_Child, align 8, !dbg !8 + %100 = load i64, i64* @guard_epoch_Child, align 8, !dbg !8 + %101 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !38 + %guardUpdated8 = icmp eq i64 %100, %101, !dbg !8 call void @llvm.assume(i1 %guardUpdated8), !dbg !8 - %132 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !22 - %133 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %132, i64 0, i32 2, !dbg !8 - %134 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %133, align 8, !dbg !8, !tbaa !24 - %135 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %134, i64 0, i32 1, !dbg !8 - %136 = load i64*, i64** %135, align 8, !dbg !8, !tbaa !52 - %137 = getelementptr inbounds i64, i64* %136, i64 1, !dbg !8 - store i64* %137, i64** %135, align 8, !dbg !8, !tbaa !52 - store i64 %129, i64* %136, align 8, !dbg !8, !tbaa !4 + %102 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !22 + %103 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %102, i64 0, i32 2, !dbg !8 + %104 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %103, align 8, !dbg !8, !tbaa !24 + %105 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %104, i64 0, i32 1, !dbg !8 + %106 = load i64*, i64** %105, align 8, !dbg !8, !tbaa !41 + %107 = getelementptr inbounds i64, i64* %106, i64 1, !dbg !8 + store i64* %107, i64** %105, align 8, !dbg !8, !tbaa !41 + store i64 %99, i64* %106, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #12, !dbg !8 - %138 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !22 - %139 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %138, i64 0, i32 2, !dbg !8 - %140 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %139, align 8, !dbg !8, !tbaa !24 - %141 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %140, i64 0, i32 1, !dbg !8 - %142 = load i64*, i64** %141, align 8, !dbg !8, !tbaa !52 - %143 = getelementptr inbounds i64, i64* %142, i64 1, !dbg !8 - store i64* %143, i64** %141, align 8, !dbg !8, !tbaa !52 - store i64 %send.i, i64* %142, align 8, !dbg !8, !tbaa !4 + %108 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !22 + %109 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %108, i64 0, i32 2, !dbg !8 + %110 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %109, align 8, !dbg !8, !tbaa !24 + %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 1, !dbg !8 + %112 = load i64*, i64** %111, align 8, !dbg !8, !tbaa !41 + %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !8 + store i64* %113, i64** %111, align 8, !dbg !8, !tbaa !41 + store i64 %send.i, i64* %112, align 8, !dbg !8, !tbaa !4 %send28.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_final_method, i64 0) #12, !dbg !8 ret void } @@ -491,35 +469,27 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !24 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !28 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !31 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !33 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !22 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !59 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !59, !prof !60 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !tbaa !22 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !48 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !48, !prof !49 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !59 - unreachable, !dbg !59 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !48 + unreachable, !dbg !48 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !61 - store i64* %11, i64** %3, align 8, !dbg !61, !tbaa !22 - %"rubyStr_final method!" = load i64, i64* @"rubyStrFrozen_final method!", align 8, !dbg !62 - %12 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !22 - %13 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %12, i64 0, i32 2, !dbg !13 - %14 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %13, align 8, !dbg !13, !tbaa !24 - %15 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 1, !dbg !13 - %16 = load i64*, i64** %15, align 8, !dbg !13, !tbaa !52 - %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !13 - store i64 %selfRaw, i64* %16, align 8, !dbg !13, !tbaa !4 - %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !13 - store i64* %18, i64** %15, align 8, !dbg !13, !tbaa !52 - store i64 %"rubyStr_final method!", i64* %17, align 8, !dbg !13, !tbaa !4 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %3, align 8, !dbg !50, !tbaa !22 + %"rubyStr_final method!" = load i64, i64* @"rubyStrFrozen_final method!", align 8, !dbg !51 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !22 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !13 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !13, !tbaa !24 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 1, !dbg !13 + %8 = load i64*, i64** %7, align 8, !dbg !13, !tbaa !41 + %9 = getelementptr inbounds i64, i64* %8, i64 1, !dbg !13 + store i64 %selfRaw, i64* %8, align 8, !dbg !13, !tbaa !4 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !13 + store i64* %10, i64** %7, align 8, !dbg !13, !tbaa !41 + store i64 %"rubyStr_final method!", i64* %9, align 8, !dbg !13, !tbaa !4 %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !13 %"" = load i64, i64* @"", align 8 ret i64 %"" @@ -535,7 +505,7 @@ declare void @llvm.assume(i1 noundef) #8 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !49 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !38 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -544,7 +514,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #9 { define linkonce void @"const_recompute_T::Helpers"() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"str_T::Helpers", i64 0, i64 0), i64 10) store i64 %1, i64* @"guarded_const_T::Helpers", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !49 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !38 store i64 %2, i64* @"guard_epoch_T::Helpers", align 8 ret void } @@ -553,7 +523,7 @@ define linkonce void @"const_recompute_T::Helpers"() local_unnamed_addr #9 { define linkonce void @const_recompute_Parent() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @str_Parent, i64 0, i64 0), i64 6) store i64 %1, i64* @guarded_const_Parent, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !49 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !38 store i64 %2, i64* @guard_epoch_Parent, align 8 ret void } @@ -562,7 +532,7 @@ define linkonce void @const_recompute_Parent() local_unnamed_addr #9 { define linkonce void @const_recompute_Child() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @str_Child, i64 0, i64 0), i64 5) store i64 %1, i64* @guarded_const_Child, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !49 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !38 store i64 %2, i64* @guard_epoch_Child, align 8 ret void } @@ -615,35 +585,24 @@ attributes #12 = { nounwind } !28 = !{!29, !23, i64 16} !29 = !{!"rb_control_frame_struct", !23, i64 0, !23, i64 8, !23, i64 16, !5, i64 24, !23, i64 32, !23, i64 40, !23, i64 48} !30 = !{!29, !23, i64 32} -!31 = !{!32, !23, i64 16} -!32 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !23, i64 16, !6, i64 24} -!33 = !{!34, !23, i64 8} -!34 = !{!"rb_iseq_constant_body", !6, i64 0, !26, i64 4, !23, i64 8, !35, i64 16, !37, i64 64, !40, i64 120, !23, i64 152, !23, i64 160, !23, i64 168, !23, i64 176, !23, i64 184, !23, i64 192, !41, i64 200, !26, i64 232, !26, i64 236, !26, i64 240, !26, i64 244, !26, i64 248, !6, i64 252, !5, i64 256} -!35 = !{!"", !36, i64 0, !26, i64 4, !26, i64 8, !26, i64 12, !26, i64 16, !26, i64 20, !26, i64 24, !26, i64 28, !23, i64 32, !23, i64 40} -!36 = !{!"", !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 1, !26, i64 1} -!37 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !26, i64 32, !38, i64 36} -!38 = !{!"rb_code_location_struct", !39, i64 0, !39, i64 8} -!39 = !{!"rb_code_position_struct", !26, i64 0, !26, i64 4} -!40 = !{!"iseq_insn_info", !23, i64 0, !23, i64 8, !26, i64 16, !23, i64 24} -!41 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !23, i64 24} -!42 = !DILocation(line: 0, scope: !9) -!43 = !DILocation(line: 5, column: 1, scope: !9) -!44 = !DILocation(line: 0, scope: !16, inlinedAt: !45) -!45 = distinct !DILocation(line: 5, column: 1, scope: !9) -!46 = !DILocation(line: 9, column: 7, scope: !16, inlinedAt: !45) -!47 = !DILocation(line: 9, column: 3, scope: !16, inlinedAt: !45) -!48 = !DILocation(line: 6, column: 3, scope: !16, inlinedAt: !45) -!49 = !{!50, !50, i64 0} -!50 = !{!"long long", !6, i64 0} -!51 = !{!"branch_weights", i32 1, i32 10000} -!52 = !{!29, !23, i64 8} -!53 = !DILocation(line: 7, column: 3, scope: !16, inlinedAt: !45) -!54 = !DILocation(line: 10, column: 3, scope: !16, inlinedAt: !45) -!55 = !DILocation(line: 15, column: 1, scope: !9) -!56 = !DILocation(line: 0, scope: !57, inlinedAt: !58) -!57 = distinct !DISubprogram(name: "Child.", linkageName: "func_Child.L188", scope: null, file: !2, line: 15, type: !10, scopeLine: 15, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!58 = distinct !DILocation(line: 15, column: 1, scope: !9) -!59 = !DILocation(line: 10, column: 3, scope: !14) -!60 = !{!"branch_weights", i32 1, i32 2000} -!61 = !DILocation(line: 0, scope: !14) -!62 = !DILocation(line: 11, column: 10, scope: !14) +!31 = !DILocation(line: 0, scope: !9) +!32 = !DILocation(line: 5, column: 1, scope: !9) +!33 = !DILocation(line: 0, scope: !16, inlinedAt: !34) +!34 = distinct !DILocation(line: 5, column: 1, scope: !9) +!35 = !DILocation(line: 9, column: 7, scope: !16, inlinedAt: !34) +!36 = !DILocation(line: 9, column: 3, scope: !16, inlinedAt: !34) +!37 = !DILocation(line: 6, column: 3, scope: !16, inlinedAt: !34) +!38 = !{!39, !39, i64 0} +!39 = !{!"long long", !6, i64 0} +!40 = !{!"branch_weights", i32 1, i32 10000} +!41 = !{!29, !23, i64 8} +!42 = !DILocation(line: 7, column: 3, scope: !16, inlinedAt: !34) +!43 = !DILocation(line: 10, column: 3, scope: !16, inlinedAt: !34) +!44 = !DILocation(line: 15, column: 1, scope: !9) +!45 = !DILocation(line: 0, scope: !46, inlinedAt: !47) +!46 = distinct !DISubprogram(name: "Child.", linkageName: "func_Child.L188", scope: null, file: !2, line: 15, type: !10, scopeLine: 15, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!47 = distinct !DILocation(line: 15, column: 1, scope: !9) +!48 = !DILocation(line: 10, column: 3, scope: !14) +!49 = !{!"branch_weights", i32 1, i32 2000} +!50 = !DILocation(line: 0, scope: !14) +!51 = !DILocation(line: 11, column: 10, scope: !14) diff --git a/test/testdata/compiler/float-intrinsics.llo.exp b/test/testdata/compiler/float-intrinsics.llo.exp index 962792c5865..78211c2b639 100644 --- a/test/testdata/compiler/float-intrinsics.llo.exp +++ b/test/testdata/compiler/float-intrinsics.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -88,6 +90,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_plus = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/float-intrinsics.rb" = private unnamed_addr constant [43 x i8] c"test/testdata/compiler/float-intrinsics.rb\00", align 1 +@iseqEncodedArray = internal global [49 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_sig = private unnamed_addr constant [4 x i8] c"sig\00", align 1 @str_Float = private unnamed_addr constant [6 x i8] c"Float\00", align 1 @"rubyIdPrecomputed_+" = internal unnamed_addr global i64 0, align 8 @@ -241,7 +245,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #1 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #2 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #0 @@ -305,298 +311,266 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !31 - %tooFewArgs = icmp ult i32 %argc, 2, !dbg !31 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !18 + %tooFewArgs = icmp ult i32 %argc, 2, !dbg !18 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !18 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_x = load i64, i64* %argArray, align 8, !dbg !31 - %11 = getelementptr i64, i64* %argArray, i32 1, !dbg !31 - %rawArg_y = load i64, i64* %11, align 8, !dbg !31 - %12 = and i64 %rawArg_x, 3, !dbg !33 - %13 = icmp eq i64 %12, 2, !dbg !33 - br i1 %13, label %typeTestSuccess16, label %14, !dbg !33 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %rawArg_x, 7, !dbg !33 - %16 = icmp ne i64 %15, 0, !dbg !33 - %17 = and i64 %rawArg_x, -9, !dbg !33 - %18 = icmp eq i64 %17, 0, !dbg !33 - %19 = or i1 %16, %18, !dbg !33 - br i1 %19, label %codeRepl, label %sorbet_isa_Float.exit, !dbg !33, !prof !34 - -sorbet_isa_Float.exit: ; preds = %14 - %20 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !33 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !33 - %22 = load i64, i64* %21, align 8, !dbg !33, !tbaa !35 - %23 = and i64 %22, 31, !dbg !33 - %24 = icmp eq i64 %23, 4, !dbg !33 - br i1 %24, label %typeTestSuccess16, label %codeRepl, !dbg !33, !prof !37 - -codeRepl: ; preds = %sorbet_isa_Float.exit, %14 - tail call fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) #16, !dbg !33 + %rawArg_x = load i64, i64* %argArray, align 8, !dbg !18 + %4 = getelementptr i64, i64* %argArray, i32 1, !dbg !18 + %rawArg_y = load i64, i64* %4, align 8, !dbg !18 + %5 = and i64 %rawArg_x, 3, !dbg !20 + %6 = icmp eq i64 %5, 2, !dbg !20 + br i1 %6, label %typeTestSuccess16, label %7, !dbg !20 + +7: ; preds = %fillRequiredArgs + %8 = and i64 %rawArg_x, 7, !dbg !20 + %9 = icmp ne i64 %8, 0, !dbg !20 + %10 = and i64 %rawArg_x, -9, !dbg !20 + %11 = icmp eq i64 %10, 0, !dbg !20 + %12 = or i1 %9, %11, !dbg !20 + br i1 %12, label %codeRepl, label %sorbet_isa_Float.exit, !dbg !20, !prof !21 + +sorbet_isa_Float.exit: ; preds = %7 + %13 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !20 + %14 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %13, i64 0, i32 0, !dbg !20 + %15 = load i64, i64* %14, align 8, !dbg !20, !tbaa !22 + %16 = and i64 %15, 31, !dbg !20 + %17 = icmp eq i64 %16, 4, !dbg !20 + br i1 %17, label %typeTestSuccess16, label %codeRepl, !dbg !20, !prof !24 + +codeRepl: ; preds = %sorbet_isa_Float.exit, %7 + tail call fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) #16, !dbg !20 unreachable typeTestSuccess16: ; preds = %fillRequiredArgs, %sorbet_isa_Float.exit - %25 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !38 - store i64* %25, i64** %3, align 8, !dbg !38, !tbaa !12 - %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !39 - store i64 %rawArg_y, i64* %callArgs0Addr, align 8, !dbg !39 - %26 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !39 - tail call void @llvm.experimental.noalias.scope.decl(metadata !40), !dbg !39 - %27 = load i64, i64* %26, align 8, !dbg !39, !tbaa !4, !alias.scope !40 - %28 = tail call i64 @rb_float_plus(i64 %rawArg_x, i64 %27) #17, !dbg !39, !noalias !40 - ret i64 %28 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !25, !tbaa !12 + %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !26 + store i64 %rawArg_y, i64* %callArgs0Addr, align 8, !dbg !26 + %18 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !26 + tail call void @llvm.experimental.noalias.scope.decl(metadata !27), !dbg !26 + %19 = load i64, i64* %18, align 8, !dbg !26, !tbaa !4, !alias.scope !27 + %20 = tail call i64 @rb_float_plus(i64 %rawArg_x, i64 %19) #17, !dbg !26, !noalias !27 + ret i64 %20 } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#minus"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !43 { +define i64 @"func_Object#minus"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !30 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !44 - %tooFewArgs = icmp ult i32 %argc, 2, !dbg !44 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !44 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !44, !prof !32 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !31 + %tooFewArgs = icmp ult i32 %argc, 2, !dbg !31 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !44 - unreachable, !dbg !44 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !31 + unreachable, !dbg !31 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = bitcast i64* %argArray to <2 x i64>*, !dbg !44 - %12 = load <2 x i64>, <2 x i64>* %11, align 8, !dbg !44 - %13 = extractelement <2 x i64> %12, i32 0, !dbg !45 - %14 = and i64 %13, 3, !dbg !45 - %15 = icmp eq i64 %14, 2, !dbg !45 - br i1 %15, label %typeTestSuccess13, label %16, !dbg !45 - -16: ; preds = %fillRequiredArgs - %17 = and i64 %13, 7, !dbg !45 - %18 = icmp ne i64 %17, 0, !dbg !45 - %19 = and i64 %13, -9, !dbg !45 - %20 = icmp eq i64 %19, 0, !dbg !45 - %21 = or i1 %18, %20, !dbg !45 - br i1 %21, label %codeRepl, label %sorbet_isa_Float.exit, !dbg !45, !prof !34 - -sorbet_isa_Float.exit: ; preds = %16 - %22 = inttoptr i64 %13 to %struct.iseq_inline_iv_cache_entry*, !dbg !45 - %23 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %22, i64 0, i32 0, !dbg !45 - %24 = load i64, i64* %23, align 8, !dbg !45, !tbaa !35 - %25 = and i64 %24, 31, !dbg !45 - %26 = icmp eq i64 %25, 4, !dbg !45 - br i1 %26, label %typeTestSuccess13, label %codeRepl, !dbg !45, !prof !37 - -codeRepl: ; preds = %sorbet_isa_Float.exit, %16 - tail call fastcc void @"func_Object#lt.cold.2"(i64 %13) #16, !dbg !45 + %4 = bitcast i64* %argArray to <2 x i64>*, !dbg !31 + %5 = load <2 x i64>, <2 x i64>* %4, align 8, !dbg !31 + %6 = extractelement <2 x i64> %5, i32 0, !dbg !32 + %7 = and i64 %6, 3, !dbg !32 + %8 = icmp eq i64 %7, 2, !dbg !32 + br i1 %8, label %typeTestSuccess13, label %9, !dbg !32 + +9: ; preds = %fillRequiredArgs + %10 = and i64 %6, 7, !dbg !32 + %11 = icmp ne i64 %10, 0, !dbg !32 + %12 = and i64 %6, -9, !dbg !32 + %13 = icmp eq i64 %12, 0, !dbg !32 + %14 = or i1 %11, %13, !dbg !32 + br i1 %14, label %codeRepl, label %sorbet_isa_Float.exit, !dbg !32, !prof !21 + +sorbet_isa_Float.exit: ; preds = %9 + %15 = inttoptr i64 %6 to %struct.iseq_inline_iv_cache_entry*, !dbg !32 + %16 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %15, i64 0, i32 0, !dbg !32 + %17 = load i64, i64* %16, align 8, !dbg !32, !tbaa !22 + %18 = and i64 %17, 31, !dbg !32 + %19 = icmp eq i64 %18, 4, !dbg !32 + br i1 %19, label %typeTestSuccess13, label %codeRepl, !dbg !32, !prof !24 + +codeRepl: ; preds = %sorbet_isa_Float.exit, %9 + tail call fastcc void @"func_Object#lt.cold.2"(i64 %6) #16, !dbg !32 unreachable typeTestSuccess13: ; preds = %fillRequiredArgs, %sorbet_isa_Float.exit - %27 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !46 - store i64* %27, i64** %3, align 8, !dbg !46, !tbaa !12 - %28 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !47, !tbaa !12 - %29 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %28, i64 0, i32 2, !dbg !47 - %30 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %29, align 8, !dbg !47, !tbaa !14 - %31 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 1, !dbg !47 - %32 = load i64*, i64** %31, align 8, !dbg !47, !tbaa !48 - %33 = getelementptr inbounds i64, i64* %32, i64 1, !dbg !47 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !47 - store i64* %34, i64** %31, align 8, !dbg !47, !tbaa !48 - %35 = bitcast i64* %32 to <2 x i64>*, !dbg !47 - store <2 x i64> %12, <2 x i64>* %35, align 8, !dbg !47, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_-, i64 0), !dbg !47 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %3, align 8, !dbg !33, !tbaa !12 + %20 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 + %21 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %20, i64 0, i32 2, !dbg !34 + %22 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %21, align 8, !dbg !34, !tbaa !14 + %23 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %22, i64 0, i32 1, !dbg !34 + %24 = load i64*, i64** %23, align 8, !dbg !34, !tbaa !35 + %25 = getelementptr inbounds i64, i64* %24, i64 1, !dbg !34 + %26 = getelementptr inbounds i64, i64* %25, i64 1, !dbg !34 + store i64* %26, i64** %23, align 8, !dbg !34, !tbaa !35 + %27 = bitcast i64* %24 to <2 x i64>*, !dbg !34 + store <2 x i64> %5, <2 x i64>* %27, align 8, !dbg !34, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_-, i64 0), !dbg !34 ret i64 %send } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#lt"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !49 { +define i64 @"func_Object#lt"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !37 { functionEntryInitializers: %callArgs = alloca [2 x i64], align 8 %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !50 - %tooFewArgs = icmp ult i32 %argc, 2, !dbg !50 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !50 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !50, !prof !32 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !38 + %tooFewArgs = icmp ult i32 %argc, 2, !dbg !38 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !38 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !38, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !50 - unreachable, !dbg !50 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !38 + unreachable, !dbg !38 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_x = load i64, i64* %argArray, align 8, !dbg !50 - %11 = getelementptr i64, i64* %argArray, i32 1, !dbg !50 - %rawArg_y = load i64, i64* %11, align 8, !dbg !50 - %12 = and i64 %rawArg_x, 3, !dbg !51 - %13 = icmp eq i64 %12, 2, !dbg !51 - br i1 %13, label %typeTestSuccess7, label %14, !dbg !51 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %rawArg_x, 7, !dbg !51 - %16 = icmp ne i64 %15, 0, !dbg !51 - %17 = and i64 %rawArg_x, -9, !dbg !51 - %18 = icmp eq i64 %17, 0, !dbg !51 - %19 = or i1 %16, %18, !dbg !51 - br i1 %19, label %codeRepl28, label %sorbet_isa_Float.exit, !dbg !51, !prof !34 - -sorbet_isa_Float.exit: ; preds = %14 - %20 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !51 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !51 - %22 = load i64, i64* %21, align 8, !dbg !51, !tbaa !35 - %23 = and i64 %22, 31, !dbg !51 - %24 = icmp eq i64 %23, 4, !dbg !51 - br i1 %24, label %typeTestSuccess7, label %codeRepl28, !dbg !51, !prof !37 - -codeRepl28: ; preds = %sorbet_isa_Float.exit, %14 - tail call fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) #16, !dbg !51 + %rawArg_x = load i64, i64* %argArray, align 8, !dbg !38 + %4 = getelementptr i64, i64* %argArray, i32 1, !dbg !38 + %rawArg_y = load i64, i64* %4, align 8, !dbg !38 + %5 = and i64 %rawArg_x, 3, !dbg !39 + %6 = icmp eq i64 %5, 2, !dbg !39 + br i1 %6, label %typeTestSuccess7, label %7, !dbg !39 + +7: ; preds = %fillRequiredArgs + %8 = and i64 %rawArg_x, 7, !dbg !39 + %9 = icmp ne i64 %8, 0, !dbg !39 + %10 = and i64 %rawArg_x, -9, !dbg !39 + %11 = icmp eq i64 %10, 0, !dbg !39 + %12 = or i1 %9, %11, !dbg !39 + br i1 %12, label %codeRepl26, label %sorbet_isa_Float.exit, !dbg !39, !prof !21 + +sorbet_isa_Float.exit: ; preds = %7 + %13 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !39 + %14 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %13, i64 0, i32 0, !dbg !39 + %15 = load i64, i64* %14, align 8, !dbg !39, !tbaa !22 + %16 = and i64 %15, 31, !dbg !39 + %17 = icmp eq i64 %16, 4, !dbg !39 + br i1 %17, label %typeTestSuccess7, label %codeRepl26, !dbg !39, !prof !24 + +codeRepl26: ; preds = %sorbet_isa_Float.exit, %7 + tail call fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) #16, !dbg !39 unreachable typeTestSuccess7: ; preds = %fillRequiredArgs, %sorbet_isa_Float.exit - %25 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !52 - store i64* %25, i64** %3, align 8, !dbg !52, !tbaa !12 - %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !53 - store i64 %rawArg_y, i64* %callArgs0Addr, align 8, !dbg !53 - %26 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !53 - tail call void @llvm.experimental.noalias.scope.decl(metadata !54), !dbg !53 - %27 = load i64, i64* %26, align 8, !dbg !53, !tbaa !4, !alias.scope !54 - %28 = tail call i64 @sorbet_flo_lt(i64 %rawArg_x, i64 %27) #17, !dbg !53, !noalias !54 - switch i64 %28, label %codeRepl [ + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %3, align 8, !dbg !40, !tbaa !12 + %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !41 + store i64 %rawArg_y, i64* %callArgs0Addr, align 8, !dbg !41 + %18 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !41 + tail call void @llvm.experimental.noalias.scope.decl(metadata !42), !dbg !41 + %19 = load i64, i64* %18, align 8, !dbg !41, !tbaa !4, !alias.scope !42 + %20 = tail call i64 @sorbet_flo_lt(i64 %rawArg_x, i64 %19) #17, !dbg !41, !noalias !42 + switch i64 %20, label %codeRepl [ i64 20, label %typeTestSuccess16 i64 0, label %typeTestSuccess16 - ], !prof !57 + ], !prof !45 typeTestSuccess16: ; preds = %typeTestSuccess7, %typeTestSuccess7 - ret i64 %28 + ret i64 %20 codeRepl: ; preds = %typeTestSuccess7 - tail call fastcc void @"func_Object#lt.cold.1"(i64 %28) #16, !dbg !58 + tail call fastcc void @"func_Object#lt.cold.1"(i64 %20) #16, !dbg !46 unreachable } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_Object#lte"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !59 { +define i64 @"func_Object#lte"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !47 { functionEntryInitializers: %callArgs = alloca [2 x i64], align 8 %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !60 - %tooFewArgs = icmp ult i32 %argc, 2, !dbg !60 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !60 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !60, !prof !32 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 23), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 2, !dbg !48 + %tooFewArgs = icmp ult i32 %argc, 2, !dbg !48 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !48 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !48, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !60 - unreachable, !dbg !60 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 2, i32 noundef 2) #2, !dbg !48 + unreachable, !dbg !48 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_x = load i64, i64* %argArray, align 8, !dbg !60 - %11 = getelementptr i64, i64* %argArray, i32 1, !dbg !60 - %rawArg_y = load i64, i64* %11, align 8, !dbg !60 - %12 = and i64 %rawArg_x, 3, !dbg !61 - %13 = icmp eq i64 %12, 2, !dbg !61 - br i1 %13, label %typeTestSuccess7, label %14, !dbg !61 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %rawArg_x, 7, !dbg !61 - %16 = icmp ne i64 %15, 0, !dbg !61 - %17 = and i64 %rawArg_x, -9, !dbg !61 - %18 = icmp eq i64 %17, 0, !dbg !61 - %19 = or i1 %16, %18, !dbg !61 - br i1 %19, label %codeRepl28, label %sorbet_isa_Float.exit, !dbg !61, !prof !34 - -sorbet_isa_Float.exit: ; preds = %14 - %20 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !61 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !61 - %22 = load i64, i64* %21, align 8, !dbg !61, !tbaa !35 - %23 = and i64 %22, 31, !dbg !61 - %24 = icmp eq i64 %23, 4, !dbg !61 - br i1 %24, label %typeTestSuccess7, label %codeRepl28, !dbg !61, !prof !37 - -codeRepl28: ; preds = %sorbet_isa_Float.exit, %14 - tail call fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) #16, !dbg !61 + %rawArg_x = load i64, i64* %argArray, align 8, !dbg !48 + %4 = getelementptr i64, i64* %argArray, i32 1, !dbg !48 + %rawArg_y = load i64, i64* %4, align 8, !dbg !48 + %5 = and i64 %rawArg_x, 3, !dbg !49 + %6 = icmp eq i64 %5, 2, !dbg !49 + br i1 %6, label %typeTestSuccess7, label %7, !dbg !49 + +7: ; preds = %fillRequiredArgs + %8 = and i64 %rawArg_x, 7, !dbg !49 + %9 = icmp ne i64 %8, 0, !dbg !49 + %10 = and i64 %rawArg_x, -9, !dbg !49 + %11 = icmp eq i64 %10, 0, !dbg !49 + %12 = or i1 %9, %11, !dbg !49 + br i1 %12, label %codeRepl26, label %sorbet_isa_Float.exit, !dbg !49, !prof !21 + +sorbet_isa_Float.exit: ; preds = %7 + %13 = inttoptr i64 %rawArg_x to %struct.iseq_inline_iv_cache_entry*, !dbg !49 + %14 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %13, i64 0, i32 0, !dbg !49 + %15 = load i64, i64* %14, align 8, !dbg !49, !tbaa !22 + %16 = and i64 %15, 31, !dbg !49 + %17 = icmp eq i64 %16, 4, !dbg !49 + br i1 %17, label %typeTestSuccess7, label %codeRepl26, !dbg !49, !prof !24 + +codeRepl26: ; preds = %sorbet_isa_Float.exit, %7 + tail call fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) #16, !dbg !49 unreachable typeTestSuccess7: ; preds = %fillRequiredArgs, %sorbet_isa_Float.exit - %25 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !62 - store i64* %25, i64** %3, align 8, !dbg !62, !tbaa !12 - %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !63 - store i64 %rawArg_y, i64* %callArgs0Addr, align 8, !dbg !63 - %26 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !63 - tail call void @llvm.experimental.noalias.scope.decl(metadata !64), !dbg !63 - %27 = load i64, i64* %26, align 8, !dbg !63, !tbaa !4, !alias.scope !64 - %28 = tail call i64 @sorbet_flo_le(i64 %rawArg_x, i64 %27) #17, !dbg !63, !noalias !64 - switch i64 %28, label %codeRepl [ + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 24), i64** %3, align 8, !dbg !50, !tbaa !12 + %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !51 + store i64 %rawArg_y, i64* %callArgs0Addr, align 8, !dbg !51 + %18 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !51 + tail call void @llvm.experimental.noalias.scope.decl(metadata !52), !dbg !51 + %19 = load i64, i64* %18, align 8, !dbg !51, !tbaa !4, !alias.scope !52 + %20 = tail call i64 @sorbet_flo_le(i64 %rawArg_x, i64 %19) #17, !dbg !51, !noalias !52 + switch i64 %20, label %codeRepl [ i64 20, label %typeTestSuccess16 i64 0, label %typeTestSuccess16 - ], !prof !57 + ], !prof !45 typeTestSuccess16: ; preds = %typeTestSuccess7, %typeTestSuccess7 - ret i64 %28 + ret i64 %20 codeRepl: ; preds = %typeTestSuccess7 - tail call fastcc void @"func_Object#lt.cold.1"(i64 %28) #16, !dbg !67 + tail call fastcc void @"func_Object#lt.cold.1"(i64 %20) #16, !dbg !55 unreachable } ; Function Attrs: sspreq define void @Init_float-intrinsics() local_unnamed_addr #8 { entry: - %positional_table.i = alloca i64, i32 2, align 8, !dbg !68 - %positional_table293.i = alloca i64, i32 2, align 8, !dbg !70 - %positional_table312.i = alloca i64, i32 2, align 8, !dbg !71 - %positional_table331.i = alloca i64, i32 2, align 8, !dbg !72 + %positional_table.i = alloca i64, i32 2, align 8, !dbg !56 + %positional_table293.i = alloca i64, i32 2, align 8, !dbg !58 + %positional_table312.i = alloca i64, i32 2, align 8, !dbg !59 + %positional_table331.i = alloca i64, i32 2, align 8, !dbg !60 %locals.i181.i = alloca i64, align 8 %locals.i179.i = alloca i64, i32 0, align 8 %locals.i177.i = alloca i64, i32 0, align 8 %locals.i175.i = alloca i64, i32 0, align 8 %locals.i.i = alloca i64, i32 0, align 8 - %keywords.i = alloca i64, i32 2, align 8, !dbg !73 - %keywords17.i = alloca i64, i32 2, align 8, !dbg !75 - %keywords34.i = alloca i64, i32 2, align 8, !dbg !77 - %keywords49.i = alloca i64, i32 2, align 8, !dbg !79 + %keywords.i = alloca i64, i32 2, align 8, !dbg !61 + %keywords17.i = alloca i64, i32 2, align 8, !dbg !63 + %keywords34.i = alloca i64, i32 2, align 8, !dbg !65 + %keywords49.i = alloca i64, i32 2, align 8, !dbg !67 %realpath = tail call i64 @sorbet_readRealpath() %0 = bitcast i64* %keywords.i to i8* call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %0) @@ -658,36 +632,38 @@ entry: %28 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([43 x i8], [43 x i8]* @"str_test/testdata/compiler/float-intrinsics.rb", i64 0, i64 0), i64 noundef 42) #17 tail call void @rb_gc_register_mark_object(i64 %28) #17 store i64 %28, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 49) %rubyId_plus.i.i = load i64, i64* @rubyIdPrecomputed_plus, align 8 %rubyStr_plus.i.i = load i64, i64* @rubyStrFrozen_plus, align 8 - %29 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_plus.i.i, i64 %rubyId_plus.i.i, i64 %28, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 10, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 + %29 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_plus.i.i, i64 %rubyId_plus.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %29, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#plus", align 8 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !39 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !26 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !26 %30 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_minus, i64 0, i64 0), i64 noundef 5) #17 call void @rb_gc_register_mark_object(i64 %30) #17 %rubyId_minus.i.i = load i64, i64* @rubyIdPrecomputed_minus, align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i174.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %31 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %30, i64 %rubyId_minus.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i174.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 13, i32 noundef 15, i64* noundef nonnull %locals.i175.i, i32 noundef 0, i32 noundef 2) + %31 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %30, i64 %rubyId_minus.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i174.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i175.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %31, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#minus", align 8 - %rubyId_-.i = load i64, i64* @rubyIdPrecomputed_-, align 8, !dbg !47 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_-, i64 %rubyId_-.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !47 + %rubyId_-.i = load i64, i64* @rubyIdPrecomputed_-, align 8, !dbg !34 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_-, i64 %rubyId_-.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 %32 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_lt, i64 0, i64 0), i64 noundef 2) #17 call void @rb_gc_register_mark_object(i64 %32) #17 %rubyId_lt.i.i = load i64, i64* @rubyIdPrecomputed_lt, align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i176.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %33 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %32, i64 %rubyId_lt.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i176.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 18, i32 noundef 20, i64* noundef nonnull %locals.i177.i, i32 noundef 0, i32 noundef 2) + %33 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %32, i64 %rubyId_lt.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i176.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i177.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %33, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#lt", align 8 - %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !53 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !53 + %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !41 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !41 %34 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_lte, i64 0, i64 0), i64 noundef 3) #17 call void @rb_gc_register_mark_object(i64 %34) #17 %rubyId_lte.i.i = load i64, i64* @rubyIdPrecomputed_lte, align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i178.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %35 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %34, i64 %rubyId_lte.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i178.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 23, i32 noundef 25, i64* noundef nonnull %locals.i179.i, i32 noundef 0, i32 noundef 2) + %35 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %34, i64 %rubyId_lte.i.i, i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i178.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i179.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %35, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#lte", align 8 - %"rubyId_<=.i" = load i64, i64* @"rubyIdPrecomputed_<=", align 8, !dbg !63 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<=", i64 %"rubyId_<=.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !63 + %"rubyId_<=.i" = load i64, i64* @"rubyIdPrecomputed_<=", align 8, !dbg !51 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<=", i64 %"rubyId_<=.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !51 %36 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #17 call void @rb_gc_register_mark_object(i64 %36) #17 %37 = bitcast i64* %locals.i181.i to i8* @@ -696,7 +672,7 @@ entry: %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i180.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 store i64 %"rubyId_.i.i", i64* %locals.i181.i, align 8 - %38 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %36, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i180.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 48, i64* noundef nonnull align 8 %locals.i181.i, i32 noundef 1, i32 noundef 4) + %38 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %36, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i180.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i181.i, i32 noundef 1, i32 noundef 4) store %struct.rb_iseq_struct* %38, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %37) %39 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #17 @@ -705,205 +681,205 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i182.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %40 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %39, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i182.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 48, i64* noundef null, i32 noundef 0, i32 noundef 4) + %40 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %39, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i182.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %40, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 %stackFrame.i183.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i184.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i185.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i186.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %41 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i185.i", i64 %"rubyId_block for.i184.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i186.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i183.i, i32 noundef 2, i32 noundef 1, i32 noundef 48, i64* noundef null, i32 noundef 0, i32 noundef 4) + %41 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i185.i", i64 %"rubyId_block for.i184.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i186.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i183.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %41, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_2", align 8 %stackFrame.i187.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i188.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i189.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i190.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %42 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i189.i", i64 %"rubyId_block for.i188.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i190.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i187.i, i32 noundef 2, i32 noundef 1, i32 noundef 48, i64* noundef null, i32 noundef 0, i32 noundef 4) + %42 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i189.i", i64 %"rubyId_block for.i188.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i190.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i187.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %42, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_3", align 8 %stackFrame.i191.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i192.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i193.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i194.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/float-intrinsics.rb", align 8 - %43 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i193.i", i64 %"rubyId_block for.i192.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i194.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i191.i, i32 noundef 2, i32 noundef 1, i32 noundef 48, i64* noundef null, i32 noundef 0, i32 noundef 4) + %43 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i193.i", i64 %"rubyId_block for.i192.i", i64 %"rubyStr_test/testdata/compiler/float-intrinsics.rb.i194.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i191.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %43, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_4", align 8 - %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !81 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !81 - %rubyId_untyped.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !82 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped, i64 %rubyId_untyped.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !82 - %rubyId_params.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !73 - %rubyId_x.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !73 - %44 = call i64 @rb_id2sym(i64 %rubyId_x.i) #17, !dbg !73 - store i64 %44, i64* %keywords.i, align 8, !dbg !73 - %rubyId_y.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !73 - %45 = call i64 @rb_id2sym(i64 %rubyId_y.i) #17, !dbg !73 - %46 = getelementptr i64, i64* %keywords.i, i32 1, !dbg !73 - store i64 %45, i64* %46, align 8, !dbg !73 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params, i64 %rubyId_params.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords.i), !dbg !73 - %rubyId_untyped8.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !83 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.1, i64 %rubyId_untyped8.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !83 - %rubyId_returns.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !73 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns, i64 %rubyId_returns.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !73 - %rubyId_sig11.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !84 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.2, i64 %rubyId_sig11.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !84 - %rubyId_untyped14.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !85 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.3, i64 %rubyId_untyped14.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !85 - %rubyId_params16.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !75 - %rubyId_x18.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !75 - %47 = call i64 @rb_id2sym(i64 %rubyId_x18.i) #17, !dbg !75 - store i64 %47, i64* %keywords17.i, align 8, !dbg !75 - %rubyId_y20.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !75 - %48 = call i64 @rb_id2sym(i64 %rubyId_y20.i) #17, !dbg !75 - %49 = getelementptr i64, i64* %keywords17.i, i32 1, !dbg !75 - store i64 %48, i64* %49, align 8, !dbg !75 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params.4, i64 %rubyId_params16.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords17.i), !dbg !75 - %rubyId_untyped24.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !86 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.5, i64 %rubyId_untyped24.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !86 - %rubyId_returns26.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !75 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.6, i64 %rubyId_returns26.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !75 - %rubyId_sig28.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !87 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.7, i64 %rubyId_sig28.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !87 - %rubyId_untyped31.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !88 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.8, i64 %rubyId_untyped31.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !88 - %rubyId_params33.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !77 - %rubyId_x35.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !77 - %50 = call i64 @rb_id2sym(i64 %rubyId_x35.i) #17, !dbg !77 - store i64 %50, i64* %keywords34.i, align 8, !dbg !77 - %rubyId_y37.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !77 - %51 = call i64 @rb_id2sym(i64 %rubyId_y37.i) #17, !dbg !77 - %52 = getelementptr i64, i64* %keywords34.i, i32 1, !dbg !77 - store i64 %51, i64* %52, align 8, !dbg !77 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params.9, i64 %rubyId_params33.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords34.i), !dbg !77 - %rubyId_returns41.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !77 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.10, i64 %rubyId_returns41.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !77 - %rubyId_sig43.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !89 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.11, i64 %rubyId_sig43.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !89 - %rubyId_untyped46.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !90 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.12, i64 %rubyId_untyped46.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !90 - %rubyId_params48.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !79 - %rubyId_x50.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !79 - %53 = call i64 @rb_id2sym(i64 %rubyId_x50.i) #17, !dbg !79 - store i64 %53, i64* %keywords49.i, align 8, !dbg !79 - %rubyId_y52.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !79 - %54 = call i64 @rb_id2sym(i64 %rubyId_y52.i) #17, !dbg !79 - %55 = getelementptr i64, i64* %keywords49.i, i32 1, !dbg !79 - store i64 %54, i64* %55, align 8, !dbg !79 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params.13, i64 %rubyId_params48.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords49.i), !dbg !79 - %rubyId_returns56.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !79 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.14, i64 %rubyId_returns56.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !79 - %rubyId_extend.i = load i64, i64* @rubyIdPrecomputed_extend, align 8, !dbg !91 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 %rubyId_extend.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !91 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !68 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !68 - %rubyId_keep_def61.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !70 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.15, i64 %rubyId_keep_def61.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !70 - %rubyId_keep_def63.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !71 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.16, i64 %rubyId_keep_def63.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !71 - %rubyId_keep_def65.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !72 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.17, i64 %rubyId_keep_def65.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !72 - %rubyId_plus.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !92 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus, i64 %rubyId_plus.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !92 - %rubyId_p.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !93 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p, i64 %rubyId_p.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !93 - %rubyId_minus.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !94 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus, i64 %rubyId_minus.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !94 - %rubyId_p73.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !95 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.18, i64 %rubyId_p73.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !95 - %rubyId_lt.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !96 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt, i64 %rubyId_lt.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !96 - %rubyId_p78.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !97 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.19, i64 %rubyId_p78.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !97 - %rubyId_lt81.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !98 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt.20, i64 %rubyId_lt81.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !98 - %rubyId_p84.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !99 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.21, i64 %rubyId_p84.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !99 - %rubyId_lte.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !100 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte, i64 %rubyId_lte.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !100 - %rubyId_p89.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !101 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.22, i64 %rubyId_p89.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !101 - %rubyId_lte92.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !102 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.23, i64 %rubyId_lte92.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !102 - %rubyId_p95.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !103 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.24, i64 %rubyId_p95.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !103 - %rubyId_lte98.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !104 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.25, i64 %rubyId_lte98.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !104 - %rubyId_p101.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !105 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.26, i64 %rubyId_p101.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !105 - %rubyId_plus104.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !106 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus.27, i64 %rubyId_plus104.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !106 - %rubyId_p107.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !107 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.28, i64 %rubyId_p107.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !107 + %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !69 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !69 + %rubyId_untyped.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !70 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped, i64 %rubyId_untyped.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !70 + %rubyId_params.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !61 + %rubyId_x.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !61 + %44 = call i64 @rb_id2sym(i64 %rubyId_x.i) #17, !dbg !61 + store i64 %44, i64* %keywords.i, align 8, !dbg !61 + %rubyId_y.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !61 + %45 = call i64 @rb_id2sym(i64 %rubyId_y.i) #17, !dbg !61 + %46 = getelementptr i64, i64* %keywords.i, i32 1, !dbg !61 + store i64 %45, i64* %46, align 8, !dbg !61 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params, i64 %rubyId_params.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords.i), !dbg !61 + %rubyId_untyped8.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !71 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.1, i64 %rubyId_untyped8.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !71 + %rubyId_returns.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !61 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns, i64 %rubyId_returns.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !61 + %rubyId_sig11.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !72 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.2, i64 %rubyId_sig11.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !72 + %rubyId_untyped14.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !73 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.3, i64 %rubyId_untyped14.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !73 + %rubyId_params16.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !63 + %rubyId_x18.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !63 + %47 = call i64 @rb_id2sym(i64 %rubyId_x18.i) #17, !dbg !63 + store i64 %47, i64* %keywords17.i, align 8, !dbg !63 + %rubyId_y20.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !63 + %48 = call i64 @rb_id2sym(i64 %rubyId_y20.i) #17, !dbg !63 + %49 = getelementptr i64, i64* %keywords17.i, i32 1, !dbg !63 + store i64 %48, i64* %49, align 8, !dbg !63 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params.4, i64 %rubyId_params16.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords17.i), !dbg !63 + %rubyId_untyped24.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !74 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.5, i64 %rubyId_untyped24.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !74 + %rubyId_returns26.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !63 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.6, i64 %rubyId_returns26.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !63 + %rubyId_sig28.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !75 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.7, i64 %rubyId_sig28.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !75 + %rubyId_untyped31.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !76 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.8, i64 %rubyId_untyped31.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !76 + %rubyId_params33.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !65 + %rubyId_x35.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !65 + %50 = call i64 @rb_id2sym(i64 %rubyId_x35.i) #17, !dbg !65 + store i64 %50, i64* %keywords34.i, align 8, !dbg !65 + %rubyId_y37.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !65 + %51 = call i64 @rb_id2sym(i64 %rubyId_y37.i) #17, !dbg !65 + %52 = getelementptr i64, i64* %keywords34.i, i32 1, !dbg !65 + store i64 %51, i64* %52, align 8, !dbg !65 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params.9, i64 %rubyId_params33.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords34.i), !dbg !65 + %rubyId_returns41.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !65 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.10, i64 %rubyId_returns41.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !65 + %rubyId_sig43.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !77 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig.11, i64 %rubyId_sig43.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !77 + %rubyId_untyped46.i = load i64, i64* @rubyIdPrecomputed_untyped, align 8, !dbg !78 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_untyped.12, i64 %rubyId_untyped46.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !78 + %rubyId_params48.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !67 + %rubyId_x50.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !67 + %53 = call i64 @rb_id2sym(i64 %rubyId_x50.i) #17, !dbg !67 + store i64 %53, i64* %keywords49.i, align 8, !dbg !67 + %rubyId_y52.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !67 + %54 = call i64 @rb_id2sym(i64 %rubyId_y52.i) #17, !dbg !67 + %55 = getelementptr i64, i64* %keywords49.i, i32 1, !dbg !67 + store i64 %54, i64* %55, align 8, !dbg !67 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params.13, i64 %rubyId_params48.i, i32 noundef 68, i32 noundef 2, i32 noundef 2, i64* noundef nonnull %keywords49.i), !dbg !67 + %rubyId_returns56.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !67 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns.14, i64 %rubyId_returns56.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !67 + %rubyId_extend.i = load i64, i64* @rubyIdPrecomputed_extend, align 8, !dbg !79 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 %rubyId_extend.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !79 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !56 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !56 + %rubyId_keep_def61.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !58 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.15, i64 %rubyId_keep_def61.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !58 + %rubyId_keep_def63.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !59 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.16, i64 %rubyId_keep_def63.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !59 + %rubyId_keep_def65.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !60 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.17, i64 %rubyId_keep_def65.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !60 + %rubyId_plus.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !80 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus, i64 %rubyId_plus.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !80 + %rubyId_p.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !81 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p, i64 %rubyId_p.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !81 + %rubyId_minus.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !82 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus, i64 %rubyId_minus.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !82 + %rubyId_p73.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !83 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.18, i64 %rubyId_p73.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !83 + %rubyId_lt.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !84 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt, i64 %rubyId_lt.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !84 + %rubyId_p78.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !85 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.19, i64 %rubyId_p78.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !85 + %rubyId_lt81.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !86 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt.20, i64 %rubyId_lt81.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !86 + %rubyId_p84.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !87 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.21, i64 %rubyId_p84.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !87 + %rubyId_lte.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !88 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte, i64 %rubyId_lte.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !88 + %rubyId_p89.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !89 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.22, i64 %rubyId_p89.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !89 + %rubyId_lte92.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !90 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.23, i64 %rubyId_lte92.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !90 + %rubyId_p95.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !91 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.24, i64 %rubyId_p95.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !91 + %rubyId_lte98.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !92 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.25, i64 %rubyId_lte98.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !92 + %rubyId_p101.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !93 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.26, i64 %rubyId_p101.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !93 + %rubyId_plus104.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !94 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus.27, i64 %rubyId_plus104.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !94 + %rubyId_p107.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !95 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.28, i64 %rubyId_p107.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !95 %56 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_8.9, i64 0, i64 0), i64 noundef 3) #17 call void @rb_gc_register_mark_object(i64 %56) #17 store i64 %56, i64* @rubyStrFrozen_8.9, align 8 - %rubyId_Rational.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !108 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational, i64 %rubyId_Rational.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !108 - %rubyId_plus111.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !109 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus.29, i64 %rubyId_plus111.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !109 - %rubyId_p114.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !110 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.30, i64 %rubyId_p114.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !110 + %rubyId_Rational.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !96 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational, i64 %rubyId_Rational.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !96 + %rubyId_plus111.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !97 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus.29, i64 %rubyId_plus111.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !97 + %rubyId_p114.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !98 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.30, i64 %rubyId_p114.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !98 %57 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_5, i64 0, i64 0), i64 noundef 1) #17 call void @rb_gc_register_mark_object(i64 %57) #17 store i64 %57, i64* @rubyStrFrozen_5, align 8 - %rubyId_Complex.i = load i64, i64* @rubyIdPrecomputed_Complex, align 8, !dbg !111 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Complex, i64 %rubyId_Complex.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !111 - %rubyId_plus118.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !112 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus.31, i64 %rubyId_plus118.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !112 - %rubyId_p121.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !113 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.32, i64 %rubyId_p121.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !113 - %rubyId_minus124.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !114 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus.33, i64 %rubyId_minus124.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !114 - %rubyId_p127.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !115 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.34, i64 %rubyId_p127.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !115 + %rubyId_Complex.i = load i64, i64* @rubyIdPrecomputed_Complex, align 8, !dbg !99 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Complex, i64 %rubyId_Complex.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !99 + %rubyId_plus118.i = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !100 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_plus.31, i64 %rubyId_plus118.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !100 + %rubyId_p121.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !101 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.32, i64 %rubyId_p121.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !101 + %rubyId_minus124.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !102 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus.33, i64 %rubyId_minus124.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !102 + %rubyId_p127.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !103 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.34, i64 %rubyId_p127.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !103 %58 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_15.4, i64 0, i64 0), i64 noundef 4) #17 call void @rb_gc_register_mark_object(i64 %58) #17 store i64 %58, i64* @rubyStrFrozen_15.4, align 8 - %rubyId_Rational130.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !116 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational.35, i64 %rubyId_Rational130.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !116 - %rubyId_minus132.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !117 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus.36, i64 %rubyId_minus132.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !117 - %rubyId_p135.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !118 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.37, i64 %rubyId_p135.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !118 + %rubyId_Rational130.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !104 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational.35, i64 %rubyId_Rational130.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !104 + %rubyId_minus132.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !105 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus.36, i64 %rubyId_minus132.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !105 + %rubyId_p135.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !106 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.37, i64 %rubyId_p135.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !106 %59 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_18, i64 0, i64 0), i64 noundef 2) #17 call void @rb_gc_register_mark_object(i64 %59) #17 store i64 %59, i64* @rubyStrFrozen_18, align 8 - %rubyId_Complex138.i = load i64, i64* @rubyIdPrecomputed_Complex, align 8, !dbg !119 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Complex.38, i64 %rubyId_Complex138.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !119 - %rubyId_minus140.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !120 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus.39, i64 %rubyId_minus140.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !120 - %rubyId_p143.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !121 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.40, i64 %rubyId_p143.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !121 - %rubyId_lt146.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !122 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt.41, i64 %rubyId_lt146.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !122 - %rubyId_p149.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !123 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.42, i64 %rubyId_p149.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !123 + %rubyId_Complex138.i = load i64, i64* @rubyIdPrecomputed_Complex, align 8, !dbg !107 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Complex.38, i64 %rubyId_Complex138.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !107 + %rubyId_minus140.i = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !108 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_minus.39, i64 %rubyId_minus140.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !108 + %rubyId_p143.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !109 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.40, i64 %rubyId_p143.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !109 + %rubyId_lt146.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !110 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt.41, i64 %rubyId_lt146.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !110 + %rubyId_p149.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !111 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.42, i64 %rubyId_p149.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !111 %60 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_25.4, i64 0, i64 0), i64 noundef 4) #17 call void @rb_gc_register_mark_object(i64 %60) #17 store i64 %60, i64* @rubyStrFrozen_25.4, align 8 - %rubyId_Rational152.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !124 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational.43, i64 %rubyId_Rational152.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !124 - %rubyId_lt154.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !125 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt.44, i64 %rubyId_lt154.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !125 - %rubyId_p157.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !126 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.45, i64 %rubyId_p157.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !126 - %rubyId_lte160.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !127 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.46, i64 %rubyId_lte160.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !127 - %rubyId_p163.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !128 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.47, i64 %rubyId_p163.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !128 + %rubyId_Rational152.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !112 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational.43, i64 %rubyId_Rational152.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !112 + %rubyId_lt154.i = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !113 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lt.44, i64 %rubyId_lt154.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !113 + %rubyId_p157.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !114 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.45, i64 %rubyId_p157.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !114 + %rubyId_lte160.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !115 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.46, i64 %rubyId_lte160.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !115 + %rubyId_p163.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !116 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.47, i64 %rubyId_p163.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !116 %61 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_5.923, i64 0, i64 0), i64 noundef 5) #17 call void @rb_gc_register_mark_object(i64 %61) #17 store i64 %61, i64* @rubyStrFrozen_5.923, align 8 - %rubyId_Rational166.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !129 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational.48, i64 %rubyId_Rational166.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !129 - %rubyId_lte168.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !130 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.49, i64 %rubyId_lte168.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !130 - %rubyId_p171.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !131 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.50, i64 %rubyId_p171.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !131 + %rubyId_Rational166.i = load i64, i64* @rubyIdPrecomputed_Rational, align 8, !dbg !117 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_Rational.48, i64 %rubyId_Rational166.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !117 + %rubyId_lte168.i = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !118 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_lte.49, i64 %rubyId_lte168.i, i32 noundef 20, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !118 + %rubyId_p171.i = load i64, i64* @rubyIdPrecomputed_p, align 8, !dbg !119 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_p.50, i64 %rubyId_p171.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !119 call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %0) call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %1) call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %2) call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %3) %62 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %63 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %62, i64 0, i32 18 - %64 = load i64, i64* %63, align 8, !tbaa !132 + %64 = load i64, i64* %63, align 8, !tbaa !120 %65 = bitcast i64* %positional_table.i to i8* call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %65) %66 = bitcast i64* %positional_table293.i to i8* @@ -917,729 +893,680 @@ entry: %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2 %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !tbaa !14 %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %72, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %72, align 8, !tbaa !129 %73 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 4 - %74 = load i64*, i64** %73, align 8, !tbaa !141 + %74 = load i64*, i64** %73, align 8, !tbaa !130 %75 = load i64, i64* %74, align 8, !tbaa !4 %76 = and i64 %75, -33 store i64 %76, i64* %74, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %69, %struct.rb_control_frame_struct* align 8 %71, %struct.rb_iseq_struct* %stackFrame.i) #17 %77 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 0 - %78 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %72, align 8, !tbaa !18 - %79 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %78, i64 0, i32 2 - %80 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %79, align 8, !tbaa !20 - %81 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %80, i64 0, i32 2 - %82 = load i64*, i64** %81, align 8, !tbaa !22 - %83 = getelementptr inbounds i64, i64* %82, i64 4 - %84 = getelementptr inbounds i64, i64* %83, i64 1 - store i64* %84, i64** %77, align 8, !dbg !89, !tbaa !12 - %85 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !91 - %86 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !91, !tbaa !142 - %needTakeSlowPath = icmp ne i64 %85, %86, !dbg !91 - br i1 %needTakeSlowPath, label %87, label %88, !dbg !91, !prof !143 - -87: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !91 - br label %88, !dbg !91 - -88: ; preds = %entry, %87 - %89 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !91 - %90 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !91 - %91 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !91, !tbaa !142 - %guardUpdated = icmp eq i64 %90, %91, !dbg !91 - call void @llvm.assume(i1 %guardUpdated), !dbg !91 - %92 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !91, !tbaa !12 - %93 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %92, i64 0, i32 2, !dbg !91 - %94 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %93, align 8, !dbg !91, !tbaa !14 - %95 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %94, i64 0, i32 1, !dbg !91 - %96 = load i64*, i64** %95, align 8, !dbg !91, !tbaa !48 - %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !91 - store i64 %64, i64* %96, align 8, !dbg !91, !tbaa !4 - %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !91 - store i64* %98, i64** %95, align 8, !dbg !91, !tbaa !48 - store i64 %89, i64* %97, align 8, !dbg !91, !tbaa !4 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #17, !dbg !91 - %99 = getelementptr inbounds i64, i64* %82, i64 7, !dbg !91 - %100 = getelementptr inbounds i64, i64* %99, i64 1, !dbg !91 - store i64* %100, i64** %77, align 8, !dbg !91, !tbaa !12 - %rubyId_plus.i1 = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !68 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_plus.i1) #17, !dbg !68 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !68 - %rawSym274.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #17, !dbg !68 - %101 = load i64, i64* @rb_cObject, align 8, !dbg !68 - %stackFrame276.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#plus", align 8, !dbg !68 - %102 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !68 - %103 = bitcast i8* %102 to i16*, !dbg !68 - %104 = load i16, i16* %103, align 8, !dbg !68 - %105 = and i16 %104, -384, !dbg !68 - %106 = or i16 %105, 1, !dbg !68 - store i16 %106, i16* %103, align 8, !dbg !68 - %107 = getelementptr inbounds i8, i8* %102, i64 8, !dbg !68 - %108 = bitcast i8* %107 to i32*, !dbg !68 - store i32 2, i32* %108, align 8, !dbg !68, !tbaa !144 - %109 = getelementptr inbounds i8, i8* %102, i64 12, !dbg !68 - %110 = getelementptr inbounds i8, i8* %102, i64 4, !dbg !68 - %111 = bitcast i8* %110 to i32*, !dbg !68 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %109, i8 0, i64 20, i1 false) #17, !dbg !68 - store i32 2, i32* %111, align 4, !dbg !68, !tbaa !146 - %rubyId_x.i2 = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !68 - store i64 %rubyId_x.i2, i64* %positional_table.i, align 8, !dbg !68 - %rubyId_y.i3 = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !68 - %112 = getelementptr i64, i64* %positional_table.i, i32 1, !dbg !68 - store i64 %rubyId_y.i3, i64* %112, align 8, !dbg !68 - %113 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !68 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %113, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %65, i64 noundef 16, i1 noundef false) #17, !dbg !68 - %114 = getelementptr inbounds i8, i8* %102, i64 32, !dbg !68 - %115 = bitcast i8* %114 to i8**, !dbg !68 - store i8* %113, i8** %115, align 8, !dbg !68, !tbaa !147 - %116 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_plus, i64 0, i64 0)) #17, !dbg !68 - %117 = bitcast i8* %102 to %struct.rb_sorbet_param_struct*, !dbg !68 - %118 = bitcast %struct.rb_iseq_struct* %stackFrame276.i to i8*, !dbg !68 - call void @rb_add_method_sorbet(i64 %101, i64 %116, i64 (i32, i64*, i64)* noundef @"func_Object#plus", %struct.rb_sorbet_param_struct* nonnull %117, i32 noundef 1, i8* %118) #17, !dbg !68 - %119 = getelementptr inbounds i64, i64* %82, i64 12, !dbg !68 - %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !68 - store i64* %120, i64** %77, align 8, !dbg !68, !tbaa !12 - %rubyId_minus.i4 = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !70 - %rawSym284.i = call i64 @rb_id2sym(i64 %rubyId_minus.i4) #17, !dbg !70 - %rubyId_normal285.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !70 - %rawSym286.i = call i64 @rb_id2sym(i64 %rubyId_normal285.i) #17, !dbg !70 - %stackFrame291.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#minus", align 8, !dbg !70 - %121 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !70 - %122 = bitcast i8* %121 to i16*, !dbg !70 - %123 = load i16, i16* %122, align 8, !dbg !70 - %124 = and i16 %123, -384, !dbg !70 - %125 = or i16 %124, 1, !dbg !70 - store i16 %125, i16* %122, align 8, !dbg !70 - %126 = getelementptr inbounds i8, i8* %121, i64 8, !dbg !70 - %127 = bitcast i8* %126 to i32*, !dbg !70 - store i32 2, i32* %127, align 8, !dbg !70, !tbaa !144 - %128 = getelementptr inbounds i8, i8* %121, i64 12, !dbg !70 - %129 = getelementptr inbounds i8, i8* %121, i64 4, !dbg !70 - %130 = bitcast i8* %129 to i32*, !dbg !70 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %128, i8 0, i64 20, i1 false) #17, !dbg !70 - store i32 2, i32* %130, align 4, !dbg !70, !tbaa !146 - %rubyId_x294.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !70 - store i64 %rubyId_x294.i, i64* %positional_table293.i, align 8, !dbg !70 - %rubyId_y295.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !70 - %131 = getelementptr i64, i64* %positional_table293.i, i32 1, !dbg !70 - store i64 %rubyId_y295.i, i64* %131, align 8, !dbg !70 - %132 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !70 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %132, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %66, i64 noundef 16, i1 noundef false) #17, !dbg !70 - %133 = getelementptr inbounds i8, i8* %121, i64 32, !dbg !70 - %134 = bitcast i8* %133 to i8**, !dbg !70 - store i8* %132, i8** %134, align 8, !dbg !70, !tbaa !147 - %135 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_minus, i64 0, i64 0)) #17, !dbg !70 - %136 = bitcast i8* %121 to %struct.rb_sorbet_param_struct*, !dbg !70 - %137 = bitcast %struct.rb_iseq_struct* %stackFrame291.i to i8*, !dbg !70 - call void @rb_add_method_sorbet(i64 %101, i64 %135, i64 (i32, i64*, i64)* noundef @"func_Object#minus", %struct.rb_sorbet_param_struct* nonnull %136, i32 noundef 1, i8* %137) #17, !dbg !70 - %138 = getelementptr inbounds i64, i64* %82, i64 17, !dbg !70 - %139 = getelementptr inbounds i64, i64* %138, i64 1, !dbg !70 - store i64* %139, i64** %77, align 8, !dbg !70, !tbaa !12 - %rubyId_lt.i5 = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !71 - %rawSym303.i = call i64 @rb_id2sym(i64 %rubyId_lt.i5) #17, !dbg !71 - %rubyId_normal304.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !71 - %rawSym305.i = call i64 @rb_id2sym(i64 %rubyId_normal304.i) #17, !dbg !71 - %stackFrame310.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#lt", align 8, !dbg !71 - %140 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !71 - %141 = bitcast i8* %140 to i16*, !dbg !71 - %142 = load i16, i16* %141, align 8, !dbg !71 - %143 = and i16 %142, -384, !dbg !71 - %144 = or i16 %143, 1, !dbg !71 - store i16 %144, i16* %141, align 8, !dbg !71 - %145 = getelementptr inbounds i8, i8* %140, i64 8, !dbg !71 - %146 = bitcast i8* %145 to i32*, !dbg !71 - store i32 2, i32* %146, align 8, !dbg !71, !tbaa !144 - %147 = getelementptr inbounds i8, i8* %140, i64 12, !dbg !71 - %148 = getelementptr inbounds i8, i8* %140, i64 4, !dbg !71 - %149 = bitcast i8* %148 to i32*, !dbg !71 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %147, i8 0, i64 20, i1 false) #17, !dbg !71 - store i32 2, i32* %149, align 4, !dbg !71, !tbaa !146 - %rubyId_x313.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !71 - store i64 %rubyId_x313.i, i64* %positional_table312.i, align 8, !dbg !71 - %rubyId_y314.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !71 - %150 = getelementptr i64, i64* %positional_table312.i, i32 1, !dbg !71 - store i64 %rubyId_y314.i, i64* %150, align 8, !dbg !71 - %151 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !71 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %151, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %67, i64 noundef 16, i1 noundef false) #17, !dbg !71 - %152 = getelementptr inbounds i8, i8* %140, i64 32, !dbg !71 - %153 = bitcast i8* %152 to i8**, !dbg !71 - store i8* %151, i8** %153, align 8, !dbg !71, !tbaa !147 - %154 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_lt, i64 0, i64 0)) #17, !dbg !71 - %155 = bitcast i8* %140 to %struct.rb_sorbet_param_struct*, !dbg !71 - %156 = bitcast %struct.rb_iseq_struct* %stackFrame310.i to i8*, !dbg !71 - call void @rb_add_method_sorbet(i64 %101, i64 %154, i64 (i32, i64*, i64)* noundef @"func_Object#lt", %struct.rb_sorbet_param_struct* nonnull %155, i32 noundef 1, i8* %156) #17, !dbg !71 - %157 = getelementptr inbounds i64, i64* %82, i64 22, !dbg !71 - %158 = getelementptr inbounds i64, i64* %157, i64 1, !dbg !71 - store i64* %158, i64** %77, align 8, !dbg !71, !tbaa !12 - %rubyId_lte.i6 = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !72 - %rawSym322.i = call i64 @rb_id2sym(i64 %rubyId_lte.i6) #17, !dbg !72 - %rubyId_normal323.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !72 - %rawSym324.i = call i64 @rb_id2sym(i64 %rubyId_normal323.i) #17, !dbg !72 - %stackFrame329.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#lte", align 8, !dbg !72 - %159 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !72 - %160 = bitcast i8* %159 to i16*, !dbg !72 - %161 = load i16, i16* %160, align 8, !dbg !72 - %162 = and i16 %161, -384, !dbg !72 - %163 = or i16 %162, 1, !dbg !72 - store i16 %163, i16* %160, align 8, !dbg !72 - %164 = getelementptr inbounds i8, i8* %159, i64 8, !dbg !72 - %165 = bitcast i8* %164 to i32*, !dbg !72 - store i32 2, i32* %165, align 8, !dbg !72, !tbaa !144 - %166 = getelementptr inbounds i8, i8* %159, i64 12, !dbg !72 - %167 = getelementptr inbounds i8, i8* %159, i64 4, !dbg !72 - %168 = bitcast i8* %167 to i32*, !dbg !72 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %166, i8 0, i64 20, i1 false) #17, !dbg !72 - store i32 2, i32* %168, align 4, !dbg !72, !tbaa !146 - %rubyId_x332.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !72 - store i64 %rubyId_x332.i, i64* %positional_table331.i, align 8, !dbg !72 - %rubyId_y333.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !72 - %169 = getelementptr i64, i64* %positional_table331.i, i32 1, !dbg !72 - store i64 %rubyId_y333.i, i64* %169, align 8, !dbg !72 - %170 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !72 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %170, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %68, i64 noundef 16, i1 noundef false) #17, !dbg !72 - %171 = getelementptr inbounds i8, i8* %159, i64 32, !dbg !72 - %172 = bitcast i8* %171 to i8**, !dbg !72 - store i8* %170, i8** %172, align 8, !dbg !72, !tbaa !147 - %173 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_lte, i64 0, i64 0)) #17, !dbg !72 - %174 = bitcast i8* %159 to %struct.rb_sorbet_param_struct*, !dbg !72 - %175 = bitcast %struct.rb_iseq_struct* %stackFrame329.i to i8*, !dbg !72 - call void @rb_add_method_sorbet(i64 %101, i64 %173, i64 (i32, i64*, i64)* noundef @"func_Object#lte", %struct.rb_sorbet_param_struct* nonnull %174, i32 noundef 1, i8* %175) #17, !dbg !72 - %176 = getelementptr inbounds i64, i64* %82, i64 26, !dbg !72 - %177 = getelementptr inbounds i64, i64* %176, i64 1, !dbg !72 - store i64* %177, i64** %77, align 8, !dbg !72, !tbaa !12 - %178 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !92, !tbaa !12 - %179 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %178, i64 0, i32 2, !dbg !92 - %180 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %179, align 8, !dbg !92, !tbaa !14 - %181 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %180, i64 0, i32 1, !dbg !92 - %182 = load i64*, i64** %181, align 8, !dbg !92, !tbaa !48 - %183 = getelementptr inbounds i64, i64* %182, i64 1, !dbg !92 - store i64 %64, i64* %182, align 8, !dbg !92, !tbaa !4 - %184 = getelementptr inbounds i64, i64* %183, i64 1, !dbg !92 - %185 = getelementptr inbounds i64, i64* %184, i64 1, !dbg !92 - store i64* %185, i64** %181, align 8, !dbg !92, !tbaa !48 - %186 = bitcast i64* %183 to <2 x i64>*, !dbg !92 - store <2 x i64> , <2 x i64>* %186, align 8, !dbg !92, !tbaa !4 - %send348.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus, i64 0) #17, !dbg !92 - %187 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !93, !tbaa !12 - %188 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %187, i64 0, i32 2, !dbg !93 - %189 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %188, align 8, !dbg !93, !tbaa !14 - %190 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %189, i64 0, i32 1, !dbg !93 - %191 = load i64*, i64** %190, align 8, !dbg !93, !tbaa !48 - %192 = getelementptr inbounds i64, i64* %191, i64 1, !dbg !93 - store i64 %64, i64* %191, align 8, !dbg !93, !tbaa !4 - %193 = getelementptr inbounds i64, i64* %192, i64 1, !dbg !93 - store i64* %193, i64** %190, align 8, !dbg !93, !tbaa !48 - store i64 %send348.i, i64* %192, align 8, !dbg !93, !tbaa !4 - %send354.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p, i64 0) #17, !dbg !93 - %194 = getelementptr inbounds i64, i64* %82, i64 27, !dbg !93 - %195 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !93 - store i64* %195, i64** %77, align 8, !dbg !93, !tbaa !12 - %196 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !94, !tbaa !12 - %197 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %196, i64 0, i32 2, !dbg !94 - %198 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %197, align 8, !dbg !94, !tbaa !14 - %199 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %198, i64 0, i32 1, !dbg !94 - %200 = load i64*, i64** %199, align 8, !dbg !94, !tbaa !48 - %201 = getelementptr inbounds i64, i64* %200, i64 1, !dbg !94 - store i64 %64, i64* %200, align 8, !dbg !94, !tbaa !4 - %202 = getelementptr inbounds i64, i64* %201, i64 1, !dbg !94 - %203 = getelementptr inbounds i64, i64* %202, i64 1, !dbg !94 - store i64* %203, i64** %199, align 8, !dbg !94, !tbaa !48 - %204 = bitcast i64* %201 to <2 x i64>*, !dbg !94 - store <2 x i64> , <2 x i64>* %204, align 8, !dbg !94, !tbaa !4 - %send363.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus, i64 0) #17, !dbg !94 - %205 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !95, !tbaa !12 - %206 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %205, i64 0, i32 2, !dbg !95 - %207 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %206, align 8, !dbg !95, !tbaa !14 - %208 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %207, i64 0, i32 1, !dbg !95 - %209 = load i64*, i64** %208, align 8, !dbg !95, !tbaa !48 - %210 = getelementptr inbounds i64, i64* %209, i64 1, !dbg !95 - store i64 %64, i64* %209, align 8, !dbg !95, !tbaa !4 - %211 = getelementptr inbounds i64, i64* %210, i64 1, !dbg !95 - store i64* %211, i64** %208, align 8, !dbg !95, !tbaa !48 - store i64 %send363.i, i64* %210, align 8, !dbg !95, !tbaa !4 - %send370.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.18, i64 0) #17, !dbg !95 - %212 = getelementptr inbounds i64, i64* %82, i64 28, !dbg !95 - %213 = getelementptr inbounds i64, i64* %212, i64 1, !dbg !95 - store i64* %213, i64** %77, align 8, !dbg !95, !tbaa !12 - %214 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !96, !tbaa !12 - %215 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %214, i64 0, i32 2, !dbg !96 - %216 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %215, align 8, !dbg !96, !tbaa !14 - %217 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %216, i64 0, i32 1, !dbg !96 - %218 = load i64*, i64** %217, align 8, !dbg !96, !tbaa !48 - %219 = getelementptr inbounds i64, i64* %218, i64 1, !dbg !96 - store i64 %64, i64* %218, align 8, !dbg !96, !tbaa !4 - %220 = getelementptr inbounds i64, i64* %219, i64 1, !dbg !96 - %221 = getelementptr inbounds i64, i64* %220, i64 1, !dbg !96 - store i64* %221, i64** %217, align 8, !dbg !96, !tbaa !48 - %222 = bitcast i64* %219 to <2 x i64>*, !dbg !96 - store <2 x i64> , <2 x i64>* %222, align 8, !dbg !96, !tbaa !4 - %send379.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt, i64 0) #17, !dbg !96 - %223 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !97, !tbaa !12 - %224 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %223, i64 0, i32 2, !dbg !97 - %225 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %224, align 8, !dbg !97, !tbaa !14 - %226 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %225, i64 0, i32 1, !dbg !97 - %227 = load i64*, i64** %226, align 8, !dbg !97, !tbaa !48 - %228 = getelementptr inbounds i64, i64* %227, i64 1, !dbg !97 - store i64 %64, i64* %227, align 8, !dbg !97, !tbaa !4 - %229 = getelementptr inbounds i64, i64* %228, i64 1, !dbg !97 - store i64* %229, i64** %226, align 8, !dbg !97, !tbaa !48 - store i64 %send379.i, i64* %228, align 8, !dbg !97, !tbaa !4 - %send386.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.19, i64 0) #17, !dbg !97 - %230 = getelementptr inbounds i64, i64* %82, i64 29, !dbg !97 - %231 = getelementptr inbounds i64, i64* %230, i64 1, !dbg !97 - store i64* %231, i64** %77, align 8, !dbg !97, !tbaa !12 - %232 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !98, !tbaa !12 - %233 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %232, i64 0, i32 2, !dbg !98 - %234 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %233, align 8, !dbg !98, !tbaa !14 - %235 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %234, i64 0, i32 1, !dbg !98 - %236 = load i64*, i64** %235, align 8, !dbg !98, !tbaa !48 - %237 = getelementptr inbounds i64, i64* %236, i64 1, !dbg !98 - store i64 %64, i64* %236, align 8, !dbg !98, !tbaa !4 - %238 = getelementptr inbounds i64, i64* %237, i64 1, !dbg !98 - %239 = getelementptr inbounds i64, i64* %238, i64 1, !dbg !98 - store i64* %239, i64** %235, align 8, !dbg !98, !tbaa !48 - %240 = bitcast i64* %237 to <2 x i64>*, !dbg !98 - store <2 x i64> , <2 x i64>* %240, align 8, !dbg !98, !tbaa !4 - %send396.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt.20, i64 0) #17, !dbg !98 - %241 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !99, !tbaa !12 - %242 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %241, i64 0, i32 2, !dbg !99 - %243 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %242, align 8, !dbg !99, !tbaa !14 - %244 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %243, i64 0, i32 1, !dbg !99 - %245 = load i64*, i64** %244, align 8, !dbg !99, !tbaa !48 - %246 = getelementptr inbounds i64, i64* %245, i64 1, !dbg !99 - store i64 %64, i64* %245, align 8, !dbg !99, !tbaa !4 - %247 = getelementptr inbounds i64, i64* %246, i64 1, !dbg !99 - store i64* %247, i64** %244, align 8, !dbg !99, !tbaa !48 - store i64 %send396.i, i64* %246, align 8, !dbg !99, !tbaa !4 - %send403.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.21, i64 0) #17, !dbg !99 - %248 = getelementptr inbounds i64, i64* %82, i64 30, !dbg !99 - %249 = getelementptr inbounds i64, i64* %248, i64 1, !dbg !99 - store i64* %249, i64** %77, align 8, !dbg !99, !tbaa !12 - %250 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !100, !tbaa !12 - %251 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %250, i64 0, i32 2, !dbg !100 - %252 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %251, align 8, !dbg !100, !tbaa !14 - %253 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %252, i64 0, i32 1, !dbg !100 - %254 = load i64*, i64** %253, align 8, !dbg !100, !tbaa !48 - %255 = getelementptr inbounds i64, i64* %254, i64 1, !dbg !100 - store i64 %64, i64* %254, align 8, !dbg !100, !tbaa !4 - %256 = getelementptr inbounds i64, i64* %255, i64 1, !dbg !100 - %257 = getelementptr inbounds i64, i64* %256, i64 1, !dbg !100 - store i64* %257, i64** %253, align 8, !dbg !100, !tbaa !48 - %258 = bitcast i64* %255 to <2 x i64>*, !dbg !100 - store <2 x i64> , <2 x i64>* %258, align 8, !dbg !100, !tbaa !4 - %send412.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte, i64 0) #17, !dbg !100 - %259 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !101, !tbaa !12 - %260 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %259, i64 0, i32 2, !dbg !101 - %261 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %260, align 8, !dbg !101, !tbaa !14 - %262 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %261, i64 0, i32 1, !dbg !101 - %263 = load i64*, i64** %262, align 8, !dbg !101, !tbaa !48 - %264 = getelementptr inbounds i64, i64* %263, i64 1, !dbg !101 - store i64 %64, i64* %263, align 8, !dbg !101, !tbaa !4 - %265 = getelementptr inbounds i64, i64* %264, i64 1, !dbg !101 - store i64* %265, i64** %262, align 8, !dbg !101, !tbaa !48 - store i64 %send412.i, i64* %264, align 8, !dbg !101, !tbaa !4 - %send419.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.22, i64 0) #17, !dbg !101 - %266 = getelementptr inbounds i64, i64* %82, i64 31, !dbg !101 - %267 = getelementptr inbounds i64, i64* %266, i64 1, !dbg !101 - store i64* %267, i64** %77, align 8, !dbg !101, !tbaa !12 - %268 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !102, !tbaa !12 - %269 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %268, i64 0, i32 2, !dbg !102 - %270 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %269, align 8, !dbg !102, !tbaa !14 - %271 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %270, i64 0, i32 1, !dbg !102 - %272 = load i64*, i64** %271, align 8, !dbg !102, !tbaa !48 - %273 = getelementptr inbounds i64, i64* %272, i64 1, !dbg !102 - store i64 %64, i64* %272, align 8, !dbg !102, !tbaa !4 - %274 = getelementptr inbounds i64, i64* %273, i64 1, !dbg !102 - %275 = getelementptr inbounds i64, i64* %274, i64 1, !dbg !102 - store i64* %275, i64** %271, align 8, !dbg !102, !tbaa !48 - %276 = bitcast i64* %273 to <2 x i64>*, !dbg !102 - store <2 x i64> , <2 x i64>* %276, align 8, !dbg !102, !tbaa !4 - %send429.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.23, i64 0) #17, !dbg !102 - %277 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !103, !tbaa !12 - %278 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %277, i64 0, i32 2, !dbg !103 - %279 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %278, align 8, !dbg !103, !tbaa !14 - %280 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %279, i64 0, i32 1, !dbg !103 - %281 = load i64*, i64** %280, align 8, !dbg !103, !tbaa !48 - %282 = getelementptr inbounds i64, i64* %281, i64 1, !dbg !103 - store i64 %64, i64* %281, align 8, !dbg !103, !tbaa !4 - %283 = getelementptr inbounds i64, i64* %282, i64 1, !dbg !103 - store i64* %283, i64** %280, align 8, !dbg !103, !tbaa !48 - store i64 %send429.i, i64* %282, align 8, !dbg !103, !tbaa !4 - %send436.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.24, i64 0) #17, !dbg !103 - %284 = getelementptr inbounds i64, i64* %82, i64 32, !dbg !103 - %285 = getelementptr inbounds i64, i64* %284, i64 1, !dbg !103 - store i64* %285, i64** %77, align 8, !dbg !103, !tbaa !12 - %286 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !104, !tbaa !12 - %287 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %286, i64 0, i32 2, !dbg !104 - %288 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %287, align 8, !dbg !104, !tbaa !14 - %289 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %288, i64 0, i32 1, !dbg !104 - %290 = load i64*, i64** %289, align 8, !dbg !104, !tbaa !48 - %291 = getelementptr inbounds i64, i64* %290, i64 1, !dbg !104 - store i64 %64, i64* %290, align 8, !dbg !104, !tbaa !4 - %292 = getelementptr inbounds i64, i64* %291, i64 1, !dbg !104 - %293 = getelementptr inbounds i64, i64* %292, i64 1, !dbg !104 - store i64* %293, i64** %289, align 8, !dbg !104, !tbaa !48 - %294 = bitcast i64* %291 to <2 x i64>*, !dbg !104 - store <2 x i64> , <2 x i64>* %294, align 8, !dbg !104, !tbaa !4 - %send446.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.25, i64 0) #17, !dbg !104 - %295 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !105, !tbaa !12 - %296 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %295, i64 0, i32 2, !dbg !105 - %297 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %296, align 8, !dbg !105, !tbaa !14 - %298 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %297, i64 0, i32 1, !dbg !105 - %299 = load i64*, i64** %298, align 8, !dbg !105, !tbaa !48 - %300 = getelementptr inbounds i64, i64* %299, i64 1, !dbg !105 - store i64 %64, i64* %299, align 8, !dbg !105, !tbaa !4 - %301 = getelementptr inbounds i64, i64* %300, i64 1, !dbg !105 - store i64* %301, i64** %298, align 8, !dbg !105, !tbaa !48 - store i64 %send446.i, i64* %300, align 8, !dbg !105, !tbaa !4 - %send453.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.26, i64 0) #17, !dbg !105 - %302 = getelementptr inbounds i64, i64* %82, i64 35, !dbg !105 - %303 = getelementptr inbounds i64, i64* %302, i64 1, !dbg !105 - store i64* %303, i64** %77, align 8, !dbg !105, !tbaa !12 - %304 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !106, !tbaa !12 - %305 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %304, i64 0, i32 2, !dbg !106 - %306 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %305, align 8, !dbg !106, !tbaa !14 - %307 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %306, i64 0, i32 1, !dbg !106 - %308 = load i64*, i64** %307, align 8, !dbg !106, !tbaa !48 - %309 = getelementptr inbounds i64, i64* %308, i64 1, !dbg !106 - store i64 %64, i64* %308, align 8, !dbg !106, !tbaa !4 - %310 = getelementptr inbounds i64, i64* %309, i64 1, !dbg !106 - %311 = getelementptr inbounds i64, i64* %310, i64 1, !dbg !106 - store i64* %311, i64** %307, align 8, !dbg !106, !tbaa !48 - %312 = bitcast i64* %309 to <2 x i64>*, !dbg !106 - store <2 x i64> , <2 x i64>* %312, align 8, !dbg !106, !tbaa !4 - %send462.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus.27, i64 0) #17, !dbg !106 - %313 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !107, !tbaa !12 - %314 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %313, i64 0, i32 2, !dbg !107 - %315 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %314, align 8, !dbg !107, !tbaa !14 - %316 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %315, i64 0, i32 1, !dbg !107 - %317 = load i64*, i64** %316, align 8, !dbg !107, !tbaa !48 - %318 = getelementptr inbounds i64, i64* %317, i64 1, !dbg !107 - store i64 %64, i64* %317, align 8, !dbg !107, !tbaa !4 - %319 = getelementptr inbounds i64, i64* %318, i64 1, !dbg !107 - store i64* %319, i64** %316, align 8, !dbg !107, !tbaa !48 - store i64 %send462.i, i64* %318, align 8, !dbg !107, !tbaa !4 - %send469.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.28, i64 0) #17, !dbg !107 - %320 = getelementptr inbounds i64, i64* %82, i64 36, !dbg !107 - %321 = getelementptr inbounds i64, i64* %320, i64 1, !dbg !107 - store i64* %321, i64** %77, align 8, !dbg !107, !tbaa !12 - %rubyStr_8.9.i = load i64, i64* @rubyStrFrozen_8.9, align 8, !dbg !108 - %322 = load i64, i64* @rb_mKernel, align 8, !dbg !108 - %323 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !108, !tbaa !12 - %324 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %323, i64 0, i32 2, !dbg !108 - %325 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %324, align 8, !dbg !108, !tbaa !14 - %326 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %325, i64 0, i32 1, !dbg !108 - %327 = load i64*, i64** %326, align 8, !dbg !108, !tbaa !48 - %328 = getelementptr inbounds i64, i64* %327, i64 1, !dbg !108 - store i64 %322, i64* %327, align 8, !dbg !108, !tbaa !4 - %329 = getelementptr inbounds i64, i64* %328, i64 1, !dbg !108 - store i64* %329, i64** %326, align 8, !dbg !108, !tbaa !48 - store i64 %rubyStr_8.9.i, i64* %328, align 8, !dbg !108, !tbaa !4 - %send475.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational, i64 0) #17, !dbg !108 - %330 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !109, !tbaa !12 - %331 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %330, i64 0, i32 2, !dbg !109 - %332 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %331, align 8, !dbg !109, !tbaa !14 - %333 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %332, i64 0, i32 1, !dbg !109 - %334 = load i64*, i64** %333, align 8, !dbg !109, !tbaa !48 - %335 = getelementptr inbounds i64, i64* %334, i64 1, !dbg !109 - store i64 %64, i64* %334, align 8, !dbg !109, !tbaa !4 - %336 = getelementptr inbounds i64, i64* %335, i64 1, !dbg !109 - store i64 36028797018963970, i64* %335, align 8, !dbg !109, !tbaa !4 - %337 = getelementptr inbounds i64, i64* %336, i64 1, !dbg !109 - store i64* %337, i64** %333, align 8, !dbg !109, !tbaa !48 - store i64 %send475.i, i64* %336, align 8, !dbg !109, !tbaa !4 - %send483.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus.29, i64 0) #17, !dbg !109 - %338 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !110, !tbaa !12 - %339 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %338, i64 0, i32 2, !dbg !110 - %340 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %339, align 8, !dbg !110, !tbaa !14 - %341 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %340, i64 0, i32 1, !dbg !110 - %342 = load i64*, i64** %341, align 8, !dbg !110, !tbaa !48 - %343 = getelementptr inbounds i64, i64* %342, i64 1, !dbg !110 - store i64 %64, i64* %342, align 8, !dbg !110, !tbaa !4 - %344 = getelementptr inbounds i64, i64* %343, i64 1, !dbg !110 - store i64* %344, i64** %341, align 8, !dbg !110, !tbaa !48 - store i64 %send483.i, i64* %343, align 8, !dbg !110, !tbaa !4 - %send490.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.30, i64 0) #17, !dbg !110 - %345 = getelementptr inbounds i64, i64* %82, i64 37, !dbg !110 - %346 = getelementptr inbounds i64, i64* %345, i64 1, !dbg !110 - store i64* %346, i64** %77, align 8, !dbg !110, !tbaa !12 - %rubyStr_5.i = load i64, i64* @rubyStrFrozen_5, align 8, !dbg !111 - %347 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !111, !tbaa !12 - %348 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %347, i64 0, i32 2, !dbg !111 - %349 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %348, align 8, !dbg !111, !tbaa !14 - %350 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %349, i64 0, i32 1, !dbg !111 - %351 = load i64*, i64** %350, align 8, !dbg !111, !tbaa !48 - %352 = getelementptr inbounds i64, i64* %351, i64 1, !dbg !111 - store i64 %322, i64* %351, align 8, !dbg !111, !tbaa !4 - %353 = getelementptr inbounds i64, i64* %352, i64 1, !dbg !111 - store i64 1, i64* %352, align 8, !dbg !111, !tbaa !4 - %354 = getelementptr inbounds i64, i64* %353, i64 1, !dbg !111 - store i64* %354, i64** %350, align 8, !dbg !111, !tbaa !48 - store i64 %rubyStr_5.i, i64* %353, align 8, !dbg !111, !tbaa !4 - %send498.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Complex, i64 0) #17, !dbg !111 - %355 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !112, !tbaa !12 - %356 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %355, i64 0, i32 2, !dbg !112 - %357 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %356, align 8, !dbg !112, !tbaa !14 - %358 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %357, i64 0, i32 1, !dbg !112 - %359 = load i64*, i64** %358, align 8, !dbg !112, !tbaa !48 - %360 = getelementptr inbounds i64, i64* %359, i64 1, !dbg !112 - store i64 %64, i64* %359, align 8, !dbg !112, !tbaa !4 - %361 = getelementptr inbounds i64, i64* %360, i64 1, !dbg !112 - store i64 36028797018963970, i64* %360, align 8, !dbg !112, !tbaa !4 - %362 = getelementptr inbounds i64, i64* %361, i64 1, !dbg !112 - store i64* %362, i64** %358, align 8, !dbg !112, !tbaa !48 - store i64 %send498.i, i64* %361, align 8, !dbg !112, !tbaa !4 - %send506.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus.31, i64 0) #17, !dbg !112 - %363 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !113, !tbaa !12 - %364 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %363, i64 0, i32 2, !dbg !113 - %365 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %364, align 8, !dbg !113, !tbaa !14 - %366 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %365, i64 0, i32 1, !dbg !113 - %367 = load i64*, i64** %366, align 8, !dbg !113, !tbaa !48 - %368 = getelementptr inbounds i64, i64* %367, i64 1, !dbg !113 - store i64 %64, i64* %367, align 8, !dbg !113, !tbaa !4 - %369 = getelementptr inbounds i64, i64* %368, i64 1, !dbg !113 - store i64* %369, i64** %366, align 8, !dbg !113, !tbaa !48 - store i64 %send506.i, i64* %368, align 8, !dbg !113, !tbaa !4 - %send513.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.32, i64 0) #17, !dbg !113 - %370 = getelementptr inbounds i64, i64* %82, i64 39, !dbg !113 - %371 = getelementptr inbounds i64, i64* %370, i64 1, !dbg !113 - store i64* %371, i64** %77, align 8, !dbg !113, !tbaa !12 - %372 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !114, !tbaa !12 - %373 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %372, i64 0, i32 2, !dbg !114 - %374 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %373, align 8, !dbg !114, !tbaa !14 - %375 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %374, i64 0, i32 1, !dbg !114 - %376 = load i64*, i64** %375, align 8, !dbg !114, !tbaa !48 - %377 = getelementptr inbounds i64, i64* %376, i64 1, !dbg !114 - store i64 %64, i64* %376, align 8, !dbg !114, !tbaa !4 - %378 = getelementptr inbounds i64, i64* %377, i64 1, !dbg !114 - %379 = getelementptr inbounds i64, i64* %378, i64 1, !dbg !114 - store i64* %379, i64** %375, align 8, !dbg !114, !tbaa !48 - %380 = bitcast i64* %377 to <2 x i64>*, !dbg !114 - store <2 x i64> , <2 x i64>* %380, align 8, !dbg !114, !tbaa !4 - %send523.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus.33, i64 0) #17, !dbg !114 - %381 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !115, !tbaa !12 - %382 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %381, i64 0, i32 2, !dbg !115 - %383 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %382, align 8, !dbg !115, !tbaa !14 - %384 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %383, i64 0, i32 1, !dbg !115 - %385 = load i64*, i64** %384, align 8, !dbg !115, !tbaa !48 - %386 = getelementptr inbounds i64, i64* %385, i64 1, !dbg !115 - store i64 %64, i64* %385, align 8, !dbg !115, !tbaa !4 - %387 = getelementptr inbounds i64, i64* %386, i64 1, !dbg !115 - store i64* %387, i64** %384, align 8, !dbg !115, !tbaa !48 - store i64 %send523.i, i64* %386, align 8, !dbg !115, !tbaa !4 - %send530.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.34, i64 0) #17, !dbg !115 - %388 = getelementptr inbounds i64, i64* %82, i64 40, !dbg !115 - %389 = getelementptr inbounds i64, i64* %388, i64 1, !dbg !115 - store i64* %389, i64** %77, align 8, !dbg !115, !tbaa !12 - %rubyStr_15.4.i = load i64, i64* @rubyStrFrozen_15.4, align 8, !dbg !116 - %390 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !116, !tbaa !12 - %391 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %390, i64 0, i32 2, !dbg !116 - %392 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %391, align 8, !dbg !116, !tbaa !14 - %393 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %392, i64 0, i32 1, !dbg !116 - %394 = load i64*, i64** %393, align 8, !dbg !116, !tbaa !48 - %395 = getelementptr inbounds i64, i64* %394, i64 1, !dbg !116 - store i64 %322, i64* %394, align 8, !dbg !116, !tbaa !4 - %396 = getelementptr inbounds i64, i64* %395, i64 1, !dbg !116 - store i64* %396, i64** %393, align 8, !dbg !116, !tbaa !48 - store i64 %rubyStr_15.4.i, i64* %395, align 8, !dbg !116, !tbaa !4 - %send537.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational.35, i64 0) #17, !dbg !116 - %397 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !117, !tbaa !12 - %398 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %397, i64 0, i32 2, !dbg !117 - %399 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %398, align 8, !dbg !117, !tbaa !14 - %400 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %399, i64 0, i32 1, !dbg !117 - %401 = load i64*, i64** %400, align 8, !dbg !117, !tbaa !48 - %402 = getelementptr inbounds i64, i64* %401, i64 1, !dbg !117 - store i64 %64, i64* %401, align 8, !dbg !117, !tbaa !4 - %403 = getelementptr inbounds i64, i64* %402, i64 1, !dbg !117 - store i64 199622053483197234, i64* %402, align 8, !dbg !117, !tbaa !4 - %404 = getelementptr inbounds i64, i64* %403, i64 1, !dbg !117 - store i64* %404, i64** %400, align 8, !dbg !117, !tbaa !48 - store i64 %send537.i, i64* %403, align 8, !dbg !117, !tbaa !4 - %send545.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus.36, i64 0) #17, !dbg !117 - %405 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !118, !tbaa !12 - %406 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %405, i64 0, i32 2, !dbg !118 - %407 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %406, align 8, !dbg !118, !tbaa !14 - %408 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %407, i64 0, i32 1, !dbg !118 - %409 = load i64*, i64** %408, align 8, !dbg !118, !tbaa !48 - %410 = getelementptr inbounds i64, i64* %409, i64 1, !dbg !118 - store i64 %64, i64* %409, align 8, !dbg !118, !tbaa !4 - %411 = getelementptr inbounds i64, i64* %410, i64 1, !dbg !118 - store i64* %411, i64** %408, align 8, !dbg !118, !tbaa !48 - store i64 %send545.i, i64* %410, align 8, !dbg !118, !tbaa !4 - %send552.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.37, i64 0) #17, !dbg !118 - %412 = getelementptr inbounds i64, i64* %82, i64 41, !dbg !118 - %413 = getelementptr inbounds i64, i64* %412, i64 1, !dbg !118 - store i64* %413, i64** %77, align 8, !dbg !118, !tbaa !12 - %rubyStr_18.i = load i64, i64* @rubyStrFrozen_18, align 8, !dbg !119 - %414 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !119, !tbaa !12 - %415 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %414, i64 0, i32 2, !dbg !119 - %416 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %415, align 8, !dbg !119, !tbaa !14 - %417 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %416, i64 0, i32 1, !dbg !119 - %418 = load i64*, i64** %417, align 8, !dbg !119, !tbaa !48 - %419 = getelementptr inbounds i64, i64* %418, i64 1, !dbg !119 - store i64 %322, i64* %418, align 8, !dbg !119, !tbaa !4 - %420 = getelementptr inbounds i64, i64* %419, i64 1, !dbg !119 - store i64 1, i64* %419, align 8, !dbg !119, !tbaa !4 - %421 = getelementptr inbounds i64, i64* %420, i64 1, !dbg !119 - store i64* %421, i64** %417, align 8, !dbg !119, !tbaa !48 - store i64 %rubyStr_18.i, i64* %420, align 8, !dbg !119, !tbaa !4 - %send561.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Complex.38, i64 0) #17, !dbg !119 - %422 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !120, !tbaa !12 - %423 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %422, i64 0, i32 2, !dbg !120 - %424 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %423, align 8, !dbg !120, !tbaa !14 - %425 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %424, i64 0, i32 1, !dbg !120 - %426 = load i64*, i64** %425, align 8, !dbg !120, !tbaa !48 - %427 = getelementptr inbounds i64, i64* %426, i64 1, !dbg !120 - store i64 %64, i64* %426, align 8, !dbg !120, !tbaa !4 - %428 = getelementptr inbounds i64, i64* %427, i64 1, !dbg !120 - store i64 199565758487855106, i64* %427, align 8, !dbg !120, !tbaa !4 - %429 = getelementptr inbounds i64, i64* %428, i64 1, !dbg !120 - store i64* %429, i64** %425, align 8, !dbg !120, !tbaa !48 - store i64 %send561.i, i64* %428, align 8, !dbg !120, !tbaa !4 - %send569.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus.39, i64 0) #17, !dbg !120 - %430 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !121, !tbaa !12 - %431 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %430, i64 0, i32 2, !dbg !121 - %432 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %431, align 8, !dbg !121, !tbaa !14 - %433 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %432, i64 0, i32 1, !dbg !121 - %434 = load i64*, i64** %433, align 8, !dbg !121, !tbaa !48 - %435 = getelementptr inbounds i64, i64* %434, i64 1, !dbg !121 - store i64 %64, i64* %434, align 8, !dbg !121, !tbaa !4 - %436 = getelementptr inbounds i64, i64* %435, i64 1, !dbg !121 - store i64* %436, i64** %433, align 8, !dbg !121, !tbaa !48 - store i64 %send569.i, i64* %435, align 8, !dbg !121, !tbaa !4 - %send576.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.40, i64 0) #17, !dbg !121 - %437 = getelementptr inbounds i64, i64* %82, i64 43, !dbg !121 - %438 = getelementptr inbounds i64, i64* %437, i64 1, !dbg !121 - store i64* %438, i64** %77, align 8, !dbg !121, !tbaa !12 - %439 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !122, !tbaa !12 - %440 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %439, i64 0, i32 2, !dbg !122 - %441 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %440, align 8, !dbg !122, !tbaa !14 - %442 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %441, i64 0, i32 1, !dbg !122 - %443 = load i64*, i64** %442, align 8, !dbg !122, !tbaa !48 - %444 = getelementptr inbounds i64, i64* %443, i64 1, !dbg !122 - store i64 %64, i64* %443, align 8, !dbg !122, !tbaa !4 - %445 = getelementptr inbounds i64, i64* %444, i64 1, !dbg !122 - %446 = getelementptr inbounds i64, i64* %445, i64 1, !dbg !122 - store i64* %446, i64** %442, align 8, !dbg !122, !tbaa !48 - %447 = bitcast i64* %444 to <2 x i64>*, !dbg !122 - store <2 x i64> , <2 x i64>* %447, align 8, !dbg !122, !tbaa !4 - %send586.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt.41, i64 0) #17, !dbg !122 - %448 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !123, !tbaa !12 - %449 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %448, i64 0, i32 2, !dbg !123 - %450 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %449, align 8, !dbg !123, !tbaa !14 - %451 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %450, i64 0, i32 1, !dbg !123 - %452 = load i64*, i64** %451, align 8, !dbg !123, !tbaa !48 - %453 = getelementptr inbounds i64, i64* %452, i64 1, !dbg !123 - store i64 %64, i64* %452, align 8, !dbg !123, !tbaa !4 - %454 = getelementptr inbounds i64, i64* %453, i64 1, !dbg !123 - store i64* %454, i64** %451, align 8, !dbg !123, !tbaa !48 - store i64 %send586.i, i64* %453, align 8, !dbg !123, !tbaa !4 - %send593.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.42, i64 0) #17, !dbg !123 - %455 = getelementptr inbounds i64, i64* %82, i64 44, !dbg !123 - %456 = getelementptr inbounds i64, i64* %455, i64 1, !dbg !123 - store i64* %456, i64** %77, align 8, !dbg !123, !tbaa !12 - %rubyStr_25.4.i = load i64, i64* @rubyStrFrozen_25.4, align 8, !dbg !124 - %457 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !124, !tbaa !12 - %458 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %457, i64 0, i32 2, !dbg !124 - %459 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %458, align 8, !dbg !124, !tbaa !14 - %460 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %459, i64 0, i32 1, !dbg !124 - %461 = load i64*, i64** %460, align 8, !dbg !124, !tbaa !48 - %462 = getelementptr inbounds i64, i64* %461, i64 1, !dbg !124 - store i64 %322, i64* %461, align 8, !dbg !124, !tbaa !4 - %463 = getelementptr inbounds i64, i64* %462, i64 1, !dbg !124 - store i64* %463, i64** %460, align 8, !dbg !124, !tbaa !48 - store i64 %rubyStr_25.4.i, i64* %462, align 8, !dbg !124, !tbaa !4 - %send600.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational.43, i64 0) #17, !dbg !124 - %464 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !125, !tbaa !12 - %465 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %464, i64 0, i32 2, !dbg !125 - %466 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %465, align 8, !dbg !125, !tbaa !14 - %467 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %466, i64 0, i32 1, !dbg !125 - %468 = load i64*, i64** %467, align 8, !dbg !125, !tbaa !48 - %469 = getelementptr inbounds i64, i64* %468, i64 1, !dbg !125 - store i64 %64, i64* %468, align 8, !dbg !125, !tbaa !4 - %470 = getelementptr inbounds i64, i64* %469, i64 1, !dbg !125 - store i64 113040350646999450, i64* %469, align 8, !dbg !125, !tbaa !4 - %471 = getelementptr inbounds i64, i64* %470, i64 1, !dbg !125 - store i64* %471, i64** %467, align 8, !dbg !125, !tbaa !48 - store i64 %send600.i, i64* %470, align 8, !dbg !125, !tbaa !4 - %send608.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt.44, i64 0) #17, !dbg !125 - %472 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !126, !tbaa !12 - %473 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %472, i64 0, i32 2, !dbg !126 - %474 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %473, align 8, !dbg !126, !tbaa !14 - %475 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %474, i64 0, i32 1, !dbg !126 - %476 = load i64*, i64** %475, align 8, !dbg !126, !tbaa !48 - %477 = getelementptr inbounds i64, i64* %476, i64 1, !dbg !126 - store i64 %64, i64* %476, align 8, !dbg !126, !tbaa !4 - %478 = getelementptr inbounds i64, i64* %477, i64 1, !dbg !126 - store i64* %478, i64** %475, align 8, !dbg !126, !tbaa !48 - store i64 %send608.i, i64* %477, align 8, !dbg !126, !tbaa !4 - %send615.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.45, i64 0) #17, !dbg !126 - %479 = getelementptr inbounds i64, i64* %82, i64 46, !dbg !126 - %480 = getelementptr inbounds i64, i64* %479, i64 1, !dbg !126 - store i64* %480, i64** %77, align 8, !dbg !126, !tbaa !12 - %481 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !127, !tbaa !12 - %482 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %481, i64 0, i32 2, !dbg !127 - %483 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %482, align 8, !dbg !127, !tbaa !14 - %484 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %483, i64 0, i32 1, !dbg !127 - %485 = load i64*, i64** %484, align 8, !dbg !127, !tbaa !48 - %486 = getelementptr inbounds i64, i64* %485, i64 1, !dbg !127 - store i64 %64, i64* %485, align 8, !dbg !127, !tbaa !4 - %487 = getelementptr inbounds i64, i64* %486, i64 1, !dbg !127 - %488 = getelementptr inbounds i64, i64* %487, i64 1, !dbg !127 - store i64* %488, i64** %484, align 8, !dbg !127, !tbaa !48 - %489 = bitcast i64* %486 to <2 x i64>*, !dbg !127 - store <2 x i64> , <2 x i64>* %489, align 8, !dbg !127, !tbaa !4 - %send625.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.46, i64 0) #17, !dbg !127 - %490 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !128, !tbaa !12 - %491 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %490, i64 0, i32 2, !dbg !128 - %492 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %491, align 8, !dbg !128, !tbaa !14 - %493 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %492, i64 0, i32 1, !dbg !128 - %494 = load i64*, i64** %493, align 8, !dbg !128, !tbaa !48 - %495 = getelementptr inbounds i64, i64* %494, i64 1, !dbg !128 - store i64 %64, i64* %494, align 8, !dbg !128, !tbaa !4 - %496 = getelementptr inbounds i64, i64* %495, i64 1, !dbg !128 - store i64* %496, i64** %493, align 8, !dbg !128, !tbaa !48 - store i64 %send625.i, i64* %495, align 8, !dbg !128, !tbaa !4 - %send632.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.47, i64 0) #17, !dbg !128 - %497 = getelementptr inbounds i64, i64* %82, i64 47, !dbg !128 - %498 = getelementptr inbounds i64, i64* %497, i64 1, !dbg !128 - store i64* %498, i64** %77, align 8, !dbg !128, !tbaa !12 - %rubyStr_5.923.i = load i64, i64* @rubyStrFrozen_5.923, align 8, !dbg !129 - %499 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !129, !tbaa !12 - %500 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %499, i64 0, i32 2, !dbg !129 - %501 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %500, align 8, !dbg !129, !tbaa !14 - %502 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %501, i64 0, i32 1, !dbg !129 - %503 = load i64*, i64** %502, align 8, !dbg !129, !tbaa !48 - %504 = getelementptr inbounds i64, i64* %503, i64 1, !dbg !129 - store i64 %322, i64* %503, align 8, !dbg !129, !tbaa !4 - %505 = getelementptr inbounds i64, i64* %504, i64 1, !dbg !129 - store i64* %505, i64** %502, align 8, !dbg !129, !tbaa !48 - store i64 %rubyStr_5.923.i, i64* %504, align 8, !dbg !129, !tbaa !4 - %send639.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational.48, i64 0) #17, !dbg !129 - %506 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !130, !tbaa !12 - %507 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %506, i64 0, i32 2, !dbg !130 - %508 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %507, align 8, !dbg !130, !tbaa !14 - %509 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %508, i64 0, i32 1, !dbg !130 - %510 = load i64*, i64** %509, align 8, !dbg !130, !tbaa !48 - %511 = getelementptr inbounds i64, i64* %510, i64 1, !dbg !130 - store i64 %64, i64* %510, align 8, !dbg !130, !tbaa !4 - %512 = getelementptr inbounds i64, i64* %511, i64 1, !dbg !130 - store i64 113040350646999450, i64* %511, align 8, !dbg !130, !tbaa !4 - %513 = getelementptr inbounds i64, i64* %512, i64 1, !dbg !130 - store i64* %513, i64** %509, align 8, !dbg !130, !tbaa !48 - store i64 %send639.i, i64* %512, align 8, !dbg !130, !tbaa !4 - %send647.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.49, i64 0) #17, !dbg !130 - %514 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !131, !tbaa !12 - %515 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %514, i64 0, i32 2, !dbg !131 - %516 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %515, align 8, !dbg !131, !tbaa !14 - %517 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %516, i64 0, i32 1, !dbg !131 - %518 = load i64*, i64** %517, align 8, !dbg !131, !tbaa !48 - %519 = getelementptr inbounds i64, i64* %518, i64 1, !dbg !131 - store i64 %64, i64* %518, align 8, !dbg !131, !tbaa !4 - %520 = getelementptr inbounds i64, i64* %519, i64 1, !dbg !131 - store i64* %520, i64** %517, align 8, !dbg !131, !tbaa !48 - store i64 %send647.i, i64* %519, align 8, !dbg !131, !tbaa !4 - %send654.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.50, i64 0) #17, !dbg !131 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %77, align 8, !dbg !77, !tbaa !12 + %78 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !79 + %79 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !79, !tbaa !131 + %needTakeSlowPath = icmp ne i64 %78, %79, !dbg !79 + br i1 %needTakeSlowPath, label %80, label %81, !dbg !79, !prof !132 + +80: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !79 + br label %81, !dbg !79 + +81: ; preds = %entry, %80 + %82 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !79 + %83 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !79 + %84 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !79, !tbaa !131 + %guardUpdated = icmp eq i64 %83, %84, !dbg !79 + call void @llvm.assume(i1 %guardUpdated), !dbg !79 + %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !12 + %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2, !dbg !79 + %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !dbg !79, !tbaa !14 + %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 1, !dbg !79 + %89 = load i64*, i64** %88, align 8, !dbg !79, !tbaa !35 + %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !79 + store i64 %64, i64* %89, align 8, !dbg !79, !tbaa !4 + %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !79 + store i64* %91, i64** %88, align 8, !dbg !79, !tbaa !35 + store i64 %82, i64* %90, align 8, !dbg !79, !tbaa !4 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #17, !dbg !79 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %77, align 8, !dbg !79, !tbaa !12 + %rubyId_plus.i1 = load i64, i64* @rubyIdPrecomputed_plus, align 8, !dbg !56 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_plus.i1) #17, !dbg !56 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !56 + %rawSym274.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #17, !dbg !56 + %92 = load i64, i64* @rb_cObject, align 8, !dbg !56 + %stackFrame276.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#plus", align 8, !dbg !56 + %93 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !56 + %94 = bitcast i8* %93 to i16*, !dbg !56 + %95 = load i16, i16* %94, align 8, !dbg !56 + %96 = and i16 %95, -384, !dbg !56 + %97 = or i16 %96, 1, !dbg !56 + store i16 %97, i16* %94, align 8, !dbg !56 + %98 = getelementptr inbounds i8, i8* %93, i64 8, !dbg !56 + %99 = bitcast i8* %98 to i32*, !dbg !56 + store i32 2, i32* %99, align 8, !dbg !56, !tbaa !133 + %100 = getelementptr inbounds i8, i8* %93, i64 12, !dbg !56 + %101 = getelementptr inbounds i8, i8* %93, i64 4, !dbg !56 + %102 = bitcast i8* %101 to i32*, !dbg !56 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %100, i8 0, i64 20, i1 false) #17, !dbg !56 + store i32 2, i32* %102, align 4, !dbg !56, !tbaa !136 + %rubyId_x.i2 = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !56 + store i64 %rubyId_x.i2, i64* %positional_table.i, align 8, !dbg !56 + %rubyId_y.i3 = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !56 + %103 = getelementptr i64, i64* %positional_table.i, i32 1, !dbg !56 + store i64 %rubyId_y.i3, i64* %103, align 8, !dbg !56 + %104 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !56 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %104, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %65, i64 noundef 16, i1 noundef false) #17, !dbg !56 + %105 = getelementptr inbounds i8, i8* %93, i64 32, !dbg !56 + %106 = bitcast i8* %105 to i8**, !dbg !56 + store i8* %104, i8** %106, align 8, !dbg !56, !tbaa !137 + %107 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_plus, i64 0, i64 0)) #17, !dbg !56 + %108 = bitcast i8* %93 to %struct.rb_sorbet_param_struct*, !dbg !56 + %109 = bitcast %struct.rb_iseq_struct* %stackFrame276.i to i8*, !dbg !56 + call void @rb_add_method_sorbet(i64 %92, i64 %107, i64 (i32, i64*, i64)* noundef @"func_Object#plus", %struct.rb_sorbet_param_struct* nonnull %108, i32 noundef 1, i8* %109) #17, !dbg !56 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %77, align 8, !dbg !56, !tbaa !12 + %rubyId_minus.i4 = load i64, i64* @rubyIdPrecomputed_minus, align 8, !dbg !58 + %rawSym284.i = call i64 @rb_id2sym(i64 %rubyId_minus.i4) #17, !dbg !58 + %rubyId_normal285.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !58 + %rawSym286.i = call i64 @rb_id2sym(i64 %rubyId_normal285.i) #17, !dbg !58 + %stackFrame291.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#minus", align 8, !dbg !58 + %110 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !58 + %111 = bitcast i8* %110 to i16*, !dbg !58 + %112 = load i16, i16* %111, align 8, !dbg !58 + %113 = and i16 %112, -384, !dbg !58 + %114 = or i16 %113, 1, !dbg !58 + store i16 %114, i16* %111, align 8, !dbg !58 + %115 = getelementptr inbounds i8, i8* %110, i64 8, !dbg !58 + %116 = bitcast i8* %115 to i32*, !dbg !58 + store i32 2, i32* %116, align 8, !dbg !58, !tbaa !133 + %117 = getelementptr inbounds i8, i8* %110, i64 12, !dbg !58 + %118 = getelementptr inbounds i8, i8* %110, i64 4, !dbg !58 + %119 = bitcast i8* %118 to i32*, !dbg !58 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %117, i8 0, i64 20, i1 false) #17, !dbg !58 + store i32 2, i32* %119, align 4, !dbg !58, !tbaa !136 + %rubyId_x294.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !58 + store i64 %rubyId_x294.i, i64* %positional_table293.i, align 8, !dbg !58 + %rubyId_y295.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !58 + %120 = getelementptr i64, i64* %positional_table293.i, i32 1, !dbg !58 + store i64 %rubyId_y295.i, i64* %120, align 8, !dbg !58 + %121 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !58 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %121, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %66, i64 noundef 16, i1 noundef false) #17, !dbg !58 + %122 = getelementptr inbounds i8, i8* %110, i64 32, !dbg !58 + %123 = bitcast i8* %122 to i8**, !dbg !58 + store i8* %121, i8** %123, align 8, !dbg !58, !tbaa !137 + %124 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_minus, i64 0, i64 0)) #17, !dbg !58 + %125 = bitcast i8* %110 to %struct.rb_sorbet_param_struct*, !dbg !58 + %126 = bitcast %struct.rb_iseq_struct* %stackFrame291.i to i8*, !dbg !58 + call void @rb_add_method_sorbet(i64 %92, i64 %124, i64 (i32, i64*, i64)* noundef @"func_Object#minus", %struct.rb_sorbet_param_struct* nonnull %125, i32 noundef 1, i8* %126) #17, !dbg !58 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %77, align 8, !dbg !58, !tbaa !12 + %rubyId_lt.i5 = load i64, i64* @rubyIdPrecomputed_lt, align 8, !dbg !59 + %rawSym303.i = call i64 @rb_id2sym(i64 %rubyId_lt.i5) #17, !dbg !59 + %rubyId_normal304.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !59 + %rawSym305.i = call i64 @rb_id2sym(i64 %rubyId_normal304.i) #17, !dbg !59 + %stackFrame310.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#lt", align 8, !dbg !59 + %127 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !59 + %128 = bitcast i8* %127 to i16*, !dbg !59 + %129 = load i16, i16* %128, align 8, !dbg !59 + %130 = and i16 %129, -384, !dbg !59 + %131 = or i16 %130, 1, !dbg !59 + store i16 %131, i16* %128, align 8, !dbg !59 + %132 = getelementptr inbounds i8, i8* %127, i64 8, !dbg !59 + %133 = bitcast i8* %132 to i32*, !dbg !59 + store i32 2, i32* %133, align 8, !dbg !59, !tbaa !133 + %134 = getelementptr inbounds i8, i8* %127, i64 12, !dbg !59 + %135 = getelementptr inbounds i8, i8* %127, i64 4, !dbg !59 + %136 = bitcast i8* %135 to i32*, !dbg !59 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %134, i8 0, i64 20, i1 false) #17, !dbg !59 + store i32 2, i32* %136, align 4, !dbg !59, !tbaa !136 + %rubyId_x313.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !59 + store i64 %rubyId_x313.i, i64* %positional_table312.i, align 8, !dbg !59 + %rubyId_y314.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !59 + %137 = getelementptr i64, i64* %positional_table312.i, i32 1, !dbg !59 + store i64 %rubyId_y314.i, i64* %137, align 8, !dbg !59 + %138 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !59 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %138, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %67, i64 noundef 16, i1 noundef false) #17, !dbg !59 + %139 = getelementptr inbounds i8, i8* %127, i64 32, !dbg !59 + %140 = bitcast i8* %139 to i8**, !dbg !59 + store i8* %138, i8** %140, align 8, !dbg !59, !tbaa !137 + %141 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @str_lt, i64 0, i64 0)) #17, !dbg !59 + %142 = bitcast i8* %127 to %struct.rb_sorbet_param_struct*, !dbg !59 + %143 = bitcast %struct.rb_iseq_struct* %stackFrame310.i to i8*, !dbg !59 + call void @rb_add_method_sorbet(i64 %92, i64 %141, i64 (i32, i64*, i64)* noundef @"func_Object#lt", %struct.rb_sorbet_param_struct* nonnull %142, i32 noundef 1, i8* %143) #17, !dbg !59 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 23), i64** %77, align 8, !dbg !59, !tbaa !12 + %rubyId_lte.i6 = load i64, i64* @rubyIdPrecomputed_lte, align 8, !dbg !60 + %rawSym322.i = call i64 @rb_id2sym(i64 %rubyId_lte.i6) #17, !dbg !60 + %rubyId_normal323.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !60 + %rawSym324.i = call i64 @rb_id2sym(i64 %rubyId_normal323.i) #17, !dbg !60 + %stackFrame329.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#lte", align 8, !dbg !60 + %144 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !60 + %145 = bitcast i8* %144 to i16*, !dbg !60 + %146 = load i16, i16* %145, align 8, !dbg !60 + %147 = and i16 %146, -384, !dbg !60 + %148 = or i16 %147, 1, !dbg !60 + store i16 %148, i16* %145, align 8, !dbg !60 + %149 = getelementptr inbounds i8, i8* %144, i64 8, !dbg !60 + %150 = bitcast i8* %149 to i32*, !dbg !60 + store i32 2, i32* %150, align 8, !dbg !60, !tbaa !133 + %151 = getelementptr inbounds i8, i8* %144, i64 12, !dbg !60 + %152 = getelementptr inbounds i8, i8* %144, i64 4, !dbg !60 + %153 = bitcast i8* %152 to i32*, !dbg !60 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %151, i8 0, i64 20, i1 false) #17, !dbg !60 + store i32 2, i32* %153, align 4, !dbg !60, !tbaa !136 + %rubyId_x332.i = load i64, i64* @rubyIdPrecomputed_x, align 8, !dbg !60 + store i64 %rubyId_x332.i, i64* %positional_table331.i, align 8, !dbg !60 + %rubyId_y333.i = load i64, i64* @rubyIdPrecomputed_y, align 8, !dbg !60 + %154 = getelementptr i64, i64* %positional_table331.i, i32 1, !dbg !60 + store i64 %rubyId_y333.i, i64* %154, align 8, !dbg !60 + %155 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 2, i64 noundef 8) #14, !dbg !60 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %155, i8* nocapture noundef nonnull readonly align 8 dereferenceable(16) %68, i64 noundef 16, i1 noundef false) #17, !dbg !60 + %156 = getelementptr inbounds i8, i8* %144, i64 32, !dbg !60 + %157 = bitcast i8* %156 to i8**, !dbg !60 + store i8* %155, i8** %157, align 8, !dbg !60, !tbaa !137 + %158 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_lte, i64 0, i64 0)) #17, !dbg !60 + %159 = bitcast i8* %144 to %struct.rb_sorbet_param_struct*, !dbg !60 + %160 = bitcast %struct.rb_iseq_struct* %stackFrame329.i to i8*, !dbg !60 + call void @rb_add_method_sorbet(i64 %92, i64 %158, i64 (i32, i64*, i64)* noundef @"func_Object#lte", %struct.rb_sorbet_param_struct* nonnull %159, i32 noundef 1, i8* %160) #17, !dbg !60 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %77, align 8, !dbg !60, !tbaa !12 + %161 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !80, !tbaa !12 + %162 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %161, i64 0, i32 2, !dbg !80 + %163 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %162, align 8, !dbg !80, !tbaa !14 + %164 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %163, i64 0, i32 1, !dbg !80 + %165 = load i64*, i64** %164, align 8, !dbg !80, !tbaa !35 + %166 = getelementptr inbounds i64, i64* %165, i64 1, !dbg !80 + store i64 %64, i64* %165, align 8, !dbg !80, !tbaa !4 + %167 = getelementptr inbounds i64, i64* %166, i64 1, !dbg !80 + %168 = getelementptr inbounds i64, i64* %167, i64 1, !dbg !80 + store i64* %168, i64** %164, align 8, !dbg !80, !tbaa !35 + %169 = bitcast i64* %166 to <2 x i64>*, !dbg !80 + store <2 x i64> , <2 x i64>* %169, align 8, !dbg !80, !tbaa !4 + %send348.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus, i64 0) #17, !dbg !80 + %170 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !81, !tbaa !12 + %171 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %170, i64 0, i32 2, !dbg !81 + %172 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %171, align 8, !dbg !81, !tbaa !14 + %173 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %172, i64 0, i32 1, !dbg !81 + %174 = load i64*, i64** %173, align 8, !dbg !81, !tbaa !35 + %175 = getelementptr inbounds i64, i64* %174, i64 1, !dbg !81 + store i64 %64, i64* %174, align 8, !dbg !81, !tbaa !4 + %176 = getelementptr inbounds i64, i64* %175, i64 1, !dbg !81 + store i64* %176, i64** %173, align 8, !dbg !81, !tbaa !35 + store i64 %send348.i, i64* %175, align 8, !dbg !81, !tbaa !4 + %send354.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p, i64 0) #17, !dbg !81 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 28), i64** %77, align 8, !dbg !81, !tbaa !12 + %177 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !82, !tbaa !12 + %178 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %177, i64 0, i32 2, !dbg !82 + %179 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %178, align 8, !dbg !82, !tbaa !14 + %180 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %179, i64 0, i32 1, !dbg !82 + %181 = load i64*, i64** %180, align 8, !dbg !82, !tbaa !35 + %182 = getelementptr inbounds i64, i64* %181, i64 1, !dbg !82 + store i64 %64, i64* %181, align 8, !dbg !82, !tbaa !4 + %183 = getelementptr inbounds i64, i64* %182, i64 1, !dbg !82 + %184 = getelementptr inbounds i64, i64* %183, i64 1, !dbg !82 + store i64* %184, i64** %180, align 8, !dbg !82, !tbaa !35 + %185 = bitcast i64* %182 to <2 x i64>*, !dbg !82 + store <2 x i64> , <2 x i64>* %185, align 8, !dbg !82, !tbaa !4 + %send363.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus, i64 0) #17, !dbg !82 + %186 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !83, !tbaa !12 + %187 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %186, i64 0, i32 2, !dbg !83 + %188 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %187, align 8, !dbg !83, !tbaa !14 + %189 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %188, i64 0, i32 1, !dbg !83 + %190 = load i64*, i64** %189, align 8, !dbg !83, !tbaa !35 + %191 = getelementptr inbounds i64, i64* %190, i64 1, !dbg !83 + store i64 %64, i64* %190, align 8, !dbg !83, !tbaa !4 + %192 = getelementptr inbounds i64, i64* %191, i64 1, !dbg !83 + store i64* %192, i64** %189, align 8, !dbg !83, !tbaa !35 + store i64 %send363.i, i64* %191, align 8, !dbg !83, !tbaa !4 + %send370.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.18, i64 0) #17, !dbg !83 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 29), i64** %77, align 8, !dbg !83, !tbaa !12 + %193 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !84, !tbaa !12 + %194 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %193, i64 0, i32 2, !dbg !84 + %195 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %194, align 8, !dbg !84, !tbaa !14 + %196 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %195, i64 0, i32 1, !dbg !84 + %197 = load i64*, i64** %196, align 8, !dbg !84, !tbaa !35 + %198 = getelementptr inbounds i64, i64* %197, i64 1, !dbg !84 + store i64 %64, i64* %197, align 8, !dbg !84, !tbaa !4 + %199 = getelementptr inbounds i64, i64* %198, i64 1, !dbg !84 + %200 = getelementptr inbounds i64, i64* %199, i64 1, !dbg !84 + store i64* %200, i64** %196, align 8, !dbg !84, !tbaa !35 + %201 = bitcast i64* %198 to <2 x i64>*, !dbg !84 + store <2 x i64> , <2 x i64>* %201, align 8, !dbg !84, !tbaa !4 + %send379.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt, i64 0) #17, !dbg !84 + %202 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !85, !tbaa !12 + %203 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %202, i64 0, i32 2, !dbg !85 + %204 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %203, align 8, !dbg !85, !tbaa !14 + %205 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %204, i64 0, i32 1, !dbg !85 + %206 = load i64*, i64** %205, align 8, !dbg !85, !tbaa !35 + %207 = getelementptr inbounds i64, i64* %206, i64 1, !dbg !85 + store i64 %64, i64* %206, align 8, !dbg !85, !tbaa !4 + %208 = getelementptr inbounds i64, i64* %207, i64 1, !dbg !85 + store i64* %208, i64** %205, align 8, !dbg !85, !tbaa !35 + store i64 %send379.i, i64* %207, align 8, !dbg !85, !tbaa !4 + %send386.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.19, i64 0) #17, !dbg !85 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 30), i64** %77, align 8, !dbg !85, !tbaa !12 + %209 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !12 + %210 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %209, i64 0, i32 2, !dbg !86 + %211 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %210, align 8, !dbg !86, !tbaa !14 + %212 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %211, i64 0, i32 1, !dbg !86 + %213 = load i64*, i64** %212, align 8, !dbg !86, !tbaa !35 + %214 = getelementptr inbounds i64, i64* %213, i64 1, !dbg !86 + store i64 %64, i64* %213, align 8, !dbg !86, !tbaa !4 + %215 = getelementptr inbounds i64, i64* %214, i64 1, !dbg !86 + %216 = getelementptr inbounds i64, i64* %215, i64 1, !dbg !86 + store i64* %216, i64** %212, align 8, !dbg !86, !tbaa !35 + %217 = bitcast i64* %214 to <2 x i64>*, !dbg !86 + store <2 x i64> , <2 x i64>* %217, align 8, !dbg !86, !tbaa !4 + %send396.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt.20, i64 0) #17, !dbg !86 + %218 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !87, !tbaa !12 + %219 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %218, i64 0, i32 2, !dbg !87 + %220 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %219, align 8, !dbg !87, !tbaa !14 + %221 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %220, i64 0, i32 1, !dbg !87 + %222 = load i64*, i64** %221, align 8, !dbg !87, !tbaa !35 + %223 = getelementptr inbounds i64, i64* %222, i64 1, !dbg !87 + store i64 %64, i64* %222, align 8, !dbg !87, !tbaa !4 + %224 = getelementptr inbounds i64, i64* %223, i64 1, !dbg !87 + store i64* %224, i64** %221, align 8, !dbg !87, !tbaa !35 + store i64 %send396.i, i64* %223, align 8, !dbg !87, !tbaa !4 + %send403.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.21, i64 0) #17, !dbg !87 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 31), i64** %77, align 8, !dbg !87, !tbaa !12 + %225 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !88, !tbaa !12 + %226 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %225, i64 0, i32 2, !dbg !88 + %227 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %226, align 8, !dbg !88, !tbaa !14 + %228 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %227, i64 0, i32 1, !dbg !88 + %229 = load i64*, i64** %228, align 8, !dbg !88, !tbaa !35 + %230 = getelementptr inbounds i64, i64* %229, i64 1, !dbg !88 + store i64 %64, i64* %229, align 8, !dbg !88, !tbaa !4 + %231 = getelementptr inbounds i64, i64* %230, i64 1, !dbg !88 + %232 = getelementptr inbounds i64, i64* %231, i64 1, !dbg !88 + store i64* %232, i64** %228, align 8, !dbg !88, !tbaa !35 + %233 = bitcast i64* %230 to <2 x i64>*, !dbg !88 + store <2 x i64> , <2 x i64>* %233, align 8, !dbg !88, !tbaa !4 + %send412.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte, i64 0) #17, !dbg !88 + %234 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !89, !tbaa !12 + %235 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %234, i64 0, i32 2, !dbg !89 + %236 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %235, align 8, !dbg !89, !tbaa !14 + %237 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %236, i64 0, i32 1, !dbg !89 + %238 = load i64*, i64** %237, align 8, !dbg !89, !tbaa !35 + %239 = getelementptr inbounds i64, i64* %238, i64 1, !dbg !89 + store i64 %64, i64* %238, align 8, !dbg !89, !tbaa !4 + %240 = getelementptr inbounds i64, i64* %239, i64 1, !dbg !89 + store i64* %240, i64** %237, align 8, !dbg !89, !tbaa !35 + store i64 %send412.i, i64* %239, align 8, !dbg !89, !tbaa !4 + %send419.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.22, i64 0) #17, !dbg !89 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 32), i64** %77, align 8, !dbg !89, !tbaa !12 + %241 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !90, !tbaa !12 + %242 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %241, i64 0, i32 2, !dbg !90 + %243 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %242, align 8, !dbg !90, !tbaa !14 + %244 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %243, i64 0, i32 1, !dbg !90 + %245 = load i64*, i64** %244, align 8, !dbg !90, !tbaa !35 + %246 = getelementptr inbounds i64, i64* %245, i64 1, !dbg !90 + store i64 %64, i64* %245, align 8, !dbg !90, !tbaa !4 + %247 = getelementptr inbounds i64, i64* %246, i64 1, !dbg !90 + %248 = getelementptr inbounds i64, i64* %247, i64 1, !dbg !90 + store i64* %248, i64** %244, align 8, !dbg !90, !tbaa !35 + %249 = bitcast i64* %246 to <2 x i64>*, !dbg !90 + store <2 x i64> , <2 x i64>* %249, align 8, !dbg !90, !tbaa !4 + %send429.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.23, i64 0) #17, !dbg !90 + %250 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !91, !tbaa !12 + %251 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %250, i64 0, i32 2, !dbg !91 + %252 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %251, align 8, !dbg !91, !tbaa !14 + %253 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %252, i64 0, i32 1, !dbg !91 + %254 = load i64*, i64** %253, align 8, !dbg !91, !tbaa !35 + %255 = getelementptr inbounds i64, i64* %254, i64 1, !dbg !91 + store i64 %64, i64* %254, align 8, !dbg !91, !tbaa !4 + %256 = getelementptr inbounds i64, i64* %255, i64 1, !dbg !91 + store i64* %256, i64** %253, align 8, !dbg !91, !tbaa !35 + store i64 %send429.i, i64* %255, align 8, !dbg !91, !tbaa !4 + %send436.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.24, i64 0) #17, !dbg !91 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 33), i64** %77, align 8, !dbg !91, !tbaa !12 + %257 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !92, !tbaa !12 + %258 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %257, i64 0, i32 2, !dbg !92 + %259 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %258, align 8, !dbg !92, !tbaa !14 + %260 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %259, i64 0, i32 1, !dbg !92 + %261 = load i64*, i64** %260, align 8, !dbg !92, !tbaa !35 + %262 = getelementptr inbounds i64, i64* %261, i64 1, !dbg !92 + store i64 %64, i64* %261, align 8, !dbg !92, !tbaa !4 + %263 = getelementptr inbounds i64, i64* %262, i64 1, !dbg !92 + %264 = getelementptr inbounds i64, i64* %263, i64 1, !dbg !92 + store i64* %264, i64** %260, align 8, !dbg !92, !tbaa !35 + %265 = bitcast i64* %262 to <2 x i64>*, !dbg !92 + store <2 x i64> , <2 x i64>* %265, align 8, !dbg !92, !tbaa !4 + %send446.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.25, i64 0) #17, !dbg !92 + %266 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !93, !tbaa !12 + %267 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %266, i64 0, i32 2, !dbg !93 + %268 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %267, align 8, !dbg !93, !tbaa !14 + %269 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %268, i64 0, i32 1, !dbg !93 + %270 = load i64*, i64** %269, align 8, !dbg !93, !tbaa !35 + %271 = getelementptr inbounds i64, i64* %270, i64 1, !dbg !93 + store i64 %64, i64* %270, align 8, !dbg !93, !tbaa !4 + %272 = getelementptr inbounds i64, i64* %271, i64 1, !dbg !93 + store i64* %272, i64** %269, align 8, !dbg !93, !tbaa !35 + store i64 %send446.i, i64* %271, align 8, !dbg !93, !tbaa !4 + %send453.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.26, i64 0) #17, !dbg !93 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 36), i64** %77, align 8, !dbg !93, !tbaa !12 + %273 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !94, !tbaa !12 + %274 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %273, i64 0, i32 2, !dbg !94 + %275 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %274, align 8, !dbg !94, !tbaa !14 + %276 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %275, i64 0, i32 1, !dbg !94 + %277 = load i64*, i64** %276, align 8, !dbg !94, !tbaa !35 + %278 = getelementptr inbounds i64, i64* %277, i64 1, !dbg !94 + store i64 %64, i64* %277, align 8, !dbg !94, !tbaa !4 + %279 = getelementptr inbounds i64, i64* %278, i64 1, !dbg !94 + %280 = getelementptr inbounds i64, i64* %279, i64 1, !dbg !94 + store i64* %280, i64** %276, align 8, !dbg !94, !tbaa !35 + %281 = bitcast i64* %278 to <2 x i64>*, !dbg !94 + store <2 x i64> , <2 x i64>* %281, align 8, !dbg !94, !tbaa !4 + %send462.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus.27, i64 0) #17, !dbg !94 + %282 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !95, !tbaa !12 + %283 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %282, i64 0, i32 2, !dbg !95 + %284 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %283, align 8, !dbg !95, !tbaa !14 + %285 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %284, i64 0, i32 1, !dbg !95 + %286 = load i64*, i64** %285, align 8, !dbg !95, !tbaa !35 + %287 = getelementptr inbounds i64, i64* %286, i64 1, !dbg !95 + store i64 %64, i64* %286, align 8, !dbg !95, !tbaa !4 + %288 = getelementptr inbounds i64, i64* %287, i64 1, !dbg !95 + store i64* %288, i64** %285, align 8, !dbg !95, !tbaa !35 + store i64 %send462.i, i64* %287, align 8, !dbg !95, !tbaa !4 + %send469.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.28, i64 0) #17, !dbg !95 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 37), i64** %77, align 8, !dbg !95, !tbaa !12 + %rubyStr_8.9.i = load i64, i64* @rubyStrFrozen_8.9, align 8, !dbg !96 + %289 = load i64, i64* @rb_mKernel, align 8, !dbg !96 + %290 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !96, !tbaa !12 + %291 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %290, i64 0, i32 2, !dbg !96 + %292 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %291, align 8, !dbg !96, !tbaa !14 + %293 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %292, i64 0, i32 1, !dbg !96 + %294 = load i64*, i64** %293, align 8, !dbg !96, !tbaa !35 + %295 = getelementptr inbounds i64, i64* %294, i64 1, !dbg !96 + store i64 %289, i64* %294, align 8, !dbg !96, !tbaa !4 + %296 = getelementptr inbounds i64, i64* %295, i64 1, !dbg !96 + store i64* %296, i64** %293, align 8, !dbg !96, !tbaa !35 + store i64 %rubyStr_8.9.i, i64* %295, align 8, !dbg !96, !tbaa !4 + %send475.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational, i64 0) #17, !dbg !96 + %297 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !97, !tbaa !12 + %298 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %297, i64 0, i32 2, !dbg !97 + %299 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %298, align 8, !dbg !97, !tbaa !14 + %300 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %299, i64 0, i32 1, !dbg !97 + %301 = load i64*, i64** %300, align 8, !dbg !97, !tbaa !35 + %302 = getelementptr inbounds i64, i64* %301, i64 1, !dbg !97 + store i64 %64, i64* %301, align 8, !dbg !97, !tbaa !4 + %303 = getelementptr inbounds i64, i64* %302, i64 1, !dbg !97 + store i64 36028797018963970, i64* %302, align 8, !dbg !97, !tbaa !4 + %304 = getelementptr inbounds i64, i64* %303, i64 1, !dbg !97 + store i64* %304, i64** %300, align 8, !dbg !97, !tbaa !35 + store i64 %send475.i, i64* %303, align 8, !dbg !97, !tbaa !4 + %send483.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus.29, i64 0) #17, !dbg !97 + %305 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !98, !tbaa !12 + %306 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %305, i64 0, i32 2, !dbg !98 + %307 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %306, align 8, !dbg !98, !tbaa !14 + %308 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %307, i64 0, i32 1, !dbg !98 + %309 = load i64*, i64** %308, align 8, !dbg !98, !tbaa !35 + %310 = getelementptr inbounds i64, i64* %309, i64 1, !dbg !98 + store i64 %64, i64* %309, align 8, !dbg !98, !tbaa !4 + %311 = getelementptr inbounds i64, i64* %310, i64 1, !dbg !98 + store i64* %311, i64** %308, align 8, !dbg !98, !tbaa !35 + store i64 %send483.i, i64* %310, align 8, !dbg !98, !tbaa !4 + %send490.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.30, i64 0) #17, !dbg !98 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 38), i64** %77, align 8, !dbg !98, !tbaa !12 + %rubyStr_5.i = load i64, i64* @rubyStrFrozen_5, align 8, !dbg !99 + %312 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !99, !tbaa !12 + %313 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %312, i64 0, i32 2, !dbg !99 + %314 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %313, align 8, !dbg !99, !tbaa !14 + %315 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %314, i64 0, i32 1, !dbg !99 + %316 = load i64*, i64** %315, align 8, !dbg !99, !tbaa !35 + %317 = getelementptr inbounds i64, i64* %316, i64 1, !dbg !99 + store i64 %289, i64* %316, align 8, !dbg !99, !tbaa !4 + %318 = getelementptr inbounds i64, i64* %317, i64 1, !dbg !99 + store i64 1, i64* %317, align 8, !dbg !99, !tbaa !4 + %319 = getelementptr inbounds i64, i64* %318, i64 1, !dbg !99 + store i64* %319, i64** %315, align 8, !dbg !99, !tbaa !35 + store i64 %rubyStr_5.i, i64* %318, align 8, !dbg !99, !tbaa !4 + %send498.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Complex, i64 0) #17, !dbg !99 + %320 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !100, !tbaa !12 + %321 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %320, i64 0, i32 2, !dbg !100 + %322 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %321, align 8, !dbg !100, !tbaa !14 + %323 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %322, i64 0, i32 1, !dbg !100 + %324 = load i64*, i64** %323, align 8, !dbg !100, !tbaa !35 + %325 = getelementptr inbounds i64, i64* %324, i64 1, !dbg !100 + store i64 %64, i64* %324, align 8, !dbg !100, !tbaa !4 + %326 = getelementptr inbounds i64, i64* %325, i64 1, !dbg !100 + store i64 36028797018963970, i64* %325, align 8, !dbg !100, !tbaa !4 + %327 = getelementptr inbounds i64, i64* %326, i64 1, !dbg !100 + store i64* %327, i64** %323, align 8, !dbg !100, !tbaa !35 + store i64 %send498.i, i64* %326, align 8, !dbg !100, !tbaa !4 + %send506.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_plus.31, i64 0) #17, !dbg !100 + %328 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !101, !tbaa !12 + %329 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %328, i64 0, i32 2, !dbg !101 + %330 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %329, align 8, !dbg !101, !tbaa !14 + %331 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %330, i64 0, i32 1, !dbg !101 + %332 = load i64*, i64** %331, align 8, !dbg !101, !tbaa !35 + %333 = getelementptr inbounds i64, i64* %332, i64 1, !dbg !101 + store i64 %64, i64* %332, align 8, !dbg !101, !tbaa !4 + %334 = getelementptr inbounds i64, i64* %333, i64 1, !dbg !101 + store i64* %334, i64** %331, align 8, !dbg !101, !tbaa !35 + store i64 %send506.i, i64* %333, align 8, !dbg !101, !tbaa !4 + %send513.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.32, i64 0) #17, !dbg !101 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 40), i64** %77, align 8, !dbg !101, !tbaa !12 + %335 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !102, !tbaa !12 + %336 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %335, i64 0, i32 2, !dbg !102 + %337 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %336, align 8, !dbg !102, !tbaa !14 + %338 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %337, i64 0, i32 1, !dbg !102 + %339 = load i64*, i64** %338, align 8, !dbg !102, !tbaa !35 + %340 = getelementptr inbounds i64, i64* %339, i64 1, !dbg !102 + store i64 %64, i64* %339, align 8, !dbg !102, !tbaa !4 + %341 = getelementptr inbounds i64, i64* %340, i64 1, !dbg !102 + %342 = getelementptr inbounds i64, i64* %341, i64 1, !dbg !102 + store i64* %342, i64** %338, align 8, !dbg !102, !tbaa !35 + %343 = bitcast i64* %340 to <2 x i64>*, !dbg !102 + store <2 x i64> , <2 x i64>* %343, align 8, !dbg !102, !tbaa !4 + %send523.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus.33, i64 0) #17, !dbg !102 + %344 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !103, !tbaa !12 + %345 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %344, i64 0, i32 2, !dbg !103 + %346 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %345, align 8, !dbg !103, !tbaa !14 + %347 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %346, i64 0, i32 1, !dbg !103 + %348 = load i64*, i64** %347, align 8, !dbg !103, !tbaa !35 + %349 = getelementptr inbounds i64, i64* %348, i64 1, !dbg !103 + store i64 %64, i64* %348, align 8, !dbg !103, !tbaa !4 + %350 = getelementptr inbounds i64, i64* %349, i64 1, !dbg !103 + store i64* %350, i64** %347, align 8, !dbg !103, !tbaa !35 + store i64 %send523.i, i64* %349, align 8, !dbg !103, !tbaa !4 + %send530.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.34, i64 0) #17, !dbg !103 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 41), i64** %77, align 8, !dbg !103, !tbaa !12 + %rubyStr_15.4.i = load i64, i64* @rubyStrFrozen_15.4, align 8, !dbg !104 + %351 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !104, !tbaa !12 + %352 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %351, i64 0, i32 2, !dbg !104 + %353 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %352, align 8, !dbg !104, !tbaa !14 + %354 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %353, i64 0, i32 1, !dbg !104 + %355 = load i64*, i64** %354, align 8, !dbg !104, !tbaa !35 + %356 = getelementptr inbounds i64, i64* %355, i64 1, !dbg !104 + store i64 %289, i64* %355, align 8, !dbg !104, !tbaa !4 + %357 = getelementptr inbounds i64, i64* %356, i64 1, !dbg !104 + store i64* %357, i64** %354, align 8, !dbg !104, !tbaa !35 + store i64 %rubyStr_15.4.i, i64* %356, align 8, !dbg !104, !tbaa !4 + %send537.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational.35, i64 0) #17, !dbg !104 + %358 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !105, !tbaa !12 + %359 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %358, i64 0, i32 2, !dbg !105 + %360 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %359, align 8, !dbg !105, !tbaa !14 + %361 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %360, i64 0, i32 1, !dbg !105 + %362 = load i64*, i64** %361, align 8, !dbg !105, !tbaa !35 + %363 = getelementptr inbounds i64, i64* %362, i64 1, !dbg !105 + store i64 %64, i64* %362, align 8, !dbg !105, !tbaa !4 + %364 = getelementptr inbounds i64, i64* %363, i64 1, !dbg !105 + store i64 199622053483197234, i64* %363, align 8, !dbg !105, !tbaa !4 + %365 = getelementptr inbounds i64, i64* %364, i64 1, !dbg !105 + store i64* %365, i64** %361, align 8, !dbg !105, !tbaa !35 + store i64 %send537.i, i64* %364, align 8, !dbg !105, !tbaa !4 + %send545.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus.36, i64 0) #17, !dbg !105 + %366 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !106, !tbaa !12 + %367 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %366, i64 0, i32 2, !dbg !106 + %368 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %367, align 8, !dbg !106, !tbaa !14 + %369 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %368, i64 0, i32 1, !dbg !106 + %370 = load i64*, i64** %369, align 8, !dbg !106, !tbaa !35 + %371 = getelementptr inbounds i64, i64* %370, i64 1, !dbg !106 + store i64 %64, i64* %370, align 8, !dbg !106, !tbaa !4 + %372 = getelementptr inbounds i64, i64* %371, i64 1, !dbg !106 + store i64* %372, i64** %369, align 8, !dbg !106, !tbaa !35 + store i64 %send545.i, i64* %371, align 8, !dbg !106, !tbaa !4 + %send552.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.37, i64 0) #17, !dbg !106 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 42), i64** %77, align 8, !dbg !106, !tbaa !12 + %rubyStr_18.i = load i64, i64* @rubyStrFrozen_18, align 8, !dbg !107 + %373 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !107, !tbaa !12 + %374 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %373, i64 0, i32 2, !dbg !107 + %375 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %374, align 8, !dbg !107, !tbaa !14 + %376 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %375, i64 0, i32 1, !dbg !107 + %377 = load i64*, i64** %376, align 8, !dbg !107, !tbaa !35 + %378 = getelementptr inbounds i64, i64* %377, i64 1, !dbg !107 + store i64 %289, i64* %377, align 8, !dbg !107, !tbaa !4 + %379 = getelementptr inbounds i64, i64* %378, i64 1, !dbg !107 + store i64 1, i64* %378, align 8, !dbg !107, !tbaa !4 + %380 = getelementptr inbounds i64, i64* %379, i64 1, !dbg !107 + store i64* %380, i64** %376, align 8, !dbg !107, !tbaa !35 + store i64 %rubyStr_18.i, i64* %379, align 8, !dbg !107, !tbaa !4 + %send561.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Complex.38, i64 0) #17, !dbg !107 + %381 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !108, !tbaa !12 + %382 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %381, i64 0, i32 2, !dbg !108 + %383 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %382, align 8, !dbg !108, !tbaa !14 + %384 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %383, i64 0, i32 1, !dbg !108 + %385 = load i64*, i64** %384, align 8, !dbg !108, !tbaa !35 + %386 = getelementptr inbounds i64, i64* %385, i64 1, !dbg !108 + store i64 %64, i64* %385, align 8, !dbg !108, !tbaa !4 + %387 = getelementptr inbounds i64, i64* %386, i64 1, !dbg !108 + store i64 199565758487855106, i64* %386, align 8, !dbg !108, !tbaa !4 + %388 = getelementptr inbounds i64, i64* %387, i64 1, !dbg !108 + store i64* %388, i64** %384, align 8, !dbg !108, !tbaa !35 + store i64 %send561.i, i64* %387, align 8, !dbg !108, !tbaa !4 + %send569.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_minus.39, i64 0) #17, !dbg !108 + %389 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !109, !tbaa !12 + %390 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %389, i64 0, i32 2, !dbg !109 + %391 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %390, align 8, !dbg !109, !tbaa !14 + %392 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %391, i64 0, i32 1, !dbg !109 + %393 = load i64*, i64** %392, align 8, !dbg !109, !tbaa !35 + %394 = getelementptr inbounds i64, i64* %393, i64 1, !dbg !109 + store i64 %64, i64* %393, align 8, !dbg !109, !tbaa !4 + %395 = getelementptr inbounds i64, i64* %394, i64 1, !dbg !109 + store i64* %395, i64** %392, align 8, !dbg !109, !tbaa !35 + store i64 %send569.i, i64* %394, align 8, !dbg !109, !tbaa !4 + %send576.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.40, i64 0) #17, !dbg !109 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 44), i64** %77, align 8, !dbg !109, !tbaa !12 + %396 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !110, !tbaa !12 + %397 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %396, i64 0, i32 2, !dbg !110 + %398 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %397, align 8, !dbg !110, !tbaa !14 + %399 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %398, i64 0, i32 1, !dbg !110 + %400 = load i64*, i64** %399, align 8, !dbg !110, !tbaa !35 + %401 = getelementptr inbounds i64, i64* %400, i64 1, !dbg !110 + store i64 %64, i64* %400, align 8, !dbg !110, !tbaa !4 + %402 = getelementptr inbounds i64, i64* %401, i64 1, !dbg !110 + %403 = getelementptr inbounds i64, i64* %402, i64 1, !dbg !110 + store i64* %403, i64** %399, align 8, !dbg !110, !tbaa !35 + %404 = bitcast i64* %401 to <2 x i64>*, !dbg !110 + store <2 x i64> , <2 x i64>* %404, align 8, !dbg !110, !tbaa !4 + %send586.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt.41, i64 0) #17, !dbg !110 + %405 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !111, !tbaa !12 + %406 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %405, i64 0, i32 2, !dbg !111 + %407 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %406, align 8, !dbg !111, !tbaa !14 + %408 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %407, i64 0, i32 1, !dbg !111 + %409 = load i64*, i64** %408, align 8, !dbg !111, !tbaa !35 + %410 = getelementptr inbounds i64, i64* %409, i64 1, !dbg !111 + store i64 %64, i64* %409, align 8, !dbg !111, !tbaa !4 + %411 = getelementptr inbounds i64, i64* %410, i64 1, !dbg !111 + store i64* %411, i64** %408, align 8, !dbg !111, !tbaa !35 + store i64 %send586.i, i64* %410, align 8, !dbg !111, !tbaa !4 + %send593.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.42, i64 0) #17, !dbg !111 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 45), i64** %77, align 8, !dbg !111, !tbaa !12 + %rubyStr_25.4.i = load i64, i64* @rubyStrFrozen_25.4, align 8, !dbg !112 + %412 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !112, !tbaa !12 + %413 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %412, i64 0, i32 2, !dbg !112 + %414 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %413, align 8, !dbg !112, !tbaa !14 + %415 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %414, i64 0, i32 1, !dbg !112 + %416 = load i64*, i64** %415, align 8, !dbg !112, !tbaa !35 + %417 = getelementptr inbounds i64, i64* %416, i64 1, !dbg !112 + store i64 %289, i64* %416, align 8, !dbg !112, !tbaa !4 + %418 = getelementptr inbounds i64, i64* %417, i64 1, !dbg !112 + store i64* %418, i64** %415, align 8, !dbg !112, !tbaa !35 + store i64 %rubyStr_25.4.i, i64* %417, align 8, !dbg !112, !tbaa !4 + %send600.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational.43, i64 0) #17, !dbg !112 + %419 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !113, !tbaa !12 + %420 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %419, i64 0, i32 2, !dbg !113 + %421 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %420, align 8, !dbg !113, !tbaa !14 + %422 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %421, i64 0, i32 1, !dbg !113 + %423 = load i64*, i64** %422, align 8, !dbg !113, !tbaa !35 + %424 = getelementptr inbounds i64, i64* %423, i64 1, !dbg !113 + store i64 %64, i64* %423, align 8, !dbg !113, !tbaa !4 + %425 = getelementptr inbounds i64, i64* %424, i64 1, !dbg !113 + store i64 113040350646999450, i64* %424, align 8, !dbg !113, !tbaa !4 + %426 = getelementptr inbounds i64, i64* %425, i64 1, !dbg !113 + store i64* %426, i64** %422, align 8, !dbg !113, !tbaa !35 + store i64 %send600.i, i64* %425, align 8, !dbg !113, !tbaa !4 + %send608.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lt.44, i64 0) #17, !dbg !113 + %427 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !114, !tbaa !12 + %428 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %427, i64 0, i32 2, !dbg !114 + %429 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %428, align 8, !dbg !114, !tbaa !14 + %430 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %429, i64 0, i32 1, !dbg !114 + %431 = load i64*, i64** %430, align 8, !dbg !114, !tbaa !35 + %432 = getelementptr inbounds i64, i64* %431, i64 1, !dbg !114 + store i64 %64, i64* %431, align 8, !dbg !114, !tbaa !4 + %433 = getelementptr inbounds i64, i64* %432, i64 1, !dbg !114 + store i64* %433, i64** %430, align 8, !dbg !114, !tbaa !35 + store i64 %send608.i, i64* %432, align 8, !dbg !114, !tbaa !4 + %send615.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.45, i64 0) #17, !dbg !114 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 47), i64** %77, align 8, !dbg !114, !tbaa !12 + %434 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !115, !tbaa !12 + %435 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %434, i64 0, i32 2, !dbg !115 + %436 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %435, align 8, !dbg !115, !tbaa !14 + %437 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %436, i64 0, i32 1, !dbg !115 + %438 = load i64*, i64** %437, align 8, !dbg !115, !tbaa !35 + %439 = getelementptr inbounds i64, i64* %438, i64 1, !dbg !115 + store i64 %64, i64* %438, align 8, !dbg !115, !tbaa !4 + %440 = getelementptr inbounds i64, i64* %439, i64 1, !dbg !115 + %441 = getelementptr inbounds i64, i64* %440, i64 1, !dbg !115 + store i64* %441, i64** %437, align 8, !dbg !115, !tbaa !35 + %442 = bitcast i64* %439 to <2 x i64>*, !dbg !115 + store <2 x i64> , <2 x i64>* %442, align 8, !dbg !115, !tbaa !4 + %send625.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.46, i64 0) #17, !dbg !115 + %443 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !116, !tbaa !12 + %444 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %443, i64 0, i32 2, !dbg !116 + %445 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %444, align 8, !dbg !116, !tbaa !14 + %446 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %445, i64 0, i32 1, !dbg !116 + %447 = load i64*, i64** %446, align 8, !dbg !116, !tbaa !35 + %448 = getelementptr inbounds i64, i64* %447, i64 1, !dbg !116 + store i64 %64, i64* %447, align 8, !dbg !116, !tbaa !4 + %449 = getelementptr inbounds i64, i64* %448, i64 1, !dbg !116 + store i64* %449, i64** %446, align 8, !dbg !116, !tbaa !35 + store i64 %send625.i, i64* %448, align 8, !dbg !116, !tbaa !4 + %send632.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.47, i64 0) #17, !dbg !116 + store i64* getelementptr inbounds ([49 x i64], [49 x i64]* @iseqEncodedArray, i64 0, i64 48), i64** %77, align 8, !dbg !116, !tbaa !12 + %rubyStr_5.923.i = load i64, i64* @rubyStrFrozen_5.923, align 8, !dbg !117 + %450 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !117, !tbaa !12 + %451 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %450, i64 0, i32 2, !dbg !117 + %452 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %451, align 8, !dbg !117, !tbaa !14 + %453 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %452, i64 0, i32 1, !dbg !117 + %454 = load i64*, i64** %453, align 8, !dbg !117, !tbaa !35 + %455 = getelementptr inbounds i64, i64* %454, i64 1, !dbg !117 + store i64 %289, i64* %454, align 8, !dbg !117, !tbaa !4 + %456 = getelementptr inbounds i64, i64* %455, i64 1, !dbg !117 + store i64* %456, i64** %453, align 8, !dbg !117, !tbaa !35 + store i64 %rubyStr_5.923.i, i64* %455, align 8, !dbg !117, !tbaa !4 + %send639.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_Rational.48, i64 0) #17, !dbg !117 + %457 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !118, !tbaa !12 + %458 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %457, i64 0, i32 2, !dbg !118 + %459 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %458, align 8, !dbg !118, !tbaa !14 + %460 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %459, i64 0, i32 1, !dbg !118 + %461 = load i64*, i64** %460, align 8, !dbg !118, !tbaa !35 + %462 = getelementptr inbounds i64, i64* %461, i64 1, !dbg !118 + store i64 %64, i64* %461, align 8, !dbg !118, !tbaa !4 + %463 = getelementptr inbounds i64, i64* %462, i64 1, !dbg !118 + store i64 113040350646999450, i64* %462, align 8, !dbg !118, !tbaa !4 + %464 = getelementptr inbounds i64, i64* %463, i64 1, !dbg !118 + store i64* %464, i64** %460, align 8, !dbg !118, !tbaa !35 + store i64 %send639.i, i64* %463, align 8, !dbg !118, !tbaa !4 + %send647.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_lte.49, i64 0) #17, !dbg !118 + %465 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !119, !tbaa !12 + %466 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %465, i64 0, i32 2, !dbg !119 + %467 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %466, align 8, !dbg !119, !tbaa !14 + %468 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %467, i64 0, i32 1, !dbg !119 + %469 = load i64*, i64** %468, align 8, !dbg !119, !tbaa !35 + %470 = getelementptr inbounds i64, i64* %469, i64 1, !dbg !119 + store i64 %64, i64* %469, align 8, !dbg !119, !tbaa !4 + %471 = getelementptr inbounds i64, i64* %470, i64 1, !dbg !119 + store i64* %471, i64** %468, align 8, !dbg !119, !tbaa !35 + store i64 %send647.i, i64* %470, align 8, !dbg !119, !tbaa !4 + %send654.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_p.50, i64 0) #17, !dbg !119 call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %65) call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %66) call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %67) @@ -1660,17 +1587,17 @@ declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #5 declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #10 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#lt.cold.1"(i64 %0) unnamed_addr #11 !dbg !148 { +define internal fastcc void @"func_Object#lt.cold.1"(i64 %0) unnamed_addr #11 !dbg !138 { newFuncRoot: tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @"str_Return value", i64 0, i64 0), i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @"str_T::Boolean", i64 0, i64 0)) #2 unreachable } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) unnamed_addr #11 !dbg !150 { +define internal fastcc void @"func_Object#lt.cold.2"(i64 %rawArg_x) unnamed_addr #11 !dbg !140 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_x, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_Float, i64 0, i64 0)) #2, !dbg !151 - unreachable, !dbg !151 + tail call void @sorbet_cast_failure(i64 %rawArg_x, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_Float, i64 0, i64 0)) #2, !dbg !141 + unreachable, !dbg !141 } ; Function Attrs: nofree nosync nounwind willreturn @@ -1680,7 +1607,7 @@ declare void @llvm.assume(i1 noundef) #12 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #13 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !142 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !131 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -1725,137 +1652,127 @@ attributes #17 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 8, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 4001, i32 4000000} -!33 = !DILocation(line: 8, column: 10, scope: !8) -!34 = !{!"branch_weights", i32 1073205, i32 2146410443} -!35 = !{!36, !5, i64 0} -!36 = !{!"RBasic", !5, i64 0, !5, i64 8} -!37 = !{!"branch_weights", i32 2000, i32 1} -!38 = !DILocation(line: 8, column: 13, scope: !8) -!39 = !DILocation(line: 9, column: 3, scope: !8) -!40 = !{!41} -!41 = distinct !{!41, !42, !"sorbet_int_rb_float_plus: argument 0"} -!42 = distinct !{!42, !"sorbet_int_rb_float_plus"} -!43 = distinct !DISubprogram(name: "Object#minus", linkageName: "func_Object#minus", scope: null, file: !2, line: 13, type: !9, scopeLine: 13, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!44 = !DILocation(line: 13, column: 1, scope: !43) -!45 = !DILocation(line: 13, column: 11, scope: !43) -!46 = !DILocation(line: 13, column: 14, scope: !43) -!47 = !DILocation(line: 14, column: 3, scope: !43) -!48 = !{!19, !13, i64 8} -!49 = distinct !DISubprogram(name: "Object#lt", linkageName: "func_Object#lt", scope: null, file: !2, line: 18, type: !9, scopeLine: 18, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!50 = !DILocation(line: 18, column: 1, scope: !49) -!51 = !DILocation(line: 18, column: 8, scope: !49) -!52 = !DILocation(line: 18, column: 11, scope: !49) -!53 = !DILocation(line: 19, column: 3, scope: !49) -!54 = !{!55} -!55 = distinct !{!55, !56, !"sorbet_int_flo_lt: argument 0"} -!56 = distinct !{!56, !"sorbet_int_flo_lt"} -!57 = !{!"branch_weights", i32 1, i32 2001, i32 2000} -!58 = !DILocation(line: 0, scope: !49) -!59 = distinct !DISubprogram(name: "Object#lte", linkageName: "func_Object#lte", scope: null, file: !2, line: 23, type: !9, scopeLine: 23, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!60 = !DILocation(line: 23, column: 1, scope: !59) -!61 = !DILocation(line: 23, column: 9, scope: !59) -!62 = !DILocation(line: 23, column: 12, scope: !59) -!63 = !DILocation(line: 24, column: 3, scope: !59) -!64 = !{!65} -!65 = distinct !{!65, !66, !"sorbet_int_flo_le: argument 0"} -!66 = distinct !{!66, !"sorbet_int_flo_le"} -!67 = !DILocation(line: 0, scope: !59) -!68 = !DILocation(line: 8, column: 1, scope: !69) -!69 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!70 = !DILocation(line: 13, column: 1, scope: !69) -!71 = !DILocation(line: 18, column: 1, scope: !69) -!72 = !DILocation(line: 23, column: 1, scope: !69) -!73 = !DILocation(line: 7, column: 6, scope: !74) -!74 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_1", scope: !69, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!75 = !DILocation(line: 12, column: 6, scope: !76) -!76 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_2", scope: !69, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!77 = !DILocation(line: 17, column: 6, scope: !78) -!78 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_3", scope: !69, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!79 = !DILocation(line: 22, column: 6, scope: !80) -!80 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_4", scope: !69, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!81 = !DILocation(line: 7, column: 1, scope: !69) -!82 = !DILocation(line: 7, column: 26, scope: !74) -!83 = !DILocation(line: 7, column: 45, scope: !74) -!84 = !DILocation(line: 12, column: 1, scope: !69) -!85 = !DILocation(line: 12, column: 26, scope: !76) -!86 = !DILocation(line: 12, column: 45, scope: !76) -!87 = !DILocation(line: 17, column: 1, scope: !69) -!88 = !DILocation(line: 17, column: 26, scope: !78) -!89 = !DILocation(line: 22, column: 1, scope: !69) -!90 = !DILocation(line: 22, column: 26, scope: !80) -!91 = !DILocation(line: 5, column: 1, scope: !69) -!92 = !DILocation(line: 27, column: 3, scope: !69) -!93 = !DILocation(line: 27, column: 1, scope: !69) -!94 = !DILocation(line: 28, column: 3, scope: !69) -!95 = !DILocation(line: 28, column: 1, scope: !69) -!96 = !DILocation(line: 29, column: 3, scope: !69) -!97 = !DILocation(line: 29, column: 1, scope: !69) -!98 = !DILocation(line: 30, column: 3, scope: !69) -!99 = !DILocation(line: 30, column: 1, scope: !69) -!100 = !DILocation(line: 31, column: 3, scope: !69) -!101 = !DILocation(line: 31, column: 1, scope: !69) -!102 = !DILocation(line: 32, column: 3, scope: !69) -!103 = !DILocation(line: 32, column: 1, scope: !69) -!104 = !DILocation(line: 33, column: 3, scope: !69) -!105 = !DILocation(line: 33, column: 1, scope: !69) -!106 = !DILocation(line: 36, column: 3, scope: !69) -!107 = !DILocation(line: 36, column: 1, scope: !69) -!108 = !DILocation(line: 37, column: 13, scope: !69) -!109 = !DILocation(line: 37, column: 3, scope: !69) -!110 = !DILocation(line: 37, column: 1, scope: !69) -!111 = !DILocation(line: 38, column: 13, scope: !69) -!112 = !DILocation(line: 38, column: 3, scope: !69) -!113 = !DILocation(line: 38, column: 1, scope: !69) -!114 = !DILocation(line: 40, column: 3, scope: !69) -!115 = !DILocation(line: 40, column: 1, scope: !69) -!116 = !DILocation(line: 41, column: 15, scope: !69) -!117 = !DILocation(line: 41, column: 3, scope: !69) -!118 = !DILocation(line: 41, column: 1, scope: !69) -!119 = !DILocation(line: 42, column: 15, scope: !69) -!120 = !DILocation(line: 42, column: 3, scope: !69) -!121 = !DILocation(line: 42, column: 1, scope: !69) -!122 = !DILocation(line: 44, column: 3, scope: !69) -!123 = !DILocation(line: 44, column: 1, scope: !69) -!124 = !DILocation(line: 45, column: 12, scope: !69) -!125 = !DILocation(line: 45, column: 3, scope: !69) -!126 = !DILocation(line: 45, column: 1, scope: !69) -!127 = !DILocation(line: 47, column: 3, scope: !69) -!128 = !DILocation(line: 47, column: 1, scope: !69) -!129 = !DILocation(line: 48, column: 13, scope: !69) -!130 = !DILocation(line: 48, column: 3, scope: !69) -!131 = !DILocation(line: 48, column: 1, scope: !69) -!132 = !{!133, !5, i64 400} -!133 = !{!"rb_vm_struct", !5, i64 0, !134, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !137, i64 216, !6, i64 224, !135, i64 264, !135, i64 280, !135, i64 296, !135, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !138, i64 472, !139, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !135, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !140, i64 1200, !6, i64 1232} -!134 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !135, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!135 = !{!"list_head", !136, i64 0} -!136 = !{!"list_node", !13, i64 0, !13, i64 8} -!137 = !{!"long long", !6, i64 0} -!138 = !{!"", !6, i64 0} -!139 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!140 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!141 = !{!19, !13, i64 32} -!142 = !{!137, !137, i64 0} -!143 = !{!"branch_weights", i32 1, i32 10000} -!144 = !{!145, !16, i64 8} -!145 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!146 = !{!145, !16, i64 4} -!147 = !{!145, !13, i64 32} -!148 = distinct !DISubprogram(name: "func_Object#lt.cold.1", linkageName: "func_Object#lt.cold.1", scope: null, file: !2, type: !149, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!149 = !DISubroutineType(types: !3) -!150 = distinct !DISubprogram(name: "func_Object#lt.cold.2", linkageName: "func_Object#lt.cold.2", scope: null, file: !2, type: !149, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!151 = !DILocation(line: 18, column: 8, scope: !150) +!18 = !DILocation(line: 8, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 4001, i32 4000000} +!20 = !DILocation(line: 8, column: 10, scope: !8) +!21 = !{!"branch_weights", i32 1073205, i32 2146410443} +!22 = !{!23, !5, i64 0} +!23 = !{!"RBasic", !5, i64 0, !5, i64 8} +!24 = !{!"branch_weights", i32 2000, i32 1} +!25 = !DILocation(line: 8, column: 13, scope: !8) +!26 = !DILocation(line: 9, column: 3, scope: !8) +!27 = !{!28} +!28 = distinct !{!28, !29, !"sorbet_int_rb_float_plus: argument 0"} +!29 = distinct !{!29, !"sorbet_int_rb_float_plus"} +!30 = distinct !DISubprogram(name: "Object#minus", linkageName: "func_Object#minus", scope: null, file: !2, line: 13, type: !9, scopeLine: 13, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!31 = !DILocation(line: 13, column: 1, scope: !30) +!32 = !DILocation(line: 13, column: 11, scope: !30) +!33 = !DILocation(line: 13, column: 14, scope: !30) +!34 = !DILocation(line: 14, column: 3, scope: !30) +!35 = !{!36, !13, i64 8} +!36 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!37 = distinct !DISubprogram(name: "Object#lt", linkageName: "func_Object#lt", scope: null, file: !2, line: 18, type: !9, scopeLine: 18, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!38 = !DILocation(line: 18, column: 1, scope: !37) +!39 = !DILocation(line: 18, column: 8, scope: !37) +!40 = !DILocation(line: 18, column: 11, scope: !37) +!41 = !DILocation(line: 19, column: 3, scope: !37) +!42 = !{!43} +!43 = distinct !{!43, !44, !"sorbet_int_flo_lt: argument 0"} +!44 = distinct !{!44, !"sorbet_int_flo_lt"} +!45 = !{!"branch_weights", i32 1, i32 2001, i32 2000} +!46 = !DILocation(line: 0, scope: !37) +!47 = distinct !DISubprogram(name: "Object#lte", linkageName: "func_Object#lte", scope: null, file: !2, line: 23, type: !9, scopeLine: 23, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!48 = !DILocation(line: 23, column: 1, scope: !47) +!49 = !DILocation(line: 23, column: 9, scope: !47) +!50 = !DILocation(line: 23, column: 12, scope: !47) +!51 = !DILocation(line: 24, column: 3, scope: !47) +!52 = !{!53} +!53 = distinct !{!53, !54, !"sorbet_int_flo_le: argument 0"} +!54 = distinct !{!54, !"sorbet_int_flo_le"} +!55 = !DILocation(line: 0, scope: !47) +!56 = !DILocation(line: 8, column: 1, scope: !57) +!57 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!58 = !DILocation(line: 13, column: 1, scope: !57) +!59 = !DILocation(line: 18, column: 1, scope: !57) +!60 = !DILocation(line: 23, column: 1, scope: !57) +!61 = !DILocation(line: 7, column: 6, scope: !62) +!62 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_1", scope: !57, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!63 = !DILocation(line: 12, column: 6, scope: !64) +!64 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_2", scope: !57, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!65 = !DILocation(line: 17, column: 6, scope: !66) +!66 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_3", scope: !57, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!67 = !DILocation(line: 22, column: 6, scope: !68) +!68 = distinct !DISubprogram(name: ".", linkageName: "func_.$152$block_4", scope: !57, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!69 = !DILocation(line: 7, column: 1, scope: !57) +!70 = !DILocation(line: 7, column: 26, scope: !62) +!71 = !DILocation(line: 7, column: 45, scope: !62) +!72 = !DILocation(line: 12, column: 1, scope: !57) +!73 = !DILocation(line: 12, column: 26, scope: !64) +!74 = !DILocation(line: 12, column: 45, scope: !64) +!75 = !DILocation(line: 17, column: 1, scope: !57) +!76 = !DILocation(line: 17, column: 26, scope: !66) +!77 = !DILocation(line: 22, column: 1, scope: !57) +!78 = !DILocation(line: 22, column: 26, scope: !68) +!79 = !DILocation(line: 5, column: 1, scope: !57) +!80 = !DILocation(line: 27, column: 3, scope: !57) +!81 = !DILocation(line: 27, column: 1, scope: !57) +!82 = !DILocation(line: 28, column: 3, scope: !57) +!83 = !DILocation(line: 28, column: 1, scope: !57) +!84 = !DILocation(line: 29, column: 3, scope: !57) +!85 = !DILocation(line: 29, column: 1, scope: !57) +!86 = !DILocation(line: 30, column: 3, scope: !57) +!87 = !DILocation(line: 30, column: 1, scope: !57) +!88 = !DILocation(line: 31, column: 3, scope: !57) +!89 = !DILocation(line: 31, column: 1, scope: !57) +!90 = !DILocation(line: 32, column: 3, scope: !57) +!91 = !DILocation(line: 32, column: 1, scope: !57) +!92 = !DILocation(line: 33, column: 3, scope: !57) +!93 = !DILocation(line: 33, column: 1, scope: !57) +!94 = !DILocation(line: 36, column: 3, scope: !57) +!95 = !DILocation(line: 36, column: 1, scope: !57) +!96 = !DILocation(line: 37, column: 13, scope: !57) +!97 = !DILocation(line: 37, column: 3, scope: !57) +!98 = !DILocation(line: 37, column: 1, scope: !57) +!99 = !DILocation(line: 38, column: 13, scope: !57) +!100 = !DILocation(line: 38, column: 3, scope: !57) +!101 = !DILocation(line: 38, column: 1, scope: !57) +!102 = !DILocation(line: 40, column: 3, scope: !57) +!103 = !DILocation(line: 40, column: 1, scope: !57) +!104 = !DILocation(line: 41, column: 15, scope: !57) +!105 = !DILocation(line: 41, column: 3, scope: !57) +!106 = !DILocation(line: 41, column: 1, scope: !57) +!107 = !DILocation(line: 42, column: 15, scope: !57) +!108 = !DILocation(line: 42, column: 3, scope: !57) +!109 = !DILocation(line: 42, column: 1, scope: !57) +!110 = !DILocation(line: 44, column: 3, scope: !57) +!111 = !DILocation(line: 44, column: 1, scope: !57) +!112 = !DILocation(line: 45, column: 12, scope: !57) +!113 = !DILocation(line: 45, column: 3, scope: !57) +!114 = !DILocation(line: 45, column: 1, scope: !57) +!115 = !DILocation(line: 47, column: 3, scope: !57) +!116 = !DILocation(line: 47, column: 1, scope: !57) +!117 = !DILocation(line: 48, column: 13, scope: !57) +!118 = !DILocation(line: 48, column: 3, scope: !57) +!119 = !DILocation(line: 48, column: 1, scope: !57) +!120 = !{!121, !5, i64 400} +!121 = !{!"rb_vm_struct", !5, i64 0, !122, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !125, i64 216, !6, i64 224, !123, i64 264, !123, i64 280, !123, i64 296, !123, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !126, i64 472, !127, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !123, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !128, i64 1200, !6, i64 1232} +!122 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !123, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!123 = !{!"list_head", !124, i64 0} +!124 = !{!"list_node", !13, i64 0, !13, i64 8} +!125 = !{!"long long", !6, i64 0} +!126 = !{!"", !6, i64 0} +!127 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!128 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!129 = !{!36, !13, i64 16} +!130 = !{!36, !13, i64 32} +!131 = !{!125, !125, i64 0} +!132 = !{!"branch_weights", i32 1, i32 10000} +!133 = !{!134, !16, i64 8} +!134 = !{!"rb_sorbet_param_struct", !135, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!135 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!136 = !{!134, !16, i64 4} +!137 = !{!134, !13, i64 32} +!138 = distinct !DISubprogram(name: "func_Object#lt.cold.1", linkageName: "func_Object#lt.cold.1", scope: null, file: !2, type: !139, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!139 = !DISubroutineType(types: !3) +!140 = distinct !DISubprogram(name: "func_Object#lt.cold.2", linkageName: "func_Object#lt.cold.2", scope: null, file: !2, type: !139, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!141 = !DILocation(line: 18, column: 8, scope: !140) diff --git a/test/testdata/compiler/globalfields.llo.exp b/test/testdata/compiler/globalfields.llo.exp index ce4b9ca1807..5d2520e870b 100644 --- a/test/testdata/compiler/globalfields.llo.exp +++ b/test/testdata/compiler/globalfields.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -89,6 +91,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/globalfields.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/globalfields.rb" = private unnamed_addr constant [39 x i8] c"test/testdata/compiler/globalfields.rb\00", align 1 +@iseqEncodedArray = internal global [20 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_new = internal unnamed_addr global i64 0, align 8 @@ -128,7 +132,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -231,9 +237,11 @@ entry: %10 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([39 x i8], [39 x i8]* @"str_test/testdata/compiler/globalfields.rb", i64 0, i64 0), i64 noundef 38) #13 tail call void @rb_gc_register_mark_object(i64 %10) #13 store i64 %10, i64* @"rubyStrFrozen_test/testdata/compiler/globalfields.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 20) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %10, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 19, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/globalfields.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/globalfields.rb", align 8 + %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %11, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !15 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !15 @@ -256,18 +264,18 @@ entry: call void @rb_gc_register_mark_object(i64 %13) #13 %rubyId_write.i.i = load i64, i64* @rubyIdPrecomputed_write, align 8 %"rubyStr_test/testdata/compiler/globalfields.rb.i15.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/globalfields.rb", align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_write.i.i, i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i15.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 6, i32 noundef 8, i64* noundef nonnull %locals.i16.i, i32 noundef 0, i32 noundef 0) + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_write.i.i, i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i15.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i16.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#write", align 8 %15 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0), i64 noundef 4) #13 call void @rb_gc_register_mark_object(i64 %15) #13 %rubyId_read.i.i = load i64, i64* @rubyIdPrecomputed_read, align 8 %"rubyStr_test/testdata/compiler/globalfields.rb.i17.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/globalfields.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_read.i.i, i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 9, i32 noundef 11, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 0) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_read.i.i, i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i17.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i18.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#read", align 8 %"rubyId_.i19.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i20.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/globalfields.rb.i21.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/globalfields.rb", align 8 - %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i20.i", i64 %"rubyId_.i19.i", i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i21.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i22.i, i32 noundef 0, i32 noundef 4) + %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i20.i", i64 %"rubyId_.i19.i", i64 %"rubyStr_test/testdata/compiler/globalfields.rb.i21.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i22.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %17, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !22 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !22 @@ -289,269 +297,225 @@ entry: store i64 %28, i64* %26, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %21, %struct.rb_control_frame_struct* align 8 %23, %struct.rb_iseq_struct* %stackFrame.i) #13 %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 0 - %30 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %24, align 8, !tbaa !39 - %31 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %30, i64 0, i32 2 - %32 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %31, align 8, !tbaa !42 - %33 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %32, i64 0, i32 2 - %34 = load i64*, i64** %33, align 8, !tbaa !44 - %35 = getelementptr inbounds i64, i64* %34, i64 4 - %36 = getelementptr inbounds i64, i64* %35, i64 1 - store i64* %36, i64** %29, align 8, !dbg !53, !tbaa !24 - %37 = load i64, i64* @rb_cObject, align 8, !dbg !54 - %38 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %37) #13, !dbg !54 - call void @sorbet_pushStaticInitFrame(i64 %38) #13, !dbg !54 - %39 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %39) #13 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %29, align 8, !dbg !42, !tbaa !24 + %30 = load i64, i64* @rb_cObject, align 8, !dbg !43 + %31 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %30) #13, !dbg !43 + call void @sorbet_pushStaticInitFrame(i64 %31) #13, !dbg !43 + %32 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %32) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %40 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !24 - %41 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %40, i64 0, i32 2 - %42 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %41, align 8, !tbaa !36 - %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %43, align 8, !tbaa !39 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 4 - %45 = load i64*, i64** %44, align 8, !tbaa !41 - %46 = load i64, i64* %45, align 8, !tbaa !4 - %47 = and i64 %46, -33 - store i64 %47, i64* %45, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %40, %struct.rb_control_frame_struct* align 8 %42, %struct.rb_iseq_struct* %stackFrame.i.i) #13 - %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 0 - %49 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %43, align 8, !tbaa !39 - %50 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %49, i64 0, i32 2 - %51 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %50, align 8, !tbaa !42 - %52 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %51, i64 0, i32 2 - %53 = load i64*, i64** %52, align 8, !tbaa !44 - %54 = getelementptr inbounds i64, i64* %53, i64 1 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !55 - store i64* %55, i64** %48, align 8, !dbg !55, !tbaa !24 + %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !24 + %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2 + %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !tbaa !36 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %36, align 8, !tbaa !39 + %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 4 + %38 = load i64*, i64** %37, align 8, !tbaa !41 + %39 = load i64, i64* %38, align 8, !tbaa !4 + %40 = and i64 %39, -33 + store i64 %40, i64* %38, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %33, %struct.rb_control_frame_struct* align 8 %35, %struct.rb_iseq_struct* %stackFrame.i.i) #13 + %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 0 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %41, align 8, !dbg !44, !tbaa !24 %rubyId_write.i.i1 = load i64, i64* @rubyIdPrecomputed_write, align 8, !dbg !8 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_write.i.i1) #13, !dbg !8 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym17.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !8 - %56 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 - %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !56 - %needTakeSlowPath = icmp ne i64 %56, %57, !dbg !8 - br i1 %needTakeSlowPath, label %58, label %59, !dbg !8, !prof !57 + %42 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 + %43 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !45 + %needTakeSlowPath = icmp ne i64 %42, %43, !dbg !8 + br i1 %needTakeSlowPath, label %44, label %45, !dbg !8, !prof !46 -58: ; preds = %entry +44: ; preds = %entry call void @const_recompute_A(), !dbg !8 - br label %59, !dbg !8 + br label %45, !dbg !8 -59: ; preds = %entry, %58 - %60 = load i64, i64* @guarded_const_A, align 8, !dbg !8 - %61 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 - %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !56 - %guardUpdated = icmp eq i64 %61, %62, !dbg !8 +45: ; preds = %entry, %44 + %46 = load i64, i64* @guarded_const_A, align 8, !dbg !8 + %47 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 + %48 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !45 + %guardUpdated = icmp eq i64 %47, %48, !dbg !8 call void @llvm.assume(i1 %guardUpdated), !dbg !8 %stackFrame18.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#write", align 8, !dbg !8 - %63 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !8 - %64 = bitcast i8* %63 to i16*, !dbg !8 - %65 = load i16, i16* %64, align 8, !dbg !8 - %66 = and i16 %65, -384, !dbg !8 - %67 = or i16 %66, 1, !dbg !8 - store i16 %67, i16* %64, align 8, !dbg !8 - %68 = getelementptr inbounds i8, i8* %63, i64 8, !dbg !8 - %69 = bitcast i8* %68 to i32*, !dbg !8 - store i32 1, i32* %69, align 8, !dbg !8, !tbaa !58 - %70 = getelementptr inbounds i8, i8* %63, i64 12, !dbg !8 - %71 = getelementptr inbounds i8, i8* %63, i64 4, !dbg !8 - %72 = bitcast i8* %71 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %70, i8 0, i64 20, i1 false) #13, !dbg !8 - store i32 1, i32* %72, align 4, !dbg !8, !tbaa !60 + %49 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !8 + %50 = bitcast i8* %49 to i16*, !dbg !8 + %51 = load i16, i16* %50, align 8, !dbg !8 + %52 = and i16 %51, -384, !dbg !8 + %53 = or i16 %52, 1, !dbg !8 + store i16 %53, i16* %50, align 8, !dbg !8 + %54 = getelementptr inbounds i8, i8* %49, i64 8, !dbg !8 + %55 = bitcast i8* %54 to i32*, !dbg !8 + store i32 1, i32* %55, align 8, !dbg !8, !tbaa !47 + %56 = getelementptr inbounds i8, i8* %49, i64 12, !dbg !8 + %57 = getelementptr inbounds i8, i8* %49, i64 4, !dbg !8 + %58 = bitcast i8* %57 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %56, i8 0, i64 20, i1 false) #13, !dbg !8 + store i32 1, i32* %58, align 4, !dbg !8, !tbaa !50 %rubyId_v.i.i = load i64, i64* @rubyIdPrecomputed_v, align 8, !dbg !8 store i64 %rubyId_v.i.i, i64* %positional_table.i.i, align 8, !dbg !8 - %73 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %73, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %39, i64 noundef 8, i1 noundef false) #13, !dbg !8 - %74 = getelementptr inbounds i8, i8* %63, i64 32, !dbg !8 - %75 = bitcast i8* %74 to i8**, !dbg !8 - store i8* %73, i8** %75, align 8, !dbg !8, !tbaa !61 - %76 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_write, i64 0, i64 0)) #13, !dbg !8 - %77 = bitcast i8* %63 to %struct.rb_sorbet_param_struct*, !dbg !8 - %78 = bitcast %struct.rb_iseq_struct* %stackFrame18.i.i to i8*, !dbg !8 - call void @rb_add_method_sorbet(i64 %60, i64 %76, i64 (i32, i64*, i64)* noundef @"func_A#write", %struct.rb_sorbet_param_struct* nonnull %77, i32 noundef 1, i8* %78) #13, !dbg !8 - %79 = getelementptr inbounds i64, i64* %53, i64 4, !dbg !8 - %80 = getelementptr inbounds i64, i64* %79, i64 1, !dbg !8 - store i64* %80, i64** %48, align 8, !dbg !8, !tbaa !24 - %rubyId_read.i.i2 = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !62 - %rawSym23.i.i = call i64 @rb_id2sym(i64 %rubyId_read.i.i2) #13, !dbg !62 - %rubyId_normal24.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !62 - %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal24.i.i) #13, !dbg !62 - %stackFrame30.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#read", align 8, !dbg !62 - %81 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !62 - %82 = bitcast i8* %81 to i16*, !dbg !62 - %83 = load i16, i16* %82, align 8, !dbg !62 - %84 = and i16 %83, -384, !dbg !62 - store i16 %84, i16* %82, align 8, !dbg !62 - %85 = getelementptr inbounds i8, i8* %81, i64 4, !dbg !62 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %85, i8 0, i64 28, i1 false) #13, !dbg !62 - %86 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0)) #13, !dbg !62 - %87 = bitcast i8* %81 to %struct.rb_sorbet_param_struct*, !dbg !62 - %88 = bitcast %struct.rb_iseq_struct* %stackFrame30.i.i to i8*, !dbg !62 - call void @rb_add_method_sorbet(i64 %60, i64 %86, i64 (i32, i64*, i64)* noundef @"func_A#read", %struct.rb_sorbet_param_struct* nonnull %87, i32 noundef 1, i8* %88) #13, !dbg !62 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %39) #13 - call void @sorbet_popRubyStack() #13, !dbg !54 - %89 = getelementptr inbounds i64, i64* %34, i64 13, !dbg !54 - %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !54 - store i64* %90, i64** %29, align 8, !dbg !54, !tbaa !24 - %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !24 - %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !15 - %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !15, !tbaa !36 - %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 1, !dbg !15 - %95 = load i64*, i64** %94, align 8, !dbg !15, !tbaa !63 - %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !15 - store i64* %96, i64** %94, align 8, !dbg !15, !tbaa !63 - store i64 %60, i64* %95, align 8, !dbg !15, !tbaa !4 + %59 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %59, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %32, i64 noundef 8, i1 noundef false) #13, !dbg !8 + %60 = getelementptr inbounds i8, i8* %49, i64 32, !dbg !8 + %61 = bitcast i8* %60 to i8**, !dbg !8 + store i8* %59, i8** %61, align 8, !dbg !8, !tbaa !51 + %62 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_write, i64 0, i64 0)) #13, !dbg !8 + %63 = bitcast i8* %49 to %struct.rb_sorbet_param_struct*, !dbg !8 + %64 = bitcast %struct.rb_iseq_struct* %stackFrame18.i.i to i8*, !dbg !8 + call void @rb_add_method_sorbet(i64 %46, i64 %62, i64 (i32, i64*, i64)* noundef @"func_A#write", %struct.rb_sorbet_param_struct* nonnull %63, i32 noundef 1, i8* %64) #13, !dbg !8 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %41, align 8, !dbg !8, !tbaa !24 + %rubyId_read.i.i2 = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !52 + %rawSym23.i.i = call i64 @rb_id2sym(i64 %rubyId_read.i.i2) #13, !dbg !52 + %rubyId_normal24.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !52 + %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal24.i.i) #13, !dbg !52 + %stackFrame30.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#read", align 8, !dbg !52 + %65 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !52 + %66 = bitcast i8* %65 to i16*, !dbg !52 + %67 = load i16, i16* %66, align 8, !dbg !52 + %68 = and i16 %67, -384, !dbg !52 + store i16 %68, i16* %66, align 8, !dbg !52 + %69 = getelementptr inbounds i8, i8* %65, i64 4, !dbg !52 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %69, i8 0, i64 28, i1 false) #13, !dbg !52 + %70 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0)) #13, !dbg !52 + %71 = bitcast i8* %65 to %struct.rb_sorbet_param_struct*, !dbg !52 + %72 = bitcast %struct.rb_iseq_struct* %stackFrame30.i.i to i8*, !dbg !52 + call void @rb_add_method_sorbet(i64 %46, i64 %70, i64 (i32, i64*, i64)* noundef @"func_A#read", %struct.rb_sorbet_param_struct* nonnull %71, i32 noundef 1, i8* %72) #13, !dbg !52 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %32) #13 + call void @sorbet_popRubyStack() #13, !dbg !43 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %29, align 8, !dbg !43, !tbaa !24 + %73 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !24 + %74 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %73, i64 0, i32 2, !dbg !15 + %75 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %74, align 8, !dbg !15, !tbaa !36 + %76 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %75, i64 0, i32 1, !dbg !15 + %77 = load i64*, i64** %76, align 8, !dbg !15, !tbaa !53 + %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !15 + store i64* %78, i64** %76, align 8, !dbg !15, !tbaa !53 + store i64 %46, i64* %77, align 8, !dbg !15, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #13, !dbg !15 - %97 = getelementptr inbounds i64, i64* %34, i64 14, !dbg !15 - %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !15 - store i64* %98, i64** %29, align 8, !dbg !15, !tbaa !24 - %99 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !24 - %100 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %99, i64 0, i32 2, !dbg !16 - %101 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %100, align 8, !dbg !16, !tbaa !36 - %102 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %101, i64 0, i32 1, !dbg !16 - %103 = load i64*, i64** %102, align 8, !dbg !16, !tbaa !63 - %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !16 - store i64* %104, i64** %102, align 8, !dbg !16, !tbaa !63 - store i64 %send.i, i64* %103, align 8, !dbg !16, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %29, align 8, !dbg !15, !tbaa !24 + %79 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !24 + %80 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %79, i64 0, i32 2, !dbg !16 + %81 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %80, align 8, !dbg !16, !tbaa !36 + %82 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %81, i64 0, i32 1, !dbg !16 + %83 = load i64*, i64** %82, align 8, !dbg !16, !tbaa !53 + %84 = getelementptr inbounds i64, i64* %83, i64 1, !dbg !16 + store i64* %84, i64** %82, align 8, !dbg !16, !tbaa !53 + store i64 %send.i, i64* %83, align 8, !dbg !16, !tbaa !4 %send32.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read, i64 0) #13, !dbg !16 - %105 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !24 - %106 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %105, i64 0, i32 2, !dbg !17 - %107 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %106, align 8, !dbg !17, !tbaa !36 - %108 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 1, !dbg !17 - %109 = load i64*, i64** %108, align 8, !dbg !17, !tbaa !63 - %110 = getelementptr inbounds i64, i64* %109, i64 1, !dbg !17 - store i64 %20, i64* %109, align 8, !dbg !17, !tbaa !4 - %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !17 - store i64* %111, i64** %108, align 8, !dbg !17, !tbaa !63 - store i64 %send32.i, i64* %110, align 8, !dbg !17, !tbaa !4 + %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !24 + %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2, !dbg !17 + %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !dbg !17, !tbaa !36 + %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 1, !dbg !17 + %89 = load i64*, i64** %88, align 8, !dbg !17, !tbaa !53 + %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !17 + store i64 %20, i64* %89, align 8, !dbg !17, !tbaa !4 + %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !17 + store i64* %91, i64** %88, align 8, !dbg !17, !tbaa !53 + store i64 %send32.i, i64* %90, align 8, !dbg !17, !tbaa !4 %send38.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !17 - %112 = getelementptr inbounds i64, i64* %34, i64 15, !dbg !17 - %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !17 - store i64* %113, i64** %29, align 8, !dbg !17, !tbaa !24 - %rubyStr_value.i = load i64, i64* @rubyStrFrozen_value, align 8, !dbg !64 - %114 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !24 - %115 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %114, i64 0, i32 2, !dbg !18 - %116 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %115, align 8, !dbg !18, !tbaa !36 - %117 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %116, i64 0, i32 1, !dbg !18 - %118 = load i64*, i64** %117, align 8, !dbg !18, !tbaa !63 - %119 = getelementptr inbounds i64, i64* %118, i64 1, !dbg !18 - store i64 %send.i, i64* %118, align 8, !dbg !18, !tbaa !4 - %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !18 - store i64* %120, i64** %117, align 8, !dbg !18, !tbaa !63 - store i64 %rubyStr_value.i, i64* %119, align 8, !dbg !18, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %29, align 8, !dbg !17, !tbaa !24 + %rubyStr_value.i = load i64, i64* @rubyStrFrozen_value, align 8, !dbg !54 + %92 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !24 + %93 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %92, i64 0, i32 2, !dbg !18 + %94 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %93, align 8, !dbg !18, !tbaa !36 + %95 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %94, i64 0, i32 1, !dbg !18 + %96 = load i64*, i64** %95, align 8, !dbg !18, !tbaa !53 + %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !18 + store i64 %send.i, i64* %96, align 8, !dbg !18, !tbaa !4 + %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !18 + store i64* %98, i64** %95, align 8, !dbg !18, !tbaa !53 + store i64 %rubyStr_value.i, i64* %97, align 8, !dbg !18, !tbaa !4 %send44.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_write, i64 0) #13, !dbg !18 - %121 = getelementptr inbounds i64, i64* %34, i64 16, !dbg !18 - %122 = getelementptr inbounds i64, i64* %121, i64 1, !dbg !18 - store i64* %122, i64** %29, align 8, !dbg !18, !tbaa !24 - %123 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !24 - %124 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %123, i64 0, i32 2, !dbg !19 - %125 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %124, align 8, !dbg !19, !tbaa !36 - %126 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %125, i64 0, i32 1, !dbg !19 - %127 = load i64*, i64** %126, align 8, !dbg !19, !tbaa !63 - %128 = getelementptr inbounds i64, i64* %127, i64 1, !dbg !19 - store i64* %128, i64** %126, align 8, !dbg !19, !tbaa !63 - store i64 %send.i, i64* %127, align 8, !dbg !19, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %29, align 8, !dbg !18, !tbaa !24 + %99 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !24 + %100 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %99, i64 0, i32 2, !dbg !19 + %101 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %100, align 8, !dbg !19, !tbaa !36 + %102 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %101, i64 0, i32 1, !dbg !19 + %103 = load i64*, i64** %102, align 8, !dbg !19, !tbaa !53 + %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !19 + store i64* %104, i64** %102, align 8, !dbg !19, !tbaa !53 + store i64 %send.i, i64* %103, align 8, !dbg !19, !tbaa !4 %send50.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read.1, i64 0) #13, !dbg !19 - %129 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !24 - %130 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %129, i64 0, i32 2, !dbg !20 - %131 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %130, align 8, !dbg !20, !tbaa !36 - %132 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %131, i64 0, i32 1, !dbg !20 - %133 = load i64*, i64** %132, align 8, !dbg !20, !tbaa !63 - %134 = getelementptr inbounds i64, i64* %133, i64 1, !dbg !20 - store i64 %20, i64* %133, align 8, !dbg !20, !tbaa !4 - %135 = getelementptr inbounds i64, i64* %134, i64 1, !dbg !20 - store i64* %135, i64** %132, align 8, !dbg !20, !tbaa !63 - store i64 %send50.i, i64* %134, align 8, !dbg !20, !tbaa !4 + %105 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !24 + %106 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %105, i64 0, i32 2, !dbg !20 + %107 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %106, align 8, !dbg !20, !tbaa !36 + %108 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 1, !dbg !20 + %109 = load i64*, i64** %108, align 8, !dbg !20, !tbaa !53 + %110 = getelementptr inbounds i64, i64* %109, i64 1, !dbg !20 + store i64 %20, i64* %109, align 8, !dbg !20, !tbaa !4 + %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !20 + store i64* %111, i64** %108, align 8, !dbg !20, !tbaa !53 + store i64 %send50.i, i64* %110, align 8, !dbg !20, !tbaa !4 %send57.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0) #13, !dbg !20 - %136 = getelementptr inbounds i64, i64* %34, i64 17, !dbg !20 - %137 = getelementptr inbounds i64, i64* %136, i64 1, !dbg !20 - store i64* %137, i64** %29, align 8, !dbg !20, !tbaa !24 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %29, align 8, !dbg !20, !tbaa !24 %"rubyId_$f.i" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !21 - %138 = call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f.i") #13, !dbg !21 - %139 = call i64 @rb_gvar_get(%struct.rb_global_entry* %138) #13, !dbg !21 - %140 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !24 - %141 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %140, i64 0, i32 2, !dbg !21 - %142 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %141, align 8, !dbg !21, !tbaa !36 - %143 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %142, i64 0, i32 1, !dbg !21 - %144 = load i64*, i64** %143, align 8, !dbg !21, !tbaa !63 - %145 = getelementptr inbounds i64, i64* %144, i64 1, !dbg !21 - store i64 %20, i64* %144, align 8, !dbg !21, !tbaa !4 - %146 = getelementptr inbounds i64, i64* %145, i64 1, !dbg !21 - store i64* %146, i64** %143, align 8, !dbg !21, !tbaa !63 - store i64 %139, i64* %145, align 8, !dbg !21, !tbaa !4 + %112 = call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f.i") #13, !dbg !21 + %113 = call i64 @rb_gvar_get(%struct.rb_global_entry* %112) #13, !dbg !21 + %114 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !24 + %115 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %114, i64 0, i32 2, !dbg !21 + %116 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %115, align 8, !dbg !21, !tbaa !36 + %117 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %116, i64 0, i32 1, !dbg !21 + %118 = load i64*, i64** %117, align 8, !dbg !21, !tbaa !53 + %119 = getelementptr inbounds i64, i64* %118, i64 1, !dbg !21 + store i64 %20, i64* %118, align 8, !dbg !21, !tbaa !4 + %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !21 + store i64* %120, i64** %117, align 8, !dbg !21, !tbaa !53 + store i64 %113, i64* %119, align 8, !dbg !21, !tbaa !4 %send63.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0) #13, !dbg !21 - %147 = getelementptr inbounds i64, i64* %34, i64 18, !dbg !21 - %148 = getelementptr inbounds i64, i64* %147, i64 1, !dbg !21 - store i64* %148, i64** %29, align 8, !dbg !21, !tbaa !24 - %149 = call i64 @sorbet_setConstant(i64 %37, i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_F, i64 0, i64 0), i64 noundef 1, i64 noundef 3) #13, !dbg !65 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %29, align 8, !dbg !21, !tbaa !24 + %121 = call i64 @sorbet_setConstant(i64 %30, i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_F, i64 0, i64 0), i64 noundef 1, i64 noundef 3) #13, !dbg !55 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_A#write"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !66 { +define i64 @"func_A#write"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !56 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !24 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !36 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !39 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !42 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !44 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !24 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !67 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !67 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !67 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !67, !prof !68 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !tbaa !24 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !57 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !57 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !57 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !57, !prof !58 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !67 - unreachable, !dbg !67 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !57 + unreachable, !dbg !57 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_v = load i64, i64* %argArray, align 8, !dbg !67 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !69 - store i64* %11, i64** %3, align 8, !dbg !69, !tbaa !24 - %"rubyId_$f" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !70 - %12 = tail call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f") #13, !dbg !70 - %13 = tail call i64 @rb_gvar_set(%struct.rb_global_entry* %12, i64 %rawArg_v) #13, !dbg !70 - %"rubyId_$f7" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !71 - %14 = tail call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f7") #13, !dbg !71 - %15 = tail call i64 @rb_gvar_get(%struct.rb_global_entry* %14) #13, !dbg !71 - ret i64 %15 + %rawArg_v = load i64, i64* %argArray, align 8, !dbg !57 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !dbg !59, !tbaa !24 + %"rubyId_$f" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !60 + %4 = tail call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f") #13, !dbg !60 + %5 = tail call i64 @rb_gvar_set(%struct.rb_global_entry* %4, i64 %rawArg_v) #13, !dbg !60 + %"rubyId_$f7" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !61 + %6 = tail call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f7") #13, !dbg !61 + %7 = tail call i64 @rb_gvar_get(%struct.rb_global_entry* %6) #13, !dbg !61 + ret i64 %7 } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_A#read"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !72 { +define i64 @"func_A#read"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !62 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !24 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !36 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !39 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !42 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !44 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !24 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !73 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !73, !prof !74 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !tbaa !24 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !63 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !63, !prof !64 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !73 - unreachable, !dbg !73 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !63 + unreachable, !dbg !63 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !75 - store i64* %11, i64** %3, align 8, !dbg !75, !tbaa !24 - %"rubyId_$f" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !76 - %12 = tail call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f") #13, !dbg !76 - %13 = tail call i64 @rb_gvar_get(%struct.rb_global_entry* %12) #13, !dbg !76 - ret i64 %13 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !dbg !65, !tbaa !24 + %"rubyId_$f" = load i64, i64* @"rubyIdPrecomputed_$f", align 8, !dbg !66 + %4 = tail call %struct.rb_global_entry* @rb_global_entry(i64 %"rubyId_$f") #13, !dbg !66 + %5 = tail call i64 @rb_gvar_get(%struct.rb_global_entry* %4) #13, !dbg !66 + ret i64 %5 } ; Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly @@ -570,7 +534,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @const_recompute_A() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !56 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !45 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -635,38 +599,28 @@ attributes #13 = { nounwind } !39 = !{!40, !25, i64 16} !40 = !{!"rb_control_frame_struct", !25, i64 0, !25, i64 8, !25, i64 16, !5, i64 24, !25, i64 32, !25, i64 40, !25, i64 48} !41 = !{!40, !25, i64 32} -!42 = !{!43, !25, i64 16} -!43 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !25, i64 16, !6, i64 24} -!44 = !{!45, !25, i64 8} -!45 = !{!"rb_iseq_constant_body", !6, i64 0, !31, i64 4, !25, i64 8, !46, i64 16, !48, i64 64, !51, i64 120, !25, i64 152, !25, i64 160, !25, i64 168, !25, i64 176, !25, i64 184, !25, i64 192, !52, i64 200, !31, i64 232, !31, i64 236, !31, i64 240, !31, i64 244, !31, i64 248, !6, i64 252, !5, i64 256} -!46 = !{!"", !47, i64 0, !31, i64 4, !31, i64 8, !31, i64 12, !31, i64 16, !31, i64 20, !31, i64 24, !31, i64 28, !25, i64 32, !25, i64 40} -!47 = !{!"", !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 1, !31, i64 1} -!48 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !31, i64 32, !49, i64 36} -!49 = !{!"rb_code_location_struct", !50, i64 0, !50, i64 8} -!50 = !{!"rb_code_position_struct", !31, i64 0, !31, i64 4} -!51 = !{!"iseq_insn_info", !25, i64 0, !25, i64 8, !31, i64 16, !25, i64 24} -!52 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !25, i64 24} -!53 = !DILocation(line: 0, scope: !14) -!54 = !DILocation(line: 5, column: 1, scope: !14) -!55 = !DILocation(line: 0, scope: !9, inlinedAt: !13) -!56 = !{!32, !32, i64 0} -!57 = !{!"branch_weights", i32 1, i32 10000} -!58 = !{!59, !31, i64 8} -!59 = !{!"rb_sorbet_param_struct", !47, i64 0, !31, i64 4, !31, i64 8, !31, i64 12, !31, i64 16, !31, i64 20, !31, i64 24, !31, i64 28, !25, i64 32, !31, i64 40, !31, i64 44, !31, i64 48, !31, i64 52, !25, i64 56} -!60 = !{!59, !31, i64 4} -!61 = !{!59, !25, i64 32} -!62 = !DILocation(line: 9, column: 3, scope: !9, inlinedAt: !13) -!63 = !{!40, !25, i64 8} -!64 = !DILocation(line: 16, column: 9, scope: !14) -!65 = !DILocation(line: 19, column: 5, scope: !14) -!66 = distinct !DISubprogram(name: "A#write", linkageName: "func_A#write", scope: null, file: !2, line: 6, type: !10, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!67 = !DILocation(line: 6, column: 3, scope: !66) -!68 = !{!"branch_weights", i32 4001, i32 4000000} -!69 = !DILocation(line: 6, column: 13, scope: !66) -!70 = !DILocation(line: 7, column: 10, scope: !66) -!71 = !DILocation(line: 7, column: 5, scope: !66) -!72 = distinct !DISubprogram(name: "A#read", linkageName: "func_A#read", scope: null, file: !2, line: 9, type: !10, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!73 = !DILocation(line: 9, column: 3, scope: !72) -!74 = !{!"branch_weights", i32 1, i32 2000} -!75 = !DILocation(line: 0, scope: !72) -!76 = !DILocation(line: 10, column: 5, scope: !72) +!42 = !DILocation(line: 0, scope: !14) +!43 = !DILocation(line: 5, column: 1, scope: !14) +!44 = !DILocation(line: 0, scope: !9, inlinedAt: !13) +!45 = !{!32, !32, i64 0} +!46 = !{!"branch_weights", i32 1, i32 10000} +!47 = !{!48, !31, i64 8} +!48 = !{!"rb_sorbet_param_struct", !49, i64 0, !31, i64 4, !31, i64 8, !31, i64 12, !31, i64 16, !31, i64 20, !31, i64 24, !31, i64 28, !25, i64 32, !31, i64 40, !31, i64 44, !31, i64 48, !31, i64 52, !25, i64 56} +!49 = !{!"", !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 0, !31, i64 1, !31, i64 1} +!50 = !{!48, !31, i64 4} +!51 = !{!48, !25, i64 32} +!52 = !DILocation(line: 9, column: 3, scope: !9, inlinedAt: !13) +!53 = !{!40, !25, i64 8} +!54 = !DILocation(line: 16, column: 9, scope: !14) +!55 = !DILocation(line: 19, column: 5, scope: !14) +!56 = distinct !DISubprogram(name: "A#write", linkageName: "func_A#write", scope: null, file: !2, line: 6, type: !10, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!57 = !DILocation(line: 6, column: 3, scope: !56) +!58 = !{!"branch_weights", i32 4001, i32 4000000} +!59 = !DILocation(line: 6, column: 13, scope: !56) +!60 = !DILocation(line: 7, column: 10, scope: !56) +!61 = !DILocation(line: 7, column: 5, scope: !56) +!62 = distinct !DISubprogram(name: "A#read", linkageName: "func_A#read", scope: null, file: !2, line: 9, type: !10, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!63 = !DILocation(line: 9, column: 3, scope: !62) +!64 = !{!"branch_weights", i32 1, i32 2000} +!65 = !DILocation(line: 0, scope: !62) +!66 = !DILocation(line: 10, column: 5, scope: !62) diff --git a/test/testdata/compiler/hashes.llo.exp b/test/testdata/compiler/hashes.llo.exp index 092fe312f01..fbdcefa4407 100644 --- a/test/testdata/compiler/hashes.llo.exp +++ b/test/testdata/compiler/hashes.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,7 +85,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/hashes.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/hashes.rb" = private unnamed_addr constant [33 x i8] c"test/testdata/compiler/hashes.rb\00", align 1 +@iseqEncodedArray = internal global [5 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @rubyIdPrecomputed_a = internal unnamed_addr global i64 0, align 8 @str_a = private unnamed_addr constant [2 x i8] c"a\00", align 1 @rubyIdPrecomputed_b = internal unnamed_addr global i64 0, align 8 @@ -93,7 +98,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -164,9 +171,12 @@ entry: store i64 %4, i64* @"rubyStrFrozen_", align 8 %5 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([33 x i8], [33 x i8]* @"str_test/testdata/compiler/hashes.rb", i64 0, i64 0), i64 noundef 32) #9 tail call void @rb_gc_register_mark_object(i64 %5) #9 + store i64 %5, i64* @"rubyStrFrozen_test/testdata/compiler/hashes.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 5) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %5, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 4, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 5) + %"rubyStr_test/testdata/compiler/hashes.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/hashes.rb", align 8 + %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/hashes.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 5) store %struct.rb_iseq_struct* %6, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %7 = bitcast [4 x i64]* %argArray.i.i to i8* call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %7) @@ -206,30 +216,23 @@ entry: store i64 %21, i64* %19, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %14, %struct.rb_control_frame_struct* align 8 %16, %struct.rb_iseq_struct* %stackFrame.i) #9 %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 0 - %23 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %17, align 8, !tbaa !28 - %24 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %23, i64 0, i32 2 - %25 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %24, align 8, !tbaa !31 - %26 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %25, i64 0, i32 2 - %27 = load i64*, i64** %26, align 8, !tbaa !33 - %28 = getelementptr inbounds i64, i64* %27, i64 3 - %29 = getelementptr inbounds i64, i64* %28, i64 1 - store i64* %29, i64** %22, align 8, !dbg !42, !tbaa !13 - %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !43 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_a.i) #9, !dbg !43 - %rubyId_b.i = load i64, i64* @rubyIdPrecomputed_b, align 8, !dbg !44 - %rawSym12.i = call i64 @rb_id2sym(i64 %rubyId_b.i) #9, !dbg !44 - %hashLiteral.i = load i64, i64* @ruby_hashLiteral1, align 8, !dbg !45 - %duplicatedHash.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral.i) #9, !dbg !45 - %30 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !13 - %31 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %30, i64 0, i32 2, !dbg !8 - %32 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %31, align 8, !dbg !8, !tbaa !25 - %33 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 1, !dbg !8 - %34 = load i64*, i64** %33, align 8, !dbg !8, !tbaa !46 - %35 = getelementptr inbounds i64, i64* %34, i64 1, !dbg !8 - store i64 %13, i64* %34, align 8, !dbg !8, !tbaa !4 - %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !8 - store i64* %36, i64** %33, align 8, !dbg !8, !tbaa !46 - store i64 %duplicatedHash.i, i64* %35, align 8, !dbg !8, !tbaa !4 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %22, align 8, !dbg !31, !tbaa !13 + %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !32 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_a.i) #9, !dbg !32 + %rubyId_b.i = load i64, i64* @rubyIdPrecomputed_b, align 8, !dbg !33 + %rawSym12.i = call i64 @rb_id2sym(i64 %rubyId_b.i) #9, !dbg !33 + %hashLiteral.i = load i64, i64* @ruby_hashLiteral1, align 8, !dbg !34 + %duplicatedHash.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral.i) #9, !dbg !34 + %23 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !13 + %24 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %23, i64 0, i32 2, !dbg !8 + %25 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %24, align 8, !dbg !8, !tbaa !25 + %26 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %25, i64 0, i32 1, !dbg !8 + %27 = load i64*, i64** %26, align 8, !dbg !8, !tbaa !35 + %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !8 + store i64 %13, i64* %27, align 8, !dbg !8, !tbaa !4 + %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !8 + store i64* %29, i64** %26, align 8, !dbg !8, !tbaa !35 + store i64 %duplicatedHash.i, i64* %28, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #9, !dbg !8 ret void } @@ -285,19 +288,8 @@ attributes #9 = { nounwind } !28 = !{!29, !14, i64 16} !29 = !{!"rb_control_frame_struct", !14, i64 0, !14, i64 8, !14, i64 16, !5, i64 24, !14, i64 32, !14, i64 40, !14, i64 48} !30 = !{!29, !14, i64 32} -!31 = !{!32, !14, i64 16} -!32 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !14, i64 16, !6, i64 24} -!33 = !{!34, !14, i64 8} -!34 = !{!"rb_iseq_constant_body", !6, i64 0, !20, i64 4, !14, i64 8, !35, i64 16, !37, i64 64, !40, i64 120, !14, i64 152, !14, i64 160, !14, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !41, i64 200, !20, i64 232, !20, i64 236, !20, i64 240, !20, i64 244, !20, i64 248, !6, i64 252, !5, i64 256} -!35 = !{!"", !36, i64 0, !20, i64 4, !20, i64 8, !20, i64 12, !20, i64 16, !20, i64 20, !20, i64 24, !20, i64 28, !14, i64 32, !14, i64 40} -!36 = !{!"", !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 1, !20, i64 1} -!37 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !20, i64 32, !38, i64 36} -!38 = !{!"rb_code_location_struct", !39, i64 0, !39, i64 8} -!39 = !{!"rb_code_position_struct", !20, i64 0, !20, i64 4} -!40 = !{!"iseq_insn_info", !14, i64 0, !14, i64 8, !20, i64 16, !14, i64 24} -!41 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !14, i64 24} -!42 = !DILocation(line: 0, scope: !9) -!43 = !DILocation(line: 4, column: 7, scope: !9) -!44 = !DILocation(line: 4, column: 13, scope: !9) -!45 = !DILocation(line: 4, column: 6, scope: !9) -!46 = !{!29, !14, i64 8} +!31 = !DILocation(line: 0, scope: !9) +!32 = !DILocation(line: 4, column: 7, scope: !9) +!33 = !DILocation(line: 4, column: 13, scope: !9) +!34 = !DILocation(line: 4, column: 6, scope: !9) +!35 = !{!29, !14, i64 8} diff --git a/test/testdata/compiler/hello.llo.exp b/test/testdata/compiler/hello.llo.exp index 148d0ecd8a7..2da76694cde 100644 --- a/test/testdata/compiler/hello.llo.exp +++ b/test/testdata/compiler/hello.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,14 +85,19 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/hello.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/hello.rb" = private unnamed_addr constant [32 x i8] c"test/testdata/compiler/hello.rb\00", align 1 +@iseqEncodedArray = internal global [5 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"rubyStrFrozen_hello world" = internal unnamed_addr global i64 0, align 8 @"str_hello world" = private unnamed_addr constant [12 x i8] c"hello world\00", align 1 @ic_puts = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -146,9 +153,12 @@ entry: store i64 %2, i64* @"rubyStrFrozen_", align 8 %3 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([32 x i8], [32 x i8]* @"str_test/testdata/compiler/hello.rb", i64 0, i64 0), i64 noundef 31) #8 tail call void @rb_gc_register_mark_object(i64 %3) #8 + store i64 %3, i64* @"rubyStrFrozen_test/testdata/compiler/hello.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 5) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %4 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %3, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 4, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/hello.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/hello.rb", align 8 + %4 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/hello.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %4, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %5 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([12 x i8], [12 x i8]* @"str_hello world", i64 0, i64 0), i64 noundef 11) #8 call void @rb_gc_register_mark_object(i64 %5) #8 @@ -171,25 +181,18 @@ entry: store i64 %16, i64* %14, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %9, %struct.rb_control_frame_struct* align 8 %11, %struct.rb_iseq_struct* %stackFrame.i) #8 %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %11, i64 0, i32 0 - %18 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %12, align 8, !tbaa !28 - %19 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %18, i64 0, i32 2 - %20 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %19, align 8, !tbaa !31 - %21 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %20, i64 0, i32 2 - %22 = load i64*, i64** %21, align 8, !tbaa !33 - %23 = getelementptr inbounds i64, i64* %22, i64 3 - %24 = getelementptr inbounds i64, i64* %23, i64 1 - store i64* %24, i64** %17, align 8, !dbg !42, !tbaa !13 - %"rubyStr_hello world.i" = load i64, i64* @"rubyStrFrozen_hello world", align 8, !dbg !43 - %25 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !13 - %26 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %25, i64 0, i32 2, !dbg !8 - %27 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %26, align 8, !dbg !8, !tbaa !25 - %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %27, i64 0, i32 1, !dbg !8 - %29 = load i64*, i64** %28, align 8, !dbg !8, !tbaa !44 - %30 = getelementptr inbounds i64, i64* %29, i64 1, !dbg !8 - store i64 %8, i64* %29, align 8, !dbg !8, !tbaa !4 - %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !8 - store i64* %31, i64** %28, align 8, !dbg !8, !tbaa !44 - store i64 %"rubyStr_hello world.i", i64* %30, align 8, !dbg !8, !tbaa !4 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %17, align 8, !dbg !31, !tbaa !13 + %"rubyStr_hello world.i" = load i64, i64* @"rubyStrFrozen_hello world", align 8, !dbg !32 + %18 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !13 + %19 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %18, i64 0, i32 2, !dbg !8 + %20 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %19, align 8, !dbg !8, !tbaa !25 + %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 1, !dbg !8 + %22 = load i64*, i64** %21, align 8, !dbg !8, !tbaa !33 + %23 = getelementptr inbounds i64, i64* %22, i64 1, !dbg !8 + store i64 %8, i64* %22, align 8, !dbg !8, !tbaa !4 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !8 + store i64* %24, i64** %21, align 8, !dbg !8, !tbaa !33 + store i64 %"rubyStr_hello world.i", i64* %23, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #8, !dbg !8 ret void } @@ -238,17 +241,6 @@ attributes #8 = { nounwind } !28 = !{!29, !14, i64 16} !29 = !{!"rb_control_frame_struct", !14, i64 0, !14, i64 8, !14, i64 16, !5, i64 24, !14, i64 32, !14, i64 40, !14, i64 48} !30 = !{!29, !14, i64 32} -!31 = !{!32, !14, i64 16} -!32 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !14, i64 16, !6, i64 24} -!33 = !{!34, !14, i64 8} -!34 = !{!"rb_iseq_constant_body", !6, i64 0, !20, i64 4, !14, i64 8, !35, i64 16, !37, i64 64, !40, i64 120, !14, i64 152, !14, i64 160, !14, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !41, i64 200, !20, i64 232, !20, i64 236, !20, i64 240, !20, i64 244, !20, i64 248, !6, i64 252, !5, i64 256} -!35 = !{!"", !36, i64 0, !20, i64 4, !20, i64 8, !20, i64 12, !20, i64 16, !20, i64 20, !20, i64 24, !20, i64 28, !14, i64 32, !14, i64 40} -!36 = !{!"", !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 1, !20, i64 1} -!37 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !20, i64 32, !38, i64 36} -!38 = !{!"rb_code_location_struct", !39, i64 0, !39, i64 8} -!39 = !{!"rb_code_position_struct", !20, i64 0, !20, i64 4} -!40 = !{!"iseq_insn_info", !14, i64 0, !14, i64 8, !20, i64 16, !14, i64 24} -!41 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !14, i64 24} -!42 = !DILocation(line: 0, scope: !9) -!43 = !DILocation(line: 4, column: 6, scope: !9) -!44 = !{!29, !14, i64 8} +!31 = !DILocation(line: 0, scope: !9) +!32 = !DILocation(line: 4, column: 6, scope: !9) +!33 = !{!29, !14, i64 8} diff --git a/test/testdata/compiler/impl_abstract_via_extend.llo.exp b/test/testdata/compiler/impl_abstract_via_extend.llo.exp index 8e0b975f2d3..966c6b50178 100644 --- a/test/testdata/compiler/impl_abstract_via_extend.llo.exp +++ b/test/testdata/compiler/impl_abstract_via_extend.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -93,6 +95,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/impl_abstract_via_extend.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/impl_abstract_via_extend.rb" = private unnamed_addr constant [51 x i8] c"test/testdata/compiler/impl_abstract_via_extend.rb\00", align 1 +@iseqEncodedArray = internal global [15 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_IFoo = private unnamed_addr constant [5 x i8] c"IFoo\00", align 1 @"rubyStrFrozen_./impl_abstract_via_extend__1" = internal unnamed_addr global i64 0, align 8 @"str_./impl_abstract_via_extend__1" = private unnamed_addr constant [30 x i8] c"./impl_abstract_via_extend__1\00", align 1 @@ -139,7 +143,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -236,9 +242,11 @@ entry: %12 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([51 x i8], [51 x i8]* @"str_test/testdata/compiler/impl_abstract_via_extend.rb", i64 0, i64 0), i64 noundef 50) #13 tail call void @rb_gc_register_mark_object(i64 %12) #13 store i64 %12, i64* @"rubyStrFrozen_test/testdata/compiler/impl_abstract_via_extend.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 15) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %12, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 14, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/impl_abstract_via_extend.rb", align 8 + %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %13, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %14 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([30 x i8], [30 x i8]* @"str_./impl_abstract_via_extend__1", i64 0, i64 0), i64 noundef 29) #13 call void @rb_gc_register_mark_object(i64 %14) #13 @@ -249,19 +257,19 @@ entry: call void @rb_gc_register_mark_object(i64 %15) #13 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i14.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/impl_abstract_via_extend.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 11, i32 noundef 11, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 1) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 1) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo#foo", align 8 %"rubyId_.i16.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i17.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i18.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/impl_abstract_via_extend.rb", align 8 - %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i17.i", i64 %"rubyId_.i16.i", i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i18.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i19.i, i32 noundef 0, i32 noundef 4) + %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i17.i", i64 %"rubyId_.i16.i", i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i18.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i19.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %17, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.", align 8 %18 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #13 call void @rb_gc_register_mark_object(i64 %18) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i20.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/impl_abstract_via_extend.rb", align 8 - %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %18, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %18, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/impl_abstract_via_extend.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %19, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.$block_1", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !13 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !13 @@ -293,213 +301,184 @@ entry: store i64 %30, i64* %28, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %23, %struct.rb_control_frame_struct* align 8 %25, %struct.rb_iseq_struct* %stackFrame.i) #13 %31 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %25, i64 0, i32 0 - %32 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %26, align 8, !tbaa !36 - %33 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %32, i64 0, i32 2 - %34 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %33, align 8, !tbaa !39 - %35 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %34, i64 0, i32 2 - %36 = load i64*, i64** %35, align 8, !tbaa !41 - %37 = getelementptr inbounds i64, i64* %36, i64 4 - %38 = getelementptr inbounds i64, i64* %37, i64 1 - store i64* %38, i64** %31, align 8, !dbg !50, !tbaa !21 - %39 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_IFoo, i64 0, i64 0)) #13, !dbg !51 - call void @sorbet_pushStaticInitFrame(i64 %39) #13, !dbg !51 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %31, align 8, !dbg !39, !tbaa !21 + %32 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_IFoo, i64 0, i64 0)) #13, !dbg !40 + call void @sorbet_pushStaticInitFrame(i64 %32) #13, !dbg !40 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo.", align 8 - %40 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !21 - %41 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %40, i64 0, i32 2 - %42 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %41, align 8, !tbaa !33 - %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %43, align 8, !tbaa !36 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 4 - %45 = load i64*, i64** %44, align 8, !tbaa !38 - %46 = load i64, i64* %45, align 8, !tbaa !4 - %47 = and i64 %46, -33 - store i64 %47, i64* %45, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %40, %struct.rb_control_frame_struct* align 8 %42, %struct.rb_iseq_struct* %stackFrame.i.i1) #13 - %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 0 - %49 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %43, align 8, !tbaa !36 - %50 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %49, i64 0, i32 2 - %51 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %50, align 8, !tbaa !39 - %52 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %51, i64 0, i32 2 - %53 = load i64*, i64** %52, align 8, !tbaa !41 - %54 = getelementptr inbounds i64, i64* %53, i64 1 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !52 - store i64* %55, i64** %48, align 8, !dbg !52, !tbaa !21 - %56 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !54 - %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !54, !tbaa !55 - %needTakeSlowPath = icmp ne i64 %56, %57, !dbg !54 - br i1 %needTakeSlowPath, label %58, label %59, !dbg !54, !prof !56 - -58: ; preds = %entry - call void @"const_recompute_T::Helpers"(), !dbg !54 - br label %59, !dbg !54 - -59: ; preds = %entry, %58 - %60 = load i64, i64* @"guarded_const_T::Helpers", align 8, !dbg !54 - %61 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !54 - %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !54, !tbaa !55 - %guardUpdated = icmp eq i64 %61, %62, !dbg !54 - call void @llvm.assume(i1 %guardUpdated), !dbg !54 - %63 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !54, !tbaa !21 - %64 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %63, i64 0, i32 2, !dbg !54 - %65 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %64, align 8, !dbg !54, !tbaa !33 - %66 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %65, i64 0, i32 1, !dbg !54 - %67 = load i64*, i64** %66, align 8, !dbg !54, !tbaa !57 - %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !54 - store i64 %39, i64* %67, align 8, !dbg !54, !tbaa !4 - %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !54 - store i64* %69, i64** %66, align 8, !dbg !54, !tbaa !57 - store i64 %60, i64* %68, align 8, !dbg !54, !tbaa !4 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #13, !dbg !54 - %70 = getelementptr inbounds i64, i64* %53, i64 2, !dbg !54 - %71 = getelementptr inbounds i64, i64* %70, i64 1, !dbg !54 - store i64* %71, i64** %48, align 8, !dbg !54, !tbaa !21 - %72 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !58 - %73 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !58, !tbaa !55 - %needTakeSlowPath3 = icmp ne i64 %72, %73, !dbg !58 - br i1 %needTakeSlowPath3, label %74, label %75, !dbg !58, !prof !56 - -74: ; preds = %59 - call void @"const_recompute_T::Sig"(), !dbg !58 - br label %75, !dbg !58 - -75: ; preds = %59, %74 - %76 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !58 - %77 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !58 - %78 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !58, !tbaa !55 - %guardUpdated4 = icmp eq i64 %77, %78, !dbg !58 - call void @llvm.assume(i1 %guardUpdated4), !dbg !58 - %79 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !58, !tbaa !21 - %80 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %79, i64 0, i32 2, !dbg !58 - %81 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %80, align 8, !dbg !58, !tbaa !33 - %82 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %81, i64 0, i32 1, !dbg !58 - %83 = load i64*, i64** %82, align 8, !dbg !58, !tbaa !57 - %84 = getelementptr inbounds i64, i64* %83, i64 1, !dbg !58 - store i64 %39, i64* %83, align 8, !dbg !58, !tbaa !4 - %85 = getelementptr inbounds i64, i64* %84, i64 1, !dbg !58 - store i64* %85, i64** %82, align 8, !dbg !58, !tbaa !57 - store i64 %76, i64* %84, align 8, !dbg !58, !tbaa !4 - %send42.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend.1, i64 0) #13, !dbg !58 - %86 = getelementptr inbounds i64, i64* %53, i64 3, !dbg !58 - %87 = getelementptr inbounds i64, i64* %86, i64 1, !dbg !58 - store i64* %87, i64** %48, align 8, !dbg !58, !tbaa !21 - %88 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !59, !tbaa !21 - %89 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %88, i64 0, i32 2, !dbg !59 - %90 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %89, align 8, !dbg !59, !tbaa !33 - %91 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 1, !dbg !59 - %92 = load i64*, i64** %91, align 8, !dbg !59, !tbaa !57 - %93 = getelementptr inbounds i64, i64* %92, i64 1, !dbg !59 - store i64* %93, i64** %91, align 8, !dbg !59, !tbaa !57 - store i64 %39, i64* %92, align 8, !dbg !59, !tbaa !4 - %send47.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_abstract!", i64 0) #13, !dbg !59 - %94 = getelementptr inbounds i64, i64* %53, i64 6, !dbg !59 - %95 = getelementptr inbounds i64, i64* %94, i64 1, !dbg !59 - store i64* %95, i64** %48, align 8, !dbg !59, !tbaa !21 - %rubyId_foo.i.i2 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !60 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i2) #13, !dbg !60 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !60 - %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !60 - %96 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !60 - %97 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !60, !tbaa !55 - %needTakeSlowPath5 = icmp ne i64 %96, %97, !dbg !60 - br i1 %needTakeSlowPath5, label %98, label %99, !dbg !60, !prof !56 - -98: ; preds = %75 - call void @const_recompute_IFoo(), !dbg !60 - br label %99, !dbg !60 - -99: ; preds = %75, %98 - %100 = load i64, i64* @guarded_const_IFoo, align 8, !dbg !60 - %101 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !60 - %102 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !60, !tbaa !55 - %guardUpdated6 = icmp eq i64 %101, %102, !dbg !60 - call void @llvm.assume(i1 %guardUpdated6), !dbg !60 - %stackFrame50.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo#foo", align 8, !dbg !60 - %103 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !60 - %104 = bitcast i8* %103 to i16*, !dbg !60 - %105 = load i16, i16* %104, align 8, !dbg !60 - %106 = and i16 %105, -384, !dbg !60 - store i16 %106, i16* %104, align 8, !dbg !60 - %107 = getelementptr inbounds i8, i8* %103, i64 4, !dbg !60 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %107, i8 0, i64 28, i1 false) #13, !dbg !60 - %108 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #13, !dbg !60 - %109 = bitcast i8* %103 to %struct.rb_sorbet_param_struct*, !dbg !60 - %110 = bitcast %struct.rb_iseq_struct* %stackFrame50.i.i to i8*, !dbg !60 - call void @rb_add_method_sorbet(i64 %100, i64 %108, i64 (i32, i64*, i64)* noundef @"func_IFoo#foo", %struct.rb_sorbet_param_struct* nonnull %109, i32 noundef 1, i8* %110) #13, !dbg !60 - call void @sorbet_popRubyStack() #13, !dbg !51 - %111 = getelementptr inbounds i64, i64* %36, i64 13, !dbg !51 - %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !51 - store i64* %112, i64** %31, align 8, !dbg !51, !tbaa !21 - %"rubyStr_./impl_abstract_via_extend__1.i" = load i64, i64* @"rubyStrFrozen_./impl_abstract_via_extend__1", align 8, !dbg !61 - %113 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !21 - %114 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %113, i64 0, i32 2, !dbg !8 - %115 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %114, align 8, !dbg !8, !tbaa !33 - %116 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %115, i64 0, i32 1, !dbg !8 - %117 = load i64*, i64** %116, align 8, !dbg !8, !tbaa !57 - %118 = getelementptr inbounds i64, i64* %117, i64 1, !dbg !8 - store i64 %22, i64* %117, align 8, !dbg !8, !tbaa !4 - %119 = getelementptr inbounds i64, i64* %118, i64 1, !dbg !8 - store i64* %119, i64** %116, align 8, !dbg !8, !tbaa !57 - store i64 %"rubyStr_./impl_abstract_via_extend__1.i", i64* %118, align 8, !dbg !8, !tbaa !4 + %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !21 + %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2 + %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !tbaa !33 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %36, align 8, !tbaa !36 + %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 4 + %38 = load i64*, i64** %37, align 8, !tbaa !38 + %39 = load i64, i64* %38, align 8, !tbaa !4 + %40 = and i64 %39, -33 + store i64 %40, i64* %38, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %33, %struct.rb_control_frame_struct* align 8 %35, %struct.rb_iseq_struct* %stackFrame.i.i1) #13 + %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 0 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %41, align 8, !dbg !41, !tbaa !21 + %42 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !43 + %43 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !43, !tbaa !44 + %needTakeSlowPath = icmp ne i64 %42, %43, !dbg !43 + br i1 %needTakeSlowPath, label %44, label %45, !dbg !43, !prof !45 + +44: ; preds = %entry + call void @"const_recompute_T::Helpers"(), !dbg !43 + br label %45, !dbg !43 + +45: ; preds = %entry, %44 + %46 = load i64, i64* @"guarded_const_T::Helpers", align 8, !dbg !43 + %47 = load i64, i64* @"guard_epoch_T::Helpers", align 8, !dbg !43 + %48 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !43, !tbaa !44 + %guardUpdated = icmp eq i64 %47, %48, !dbg !43 + call void @llvm.assume(i1 %guardUpdated), !dbg !43 + %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !43, !tbaa !21 + %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2, !dbg !43 + %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !dbg !43, !tbaa !33 + %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 1, !dbg !43 + %53 = load i64*, i64** %52, align 8, !dbg !43, !tbaa !46 + %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !43 + store i64 %32, i64* %53, align 8, !dbg !43, !tbaa !4 + %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !43 + store i64* %55, i64** %52, align 8, !dbg !43, !tbaa !46 + store i64 %46, i64* %54, align 8, !dbg !43, !tbaa !4 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #13, !dbg !43 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %41, align 8, !dbg !43, !tbaa !21 + %56 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !47 + %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !47, !tbaa !44 + %needTakeSlowPath3 = icmp ne i64 %56, %57, !dbg !47 + br i1 %needTakeSlowPath3, label %58, label %59, !dbg !47, !prof !45 + +58: ; preds = %45 + call void @"const_recompute_T::Sig"(), !dbg !47 + br label %59, !dbg !47 + +59: ; preds = %45, %58 + %60 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !47 + %61 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !47 + %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !47, !tbaa !44 + %guardUpdated4 = icmp eq i64 %61, %62, !dbg !47 + call void @llvm.assume(i1 %guardUpdated4), !dbg !47 + %63 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !47, !tbaa !21 + %64 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %63, i64 0, i32 2, !dbg !47 + %65 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %64, align 8, !dbg !47, !tbaa !33 + %66 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %65, i64 0, i32 1, !dbg !47 + %67 = load i64*, i64** %66, align 8, !dbg !47, !tbaa !46 + %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !47 + store i64 %32, i64* %67, align 8, !dbg !47, !tbaa !4 + %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !47 + store i64* %69, i64** %66, align 8, !dbg !47, !tbaa !46 + store i64 %60, i64* %68, align 8, !dbg !47, !tbaa !4 + %send42.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend.1, i64 0) #13, !dbg !47 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %41, align 8, !dbg !47, !tbaa !21 + %70 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !21 + %71 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %70, i64 0, i32 2, !dbg !48 + %72 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %71, align 8, !dbg !48, !tbaa !33 + %73 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %72, i64 0, i32 1, !dbg !48 + %74 = load i64*, i64** %73, align 8, !dbg !48, !tbaa !46 + %75 = getelementptr inbounds i64, i64* %74, i64 1, !dbg !48 + store i64* %75, i64** %73, align 8, !dbg !48, !tbaa !46 + store i64 %32, i64* %74, align 8, !dbg !48, !tbaa !4 + %send47.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_abstract!", i64 0) #13, !dbg !48 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %41, align 8, !dbg !48, !tbaa !21 + %rubyId_foo.i.i2 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !49 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i2) #13, !dbg !49 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !49 + %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !49 + %76 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !49 + %77 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !49, !tbaa !44 + %needTakeSlowPath5 = icmp ne i64 %76, %77, !dbg !49 + br i1 %needTakeSlowPath5, label %78, label %79, !dbg !49, !prof !45 + +78: ; preds = %59 + call void @const_recompute_IFoo(), !dbg !49 + br label %79, !dbg !49 + +79: ; preds = %59, %78 + %80 = load i64, i64* @guarded_const_IFoo, align 8, !dbg !49 + %81 = load i64, i64* @guard_epoch_IFoo, align 8, !dbg !49 + %82 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !49, !tbaa !44 + %guardUpdated6 = icmp eq i64 %81, %82, !dbg !49 + call void @llvm.assume(i1 %guardUpdated6), !dbg !49 + %stackFrame50.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_IFoo#foo", align 8, !dbg !49 + %83 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !49 + %84 = bitcast i8* %83 to i16*, !dbg !49 + %85 = load i16, i16* %84, align 8, !dbg !49 + %86 = and i16 %85, -384, !dbg !49 + store i16 %86, i16* %84, align 8, !dbg !49 + %87 = getelementptr inbounds i8, i8* %83, i64 4, !dbg !49 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %87, i8 0, i64 28, i1 false) #13, !dbg !49 + %88 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #13, !dbg !49 + %89 = bitcast i8* %83 to %struct.rb_sorbet_param_struct*, !dbg !49 + %90 = bitcast %struct.rb_iseq_struct* %stackFrame50.i.i to i8*, !dbg !49 + call void @rb_add_method_sorbet(i64 %80, i64 %88, i64 (i32, i64*, i64)* noundef @"func_IFoo#foo", %struct.rb_sorbet_param_struct* nonnull %89, i32 noundef 1, i8* %90) #13, !dbg !49 + call void @sorbet_popRubyStack() #13, !dbg !40 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %31, align 8, !dbg !40, !tbaa !21 + %"rubyStr_./impl_abstract_via_extend__1.i" = load i64, i64* @"rubyStrFrozen_./impl_abstract_via_extend__1", align 8, !dbg !50 + %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !21 + %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !8 + %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !8, !tbaa !33 + %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 1, !dbg !8 + %95 = load i64*, i64** %94, align 8, !dbg !8, !tbaa !46 + %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !8 + store i64 %22, i64* %95, align 8, !dbg !8, !tbaa !4 + %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !8 + store i64* %97, i64** %94, align 8, !dbg !8, !tbaa !46 + store i64 %"rubyStr_./impl_abstract_via_extend__1.i", i64* %96, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_require_relative, i64 0) #13, !dbg !8 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_IFoo#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !62 { +define i64 @"func_IFoo#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !51 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !21 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !33 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !36 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !39 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !41 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !21 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !63 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !63, !prof !64 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %3, align 8, !tbaa !21 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !52 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !52, !prof !53 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !63 - unreachable, !dbg !63 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !52 + unreachable, !dbg !52 fillRequiredArgs: ; preds = %functionEntryInitializers - tail call void @llvm.experimental.noalias.scope.decl(metadata !65), !dbg !63 - %11 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !21, !noalias !65 - %12 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %11, i64 0, i32 2, !dbg !63 - %13 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %12, align 8, !dbg !63, !tbaa !33, !noalias !65 - %14 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %13, i64 0, i32 3, !dbg !63 - %15 = load i64, i64* %14, align 8, !dbg !63, !tbaa !68, !noalias !65 - %16 = tail call %struct.rb_callable_method_entry_struct* @rb_vm_frame_method_entry(%struct.rb_control_frame_struct* %13) #13, !dbg !63, !noalias !65 - %17 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %16, i64 0, i32 1, !dbg !63 - %18 = load i64, i64* %17, align 8, !dbg !63, !tbaa !69, !noalias !65 - %19 = inttoptr i64 %18 to %struct.RClass*, !dbg !63 - %20 = getelementptr inbounds %struct.RClass, %struct.RClass* %19, i64 0, i32 2, !dbg !63 - %21 = load %struct.rb_classext_struct*, %struct.rb_classext_struct** %20, align 8, !dbg !63, !tbaa !71, !noalias !65 - %22 = getelementptr inbounds %struct.rb_classext_struct, %struct.rb_classext_struct* %21, i64 0, i32 8, !dbg !63 - %23 = load i64, i64* %22, align 8, !dbg !63, !tbaa !74, !noalias !65 - %24 = inttoptr i64 %23 to %struct.RClass*, !dbg !63 - %25 = getelementptr inbounds %struct.RClass, %struct.RClass* %24, i64 0, i32 1, !dbg !63 - %26 = load i64, i64* %25, align 8, !dbg !63, !tbaa !76, !noalias !65 - %27 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %16, i64 0, i32 2, !dbg !63 - %28 = load %struct.rb_method_definition_struct*, %struct.rb_method_definition_struct** %27, align 8, !dbg !63, !tbaa !77, !noalias !65 - %29 = getelementptr inbounds %struct.rb_method_definition_struct, %struct.rb_method_definition_struct* %28, i64 0, i32 2, !dbg !63 - %30 = load i64, i64* %29, align 8, !dbg !63, !tbaa !78, !noalias !65 - %31 = tail call %struct.rb_callable_method_entry_struct* @rb_callable_method_entry(i64 %26, i64 %30) #13, !dbg !63, !noalias !65 - %32 = icmp eq %struct.rb_callable_method_entry_struct* %31, null, !dbg !63 - br i1 %32, label %33, label %sorbet_callSuper.exit, !dbg !63 - -33: ; preds = %fillRequiredArgs - %34 = load i64, i64* @rb_eRuntimeError, align 8, !dbg !63, !tbaa !4 - tail call void (i64, i8*, ...) @rb_raise(i64 %34, i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @.str.6, i64 0, i64 0)) #12, !dbg !63 - unreachable, !dbg !63 + tail call void @llvm.experimental.noalias.scope.decl(metadata !54), !dbg !52 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !52, !tbaa !21, !noalias !54 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !52 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !52, !tbaa !33, !noalias !54 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 3, !dbg !52 + %8 = load i64, i64* %7, align 8, !dbg !52, !tbaa !57, !noalias !54 + %9 = tail call %struct.rb_callable_method_entry_struct* @rb_vm_frame_method_entry(%struct.rb_control_frame_struct* %6) #13, !dbg !52, !noalias !54 + %10 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %9, i64 0, i32 1, !dbg !52 + %11 = load i64, i64* %10, align 8, !dbg !52, !tbaa !58, !noalias !54 + %12 = inttoptr i64 %11 to %struct.RClass*, !dbg !52 + %13 = getelementptr inbounds %struct.RClass, %struct.RClass* %12, i64 0, i32 2, !dbg !52 + %14 = load %struct.rb_classext_struct*, %struct.rb_classext_struct** %13, align 8, !dbg !52, !tbaa !60, !noalias !54 + %15 = getelementptr inbounds %struct.rb_classext_struct, %struct.rb_classext_struct* %14, i64 0, i32 8, !dbg !52 + %16 = load i64, i64* %15, align 8, !dbg !52, !tbaa !63, !noalias !54 + %17 = inttoptr i64 %16 to %struct.RClass*, !dbg !52 + %18 = getelementptr inbounds %struct.RClass, %struct.RClass* %17, i64 0, i32 1, !dbg !52 + %19 = load i64, i64* %18, align 8, !dbg !52, !tbaa !65, !noalias !54 + %20 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %9, i64 0, i32 2, !dbg !52 + %21 = load %struct.rb_method_definition_struct*, %struct.rb_method_definition_struct** %20, align 8, !dbg !52, !tbaa !66, !noalias !54 + %22 = getelementptr inbounds %struct.rb_method_definition_struct, %struct.rb_method_definition_struct* %21, i64 0, i32 2, !dbg !52 + %23 = load i64, i64* %22, align 8, !dbg !52, !tbaa !67, !noalias !54 + %24 = tail call %struct.rb_callable_method_entry_struct* @rb_callable_method_entry(i64 %19, i64 %23) #13, !dbg !52, !noalias !54 + %25 = icmp eq %struct.rb_callable_method_entry_struct* %24, null, !dbg !52 + br i1 %25, label %26, label %sorbet_callSuper.exit, !dbg !52 + +26: ; preds = %fillRequiredArgs + %27 = load i64, i64* @rb_eRuntimeError, align 8, !dbg !52, !tbaa !4 + tail call void (i64, i8*, ...) @rb_raise(i64 %27, i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @.str.6, i64 0, i64 0)) #12, !dbg !52 + unreachable, !dbg !52 sorbet_callSuper.exit: ; preds = %fillRequiredArgs - %35 = tail call i64 @rb_vm_call_kw(%struct.rb_execution_context_struct* nonnull %11, i64 %15, i64 %30, i32 noundef 0, i64* noundef null, %struct.rb_callable_method_entry_struct* nonnull %31, i32 noundef 0) #13, !dbg !63 - ret i64 %35 + %28 = tail call i64 @rb_vm_call_kw(%struct.rb_execution_context_struct* nonnull %4, i64 %8, i64 %23, i32 noundef 0, i64* noundef null, %struct.rb_callable_method_entry_struct* nonnull %24, i32 noundef 0) #13, !dbg !52 + ret i64 %28 } ; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn @@ -515,7 +494,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @"const_recompute_T::Helpers"() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"str_T::Helpers", i64 0, i64 0), i64 10) store i64 %1, i64* @"guarded_const_T::Helpers", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !55 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !44 store i64 %2, i64* @"guard_epoch_T::Helpers", align 8 ret void } @@ -524,7 +503,7 @@ define linkonce void @"const_recompute_T::Helpers"() local_unnamed_addr #10 { define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !55 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !44 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -533,7 +512,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #10 { define linkonce void @const_recompute_IFoo() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @str_IFoo, i64 0, i64 0), i64 4) store i64 %1, i64* @guarded_const_IFoo, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !55 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !44 store i64 %2, i64* @guard_epoch_IFoo, align 8 ret void } @@ -595,44 +574,33 @@ attributes #13 = { nounwind } !36 = !{!37, !22, i64 16} !37 = !{!"rb_control_frame_struct", !22, i64 0, !22, i64 8, !22, i64 16, !5, i64 24, !22, i64 32, !22, i64 40, !22, i64 48} !38 = !{!37, !22, i64 32} -!39 = !{!40, !22, i64 16} -!40 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !22, i64 16, !6, i64 24} -!41 = !{!42, !22, i64 8} -!42 = !{!"rb_iseq_constant_body", !6, i64 0, !28, i64 4, !22, i64 8, !43, i64 16, !45, i64 64, !48, i64 120, !22, i64 152, !22, i64 160, !22, i64 168, !22, i64 176, !22, i64 184, !22, i64 192, !49, i64 200, !28, i64 232, !28, i64 236, !28, i64 240, !28, i64 244, !28, i64 248, !6, i64 252, !5, i64 256} -!43 = !{!"", !44, i64 0, !28, i64 4, !28, i64 8, !28, i64 12, !28, i64 16, !28, i64 20, !28, i64 24, !28, i64 28, !22, i64 32, !22, i64 40} -!44 = !{!"", !28, i64 0, !28, i64 0, !28, i64 0, !28, i64 0, !28, i64 0, !28, i64 0, !28, i64 0, !28, i64 0, !28, i64 1, !28, i64 1} -!45 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !28, i64 32, !46, i64 36} -!46 = !{!"rb_code_location_struct", !47, i64 0, !47, i64 8} -!47 = !{!"rb_code_position_struct", !28, i64 0, !28, i64 4} -!48 = !{!"iseq_insn_info", !22, i64 0, !22, i64 8, !28, i64 16, !22, i64 24} -!49 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !22, i64 24} -!50 = !DILocation(line: 0, scope: !9) -!51 = !DILocation(line: 5, column: 1, scope: !9) -!52 = !DILocation(line: 10, column: 3, scope: !14, inlinedAt: !53) -!53 = distinct !DILocation(line: 5, column: 1, scope: !9) -!54 = !DILocation(line: 6, column: 3, scope: !14, inlinedAt: !53) -!55 = !{!29, !29, i64 0} -!56 = !{!"branch_weights", i32 1, i32 10000} -!57 = !{!37, !22, i64 8} -!58 = !DILocation(line: 7, column: 3, scope: !14, inlinedAt: !53) -!59 = !DILocation(line: 8, column: 3, scope: !14, inlinedAt: !53) -!60 = !DILocation(line: 11, column: 3, scope: !14, inlinedAt: !53) -!61 = !DILocation(line: 14, column: 18, scope: !9) -!62 = distinct !DISubprogram(name: "IFoo#foo", linkageName: "func_IFoo#foo", scope: null, file: !2, line: 11, type: !10, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!63 = !DILocation(line: 11, column: 3, scope: !62) -!64 = !{!"branch_weights", i32 1, i32 2000} -!65 = !{!66} -!66 = distinct !{!66, !67, !"sorbet_callSuper: argument 0"} -!67 = distinct !{!67, !"sorbet_callSuper"} -!68 = !{!37, !5, i64 24} -!69 = !{!70, !5, i64 8} -!70 = !{!"rb_callable_method_entry_struct", !5, i64 0, !5, i64 8, !22, i64 16, !5, i64 24, !5, i64 32} -!71 = !{!72, !22, i64 24} -!72 = !{!"RClass", !73, i64 0, !5, i64 16, !22, i64 24, !29, i64 32} -!73 = !{!"RBasic", !5, i64 0, !5, i64 8} -!74 = !{!75, !5, i64 64} -!75 = !{!"rb_classext_struct", !22, i64 0, !22, i64 8, !22, i64 16, !22, i64 24, !22, i64 32, !22, i64 40, !22, i64 48, !22, i64 56, !5, i64 64, !5, i64 72, !22, i64 80, !5, i64 88} -!76 = !{!72, !5, i64 16} -!77 = !{!70, !22, i64 16} -!78 = !{!79, !5, i64 32} -!79 = !{!"rb_method_definition_struct", !6, i64 0, !28, i64 0, !28, i64 4, !6, i64 8, !5, i64 32, !5, i64 40} +!39 = !DILocation(line: 0, scope: !9) +!40 = !DILocation(line: 5, column: 1, scope: !9) +!41 = !DILocation(line: 10, column: 3, scope: !14, inlinedAt: !42) +!42 = distinct !DILocation(line: 5, column: 1, scope: !9) +!43 = !DILocation(line: 6, column: 3, scope: !14, inlinedAt: !42) +!44 = !{!29, !29, i64 0} +!45 = !{!"branch_weights", i32 1, i32 10000} +!46 = !{!37, !22, i64 8} +!47 = !DILocation(line: 7, column: 3, scope: !14, inlinedAt: !42) +!48 = !DILocation(line: 8, column: 3, scope: !14, inlinedAt: !42) +!49 = !DILocation(line: 11, column: 3, scope: !14, inlinedAt: !42) +!50 = !DILocation(line: 14, column: 18, scope: !9) +!51 = distinct !DISubprogram(name: "IFoo#foo", linkageName: "func_IFoo#foo", scope: null, file: !2, line: 11, type: !10, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!52 = !DILocation(line: 11, column: 3, scope: !51) +!53 = !{!"branch_weights", i32 1, i32 2000} +!54 = !{!55} +!55 = distinct !{!55, !56, !"sorbet_callSuper: argument 0"} +!56 = distinct !{!56, !"sorbet_callSuper"} +!57 = !{!37, !5, i64 24} +!58 = !{!59, !5, i64 8} +!59 = !{!"rb_callable_method_entry_struct", !5, i64 0, !5, i64 8, !22, i64 16, !5, i64 24, !5, i64 32} +!60 = !{!61, !22, i64 24} +!61 = !{!"RClass", !62, i64 0, !5, i64 16, !22, i64 24, !29, i64 32} +!62 = !{!"RBasic", !5, i64 0, !5, i64 8} +!63 = !{!64, !5, i64 64} +!64 = !{!"rb_classext_struct", !22, i64 0, !22, i64 8, !22, i64 16, !22, i64 24, !22, i64 32, !22, i64 40, !22, i64 48, !22, i64 56, !5, i64 64, !5, i64 72, !22, i64 80, !5, i64 88} +!65 = !{!61, !5, i64 16} +!66 = !{!59, !22, i64 16} +!67 = !{!68, !5, i64 32} +!68 = !{!"rb_method_definition_struct", !6, i64 0, !28, i64 0, !28, i64 4, !6, i64 8, !5, i64 32, !5, i64 40} diff --git a/test/testdata/compiler/instancefields.llo.exp b/test/testdata/compiler/instancefields.llo.exp index 805229a3213..41829c06f70 100644 --- a/test/testdata/compiler/instancefields.llo.exp +++ b/test/testdata/compiler/instancefields.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -88,6 +90,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/instancefields.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/instancefields.rb" = private unnamed_addr constant [41 x i8] c"test/testdata/compiler/instancefields.rb\00", align 1 +@iseqEncodedArray = internal global [20 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_new = internal unnamed_addr global i64 0, align 8 @@ -131,7 +135,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -230,9 +236,11 @@ entry: %10 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([41 x i8], [41 x i8]* @"str_test/testdata/compiler/instancefields.rb", i64 0, i64 0), i64 noundef 40) #13 tail call void @rb_gc_register_mark_object(i64 %10) #13 store i64 %10, i64* @"rubyStrFrozen_test/testdata/compiler/instancefields.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 20) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %10, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 19, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/instancefields.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/instancefields.rb", align 8 + %11 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %11, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !15 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !15 @@ -259,18 +267,18 @@ entry: call void @rb_gc_register_mark_object(i64 %13) #13 %rubyId_write.i.i = load i64, i64* @rubyIdPrecomputed_write, align 8 %"rubyStr_test/testdata/compiler/instancefields.rb.i19.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/instancefields.rb", align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_write.i.i, i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i19.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 6, i32 noundef 8, i64* noundef nonnull %locals.i20.i, i32 noundef 0, i32 noundef 0) + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_write.i.i, i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i19.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i20.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#write", align 8 %15 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0), i64 noundef 4) #13 call void @rb_gc_register_mark_object(i64 %15) #13 %rubyId_read.i.i = load i64, i64* @rubyIdPrecomputed_read, align 8 %"rubyStr_test/testdata/compiler/instancefields.rb.i21.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/instancefields.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_read.i.i, i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i21.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 9, i32 noundef 11, i64* noundef nonnull %locals.i22.i, i32 noundef 0, i32 noundef 0) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_read.i.i, i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i21.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i22.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#read", align 8 %"rubyId_.i23.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i24.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/instancefields.rb.i25.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/instancefields.rb", align 8 - %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i24.i", i64 %"rubyId_.i23.i", i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i26.i, i32 noundef 0, i32 noundef 4) + %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i24.i", i64 %"rubyId_.i23.i", i64 %"rubyStr_test/testdata/compiler/instancefields.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i26.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %17, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !24 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !24 @@ -292,280 +300,236 @@ entry: store i64 %28, i64* %26, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %21, %struct.rb_control_frame_struct* align 8 %23, %struct.rb_iseq_struct* %stackFrame.i) #13 %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 0 - %30 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %24, align 8, !tbaa !41 - %31 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %30, i64 0, i32 2 - %32 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %31, align 8, !tbaa !44 - %33 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %32, i64 0, i32 2 - %34 = load i64*, i64** %33, align 8, !tbaa !46 - %35 = getelementptr inbounds i64, i64* %34, i64 4 - %36 = getelementptr inbounds i64, i64* %35, i64 1 - store i64* %36, i64** %29, align 8, !dbg !55, !tbaa !26 - %37 = load i64, i64* @rb_cObject, align 8, !dbg !56 - %38 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %37) #13, !dbg !56 - call void @sorbet_pushStaticInitFrame(i64 %38) #13, !dbg !56 - %39 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %39) #13 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %29, align 8, !dbg !44, !tbaa !26 + %30 = load i64, i64* @rb_cObject, align 8, !dbg !45 + %31 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %30) #13, !dbg !45 + call void @sorbet_pushStaticInitFrame(i64 %31) #13, !dbg !45 + %32 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %32) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %40 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 - %41 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %40, i64 0, i32 2 - %42 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %41, align 8, !tbaa !38 - %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %43, align 8, !tbaa !41 - %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 4 - %45 = load i64*, i64** %44, align 8, !tbaa !43 - %46 = load i64, i64* %45, align 8, !tbaa !4 - %47 = and i64 %46, -33 - store i64 %47, i64* %45, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %40, %struct.rb_control_frame_struct* align 8 %42, %struct.rb_iseq_struct* %stackFrame.i.i) #13 - %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 0 - %49 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %43, align 8, !tbaa !41 - %50 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %49, i64 0, i32 2 - %51 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %50, align 8, !tbaa !44 - %52 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %51, i64 0, i32 2 - %53 = load i64*, i64** %52, align 8, !tbaa !46 - %54 = getelementptr inbounds i64, i64* %53, i64 1 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !57 - store i64* %55, i64** %48, align 8, !dbg !57, !tbaa !26 + %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 + %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2 + %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !tbaa !38 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %36, align 8, !tbaa !41 + %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 4 + %38 = load i64*, i64** %37, align 8, !tbaa !43 + %39 = load i64, i64* %38, align 8, !tbaa !4 + %40 = and i64 %39, -33 + store i64 %40, i64* %38, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %33, %struct.rb_control_frame_struct* align 8 %35, %struct.rb_iseq_struct* %stackFrame.i.i) #13 + %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 0 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %41, align 8, !dbg !46, !tbaa !26 %rubyId_write.i.i1 = load i64, i64* @rubyIdPrecomputed_write, align 8, !dbg !8 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_write.i.i1) #13, !dbg !8 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym17.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !8 - %56 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 - %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !58 - %needTakeSlowPath = icmp ne i64 %56, %57, !dbg !8 - br i1 %needTakeSlowPath, label %58, label %59, !dbg !8, !prof !59 + %42 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 + %43 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !47 + %needTakeSlowPath = icmp ne i64 %42, %43, !dbg !8 + br i1 %needTakeSlowPath, label %44, label %45, !dbg !8, !prof !48 -58: ; preds = %entry +44: ; preds = %entry call void @const_recompute_A(), !dbg !8 - br label %59, !dbg !8 + br label %45, !dbg !8 -59: ; preds = %entry, %58 - %60 = load i64, i64* @guarded_const_A, align 8, !dbg !8 - %61 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 - %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !58 - %guardUpdated = icmp eq i64 %61, %62, !dbg !8 +45: ; preds = %entry, %44 + %46 = load i64, i64* @guarded_const_A, align 8, !dbg !8 + %47 = load i64, i64* @guard_epoch_A, align 8, !dbg !8 + %48 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !47 + %guardUpdated = icmp eq i64 %47, %48, !dbg !8 call void @llvm.assume(i1 %guardUpdated), !dbg !8 %stackFrame18.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#write", align 8, !dbg !8 - %63 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !8 - %64 = bitcast i8* %63 to i16*, !dbg !8 - %65 = load i16, i16* %64, align 8, !dbg !8 - %66 = and i16 %65, -384, !dbg !8 - %67 = or i16 %66, 1, !dbg !8 - store i16 %67, i16* %64, align 8, !dbg !8 - %68 = getelementptr inbounds i8, i8* %63, i64 8, !dbg !8 - %69 = bitcast i8* %68 to i32*, !dbg !8 - store i32 1, i32* %69, align 8, !dbg !8, !tbaa !60 - %70 = getelementptr inbounds i8, i8* %63, i64 12, !dbg !8 - %71 = getelementptr inbounds i8, i8* %63, i64 4, !dbg !8 - %72 = bitcast i8* %71 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %70, i8 0, i64 20, i1 false) #13, !dbg !8 - store i32 1, i32* %72, align 4, !dbg !8, !tbaa !62 + %49 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !8 + %50 = bitcast i8* %49 to i16*, !dbg !8 + %51 = load i16, i16* %50, align 8, !dbg !8 + %52 = and i16 %51, -384, !dbg !8 + %53 = or i16 %52, 1, !dbg !8 + store i16 %53, i16* %50, align 8, !dbg !8 + %54 = getelementptr inbounds i8, i8* %49, i64 8, !dbg !8 + %55 = bitcast i8* %54 to i32*, !dbg !8 + store i32 1, i32* %55, align 8, !dbg !8, !tbaa !49 + %56 = getelementptr inbounds i8, i8* %49, i64 12, !dbg !8 + %57 = getelementptr inbounds i8, i8* %49, i64 4, !dbg !8 + %58 = bitcast i8* %57 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %56, i8 0, i64 20, i1 false) #13, !dbg !8 + store i32 1, i32* %58, align 4, !dbg !8, !tbaa !52 %rubyId_v.i.i = load i64, i64* @rubyIdPrecomputed_v, align 8, !dbg !8 store i64 %rubyId_v.i.i, i64* %positional_table.i.i, align 8, !dbg !8 - %73 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %73, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %39, i64 noundef 8, i1 noundef false) #13, !dbg !8 - %74 = getelementptr inbounds i8, i8* %63, i64 32, !dbg !8 - %75 = bitcast i8* %74 to i8**, !dbg !8 - store i8* %73, i8** %75, align 8, !dbg !8, !tbaa !63 - %76 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_write, i64 0, i64 0)) #13, !dbg !8 - %77 = bitcast i8* %63 to %struct.rb_sorbet_param_struct*, !dbg !8 - %78 = bitcast %struct.rb_iseq_struct* %stackFrame18.i.i to i8*, !dbg !8 - call void @rb_add_method_sorbet(i64 %60, i64 %76, i64 (i32, i64*, i64)* noundef @"func_A#write", %struct.rb_sorbet_param_struct* nonnull %77, i32 noundef 1, i8* %78) #13, !dbg !8 - %79 = getelementptr inbounds i64, i64* %53, i64 4, !dbg !8 - %80 = getelementptr inbounds i64, i64* %79, i64 1, !dbg !8 - store i64* %80, i64** %48, align 8, !dbg !8, !tbaa !26 - %rubyId_read.i.i2 = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !64 - %rawSym23.i.i = call i64 @rb_id2sym(i64 %rubyId_read.i.i2) #13, !dbg !64 - %rubyId_normal24.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !64 - %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal24.i.i) #13, !dbg !64 - %stackFrame30.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#read", align 8, !dbg !64 - %81 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !64 - %82 = bitcast i8* %81 to i16*, !dbg !64 - %83 = load i16, i16* %82, align 8, !dbg !64 - %84 = and i16 %83, -384, !dbg !64 - store i16 %84, i16* %82, align 8, !dbg !64 - %85 = getelementptr inbounds i8, i8* %81, i64 4, !dbg !64 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %85, i8 0, i64 28, i1 false) #13, !dbg !64 - %86 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0)) #13, !dbg !64 - %87 = bitcast i8* %81 to %struct.rb_sorbet_param_struct*, !dbg !64 - %88 = bitcast %struct.rb_iseq_struct* %stackFrame30.i.i to i8*, !dbg !64 - call void @rb_add_method_sorbet(i64 %60, i64 %86, i64 (i32, i64*, i64)* noundef @"func_A#read", %struct.rb_sorbet_param_struct* nonnull %87, i32 noundef 1, i8* %88) #13, !dbg !64 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %39) #13 - call void @sorbet_popRubyStack() #13, !dbg !56 - %89 = getelementptr inbounds i64, i64* %34, i64 13, !dbg !56 - %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !56 - store i64* %90, i64** %29, align 8, !dbg !56, !tbaa !26 - %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !26 - %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !15 - %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !15, !tbaa !38 - %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 1, !dbg !15 - %95 = load i64*, i64** %94, align 8, !dbg !15, !tbaa !65 - %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !15 - store i64* %96, i64** %94, align 8, !dbg !15, !tbaa !65 - store i64 %60, i64* %95, align 8, !dbg !15, !tbaa !4 + %59 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %59, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %32, i64 noundef 8, i1 noundef false) #13, !dbg !8 + %60 = getelementptr inbounds i8, i8* %49, i64 32, !dbg !8 + %61 = bitcast i8* %60 to i8**, !dbg !8 + store i8* %59, i8** %61, align 8, !dbg !8, !tbaa !53 + %62 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_write, i64 0, i64 0)) #13, !dbg !8 + %63 = bitcast i8* %49 to %struct.rb_sorbet_param_struct*, !dbg !8 + %64 = bitcast %struct.rb_iseq_struct* %stackFrame18.i.i to i8*, !dbg !8 + call void @rb_add_method_sorbet(i64 %46, i64 %62, i64 (i32, i64*, i64)* noundef @"func_A#write", %struct.rb_sorbet_param_struct* nonnull %63, i32 noundef 1, i8* %64) #13, !dbg !8 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %41, align 8, !dbg !8, !tbaa !26 + %rubyId_read.i.i2 = load i64, i64* @rubyIdPrecomputed_read, align 8, !dbg !54 + %rawSym23.i.i = call i64 @rb_id2sym(i64 %rubyId_read.i.i2) #13, !dbg !54 + %rubyId_normal24.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !54 + %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal24.i.i) #13, !dbg !54 + %stackFrame30.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#read", align 8, !dbg !54 + %65 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !54 + %66 = bitcast i8* %65 to i16*, !dbg !54 + %67 = load i16, i16* %66, align 8, !dbg !54 + %68 = and i16 %67, -384, !dbg !54 + store i16 %68, i16* %66, align 8, !dbg !54 + %69 = getelementptr inbounds i8, i8* %65, i64 4, !dbg !54 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %69, i8 0, i64 28, i1 false) #13, !dbg !54 + %70 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_read, i64 0, i64 0)) #13, !dbg !54 + %71 = bitcast i8* %65 to %struct.rb_sorbet_param_struct*, !dbg !54 + %72 = bitcast %struct.rb_iseq_struct* %stackFrame30.i.i to i8*, !dbg !54 + call void @rb_add_method_sorbet(i64 %46, i64 %70, i64 (i32, i64*, i64)* noundef @"func_A#read", %struct.rb_sorbet_param_struct* nonnull %71, i32 noundef 1, i8* %72) #13, !dbg !54 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %32) #13 + call void @sorbet_popRubyStack() #13, !dbg !45 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %29, align 8, !dbg !45, !tbaa !26 + %73 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !26 + %74 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %73, i64 0, i32 2, !dbg !15 + %75 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %74, align 8, !dbg !15, !tbaa !38 + %76 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %75, i64 0, i32 1, !dbg !15 + %77 = load i64*, i64** %76, align 8, !dbg !15, !tbaa !55 + %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !15 + store i64* %78, i64** %76, align 8, !dbg !15, !tbaa !55 + store i64 %46, i64* %77, align 8, !dbg !15, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #13, !dbg !15 - %97 = getelementptr inbounds i64, i64* %34, i64 14, !dbg !15 - %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !15 - store i64* %98, i64** %29, align 8, !dbg !15, !tbaa !26 - %99 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !26 - %100 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %99, i64 0, i32 2, !dbg !16 - %101 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %100, align 8, !dbg !16, !tbaa !38 - %102 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %101, i64 0, i32 1, !dbg !16 - %103 = load i64*, i64** %102, align 8, !dbg !16, !tbaa !65 - %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !16 - store i64* %104, i64** %102, align 8, !dbg !16, !tbaa !65 - store i64 %60, i64* %103, align 8, !dbg !16, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %29, align 8, !dbg !15, !tbaa !26 + %79 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !26 + %80 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %79, i64 0, i32 2, !dbg !16 + %81 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %80, align 8, !dbg !16, !tbaa !38 + %82 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %81, i64 0, i32 1, !dbg !16 + %83 = load i64*, i64** %82, align 8, !dbg !16, !tbaa !55 + %84 = getelementptr inbounds i64, i64* %83, i64 1, !dbg !16 + store i64* %84, i64** %82, align 8, !dbg !16, !tbaa !55 + store i64 %46, i64* %83, align 8, !dbg !16, !tbaa !4 %send35.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new.1, i64 0) #13, !dbg !16 - %105 = getelementptr inbounds i64, i64* %34, i64 15, !dbg !16 - %106 = getelementptr inbounds i64, i64* %105, i64 1, !dbg !16 - store i64* %106, i64** %29, align 8, !dbg !16, !tbaa !26 - %107 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !26 - %108 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %107, i64 0, i32 2, !dbg !17 - %109 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %108, align 8, !dbg !17, !tbaa !38 - %110 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %109, i64 0, i32 1, !dbg !17 - %111 = load i64*, i64** %110, align 8, !dbg !17, !tbaa !65 - %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !17 - store i64* %112, i64** %110, align 8, !dbg !17, !tbaa !65 - store i64 %send.i, i64* %111, align 8, !dbg !17, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %29, align 8, !dbg !16, !tbaa !26 + %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !26 + %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2, !dbg !17 + %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !dbg !17, !tbaa !38 + %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 1, !dbg !17 + %89 = load i64*, i64** %88, align 8, !dbg !17, !tbaa !55 + %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !17 + store i64* %90, i64** %88, align 8, !dbg !17, !tbaa !55 + store i64 %send.i, i64* %89, align 8, !dbg !17, !tbaa !4 %send40.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read, i64 0) #13, !dbg !17 - %113 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !26 - %114 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %113, i64 0, i32 2, !dbg !18 - %115 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %114, align 8, !dbg !18, !tbaa !38 - %116 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %115, i64 0, i32 1, !dbg !18 - %117 = load i64*, i64** %116, align 8, !dbg !18, !tbaa !65 - %118 = getelementptr inbounds i64, i64* %117, i64 1, !dbg !18 - store i64 %20, i64* %117, align 8, !dbg !18, !tbaa !4 - %119 = getelementptr inbounds i64, i64* %118, i64 1, !dbg !18 - store i64* %119, i64** %116, align 8, !dbg !18, !tbaa !65 - store i64 %send40.i, i64* %118, align 8, !dbg !18, !tbaa !4 + %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !26 + %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !18 + %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !18, !tbaa !38 + %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 1, !dbg !18 + %95 = load i64*, i64** %94, align 8, !dbg !18, !tbaa !55 + %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !18 + store i64 %20, i64* %95, align 8, !dbg !18, !tbaa !4 + %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !18 + store i64* %97, i64** %94, align 8, !dbg !18, !tbaa !55 + store i64 %send40.i, i64* %96, align 8, !dbg !18, !tbaa !4 %send46.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #13, !dbg !18 - %120 = getelementptr inbounds i64, i64* %34, i64 16, !dbg !18 - %121 = getelementptr inbounds i64, i64* %120, i64 1, !dbg !18 - store i64* %121, i64** %29, align 8, !dbg !18, !tbaa !26 - %rubyStr_value.i = load i64, i64* @rubyStrFrozen_value, align 8, !dbg !66 - %122 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !26 - %123 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %122, i64 0, i32 2, !dbg !19 - %124 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %123, align 8, !dbg !19, !tbaa !38 - %125 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %124, i64 0, i32 1, !dbg !19 - %126 = load i64*, i64** %125, align 8, !dbg !19, !tbaa !65 - %127 = getelementptr inbounds i64, i64* %126, i64 1, !dbg !19 - store i64 %send.i, i64* %126, align 8, !dbg !19, !tbaa !4 - %128 = getelementptr inbounds i64, i64* %127, i64 1, !dbg !19 - store i64* %128, i64** %125, align 8, !dbg !19, !tbaa !65 - store i64 %rubyStr_value.i, i64* %127, align 8, !dbg !19, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %29, align 8, !dbg !18, !tbaa !26 + %rubyStr_value.i = load i64, i64* @rubyStrFrozen_value, align 8, !dbg !56 + %98 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !26 + %99 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %98, i64 0, i32 2, !dbg !19 + %100 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %99, align 8, !dbg !19, !tbaa !38 + %101 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %100, i64 0, i32 1, !dbg !19 + %102 = load i64*, i64** %101, align 8, !dbg !19, !tbaa !55 + %103 = getelementptr inbounds i64, i64* %102, i64 1, !dbg !19 + store i64 %send.i, i64* %102, align 8, !dbg !19, !tbaa !4 + %104 = getelementptr inbounds i64, i64* %103, i64 1, !dbg !19 + store i64* %104, i64** %101, align 8, !dbg !19, !tbaa !55 + store i64 %rubyStr_value.i, i64* %103, align 8, !dbg !19, !tbaa !4 %send52.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_write, i64 0) #13, !dbg !19 - %129 = getelementptr inbounds i64, i64* %34, i64 17, !dbg !19 - %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !19 - store i64* %130, i64** %29, align 8, !dbg !19, !tbaa !26 - %131 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !26 - %132 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %131, i64 0, i32 2, !dbg !20 - %133 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %132, align 8, !dbg !20, !tbaa !38 - %134 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %133, i64 0, i32 1, !dbg !20 - %135 = load i64*, i64** %134, align 8, !dbg !20, !tbaa !65 - %136 = getelementptr inbounds i64, i64* %135, i64 1, !dbg !20 - store i64* %136, i64** %134, align 8, !dbg !20, !tbaa !65 - store i64 %send.i, i64* %135, align 8, !dbg !20, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %29, align 8, !dbg !19, !tbaa !26 + %105 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !26 + %106 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %105, i64 0, i32 2, !dbg !20 + %107 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %106, align 8, !dbg !20, !tbaa !38 + %108 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 1, !dbg !20 + %109 = load i64*, i64** %108, align 8, !dbg !20, !tbaa !55 + %110 = getelementptr inbounds i64, i64* %109, i64 1, !dbg !20 + store i64* %110, i64** %108, align 8, !dbg !20, !tbaa !55 + store i64 %send.i, i64* %109, align 8, !dbg !20, !tbaa !4 %send58.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read.2, i64 0) #13, !dbg !20 - %137 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !26 - %138 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %137, i64 0, i32 2, !dbg !21 - %139 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %138, align 8, !dbg !21, !tbaa !38 - %140 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %139, i64 0, i32 1, !dbg !21 - %141 = load i64*, i64** %140, align 8, !dbg !21, !tbaa !65 - %142 = getelementptr inbounds i64, i64* %141, i64 1, !dbg !21 - store i64 %20, i64* %141, align 8, !dbg !21, !tbaa !4 - %143 = getelementptr inbounds i64, i64* %142, i64 1, !dbg !21 - store i64* %143, i64** %140, align 8, !dbg !21, !tbaa !65 - store i64 %send58.i, i64* %142, align 8, !dbg !21, !tbaa !4 + %111 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !26 + %112 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %111, i64 0, i32 2, !dbg !21 + %113 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %112, align 8, !dbg !21, !tbaa !38 + %114 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %113, i64 0, i32 1, !dbg !21 + %115 = load i64*, i64** %114, align 8, !dbg !21, !tbaa !55 + %116 = getelementptr inbounds i64, i64* %115, i64 1, !dbg !21 + store i64 %20, i64* %115, align 8, !dbg !21, !tbaa !4 + %117 = getelementptr inbounds i64, i64* %116, i64 1, !dbg !21 + store i64* %117, i64** %114, align 8, !dbg !21, !tbaa !55 + store i64 %send58.i, i64* %116, align 8, !dbg !21, !tbaa !4 %send65.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0) #13, !dbg !21 - %144 = getelementptr inbounds i64, i64* %34, i64 18, !dbg !21 - %145 = getelementptr inbounds i64, i64* %144, i64 1, !dbg !21 - store i64* %145, i64** %29, align 8, !dbg !21, !tbaa !26 - %146 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !26 - %147 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %146, i64 0, i32 2, !dbg !22 - %148 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %147, align 8, !dbg !22, !tbaa !38 - %149 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %148, i64 0, i32 1, !dbg !22 - %150 = load i64*, i64** %149, align 8, !dbg !22, !tbaa !65 - %151 = getelementptr inbounds i64, i64* %150, i64 1, !dbg !22 - store i64* %151, i64** %149, align 8, !dbg !22, !tbaa !65 - store i64 %send35.i, i64* %150, align 8, !dbg !22, !tbaa !4 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %29, align 8, !dbg !21, !tbaa !26 + %118 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !26 + %119 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %118, i64 0, i32 2, !dbg !22 + %120 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %119, align 8, !dbg !22, !tbaa !38 + %121 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 1, !dbg !22 + %122 = load i64*, i64** %121, align 8, !dbg !22, !tbaa !55 + %123 = getelementptr inbounds i64, i64* %122, i64 1, !dbg !22 + store i64* %123, i64** %121, align 8, !dbg !22, !tbaa !55 + store i64 %send35.i, i64* %122, align 8, !dbg !22, !tbaa !4 %send71.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_read.4, i64 0) #13, !dbg !22 - %152 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !26 - %153 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %152, i64 0, i32 2, !dbg !23 - %154 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %153, align 8, !dbg !23, !tbaa !38 - %155 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %154, i64 0, i32 1, !dbg !23 - %156 = load i64*, i64** %155, align 8, !dbg !23, !tbaa !65 - %157 = getelementptr inbounds i64, i64* %156, i64 1, !dbg !23 - store i64 %20, i64* %156, align 8, !dbg !23, !tbaa !4 - %158 = getelementptr inbounds i64, i64* %157, i64 1, !dbg !23 - store i64* %158, i64** %155, align 8, !dbg !23, !tbaa !65 - store i64 %send71.i, i64* %157, align 8, !dbg !23, !tbaa !4 + %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !26 + %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !23 + %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !23, !tbaa !38 + %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 1, !dbg !23 + %128 = load i64*, i64** %127, align 8, !dbg !23, !tbaa !55 + %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !23 + store i64 %20, i64* %128, align 8, !dbg !23, !tbaa !4 + %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !23 + store i64* %130, i64** %127, align 8, !dbg !23, !tbaa !55 + store i64 %send71.i, i64* %129, align 8, !dbg !23, !tbaa !4 %send78.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0) #13, !dbg !23 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_A#write"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !67 { +define i64 @"func_A#write"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #7 !dbg !57 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !38 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !41 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !44 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !46 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !26 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !68 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !68 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !68 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !68, !prof !69 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !tbaa !26 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !58 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !58 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !58 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !58, !prof !59 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !68 - unreachable, !dbg !68 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !58 + unreachable, !dbg !58 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_v = load i64, i64* %argArray, align 8, !dbg !68 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !70 - store i64* %11, i64** %3, align 8, !dbg !70, !tbaa !26 - %"rubyId_@f" = load i64, i64* @"rubyIdPrecomputed_@f", align 8, !dbg !71 - tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@f", i64 %rawArg_v, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@f") #13, !dbg !71 - %"rubyId_@f9" = load i64, i64* @"rubyIdPrecomputed_@f", align 8, !dbg !72 - %12 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@f9", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@f.6") #13, !dbg !72 - ret i64 %12 + %rawArg_v = load i64, i64* %argArray, align 8, !dbg !58 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !dbg !60, !tbaa !26 + %"rubyId_@f" = load i64, i64* @"rubyIdPrecomputed_@f", align 8, !dbg !61 + tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@f", i64 %rawArg_v, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@f") #13, !dbg !61 + %"rubyId_@f9" = load i64, i64* @"rubyIdPrecomputed_@f", align 8, !dbg !62 + %4 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@f9", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@f.6") #13, !dbg !62 + ret i64 %4 } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_A#read"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !73 { +define i64 @"func_A#read"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #7 !dbg !63 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !38 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !41 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !44 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !46 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !26 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !74 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !74, !prof !75 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !tbaa !26 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !64 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !64, !prof !65 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !74 - unreachable, !dbg !74 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !64 + unreachable, !dbg !64 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !76 - store i64* %11, i64** %3, align 8, !dbg !76, !tbaa !26 - %"rubyId_@f" = load i64, i64* @"rubyIdPrecomputed_@f", align 8, !dbg !77 - %12 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@f", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@f.7") #13, !dbg !77 - ret i64 %12 + store i64* getelementptr inbounds ([20 x i64], [20 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !dbg !66, !tbaa !26 + %"rubyId_@f" = load i64, i64* @"rubyIdPrecomputed_@f", align 8, !dbg !67 + %4 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@f", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@f.7") #13, !dbg !67 + ret i64 %4 } ; Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly @@ -584,7 +548,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @const_recompute_A() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !58 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !47 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -651,37 +615,27 @@ attributes #13 = { nounwind } !41 = !{!42, !27, i64 16} !42 = !{!"rb_control_frame_struct", !27, i64 0, !27, i64 8, !27, i64 16, !5, i64 24, !27, i64 32, !27, i64 40, !27, i64 48} !43 = !{!42, !27, i64 32} -!44 = !{!45, !27, i64 16} -!45 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !27, i64 16, !6, i64 24} -!46 = !{!47, !27, i64 8} -!47 = !{!"rb_iseq_constant_body", !6, i64 0, !33, i64 4, !27, i64 8, !48, i64 16, !50, i64 64, !53, i64 120, !27, i64 152, !27, i64 160, !27, i64 168, !27, i64 176, !27, i64 184, !27, i64 192, !54, i64 200, !33, i64 232, !33, i64 236, !33, i64 240, !33, i64 244, !33, i64 248, !6, i64 252, !5, i64 256} -!48 = !{!"", !49, i64 0, !33, i64 4, !33, i64 8, !33, i64 12, !33, i64 16, !33, i64 20, !33, i64 24, !33, i64 28, !27, i64 32, !27, i64 40} -!49 = !{!"", !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 1, !33, i64 1} -!50 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !33, i64 32, !51, i64 36} -!51 = !{!"rb_code_location_struct", !52, i64 0, !52, i64 8} -!52 = !{!"rb_code_position_struct", !33, i64 0, !33, i64 4} -!53 = !{!"iseq_insn_info", !27, i64 0, !27, i64 8, !33, i64 16, !27, i64 24} -!54 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !27, i64 24} -!55 = !DILocation(line: 0, scope: !14) -!56 = !DILocation(line: 5, column: 1, scope: !14) -!57 = !DILocation(line: 0, scope: !9, inlinedAt: !13) -!58 = !{!34, !34, i64 0} -!59 = !{!"branch_weights", i32 1, i32 10000} -!60 = !{!61, !33, i64 8} -!61 = !{!"rb_sorbet_param_struct", !49, i64 0, !33, i64 4, !33, i64 8, !33, i64 12, !33, i64 16, !33, i64 20, !33, i64 24, !33, i64 28, !27, i64 32, !33, i64 40, !33, i64 44, !33, i64 48, !33, i64 52, !27, i64 56} -!62 = !{!61, !33, i64 4} -!63 = !{!61, !27, i64 32} -!64 = !DILocation(line: 9, column: 3, scope: !9, inlinedAt: !13) -!65 = !{!42, !27, i64 8} -!66 = !DILocation(line: 17, column: 9, scope: !14) -!67 = distinct !DISubprogram(name: "A#write", linkageName: "func_A#write", scope: null, file: !2, line: 6, type: !10, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!68 = !DILocation(line: 6, column: 3, scope: !67) -!69 = !{!"branch_weights", i32 4001, i32 4000000} -!70 = !DILocation(line: 6, column: 13, scope: !67) -!71 = !DILocation(line: 7, column: 10, scope: !67) -!72 = !DILocation(line: 7, column: 5, scope: !67) -!73 = distinct !DISubprogram(name: "A#read", linkageName: "func_A#read", scope: null, file: !2, line: 9, type: !10, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!74 = !DILocation(line: 9, column: 3, scope: !73) -!75 = !{!"branch_weights", i32 1, i32 2000} -!76 = !DILocation(line: 0, scope: !73) -!77 = !DILocation(line: 10, column: 5, scope: !73) +!44 = !DILocation(line: 0, scope: !14) +!45 = !DILocation(line: 5, column: 1, scope: !14) +!46 = !DILocation(line: 0, scope: !9, inlinedAt: !13) +!47 = !{!34, !34, i64 0} +!48 = !{!"branch_weights", i32 1, i32 10000} +!49 = !{!50, !33, i64 8} +!50 = !{!"rb_sorbet_param_struct", !51, i64 0, !33, i64 4, !33, i64 8, !33, i64 12, !33, i64 16, !33, i64 20, !33, i64 24, !33, i64 28, !27, i64 32, !33, i64 40, !33, i64 44, !33, i64 48, !33, i64 52, !27, i64 56} +!51 = !{!"", !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 0, !33, i64 1, !33, i64 1} +!52 = !{!50, !33, i64 4} +!53 = !{!50, !27, i64 32} +!54 = !DILocation(line: 9, column: 3, scope: !9, inlinedAt: !13) +!55 = !{!42, !27, i64 8} +!56 = !DILocation(line: 17, column: 9, scope: !14) +!57 = distinct !DISubprogram(name: "A#write", linkageName: "func_A#write", scope: null, file: !2, line: 6, type: !10, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!58 = !DILocation(line: 6, column: 3, scope: !57) +!59 = !{!"branch_weights", i32 4001, i32 4000000} +!60 = !DILocation(line: 6, column: 13, scope: !57) +!61 = !DILocation(line: 7, column: 10, scope: !57) +!62 = !DILocation(line: 7, column: 5, scope: !57) +!63 = distinct !DISubprogram(name: "A#read", linkageName: "func_A#read", scope: null, file: !2, line: 9, type: !10, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!64 = !DILocation(line: 9, column: 3, scope: !63) +!65 = !{!"branch_weights", i32 1, i32 2000} +!66 = !DILocation(line: 0, scope: !63) +!67 = !DILocation(line: 10, column: 5, scope: !63) diff --git a/test/testdata/compiler/intrinsics/bang.llo.exp b/test/testdata/compiler/intrinsics/bang.llo.exp index 3eec2b6d1ef..0a1142dcf85 100644 --- a/test/testdata/compiler/intrinsics/bang.llo.exp +++ b/test/testdata/compiler/intrinsics/bang.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/intrinsics/bang.rb" = private unnamed_addr constant [42 x i8] c"test/testdata/compiler/intrinsics/bang.rb\00", align 1 +@iseqEncodedArray = internal global [23 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_Bad = private unnamed_addr constant [4 x i8] c"Bad\00", align 1 @str_Main = private unnamed_addr constant [5 x i8] c"Main\00", align 1 @ic_test = internal global %struct.FunctionInlineCache zeroinitializer @@ -130,7 +134,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -223,9 +229,11 @@ entry: %9 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @"str_test/testdata/compiler/intrinsics/bang.rb", i64 0, i64 0), i64 noundef 41) #13 tail call void @rb_gc_register_mark_object(i64 %9) #13 store i64 %9, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 23) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %9, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 22, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb", align 8 + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_test.i = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test, i64 %rubyId_test.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !8 @@ -233,7 +241,7 @@ entry: call void @rb_gc_register_mark_object(i64 %11) #13 %"rubyId_!.i.i" = load i64, i64* @"rubyIdPrecomputed_!", align 8 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i20.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb", align 8 - %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %11, i64 %"rubyId_!.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 6, i32 noundef 9, i64* noundef nonnull %locals.i21.i, i32 noundef 0, i32 noundef 2) + %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %11, i64 %"rubyId_!.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i21.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %12, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Bad#!", align 8 %13 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([18 x i8], [18 x i8]* @"str_bad bang overload", i64 0, i64 0), i64 noundef 17) #13 call void @rb_gc_register_mark_object(i64 %13) #13 @@ -243,7 +251,7 @@ entry: %"rubyId_.i22.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i23.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i24.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb", align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i23.i", i64 %"rubyId_.i22.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i24.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i25.i, i32 noundef 0, i32 noundef 4) + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i23.i", i64 %"rubyId_.i22.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i24.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i25.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Bad.", align 8 %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !15 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !15 @@ -251,7 +259,7 @@ entry: call void @rb_gc_register_mark_object(i64 %15) #13 %rubyId_test.i.i = load i64, i64* @rubyIdPrecomputed_test, align 8 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i26.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_test.i.i, i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 13, i32 noundef 19, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 2) + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %15, i64 %rubyId_test.i.i, i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Main.test, align 8 %rubyId_puts3.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !17 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 %rubyId_puts3.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !17 @@ -271,7 +279,7 @@ entry: %"rubyId_.i28.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i29.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i30.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/bang.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i29.i", i64 %"rubyId_.i28.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 12, i32 noundef 12, i64* noundef nonnull %locals.i31.i, i32 noundef 0, i32 noundef 4) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i29.i", i64 %"rubyId_.i28.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/bang.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i31.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Main.", align 8 %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !24 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !24 @@ -288,137 +296,112 @@ entry: store i64 %26, i64* %24, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %19, %struct.rb_control_frame_struct* align 8 %21, %struct.rb_iseq_struct* %stackFrame.i) #13 %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 0 - %28 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %22, align 8, !tbaa !32 - %29 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %28, i64 0, i32 2 - %30 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %29, align 8, !tbaa !35 - %31 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %30, i64 0, i32 2 - %32 = load i64*, i64** %31, align 8, !tbaa !37 - %33 = getelementptr inbounds i64, i64* %32, i64 4 - %34 = getelementptr inbounds i64, i64* %33, i64 1 - store i64* %34, i64** %27, align 8, !dbg !46, !tbaa !26 - %35 = load i64, i64* @rb_cObject, align 8, !dbg !47 - %36 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Bad, i64 0, i64 0), i64 %35) #13, !dbg !47 - call void @sorbet_pushStaticInitFrame(i64 %36) #13, !dbg !47 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %27, align 8, !dbg !35, !tbaa !26 + %28 = load i64, i64* @rb_cObject, align 8, !dbg !36 + %29 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Bad, i64 0, i64 0), i64 %28) #13, !dbg !36 + call void @sorbet_pushStaticInitFrame(i64 %29) #13, !dbg !36 %stackFrame.i1.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Bad.", align 8 - %37 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 - %38 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %37, i64 0, i32 2 - %39 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %38, align 8, !tbaa !28 - %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %39, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %40, align 8, !tbaa !32 - %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %39, i64 0, i32 4 - %42 = load i64*, i64** %41, align 8, !tbaa !34 - %43 = load i64, i64* %42, align 8, !tbaa !4 - %44 = and i64 %43, -33 - store i64 %44, i64* %42, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %37, %struct.rb_control_frame_struct* align 8 %39, %struct.rb_iseq_struct* %stackFrame.i1.i) #13 - %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %39, i64 0, i32 0 - %46 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %40, align 8, !tbaa !32 - %47 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %46, i64 0, i32 2 - %48 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %47, align 8, !tbaa !35 - %49 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %48, i64 0, i32 2 - %50 = load i64*, i64** %49, align 8, !tbaa !37 - %51 = getelementptr inbounds i64, i64* %50, i64 1 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !48 - store i64* %52, i64** %45, align 8, !dbg !48, !tbaa !26 - %"rubyId_!.i.i1" = load i64, i64* @"rubyIdPrecomputed_!", align 8, !dbg !50 - %rawSym.i2.i = call i64 @rb_id2sym(i64 %"rubyId_!.i.i1") #13, !dbg !50 - %rubyId_normal.i3.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !50 - %rawSym7.i4.i = call i64 @rb_id2sym(i64 %rubyId_normal.i3.i) #13, !dbg !50 - %53 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !50 - %54 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !50, !tbaa !51 - %needTakeSlowPath = icmp ne i64 %53, %54, !dbg !50 - br i1 %needTakeSlowPath, label %55, label %56, !dbg !50, !prof !53 - -55: ; preds = %entry - call void @const_recompute_Bad(), !dbg !50 - br label %56, !dbg !50 - -56: ; preds = %entry, %55 - %57 = load i64, i64* @guarded_const_Bad, align 8, !dbg !50 - %58 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !50 - %59 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !50, !tbaa !51 - %guardUpdated = icmp eq i64 %58, %59, !dbg !50 - call void @llvm.assume(i1 %guardUpdated), !dbg !50 - %stackFrame8.i5.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Bad#!", align 8, !dbg !50 - %60 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !50 - %61 = bitcast i8* %60 to i16*, !dbg !50 - %62 = load i16, i16* %61, align 8, !dbg !50 - %63 = and i16 %62, -384, !dbg !50 - store i16 %63, i16* %61, align 8, !dbg !50 - %64 = getelementptr inbounds i8, i8* %60, i64 4, !dbg !50 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %64, i8 0, i64 28, i1 false) #13, !dbg !50 - %65 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @"str_!", i64 0, i64 0)) #13, !dbg !50 - %66 = bitcast i8* %60 to %struct.rb_sorbet_param_struct*, !dbg !50 - %67 = bitcast %struct.rb_iseq_struct* %stackFrame8.i5.i to i8*, !dbg !50 - call void @rb_add_method_sorbet(i64 %57, i64 %65, i64 (i32, i64*, i64)* noundef @"func_Bad#!", %struct.rb_sorbet_param_struct* nonnull %66, i32 noundef 1, i8* %67) #13, !dbg !50 - call void @sorbet_popRubyStack() #13, !dbg !47 - %68 = getelementptr inbounds i64, i64* %32, i64 11, !dbg !47 - %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !47 - store i64* %69, i64** %27, align 8, !dbg !47, !tbaa !26 - %70 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_Main, i64 0, i64 0)) #13, !dbg !54 - call void @sorbet_pushStaticInitFrame(i64 %70) #13, !dbg !54 + %30 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 + %31 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %30, i64 0, i32 2 + %32 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %31, align 8, !tbaa !28 + %33 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i1.i, %struct.rb_iseq_struct** %33, align 8, !tbaa !32 + %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 4 + %35 = load i64*, i64** %34, align 8, !tbaa !34 + %36 = load i64, i64* %35, align 8, !tbaa !4 + %37 = and i64 %36, -33 + store i64 %37, i64* %35, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %30, %struct.rb_control_frame_struct* align 8 %32, %struct.rb_iseq_struct* %stackFrame.i1.i) #13 + %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 0 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %38, align 8, !dbg !37, !tbaa !26 + %"rubyId_!.i.i1" = load i64, i64* @"rubyIdPrecomputed_!", align 8, !dbg !39 + %rawSym.i2.i = call i64 @rb_id2sym(i64 %"rubyId_!.i.i1") #13, !dbg !39 + %rubyId_normal.i3.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !39 + %rawSym7.i4.i = call i64 @rb_id2sym(i64 %rubyId_normal.i3.i) #13, !dbg !39 + %39 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !39 + %40 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !40 + %needTakeSlowPath = icmp ne i64 %39, %40, !dbg !39 + br i1 %needTakeSlowPath, label %41, label %42, !dbg !39, !prof !42 + +41: ; preds = %entry + call void @const_recompute_Bad(), !dbg !39 + br label %42, !dbg !39 + +42: ; preds = %entry, %41 + %43 = load i64, i64* @guarded_const_Bad, align 8, !dbg !39 + %44 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !39 + %45 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !40 + %guardUpdated = icmp eq i64 %44, %45, !dbg !39 + call void @llvm.assume(i1 %guardUpdated), !dbg !39 + %stackFrame8.i5.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Bad#!", align 8, !dbg !39 + %46 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !39 + %47 = bitcast i8* %46 to i16*, !dbg !39 + %48 = load i16, i16* %47, align 8, !dbg !39 + %49 = and i16 %48, -384, !dbg !39 + store i16 %49, i16* %47, align 8, !dbg !39 + %50 = getelementptr inbounds i8, i8* %46, i64 4, !dbg !39 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %50, i8 0, i64 28, i1 false) #13, !dbg !39 + %51 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @"str_!", i64 0, i64 0)) #13, !dbg !39 + %52 = bitcast i8* %46 to %struct.rb_sorbet_param_struct*, !dbg !39 + %53 = bitcast %struct.rb_iseq_struct* %stackFrame8.i5.i to i8*, !dbg !39 + call void @rb_add_method_sorbet(i64 %43, i64 %51, i64 (i32, i64*, i64)* noundef @"func_Bad#!", %struct.rb_sorbet_param_struct* nonnull %52, i32 noundef 1, i8* %53) #13, !dbg !39 + call void @sorbet_popRubyStack() #13, !dbg !36 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %27, align 8, !dbg !36, !tbaa !26 + %54 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_Main, i64 0, i64 0)) #13, !dbg !43 + call void @sorbet_pushStaticInitFrame(i64 %54) #13, !dbg !43 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Main.", align 8 - %71 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 - %72 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %71, i64 0, i32 2 - %73 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %72, align 8, !tbaa !28 - %74 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %73, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %74, align 8, !tbaa !32 - %75 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %73, i64 0, i32 4 - %76 = load i64*, i64** %75, align 8, !tbaa !34 - %77 = load i64, i64* %76, align 8, !tbaa !4 - %78 = and i64 %77, -33 - store i64 %78, i64* %76, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %71, %struct.rb_control_frame_struct* align 8 %73, %struct.rb_iseq_struct* %stackFrame.i.i) #13 - %79 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %73, i64 0, i32 0 - %80 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %74, align 8, !tbaa !32 - %81 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %80, i64 0, i32 2 - %82 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %81, align 8, !tbaa !35 - %83 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %82, i64 0, i32 2 - %84 = load i64*, i64** %83, align 8, !tbaa !37 - %85 = getelementptr inbounds i64, i64* %84, i64 1 - %86 = getelementptr inbounds i64, i64* %85, i64 1, !dbg !55 - store i64* %86, i64** %79, align 8, !dbg !55, !tbaa !26 - %rubyId_test.i.i2 = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !57 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_test.i.i2) #13, !dbg !57 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !57 - %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !57 - %87 = load i64, i64* @guard_epoch_Main, align 8, !dbg !57 - %88 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !57, !tbaa !51 - %needTakeSlowPath3 = icmp ne i64 %87, %88, !dbg !57 - br i1 %needTakeSlowPath3, label %89, label %90, !dbg !57, !prof !53 - -89: ; preds = %56 - call void @const_recompute_Main(), !dbg !57 - br label %90, !dbg !57 - -90: ; preds = %56, %89 - %91 = load i64, i64* @guarded_const_Main, align 8, !dbg !57 - %92 = load i64, i64* @guard_epoch_Main, align 8, !dbg !57 - %93 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !57, !tbaa !51 - %guardUpdated4 = icmp eq i64 %92, %93, !dbg !57 - call void @llvm.assume(i1 %guardUpdated4), !dbg !57 - %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Main.test, align 8, !dbg !57 - %94 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !57 - %95 = bitcast i8* %94 to i16*, !dbg !57 - %96 = load i16, i16* %95, align 8, !dbg !57 - %97 = and i16 %96, -384, !dbg !57 - store i16 %97, i16* %95, align 8, !dbg !57 - %98 = getelementptr inbounds i8, i8* %94, i64 4, !dbg !57 - %99 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !57 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %98, i8 0, i64 28, i1 false) #13, !dbg !57 - call void @rb_define_singleton_sorbet_method(i64 %91, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_test, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Main.test, i8* nonnull %94, i8* %99) #13, !dbg !57 - call void @sorbet_popRubyStack() #13, !dbg !54 - %100 = getelementptr inbounds i64, i64* %32, i64 21, !dbg !54 - %101 = getelementptr inbounds i64, i64* %100, i64 1, !dbg !54 - store i64* %101, i64** %27, align 8, !dbg !54, !tbaa !26 - %102 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !26 - %103 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %102, i64 0, i32 2, !dbg !8 - %104 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %103, align 8, !dbg !8, !tbaa !28 - %105 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %104, i64 0, i32 1, !dbg !8 - %106 = load i64*, i64** %105, align 8, !dbg !8, !tbaa !58 - %107 = getelementptr inbounds i64, i64* %106, i64 1, !dbg !8 - store i64* %107, i64** %105, align 8, !dbg !8, !tbaa !58 - store i64 %91, i64* %106, align 8, !dbg !8, !tbaa !4 + %55 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !26 + %56 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %55, i64 0, i32 2 + %57 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %56, align 8, !tbaa !28 + %58 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %58, align 8, !tbaa !32 + %59 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 4 + %60 = load i64*, i64** %59, align 8, !tbaa !34 + %61 = load i64, i64* %60, align 8, !tbaa !4 + %62 = and i64 %61, -33 + store i64 %62, i64* %60, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %55, %struct.rb_control_frame_struct* align 8 %57, %struct.rb_iseq_struct* %stackFrame.i.i) #13 + %63 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 0 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %63, align 8, !dbg !44, !tbaa !26 + %rubyId_test.i.i2 = load i64, i64* @rubyIdPrecomputed_test, align 8, !dbg !46 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_test.i.i2) #13, !dbg !46 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !46 + %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #13, !dbg !46 + %64 = load i64, i64* @guard_epoch_Main, align 8, !dbg !46 + %65 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !46, !tbaa !40 + %needTakeSlowPath3 = icmp ne i64 %64, %65, !dbg !46 + br i1 %needTakeSlowPath3, label %66, label %67, !dbg !46, !prof !42 + +66: ; preds = %42 + call void @const_recompute_Main(), !dbg !46 + br label %67, !dbg !46 + +67: ; preds = %42, %66 + %68 = load i64, i64* @guarded_const_Main, align 8, !dbg !46 + %69 = load i64, i64* @guard_epoch_Main, align 8, !dbg !46 + %70 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !46, !tbaa !40 + %guardUpdated4 = icmp eq i64 %69, %70, !dbg !46 + call void @llvm.assume(i1 %guardUpdated4), !dbg !46 + %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Main.test, align 8, !dbg !46 + %71 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !46 + %72 = bitcast i8* %71 to i16*, !dbg !46 + %73 = load i16, i16* %72, align 8, !dbg !46 + %74 = and i16 %73, -384, !dbg !46 + store i16 %74, i16* %72, align 8, !dbg !46 + %75 = getelementptr inbounds i8, i8* %71, i64 4, !dbg !46 + %76 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !46 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %75, i8 0, i64 28, i1 false) #13, !dbg !46 + call void @rb_define_singleton_sorbet_method(i64 %68, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_test, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Main.test, i8* nonnull %71, i8* %76) #13, !dbg !46 + call void @sorbet_popRubyStack() #13, !dbg !43 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 22), i64** %27, align 8, !dbg !43, !tbaa !26 + %77 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !26 + %78 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %77, i64 0, i32 2, !dbg !8 + %79 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %78, align 8, !dbg !8, !tbaa !28 + %80 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %79, i64 0, i32 1, !dbg !8 + %81 = load i64*, i64** %80, align 8, !dbg !8, !tbaa !47 + %82 = getelementptr inbounds i64, i64* %81, i64 1, !dbg !8 + store i64* %82, i64** %80, align 8, !dbg !8, !tbaa !47 + store i64 %68, i64* %81, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test, i64 0) #13, !dbg !8 ret void } @@ -430,39 +413,29 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !28 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !32 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !35 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !37 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !26 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !59 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !59, !prof !60 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !tbaa !26 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !48 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !48, !prof !49 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !59 - unreachable, !dbg !59 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !48 + unreachable, !dbg !48 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !61 - store i64* %11, i64** %3, align 8, !dbg !61, !tbaa !26 - %"rubyStr_bad bang overload" = load i64, i64* @"rubyStrFrozen_bad bang overload", align 8, !dbg !62 - %12 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !26 - %13 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %12, i64 0, i32 2, !dbg !13 - %14 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %13, align 8, !dbg !13, !tbaa !28 - %15 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 1, !dbg !13 - %16 = load i64*, i64** %15, align 8, !dbg !13, !tbaa !58 - %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !13 - store i64 %selfRaw, i64* %16, align 8, !dbg !13, !tbaa !4 - %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !13 - store i64* %18, i64** %15, align 8, !dbg !13, !tbaa !58 - store i64 %"rubyStr_bad bang overload", i64* %17, align 8, !dbg !13, !tbaa !4 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !dbg !50, !tbaa !26 + %"rubyStr_bad bang overload" = load i64, i64* @"rubyStrFrozen_bad bang overload", align 8, !dbg !51 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !26 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !13 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !13, !tbaa !28 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 1, !dbg !13 + %8 = load i64*, i64** %7, align 8, !dbg !13, !tbaa !47 + %9 = getelementptr inbounds i64, i64* %8, i64 1, !dbg !13 + store i64 %selfRaw, i64* %8, align 8, !dbg !13, !tbaa !4 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !13 + store i64* %10, i64** %7, align 8, !dbg !13, !tbaa !47 + store i64 %"rubyStr_bad bang overload", i64* %9, align 8, !dbg !13, !tbaa !4 %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !13 - %19 = getelementptr inbounds i64, i64* %9, i64 2, !dbg !13 - %20 = getelementptr inbounds i64, i64* %19, i64 1, !dbg !13 - store i64* %20, i64** %3, align 8, !dbg !13, !tbaa !26 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !13, !tbaa !26 ret i64 20 } @@ -473,150 +446,134 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !28 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !32 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !35 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !37 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !26 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !63 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !63, !prof !60 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !tbaa !26 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !52 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !52, !prof !49 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !63 - unreachable, !dbg !63 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !52 + unreachable, !dbg !52 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !64 - store i64* %11, i64** %3, align 8, !dbg !64, !tbaa !26 - tail call void @llvm.experimental.noalias.scope.decl(metadata !65), !dbg !68 - %12 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !26 - %13 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %12, i64 0, i32 2, !dbg !17 - %14 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %13, align 8, !dbg !17, !tbaa !28 - %15 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 1, !dbg !17 - %16 = load i64*, i64** %15, align 8, !dbg !17, !tbaa !58 - %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !17 - store i64 %selfRaw, i64* %16, align 8, !dbg !17, !tbaa !4 - %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !17 - store i64* %18, i64** %15, align 8, !dbg !17, !tbaa !58 - store i64 0, i64* %17, align 8, !dbg !17, !tbaa !4 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %3, align 8, !dbg !53, !tbaa !26 + tail call void @llvm.experimental.noalias.scope.decl(metadata !54), !dbg !57 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !26 + %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2, !dbg !17 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !dbg !17, !tbaa !28 + %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 1, !dbg !17 + %8 = load i64*, i64** %7, align 8, !dbg !17, !tbaa !47 + %9 = getelementptr inbounds i64, i64* %8, i64 1, !dbg !17 + store i64 %selfRaw, i64* %8, align 8, !dbg !17, !tbaa !4 + %10 = getelementptr inbounds i64, i64* %9, i64 1, !dbg !17 + store i64* %10, i64** %7, align 8, !dbg !17, !tbaa !47 + store i64 0, i64* %9, align 8, !dbg !17, !tbaa !4 %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0), !dbg !17 - %19 = getelementptr inbounds i64, i64* %9, i64 2, !dbg !17 - %20 = getelementptr inbounds i64, i64* %19, i64 1, !dbg !17 - store i64* %20, i64** %3, align 8, !dbg !17, !tbaa !26 - tail call void @llvm.experimental.noalias.scope.decl(metadata !69), !dbg !72 - %21 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !26 - %22 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %21, i64 0, i32 2, !dbg !19 - %23 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %22, align 8, !dbg !19, !tbaa !28 - %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 1, !dbg !19 - %25 = load i64*, i64** %24, align 8, !dbg !19, !tbaa !58 - %26 = getelementptr inbounds i64, i64* %25, i64 1, !dbg !19 - store i64 %selfRaw, i64* %25, align 8, !dbg !19, !tbaa !4 - %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !19 - store i64* %27, i64** %24, align 8, !dbg !19, !tbaa !58 - store i64 20, i64* %26, align 8, !dbg !19, !tbaa !4 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 15), i64** %3, align 8, !dbg !17, !tbaa !26 + tail call void @llvm.experimental.noalias.scope.decl(metadata !58), !dbg !61 + %11 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !26 + %12 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %11, i64 0, i32 2, !dbg !19 + %13 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %12, align 8, !dbg !19, !tbaa !28 + %14 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %13, i64 0, i32 1, !dbg !19 + %15 = load i64*, i64** %14, align 8, !dbg !19, !tbaa !47 + %16 = getelementptr inbounds i64, i64* %15, i64 1, !dbg !19 + store i64 %selfRaw, i64* %15, align 8, !dbg !19, !tbaa !4 + %17 = getelementptr inbounds i64, i64* %16, i64 1, !dbg !19 + store i64* %17, i64** %14, align 8, !dbg !19, !tbaa !47 + store i64 20, i64* %16, align 8, !dbg !19, !tbaa !4 %send46 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0), !dbg !19 - %28 = getelementptr inbounds i64, i64* %9, i64 3, !dbg !19 - %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !19 - store i64* %29, i64** %3, align 8, !dbg !19, !tbaa !26 - tail call void @llvm.experimental.noalias.scope.decl(metadata !73), !dbg !76 - %30 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !26 - %31 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %30, i64 0, i32 2, !dbg !20 - %32 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %31, align 8, !dbg !20, !tbaa !28 - %33 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 1, !dbg !20 - %34 = load i64*, i64** %33, align 8, !dbg !20, !tbaa !58 - %35 = getelementptr inbounds i64, i64* %34, i64 1, !dbg !20 - store i64 %selfRaw, i64* %34, align 8, !dbg !20, !tbaa !4 - %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !20 - store i64* %36, i64** %33, align 8, !dbg !20, !tbaa !58 - store i64 20, i64* %35, align 8, !dbg !20, !tbaa !4 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %3, align 8, !dbg !19, !tbaa !26 + tail call void @llvm.experimental.noalias.scope.decl(metadata !62), !dbg !65 + %18 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !26 + %19 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %18, i64 0, i32 2, !dbg !20 + %20 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %19, align 8, !dbg !20, !tbaa !28 + %21 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %20, i64 0, i32 1, !dbg !20 + %22 = load i64*, i64** %21, align 8, !dbg !20, !tbaa !47 + %23 = getelementptr inbounds i64, i64* %22, i64 1, !dbg !20 + store i64 %selfRaw, i64* %22, align 8, !dbg !20, !tbaa !4 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !20 + store i64* %24, i64** %21, align 8, !dbg !20, !tbaa !47 + store i64 20, i64* %23, align 8, !dbg !20, !tbaa !4 %send59 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0), !dbg !20 - %37 = getelementptr inbounds i64, i64* %9, i64 4, !dbg !20 - %38 = getelementptr inbounds i64, i64* %37, i64 1, !dbg !20 - store i64* %38, i64** %3, align 8, !dbg !20, !tbaa !26 - %rubyStr_hello = load i64, i64* @rubyStrFrozen_hello, align 8, !dbg !77 - %"rubyId_!63" = load i64, i64* @"rubyIdPrecomputed_!", align 8, !dbg !78 - tail call void @llvm.experimental.noalias.scope.decl(metadata !79), !dbg !78 - %39 = and i64 %rubyStr_hello, -9, !dbg !78 - %40 = icmp eq i64 %39, 0, !dbg !78 - br i1 %40, label %sorbet_bang.exit105, label %41, !dbg !78 - -41: ; preds = %fillRequiredArgs - %42 = icmp eq i64 %rubyStr_hello, 20, !dbg !78 - br i1 %42, label %sorbet_bang.exit105, label %43, !dbg !78 - -43: ; preds = %41 - %44 = tail call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_bang.rb_funcallv_data, i64 %rubyStr_hello, i64 %"rubyId_!63", i32 noundef 0, i64* noundef null) #13, !dbg !78 - br label %sorbet_bang.exit105, !dbg !78 - -sorbet_bang.exit105: ; preds = %fillRequiredArgs, %41, %43 - %45 = phi i64 [ %44, %43 ], [ 0, %41 ], [ 20, %fillRequiredArgs ], !dbg !78 - %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !26 - %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !21 - %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !21, !tbaa !28 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 1, !dbg !21 - %50 = load i64*, i64** %49, align 8, !dbg !21, !tbaa !58 - %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !21 - store i64 %selfRaw, i64* %50, align 8, !dbg !21, !tbaa !4 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !21 - store i64* %52, i64** %49, align 8, !dbg !21, !tbaa !58 - store i64 %45, i64* %51, align 8, !dbg !21, !tbaa !4 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %3, align 8, !dbg !20, !tbaa !26 + %rubyStr_hello = load i64, i64* @rubyStrFrozen_hello, align 8, !dbg !66 + %"rubyId_!63" = load i64, i64* @"rubyIdPrecomputed_!", align 8, !dbg !67 + tail call void @llvm.experimental.noalias.scope.decl(metadata !68), !dbg !67 + %25 = and i64 %rubyStr_hello, -9, !dbg !67 + %26 = icmp eq i64 %25, 0, !dbg !67 + br i1 %26, label %sorbet_bang.exit100, label %27, !dbg !67 + +27: ; preds = %fillRequiredArgs + %28 = icmp eq i64 %rubyStr_hello, 20, !dbg !67 + br i1 %28, label %sorbet_bang.exit100, label %29, !dbg !67 + +29: ; preds = %27 + %30 = tail call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_bang.rb_funcallv_data, i64 %rubyStr_hello, i64 %"rubyId_!63", i32 noundef 0, i64* noundef null) #13, !dbg !67 + br label %sorbet_bang.exit100, !dbg !67 + +sorbet_bang.exit100: ; preds = %fillRequiredArgs, %27, %29 + %31 = phi i64 [ %30, %29 ], [ 0, %27 ], [ 20, %fillRequiredArgs ], !dbg !67 + %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !26 + %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !21 + %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !21, !tbaa !28 + %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 1, !dbg !21 + %36 = load i64*, i64** %35, align 8, !dbg !21, !tbaa !47 + %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !21 + store i64 %selfRaw, i64* %36, align 8, !dbg !21, !tbaa !4 + %38 = getelementptr inbounds i64, i64* %37, i64 1, !dbg !21 + store i64* %38, i64** %35, align 8, !dbg !21, !tbaa !47 + store i64 %31, i64* %37, align 8, !dbg !21, !tbaa !4 %send71 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 0), !dbg !21 - %53 = getelementptr inbounds i64, i64* %9, i64 5, !dbg !21 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !21 - store i64* %54, i64** %3, align 8, !dbg !21, !tbaa !26 - %55 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !22 - %56 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !51 - %needTakeSlowPath = icmp ne i64 %55, %56, !dbg !22 - br i1 %needTakeSlowPath, label %57, label %58, !dbg !22, !prof !53 - -57: ; preds = %sorbet_bang.exit105 + store i64* getelementptr inbounds ([23 x i64], [23 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %3, align 8, !dbg !21, !tbaa !26 + %39 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !22 + %40 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !40 + %needTakeSlowPath = icmp ne i64 %39, %40, !dbg !22 + br i1 %needTakeSlowPath, label %41, label %42, !dbg !22, !prof !42 + +41: ; preds = %sorbet_bang.exit100 tail call void @const_recompute_Bad(), !dbg !22 - br label %58, !dbg !22 + br label %42, !dbg !22 -58: ; preds = %sorbet_bang.exit105, %57 - %59 = load i64, i64* @guarded_const_Bad, align 8, !dbg !22 - %60 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !22 - %61 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !51 - %guardUpdated = icmp eq i64 %60, %61, !dbg !22 +42: ; preds = %sorbet_bang.exit100, %41 + %43 = load i64, i64* @guarded_const_Bad, align 8, !dbg !22 + %44 = load i64, i64* @guard_epoch_Bad, align 8, !dbg !22 + %45 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !22, !tbaa !40 + %guardUpdated = icmp eq i64 %44, %45, !dbg !22 tail call void @llvm.assume(i1 %guardUpdated), !dbg !22 - %62 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !26 - %63 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %62, i64 0, i32 2, !dbg !22 - %64 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %63, align 8, !dbg !22, !tbaa !28 - %65 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %64, i64 0, i32 1, !dbg !22 - %66 = load i64*, i64** %65, align 8, !dbg !22, !tbaa !58 - %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !22 - store i64* %67, i64** %65, align 8, !dbg !22, !tbaa !58 - store i64 %59, i64* %66, align 8, !dbg !22, !tbaa !4 + %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !26 + %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !22 + %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !22, !tbaa !28 + %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 1, !dbg !22 + %50 = load i64*, i64** %49, align 8, !dbg !22, !tbaa !47 + %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !22 + store i64* %51, i64** %49, align 8, !dbg !22, !tbaa !47 + store i64 %43, i64* %50, align 8, !dbg !22, !tbaa !4 %send75 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0), !dbg !22 - %"rubyId_!79" = load i64, i64* @"rubyIdPrecomputed_!", align 8, !dbg !82 - tail call void @llvm.experimental.noalias.scope.decl(metadata !83), !dbg !82 - %68 = and i64 %send75, -9, !dbg !82 - %69 = icmp eq i64 %68, 0, !dbg !82 - br i1 %69, label %sorbet_bang.exit, label %70, !dbg !82 - -70: ; preds = %58 - %71 = icmp eq i64 %send75, 20, !dbg !82 - br i1 %71, label %sorbet_bang.exit, label %72, !dbg !82 - -72: ; preds = %70 - %73 = tail call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_bang.rb_funcallv_data, i64 %send75, i64 %"rubyId_!79", i32 noundef 0, i64* noundef null) #13, !dbg !82 - br label %sorbet_bang.exit, !dbg !82 - -sorbet_bang.exit: ; preds = %58, %70, %72 - %74 = phi i64 [ %73, %72 ], [ 0, %70 ], [ 20, %58 ], !dbg !82 - %75 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !26 - %76 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %75, i64 0, i32 2, !dbg !23 - %77 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %76, align 8, !dbg !23, !tbaa !28 - %78 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %77, i64 0, i32 1, !dbg !23 - %79 = load i64*, i64** %78, align 8, !dbg !23, !tbaa !58 - %80 = getelementptr inbounds i64, i64* %79, i64 1, !dbg !23 - store i64 %selfRaw, i64* %79, align 8, !dbg !23, !tbaa !4 - %81 = getelementptr inbounds i64, i64* %80, i64 1, !dbg !23 - store i64* %81, i64** %78, align 8, !dbg !23, !tbaa !58 - store i64 %74, i64* %80, align 8, !dbg !23, !tbaa !4 + %"rubyId_!79" = load i64, i64* @"rubyIdPrecomputed_!", align 8, !dbg !71 + tail call void @llvm.experimental.noalias.scope.decl(metadata !72), !dbg !71 + %52 = and i64 %send75, -9, !dbg !71 + %53 = icmp eq i64 %52, 0, !dbg !71 + br i1 %53, label %sorbet_bang.exit, label %54, !dbg !71 + +54: ; preds = %42 + %55 = icmp eq i64 %send75, 20, !dbg !71 + br i1 %55, label %sorbet_bang.exit, label %56, !dbg !71 + +56: ; preds = %54 + %57 = tail call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_bang.rb_funcallv_data, i64 %send75, i64 %"rubyId_!79", i32 noundef 0, i64* noundef null) #13, !dbg !71 + br label %sorbet_bang.exit, !dbg !71 + +sorbet_bang.exit: ; preds = %42, %54, %56 + %58 = phi i64 [ %57, %56 ], [ 0, %54 ], [ 20, %42 ], !dbg !71 + %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !26 + %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2, !dbg !23 + %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !dbg !23, !tbaa !28 + %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 1, !dbg !23 + %63 = load i64*, i64** %62, align 8, !dbg !23, !tbaa !47 + %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !23 + store i64 %selfRaw, i64* %63, align 8, !dbg !23, !tbaa !4 + %65 = getelementptr inbounds i64, i64* %64, i64 1, !dbg !23 + store i64* %65, i64** %62, align 8, !dbg !23, !tbaa !47 + store i64 %58, i64* %64, align 8, !dbg !23, !tbaa !4 %send87 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0), !dbg !23 ret i64 %send87 } @@ -634,7 +591,7 @@ declare void @llvm.assume(i1 noundef) #9 define linkonce void @const_recompute_Bad() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str_Bad, i64 0, i64 0), i64 3) store i64 %1, i64* @guarded_const_Bad, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !51 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !40 store i64 %2, i64* @guard_epoch_Bad, align 8 ret void } @@ -643,7 +600,7 @@ define linkonce void @const_recompute_Bad() local_unnamed_addr #10 { define linkonce void @const_recompute_Main() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @str_Main, i64 0, i64 0), i64 4) store i64 %1, i64* @guarded_const_Main, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !51 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !40 store i64 %2, i64* @guard_epoch_Main, align 8 ret void } @@ -701,54 +658,43 @@ attributes #13 = { nounwind } !32 = !{!33, !27, i64 16} !33 = !{!"rb_control_frame_struct", !27, i64 0, !27, i64 8, !27, i64 16, !5, i64 24, !27, i64 32, !27, i64 40, !27, i64 48} !34 = !{!33, !27, i64 32} -!35 = !{!36, !27, i64 16} -!36 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !27, i64 16, !6, i64 24} -!37 = !{!38, !27, i64 8} -!38 = !{!"rb_iseq_constant_body", !6, i64 0, !30, i64 4, !27, i64 8, !39, i64 16, !41, i64 64, !44, i64 120, !27, i64 152, !27, i64 160, !27, i64 168, !27, i64 176, !27, i64 184, !27, i64 192, !45, i64 200, !30, i64 232, !30, i64 236, !30, i64 240, !30, i64 244, !30, i64 248, !6, i64 252, !5, i64 256} -!39 = !{!"", !40, i64 0, !30, i64 4, !30, i64 8, !30, i64 12, !30, i64 16, !30, i64 20, !30, i64 24, !30, i64 28, !27, i64 32, !27, i64 40} -!40 = !{!"", !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 0, !30, i64 1, !30, i64 1} -!41 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !30, i64 32, !42, i64 36} -!42 = !{!"rb_code_location_struct", !43, i64 0, !43, i64 8} -!43 = !{!"rb_code_position_struct", !30, i64 0, !30, i64 4} -!44 = !{!"iseq_insn_info", !27, i64 0, !27, i64 8, !30, i64 16, !27, i64 24} -!45 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !27, i64 24} -!46 = !DILocation(line: 0, scope: !9) -!47 = !DILocation(line: 5, column: 1, scope: !9) -!48 = !DILocation(line: 0, scope: !16, inlinedAt: !49) -!49 = distinct !DILocation(line: 5, column: 1, scope: !9) -!50 = !DILocation(line: 6, column: 3, scope: !16, inlinedAt: !49) -!51 = !{!52, !52, i64 0} -!52 = !{!"long long", !6, i64 0} -!53 = !{!"branch_weights", i32 1, i32 10000} -!54 = !DILocation(line: 12, column: 1, scope: !9) -!55 = !DILocation(line: 0, scope: !25, inlinedAt: !56) -!56 = distinct !DILocation(line: 12, column: 1, scope: !9) -!57 = !DILocation(line: 13, column: 3, scope: !25, inlinedAt: !56) -!58 = !{!33, !27, i64 8} -!59 = !DILocation(line: 6, column: 3, scope: !14) -!60 = !{!"branch_weights", i32 1, i32 2000} -!61 = !DILocation(line: 0, scope: !14) -!62 = !DILocation(line: 7, column: 10, scope: !14) -!63 = !DILocation(line: 13, column: 3, scope: !18) -!64 = !DILocation(line: 0, scope: !18) -!65 = !{!66} -!66 = distinct !{!66, !67, !"sorbet_bang: argument 0"} -!67 = distinct !{!67, !"sorbet_bang"} -!68 = !DILocation(line: 14, column: 10, scope: !18) -!69 = !{!70} -!70 = distinct !{!70, !71, !"sorbet_bang: argument 0"} -!71 = distinct !{!71, !"sorbet_bang"} -!72 = !DILocation(line: 15, column: 10, scope: !18) -!73 = !{!74} -!74 = distinct !{!74, !75, !"sorbet_bang: argument 0"} -!75 = distinct !{!75, !"sorbet_bang"} -!76 = !DILocation(line: 16, column: 10, scope: !18) -!77 = !DILocation(line: 17, column: 11, scope: !18) -!78 = !DILocation(line: 17, column: 10, scope: !18) -!79 = !{!80} -!80 = distinct !{!80, !81, !"sorbet_bang: argument 0"} -!81 = distinct !{!81, !"sorbet_bang"} -!82 = !DILocation(line: 18, column: 10, scope: !18) -!83 = !{!84} -!84 = distinct !{!84, !85, !"sorbet_bang: argument 0"} -!85 = distinct !{!85, !"sorbet_bang"} +!35 = !DILocation(line: 0, scope: !9) +!36 = !DILocation(line: 5, column: 1, scope: !9) +!37 = !DILocation(line: 0, scope: !16, inlinedAt: !38) +!38 = distinct !DILocation(line: 5, column: 1, scope: !9) +!39 = !DILocation(line: 6, column: 3, scope: !16, inlinedAt: !38) +!40 = !{!41, !41, i64 0} +!41 = !{!"long long", !6, i64 0} +!42 = !{!"branch_weights", i32 1, i32 10000} +!43 = !DILocation(line: 12, column: 1, scope: !9) +!44 = !DILocation(line: 0, scope: !25, inlinedAt: !45) +!45 = distinct !DILocation(line: 12, column: 1, scope: !9) +!46 = !DILocation(line: 13, column: 3, scope: !25, inlinedAt: !45) +!47 = !{!33, !27, i64 8} +!48 = !DILocation(line: 6, column: 3, scope: !14) +!49 = !{!"branch_weights", i32 1, i32 2000} +!50 = !DILocation(line: 0, scope: !14) +!51 = !DILocation(line: 7, column: 10, scope: !14) +!52 = !DILocation(line: 13, column: 3, scope: !18) +!53 = !DILocation(line: 0, scope: !18) +!54 = !{!55} +!55 = distinct !{!55, !56, !"sorbet_bang: argument 0"} +!56 = distinct !{!56, !"sorbet_bang"} +!57 = !DILocation(line: 14, column: 10, scope: !18) +!58 = !{!59} +!59 = distinct !{!59, !60, !"sorbet_bang: argument 0"} +!60 = distinct !{!60, !"sorbet_bang"} +!61 = !DILocation(line: 15, column: 10, scope: !18) +!62 = !{!63} +!63 = distinct !{!63, !64, !"sorbet_bang: argument 0"} +!64 = distinct !{!64, !"sorbet_bang"} +!65 = !DILocation(line: 16, column: 10, scope: !18) +!66 = !DILocation(line: 17, column: 11, scope: !18) +!67 = !DILocation(line: 17, column: 10, scope: !18) +!68 = !{!69} +!69 = distinct !{!69, !70, !"sorbet_bang: argument 0"} +!70 = distinct !{!70, !"sorbet_bang"} +!71 = !DILocation(line: 18, column: 10, scope: !18) +!72 = !{!73} +!73 = distinct !{!73, !74, !"sorbet_bang: argument 0"} +!74 = distinct !{!74, !"sorbet_bang"} diff --git a/test/testdata/compiler/intrinsics/t_must.llo.exp b/test/testdata/compiler/intrinsics/t_must.llo.exp index 897e6618bb8..f21f9709ee7 100644 --- a/test/testdata/compiler/intrinsics/t_must.llo.exp +++ b/test/testdata/compiler/intrinsics/t_must.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,31 +50,32 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.ExceptionClosure = type { i64 (i64**, i64*, i64)*, i64**, i64*, i64, i64* } +%struct.ExceptionClosure = type { i64 (i64**, i64)*, i64**, i64, i64* } @ruby_current_execution_context_ptr = external local_unnamed_addr global %struct.rb_execution_context_struct*, align 8 @ruby_vm_global_constant_state = external local_unnamed_addr global i64, align 8 @@ -90,6 +92,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/intrinsics/t_must.rb" = private unnamed_addr constant [44 x i8] c"test/testdata/compiler/intrinsics/t_must.rb\00", align 1 +@iseqEncodedArray = internal global [28 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_Test = private unnamed_addr constant [5 x i8] c"Test\00", align 1 @ic_test_known_nil = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_test_known_nil = internal unnamed_addr global i64 0, align 8 @@ -153,7 +157,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -217,31 +223,29 @@ declare void @rb_set_errinfo(i64) local_unnamed_addr #1 define internal noundef i64 @sorbet_applyExceptionClosure(i64 %0) #5 { %2 = inttoptr i64 %0 to %struct.ExceptionClosure* %3 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 0 - %4 = load i64 (i64**, i64*, i64)*, i64 (i64**, i64*, i64)** %3, align 8, !tbaa !4 + %4 = load i64 (i64**, i64)*, i64 (i64**, i64)** %3, align 8, !tbaa !4 %5 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 1 %6 = load i64**, i64*** %5, align 8, !tbaa !10 %7 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 2 - %8 = load i64*, i64** %7, align 8, !tbaa !11 - %9 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 3 - %10 = load i64, i64* %9, align 8, !tbaa !12 - %11 = tail call i64 %4(i64** %6, i64* %8, i64 %10) #16 - %12 = icmp eq i64 %11, 52 - br i1 %12, label %16, label %13 - -13: ; preds = %1 - %14 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 4 - %15 = load i64*, i64** %14, align 8, !tbaa !13 - store i64 %11, i64* %15, align 8, !tbaa !14 - br label %16 - -16: ; preds = %13, %1 + %8 = load i64, i64* %7, align 8, !tbaa !11 + %9 = tail call i64 %4(i64** %6, i64 %8) #16 + %10 = icmp eq i64 %9, 52 + br i1 %10, label %14, label %11 + +11: ; preds = %1 + %12 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %2, i64 0, i32 3 + %13 = load i64*, i64** %12, align 8, !tbaa !12 + store i64 %9, i64* %13, align 8, !tbaa !13 + br label %14 + +14: ; preds = %11, %1 ret i64 52 } ; Function Attrs: nofree norecurse nosync nounwind ssp uwtable willreturn writeonly define internal noundef i64 @sorbet_rescueStoreException(i64 %0, i64 %1) #6 { %3 = inttoptr i64 %0 to i64* - store i64 %1, i64* %3, align 8, !tbaa !14 + store i64 %1, i64* %3, align 8, !tbaa !13 ret i64 52 } @@ -252,14 +256,14 @@ declare void @rb_exc_raise(i64) local_unnamed_addr #0 ; Function Attrs: nounwind ssp uwtable define weak i32 @sorbet_getIsReleaseBuild() local_unnamed_addr #5 { - %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !14 + %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !13 tail call void (i64, i8*, ...) @rb_raise(i64 %1, i8* noundef getelementptr inbounds ([93 x i8], [93 x i8]* @.str.9, i64 0, i64 0)) #17 unreachable } ; Function Attrs: nounwind ssp uwtable define weak i8* @sorbet_getBuildSCMRevision() local_unnamed_addr #5 { - %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !14 + %1 = load i64, i64* @rb_eRuntimeError, align 8, !tbaa !13 tail call void (i64, i8*, ...) @rb_raise(i64 %1, i8* noundef getelementptr inbounds ([95 x i8], [95 x i8]* @.str.8, i64 0, i64 0)) #17 unreachable } @@ -269,7 +273,7 @@ declare i64 @rb_errinfo() local_unnamed_addr #1 ; Function Attrs: sspreq define void @Init_t_must() local_unnamed_addr #7 { entry: - %positional_table.i.i = alloca i64, align 8, !dbg !15 + %positional_table.i.i = alloca i64, align 8, !dbg !14 %locals.i44.i = alloca i64, i32 0, align 8 %locals.i28.i = alloca i64, i32 5, align 8 %locals.i23.i = alloca i64, i32 4, align 8 @@ -313,18 +317,20 @@ entry: %17 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([44 x i8], [44 x i8]* @"str_test/testdata/compiler/intrinsics/t_must.rb", i64 0, i64 0), i64 noundef 43) #16 tail call void @rb_gc_register_mark_object(i64 %17) #16 store i64 %17, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 28) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %17, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 27, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_test_known_nil.i = load i64, i64* @rubyIdPrecomputed_test_known_nil, align 8, !dbg !22 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_known_nil, i64 %rubyId_test_known_nil.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !22 - %rubyId_test_nilable_arg.i = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !23 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg, i64 %rubyId_test_nilable_arg.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !23 - %rubyId_test_nilable_arg2.i = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !24 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.1, i64 %rubyId_test_nilable_arg2.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 - %rubyId_test_nilable_arg4.i = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !25 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.2, i64 %rubyId_test_nilable_arg4.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 + %rubyId_test_known_nil.i = load i64, i64* @rubyIdPrecomputed_test_known_nil, align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_known_nil, i64 %rubyId_test_known_nil.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !21 + %rubyId_test_nilable_arg.i = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !22 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg, i64 %rubyId_test_nilable_arg.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !22 + %rubyId_test_nilable_arg2.i = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !23 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.1, i64 %rubyId_test_nilable_arg2.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !23 + %rubyId_test_nilable_arg4.i = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !24 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.2, i64 %rubyId_test_nilable_arg4.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 %19 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([15 x i8], [15 x i8]* @str_test_known_nil, i64 0, i64 0), i64 noundef 14) #16 call void @rb_gc_register_mark_object(i64 %19) #16 %20 = bitcast i64* %locals.i23.i to i8* @@ -342,7 +348,7 @@ entry: %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %23 = getelementptr i64, i64* %locals.i23.i, i32 3 store i64 %"rubyId_.i.i", i64* %23, align 8 - %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %rubyId_test_known_nil.i.i, i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i22.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 6, i32 noundef 12, i64* noundef nonnull align 8 %locals.i23.i, i32 noundef 4, i32 noundef 2) + %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %19, i64 %rubyId_test_known_nil.i.i, i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i22.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i23.i, i32 noundef 4, i32 noundef 2) store %struct.rb_iseq_struct* %24, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_known_nil, align 8 call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %20) %25 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @"str_rescue for", i64 0, i64 0), i64 noundef 10) #16 @@ -351,7 +357,7 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_known_nil, align 8 %"rubyId_rescue for.i.i" = load i64, i64* @"rubyIdPrecomputed_rescue for", align 8 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i24.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 - %26 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %25, i64 %"rubyId_rescue for.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i24.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 4, i32 noundef 6, i32 noundef 12, i64* noundef null, i32 noundef 0, i32 noundef 2) + %26 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %25, i64 %"rubyId_rescue for.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i24.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 4, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %26, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_known_nil$block_2", align 8 %27 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @"str_ensure for", i64 0, i64 0), i64 noundef 10) #16 call void @rb_gc_register_mark_object(i64 %27) #16 @@ -359,16 +365,16 @@ entry: %stackFrame.i25.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_known_nil, align 8 %"rubyId_ensure for.i.i" = load i64, i64* @"rubyIdPrecomputed_ensure for", align 8 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i26.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 - %28 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %27, i64 %"rubyId_ensure for.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i25.i, i32 noundef 5, i32 noundef 6, i32 noundef 12, i64* noundef null, i32 noundef 0, i32 noundef 2) + %28 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %27, i64 %"rubyId_ensure for.i.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i25.i, i32 noundef 5, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %28, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_known_nil$block_3", align 8 %29 = call i64 @sorbet_getConstant(i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @sorbet_getTRetry.retry, i64 0, i64 0), i64 noundef 25) #16 store i64 %29, i64* @"", align 8 - %rubyId_must.i = load i64, i64* @rubyIdPrecomputed_must, align 8, !dbg !26 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_must, i64 %rubyId_must.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !26 - %"rubyId_is_a?.i" = load i64, i64* @"rubyIdPrecomputed_is_a?", align 8, !dbg !29 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 %"rubyId_is_a?.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !29 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !31 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !31 + %rubyId_must.i = load i64, i64* @rubyIdPrecomputed_must, align 8, !dbg !25 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_must, i64 %rubyId_must.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 + %"rubyId_is_a?.i" = load i64, i64* @"rubyIdPrecomputed_is_a?", align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 %"rubyId_is_a?.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !28 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !30 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !30 %30 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @str_test_nilable_arg, i64 0, i64 0), i64 noundef 16) #16 call void @rb_gc_register_mark_object(i64 %30) #16 %31 = bitcast i64* %locals.i28.i to i8* @@ -389,1314 +395,1204 @@ entry: %"rubyId_.i32.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %35 = getelementptr i64, i64* %locals.i28.i, i32 4 store i64 %"rubyId_.i32.i", i64* %35, align 8 - %36 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %30, i64 %rubyId_test_nilable_arg.i.i, i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i27.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 14, i32 noundef 21, i64* noundef nonnull align 8 %locals.i28.i, i32 noundef 5, i32 noundef 3) + %36 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %30, i64 %rubyId_test_nilable_arg.i.i, i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i27.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i28.i, i32 noundef 5, i32 noundef 3) store %struct.rb_iseq_struct* %36, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_nilable_arg, align 8 call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %31) %"rubyId_rescue for.i34.i" = load i64, i64* @"rubyIdPrecomputed_rescue for", align 8 %"rubyStr_rescue for.i35.i" = load i64, i64* @"rubyStrFrozen_rescue for", align 8 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i36.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 - %37 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_rescue for.i35.i", i64 %"rubyId_rescue for.i34.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i36.i", i64 %realpath, %struct.rb_iseq_struct* %36, i32 noundef 4, i32 noundef 14, i32 noundef 21, i64* noundef null, i32 noundef 0, i32 noundef 3) + %37 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_rescue for.i35.i", i64 %"rubyId_rescue for.i34.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i36.i", i64 %realpath, %struct.rb_iseq_struct* %36, i32 noundef 4, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %37, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_nilable_arg$block_2", align 8 %stackFrame.i37.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_nilable_arg, align 8 %"rubyId_ensure for.i38.i" = load i64, i64* @"rubyIdPrecomputed_ensure for", align 8 %"rubyStr_ensure for.i39.i" = load i64, i64* @"rubyStrFrozen_ensure for", align 8 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i40.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 - %38 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_ensure for.i39.i", i64 %"rubyId_ensure for.i38.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i40.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i37.i, i32 noundef 5, i32 noundef 14, i32 noundef 21, i64* noundef null, i32 noundef 0, i32 noundef 3) + %38 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_ensure for.i39.i", i64 %"rubyId_ensure for.i38.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i40.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i37.i, i32 noundef 5, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %38, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_nilable_arg$block_3", align 8 - %rubyId_must9.i = load i64, i64* @rubyIdPrecomputed_must, align 8, !dbg !32 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_must.3, i64 %rubyId_must9.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !32 + %rubyId_must9.i = load i64, i64* @rubyIdPrecomputed_must, align 8, !dbg !31 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_must.3, i64 %rubyId_must9.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !31 %39 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([12 x i8], [12 x i8]* @"str_ wasn't nil", i64 0, i64 0), i64 noundef 11) #16 call void @rb_gc_register_mark_object(i64 %39) #16 store i64 %39, i64* @"rubyStrFrozen_ wasn't nil", align 8 - %rubyId_puts11.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !35 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 %rubyId_puts11.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 - %"rubyId_is_a?14.i" = load i64, i64* @"rubyIdPrecomputed_is_a?", align 8, !dbg !36 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_is_a?.5", i64 %"rubyId_is_a?14.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !36 - %rubyId_puts16.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !38 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 %rubyId_puts16.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !38 + %rubyId_puts11.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !34 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 %rubyId_puts11.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 + %"rubyId_is_a?14.i" = load i64, i64* @"rubyIdPrecomputed_is_a?", align 8, !dbg !35 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_is_a?.5", i64 %"rubyId_is_a?14.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 + %rubyId_puts16.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 %rubyId_puts16.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 %"rubyId_.i41.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i42.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i43.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/intrinsics/t_must.rb", align 8 - %40 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i42.i", i64 %"rubyId_.i41.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i43.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i44.i, i32 noundef 0, i32 noundef 4) + %40 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i42.i", i64 %"rubyId_.i41.i", i64 %"rubyStr_test/testdata/compiler/intrinsics/t_must.rb.i43.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i44.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %40, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.", align 8 - %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !39 - %rubyId_keep_self_def20.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !40 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def.7, i64 %rubyId_keep_self_def20.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !40 + %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !38 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !38 + %rubyId_keep_self_def20.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !39 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def.7, i64 %rubyId_keep_self_def20.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !39 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 + %41 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 %42 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %41, i64 0, i32 2 - %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !tbaa !42 + %43 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %42, align 8, !tbaa !41 %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %44, align 8, !tbaa !46 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %44, align 8, !tbaa !45 %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 4 - %46 = load i64*, i64** %45, align 8, !tbaa !48 - %47 = load i64, i64* %46, align 8, !tbaa !14 + %46 = load i64*, i64** %45, align 8, !tbaa !47 + %47 = load i64, i64* %46, align 8, !tbaa !13 %48 = and i64 %47, -33 - store i64 %48, i64* %46, align 8, !tbaa !14 + store i64 %48, i64* %46, align 8, !tbaa !13 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %41, %struct.rb_control_frame_struct* align 8 %43, %struct.rb_iseq_struct* %stackFrame.i) #16 %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %43, i64 0, i32 0 - %50 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %44, align 8, !tbaa !46 - %51 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %50, i64 0, i32 2 - %52 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %51, align 8, !tbaa !49 - %53 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %52, i64 0, i32 2 - %54 = load i64*, i64** %53, align 8, !tbaa !51 - %55 = getelementptr inbounds i64, i64* %54, i64 4 - %56 = getelementptr inbounds i64, i64* %55, i64 1 - store i64* %56, i64** %49, align 8, !dbg !60, !tbaa !41 - %57 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_Test, i64 0, i64 0)) #16, !dbg !61 - call void @sorbet_pushStaticInitFrame(i64 %57) #16, !dbg !61 - %58 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %58) #16 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %49, align 8, !dbg !48, !tbaa !40 + %50 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @str_Test, i64 0, i64 0)) #16, !dbg !49 + call void @sorbet_pushStaticInitFrame(i64 %50) #16, !dbg !49 + %51 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %51) #16 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.", align 8 - %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 - %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2 - %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !tbaa !42 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %62, align 8, !tbaa !46 - %63 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 4 - %64 = load i64*, i64** %63, align 8, !tbaa !48 - %65 = load i64, i64* %64, align 8, !tbaa !14 - %66 = and i64 %65, -33 - store i64 %66, i64* %64, align 8, !tbaa !14 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %59, %struct.rb_control_frame_struct* align 8 %61, %struct.rb_iseq_struct* %stackFrame.i.i1) #16 - %67 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 0 - %68 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %62, align 8, !tbaa !46 - %69 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %68, i64 0, i32 2 - %70 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %69, align 8, !tbaa !49 - %71 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %70, i64 0, i32 2 - %72 = load i64*, i64** %71, align 8, !tbaa !51 - %73 = getelementptr inbounds i64, i64* %72, i64 1 - %74 = getelementptr inbounds i64, i64* %73, i64 1, !dbg !62 - store i64* %74, i64** %67, align 8, !dbg !62, !tbaa !41 - %rubyId_test_known_nil.i.i2 = load i64, i64* @rubyIdPrecomputed_test_known_nil, align 8, !dbg !63 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_test_known_nil.i.i2) #16, !dbg !63 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !63 - %rawSym17.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #16, !dbg !63 - %75 = load i64, i64* @guard_epoch_Test, align 8, !dbg !63 - %76 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !63, !tbaa !64 - %needTakeSlowPath = icmp ne i64 %75, %76, !dbg !63 - br i1 %needTakeSlowPath, label %77, label %78, !dbg !63, !prof !66 - -77: ; preds = %entry - call void @const_recompute_Test(), !dbg !63 - br label %78, !dbg !63 - -78: ; preds = %entry, %77 - %79 = load i64, i64* @guarded_const_Test, align 8, !dbg !63 - %80 = load i64, i64* @guard_epoch_Test, align 8, !dbg !63 - %81 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !63, !tbaa !64 - %guardUpdated = icmp eq i64 %80, %81, !dbg !63 - call void @llvm.assume(i1 %guardUpdated), !dbg !63 - %stackFrame18.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_known_nil, align 8, !dbg !63 - %82 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !63 - %83 = bitcast i8* %82 to i16*, !dbg !63 - %84 = load i16, i16* %83, align 8, !dbg !63 - %85 = and i16 %84, -384, !dbg !63 - store i16 %85, i16* %83, align 8, !dbg !63 - %86 = getelementptr inbounds i8, i8* %82, i64 4, !dbg !63 - %87 = bitcast %struct.rb_iseq_struct* %stackFrame18.i.i to i8*, !dbg !63 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %86, i8 0, i64 28, i1 false) #16, !dbg !63 - call void @rb_define_singleton_sorbet_method(i64 %79, i8* noundef getelementptr inbounds ([15 x i8], [15 x i8]* @str_test_known_nil, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Test.test_known_nil, i8* nonnull %82, i8* %87) #16, !dbg !63 - %88 = getelementptr inbounds i64, i64* %72, i64 9, !dbg !63 - %89 = getelementptr inbounds i64, i64* %88, i64 1, !dbg !63 - store i64* %89, i64** %67, align 8, !dbg !63, !tbaa !41 - %rubyId_test_nilable_arg.i.i3 = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !15 - %rawSym23.i.i = call i64 @rb_id2sym(i64 %rubyId_test_nilable_arg.i.i3) #16, !dbg !15 - %rubyId_normal24.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !15 - %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal24.i.i) #16, !dbg !15 - %stackFrame30.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_nilable_arg, align 8, !dbg !15 - %90 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !15 - %91 = bitcast i8* %90 to i16*, !dbg !15 - %92 = load i16, i16* %91, align 8, !dbg !15 - %93 = and i16 %92, -384, !dbg !15 - %94 = or i16 %93, 1, !dbg !15 - store i16 %94, i16* %91, align 8, !dbg !15 - %95 = getelementptr inbounds i8, i8* %90, i64 8, !dbg !15 - %96 = bitcast i8* %95 to i32*, !dbg !15 - store i32 1, i32* %96, align 8, !dbg !15, !tbaa !67 - %97 = getelementptr inbounds i8, i8* %90, i64 12, !dbg !15 - %98 = getelementptr inbounds i8, i8* %90, i64 4, !dbg !15 - %99 = bitcast i8* %98 to i32*, !dbg !15 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %97, i8 0, i64 20, i1 false) #16, !dbg !15 - store i32 1, i32* %99, align 4, !dbg !15, !tbaa !69 - %rubyId_arg.i.i4 = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !15 - store i64 %rubyId_arg.i.i4, i64* %positional_table.i.i, align 8, !dbg !15 - %100 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !15 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %100, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %58, i64 noundef 8, i1 noundef false) #16, !dbg !15 - %101 = getelementptr inbounds i8, i8* %90, i64 32, !dbg !15 - %102 = bitcast i8* %101 to i8**, !dbg !15 - store i8* %100, i8** %102, align 8, !dbg !15, !tbaa !70 - %103 = bitcast %struct.rb_iseq_struct* %stackFrame30.i.i to i8*, !dbg !15 - call void @rb_define_singleton_sorbet_method(i64 %79, i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @str_test_nilable_arg, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Test.test_nilable_arg, i8* nonnull %90, i8* %103) #16, !dbg !15 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %58) #16 - call void @sorbet_popRubyStack() #16, !dbg !61 - %104 = getelementptr inbounds i64, i64* %54, i64 23, !dbg !61 - %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !61 - store i64* %105, i64** %49, align 8, !dbg !61, !tbaa !41 - %106 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !41 - %107 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %106, i64 0, i32 2, !dbg !22 - %108 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %107, align 8, !dbg !22, !tbaa !42 - %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %108, i64 0, i32 1, !dbg !22 - %110 = load i64*, i64** %109, align 8, !dbg !22, !tbaa !71 - %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !22 - store i64* %111, i64** %109, align 8, !dbg !22, !tbaa !71 - store i64 %79, i64* %110, align 8, !dbg !22, !tbaa !14 - %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_known_nil, i64 0) #16, !dbg !22 - %112 = getelementptr inbounds i64, i64* %54, i64 24, !dbg !22 - %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !22 - store i64* %113, i64** %49, align 8, !dbg !22, !tbaa !41 - %114 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !41 - %115 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %114, i64 0, i32 2, !dbg !23 - %116 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %115, align 8, !dbg !23, !tbaa !42 - %117 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %116, i64 0, i32 1, !dbg !23 - %118 = load i64*, i64** %117, align 8, !dbg !23, !tbaa !71 - %119 = getelementptr inbounds i64, i64* %118, i64 1, !dbg !23 - store i64 %79, i64* %118, align 8, !dbg !23, !tbaa !14 - %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !23 - store i64* %120, i64** %117, align 8, !dbg !23, !tbaa !71 - store i64 21, i64* %119, align 8, !dbg !23, !tbaa !14 - %send35.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg, i64 0) #16, !dbg !23 - %121 = getelementptr inbounds i64, i64* %54, i64 25, !dbg !23 - %122 = getelementptr inbounds i64, i64* %121, i64 1, !dbg !23 - store i64* %122, i64** %49, align 8, !dbg !23, !tbaa !41 - %123 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !41 - %124 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %123, i64 0, i32 2, !dbg !24 - %125 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %124, align 8, !dbg !24, !tbaa !42 - %126 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %125, i64 0, i32 1, !dbg !24 - %127 = load i64*, i64** %126, align 8, !dbg !24, !tbaa !71 - %128 = getelementptr inbounds i64, i64* %127, i64 1, !dbg !24 - store i64 %79, i64* %127, align 8, !dbg !24, !tbaa !14 - %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !24 - store i64* %129, i64** %126, align 8, !dbg !24, !tbaa !71 - store i64 0, i64* %128, align 8, !dbg !24, !tbaa !14 - %send41.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.1, i64 0) #16, !dbg !24 - %130 = getelementptr inbounds i64, i64* %54, i64 26, !dbg !24 - %131 = getelementptr inbounds i64, i64* %130, i64 1, !dbg !24 - store i64* %131, i64** %49, align 8, !dbg !24, !tbaa !41 - %132 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !41 - %133 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %132, i64 0, i32 2, !dbg !25 - %134 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %133, align 8, !dbg !25, !tbaa !42 - %135 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %134, i64 0, i32 1, !dbg !25 - %136 = load i64*, i64** %135, align 8, !dbg !25, !tbaa !71 - %137 = getelementptr inbounds i64, i64* %136, i64 1, !dbg !25 - store i64 %79, i64* %136, align 8, !dbg !25, !tbaa !14 - %138 = getelementptr inbounds i64, i64* %137, i64 1, !dbg !25 - store i64* %138, i64** %135, align 8, !dbg !25, !tbaa !71 - store i64 8, i64* %137, align 8, !dbg !25, !tbaa !14 - %send48.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.2, i64 0) #16, !dbg !25 + %52 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 + %53 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %52, i64 0, i32 2 + %54 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %53, align 8, !tbaa !41 + %55 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %54, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %55, align 8, !tbaa !45 + %56 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %54, i64 0, i32 4 + %57 = load i64*, i64** %56, align 8, !tbaa !47 + %58 = load i64, i64* %57, align 8, !tbaa !13 + %59 = and i64 %58, -33 + store i64 %59, i64* %57, align 8, !tbaa !13 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %52, %struct.rb_control_frame_struct* align 8 %54, %struct.rb_iseq_struct* %stackFrame.i.i1) #16 + %60 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %54, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %60, align 8, !dbg !50, !tbaa !40 + %rubyId_test_known_nil.i.i2 = load i64, i64* @rubyIdPrecomputed_test_known_nil, align 8, !dbg !51 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_test_known_nil.i.i2) #16, !dbg !51 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !51 + %rawSym17.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #16, !dbg !51 + %61 = load i64, i64* @guard_epoch_Test, align 8, !dbg !51 + %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !51, !tbaa !52 + %needTakeSlowPath = icmp ne i64 %61, %62, !dbg !51 + br i1 %needTakeSlowPath, label %63, label %64, !dbg !51, !prof !54 + +63: ; preds = %entry + call void @const_recompute_Test(), !dbg !51 + br label %64, !dbg !51 + +64: ; preds = %entry, %63 + %65 = load i64, i64* @guarded_const_Test, align 8, !dbg !51 + %66 = load i64, i64* @guard_epoch_Test, align 8, !dbg !51 + %67 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !51, !tbaa !52 + %guardUpdated = icmp eq i64 %66, %67, !dbg !51 + call void @llvm.assume(i1 %guardUpdated), !dbg !51 + %stackFrame18.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_known_nil, align 8, !dbg !51 + %68 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !51 + %69 = bitcast i8* %68 to i16*, !dbg !51 + %70 = load i16, i16* %69, align 8, !dbg !51 + %71 = and i16 %70, -384, !dbg !51 + store i16 %71, i16* %69, align 8, !dbg !51 + %72 = getelementptr inbounds i8, i8* %68, i64 4, !dbg !51 + %73 = bitcast %struct.rb_iseq_struct* %stackFrame18.i.i to i8*, !dbg !51 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %72, i8 0, i64 28, i1 false) #16, !dbg !51 + call void @rb_define_singleton_sorbet_method(i64 %65, i8* noundef getelementptr inbounds ([15 x i8], [15 x i8]* @str_test_known_nil, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Test.test_known_nil, i8* nonnull %68, i8* %73) #16, !dbg !51 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %60, align 8, !dbg !51, !tbaa !40 + %rubyId_test_nilable_arg.i.i3 = load i64, i64* @rubyIdPrecomputed_test_nilable_arg, align 8, !dbg !14 + %rawSym23.i.i = call i64 @rb_id2sym(i64 %rubyId_test_nilable_arg.i.i3) #16, !dbg !14 + %rubyId_normal24.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !14 + %rawSym25.i.i = call i64 @rb_id2sym(i64 %rubyId_normal24.i.i) #16, !dbg !14 + %stackFrame30.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Test.test_nilable_arg, align 8, !dbg !14 + %74 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !14 + %75 = bitcast i8* %74 to i16*, !dbg !14 + %76 = load i16, i16* %75, align 8, !dbg !14 + %77 = and i16 %76, -384, !dbg !14 + %78 = or i16 %77, 1, !dbg !14 + store i16 %78, i16* %75, align 8, !dbg !14 + %79 = getelementptr inbounds i8, i8* %74, i64 8, !dbg !14 + %80 = bitcast i8* %79 to i32*, !dbg !14 + store i32 1, i32* %80, align 8, !dbg !14, !tbaa !55 + %81 = getelementptr inbounds i8, i8* %74, i64 12, !dbg !14 + %82 = getelementptr inbounds i8, i8* %74, i64 4, !dbg !14 + %83 = bitcast i8* %82 to i32*, !dbg !14 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %81, i8 0, i64 20, i1 false) #16, !dbg !14 + store i32 1, i32* %83, align 4, !dbg !14, !tbaa !58 + %rubyId_arg.i.i4 = load i64, i64* @rubyIdPrecomputed_arg, align 8, !dbg !14 + store i64 %rubyId_arg.i.i4, i64* %positional_table.i.i, align 8, !dbg !14 + %84 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !14 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %84, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %51, i64 noundef 8, i1 noundef false) #16, !dbg !14 + %85 = getelementptr inbounds i8, i8* %74, i64 32, !dbg !14 + %86 = bitcast i8* %85 to i8**, !dbg !14 + store i8* %84, i8** %86, align 8, !dbg !14, !tbaa !59 + %87 = bitcast %struct.rb_iseq_struct* %stackFrame30.i.i to i8*, !dbg !14 + call void @rb_define_singleton_sorbet_method(i64 %65, i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @str_test_nilable_arg, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Test.test_nilable_arg, i8* nonnull %74, i8* %87) #16, !dbg !14 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %51) #16 + call void @sorbet_popRubyStack() #16, !dbg !49 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 24), i64** %49, align 8, !dbg !49, !tbaa !40 + %88 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !40 + %89 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %88, i64 0, i32 2, !dbg !21 + %90 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %89, align 8, !dbg !21, !tbaa !41 + %91 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 1, !dbg !21 + %92 = load i64*, i64** %91, align 8, !dbg !21, !tbaa !60 + %93 = getelementptr inbounds i64, i64* %92, i64 1, !dbg !21 + store i64* %93, i64** %91, align 8, !dbg !21, !tbaa !60 + store i64 %65, i64* %92, align 8, !dbg !21, !tbaa !13 + %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_known_nil, i64 0) #16, !dbg !21 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 25), i64** %49, align 8, !dbg !21, !tbaa !40 + %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !40 + %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2, !dbg !22 + %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !dbg !22, !tbaa !41 + %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 1, !dbg !22 + %98 = load i64*, i64** %97, align 8, !dbg !22, !tbaa !60 + %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !22 + store i64 %65, i64* %98, align 8, !dbg !22, !tbaa !13 + %100 = getelementptr inbounds i64, i64* %99, i64 1, !dbg !22 + store i64* %100, i64** %97, align 8, !dbg !22, !tbaa !60 + store i64 21, i64* %99, align 8, !dbg !22, !tbaa !13 + %send35.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg, i64 0) #16, !dbg !22 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 26), i64** %49, align 8, !dbg !22, !tbaa !40 + %101 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !40 + %102 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %101, i64 0, i32 2, !dbg !23 + %103 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %102, align 8, !dbg !23, !tbaa !41 + %104 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %103, i64 0, i32 1, !dbg !23 + %105 = load i64*, i64** %104, align 8, !dbg !23, !tbaa !60 + %106 = getelementptr inbounds i64, i64* %105, i64 1, !dbg !23 + store i64 %65, i64* %105, align 8, !dbg !23, !tbaa !13 + %107 = getelementptr inbounds i64, i64* %106, i64 1, !dbg !23 + store i64* %107, i64** %104, align 8, !dbg !23, !tbaa !60 + store i64 0, i64* %106, align 8, !dbg !23, !tbaa !13 + %send41.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.1, i64 0) #16, !dbg !23 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %49, align 8, !dbg !23, !tbaa !40 + %108 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !40 + %109 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %108, i64 0, i32 2, !dbg !24 + %110 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %109, align 8, !dbg !24, !tbaa !41 + %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 1, !dbg !24 + %112 = load i64*, i64** %111, align 8, !dbg !24, !tbaa !60 + %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !24 + store i64 %65, i64* %112, align 8, !dbg !24, !tbaa !13 + %114 = getelementptr inbounds i64, i64* %113, i64 1, !dbg !24 + store i64* %114, i64** %111, align 8, !dbg !24, !tbaa !60 + store i64 8, i64* %113, align 8, !dbg !24, !tbaa !13 + %send48.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_test_nilable_arg.2, i64 0) #16, !dbg !24 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @func_Test.test_known_nil(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #8 !dbg !28 { +define i64 @func_Test.test_known_nil(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #8 !dbg !27 { functionEntryInitializers: %0 = alloca i64, align 8 %1 = alloca %struct.ExceptionClosure, align 8 %2 = alloca i64, align 8 %3 = alloca %struct.ExceptionClosure, align 8 - %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2 - %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !42 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !41 %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 0 - %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 2 - %9 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %8, align 8, !tbaa !46 - %10 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %9, i64 0, i32 2 - %11 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %10, align 8, !tbaa !49 - %12 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %11, i64 0, i32 2 - %13 = load i64*, i64** %12, align 8, !tbaa !51 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %7, align 8, !tbaa !41 - %exceptionValue = alloca i64, align 8, !dbg !72 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !73 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !73, !prof !74 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %7, align 8, !tbaa !40 + %exceptionValue = alloca i64, align 8, !dbg !61 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !62 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !62, !prof !63 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !73 - unreachable, !dbg !73 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !62 + unreachable, !dbg !62 fillRequiredArgs: ; preds = %functionEntryInitializers - %15 = getelementptr inbounds i64, i64* %13, i64 2, !dbg !75 - %16 = getelementptr inbounds i64, i64* %15, i64 1, !dbg !75 - store i64* %16, i64** %7, align 8, !dbg !75, !tbaa !41 - %previousException = tail call i64 @rb_errinfo(), !dbg !72 - %17 = bitcast i64* %0 to i8* - %18 = bitcast %struct.ExceptionClosure* %1 to i8* - %19 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 0 - %20 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 1 - %21 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 2 - %22 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 3 - %23 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 4 - %24 = icmp eq i64 %previousException, 8 - %25 = ptrtoint %struct.ExceptionClosure* %1 to i64 - %26 = ptrtoint i64* %exceptionValue to i64 - %27 = bitcast i64* %2 to i8* - %28 = bitcast %struct.ExceptionClosure* %3 to i8* - %29 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 0 - %30 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 1 - %31 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 2 - %32 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 3 - %33 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 4 - %34 = ptrtoint %struct.ExceptionClosure* %3 to i64 - br i1 %24, label %exception-entry.us, label %exception-entry, !dbg !72 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %7, align 8, !dbg !64, !tbaa !40 + %previousException = tail call i64 @rb_errinfo(), !dbg !61 + %8 = bitcast i64* %0 to i8* + %9 = bitcast %struct.ExceptionClosure* %1 to i8* + %10 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 0 + %11 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 1 + %12 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 2 + %13 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 3 + %14 = icmp eq i64 %previousException, 8 + %15 = ptrtoint %struct.ExceptionClosure* %1 to i64 + %16 = ptrtoint i64* %exceptionValue to i64 + %17 = bitcast i64* %2 to i8* + %18 = bitcast %struct.ExceptionClosure* %3 to i8* + %19 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 0 + %20 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 1 + %21 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 2 + %22 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 3 + %23 = ptrtoint %struct.ExceptionClosure* %3 to i64 + br i1 %14, label %exception-entry.us, label %exception-entry, !dbg !61 exception-entry.us: ; preds = %fillRequiredArgs, %sorbet_try.exit.us - %35 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %36 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %35, i64 0, i32 2, !dbg !72 - %37 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %36, align 8, !dbg !72, !tbaa !42 - %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 4, !dbg !72 - %39 = load i64*, i64** %38, align 8, !dbg !72, !tbaa !48 - %40 = load i64, i64* %39, align 8, !dbg !72, !tbaa !14 - %41 = and i64 %40, 8, !dbg !72 - %42 = icmp eq i64 %41, 0, !dbg !72 - br i1 %42, label %44, label %43, !dbg !72, !prof !76 - -43: ; preds = %exception-entry.us - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %39, i32 noundef -3, i64 noundef 8) #16, !dbg !72 - br label %sorbet_writeLocal.exit.us, !dbg !72 - -44: ; preds = %exception-entry.us - %45 = getelementptr inbounds i64, i64* %39, i64 -3, !dbg !72 - store i64 8, i64* %45, align 8, !dbg !72, !tbaa !14 - br label %sorbet_writeLocal.exit.us, !dbg !72 - -sorbet_writeLocal.exit.us: ; preds = %44, %43 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %17) #16, !dbg !72 - store i64 52, i64* %0, align 8, !dbg !72, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %18) #16, !dbg !72 - store i64 (i64**, i64*, i64)* @"func_Test.test_known_nil$block_1", i64 (i64**, i64*, i64)** %19, align 8, !dbg !72, !tbaa !4 - store i64** %7, i64*** %20, align 8, !dbg !72, !tbaa !10 - store i64* %13, i64** %21, align 8, !dbg !72, !tbaa !11 - store i64 0, i64* %22, align 8, !dbg !72, !tbaa !12 - store i64* %0, i64** %23, align 8, !dbg !72, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !72, !tbaa !14 - %46 = load i64, i64* @rb_eException, align 8, !dbg !72, !tbaa !14 - %47 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %25, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %26, i64 %46, i32 0) #16, !dbg !72 - %48 = load i64, i64* %0, align 8, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %18) #16, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %17) #16, !dbg !72 - %isReturnValue.us = icmp ne i64 %48, 52, !dbg !72 - br i1 %isReturnValue.us, label %exception-body-return, label %exception-body-continue.us, !dbg !72 + %24 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2, !dbg !61 + %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !dbg !61, !tbaa !41 + %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4, !dbg !61 + %28 = load i64*, i64** %27, align 8, !dbg !61, !tbaa !47 + %29 = load i64, i64* %28, align 8, !dbg !61, !tbaa !13 + %30 = and i64 %29, 8, !dbg !61 + %31 = icmp eq i64 %30, 0, !dbg !61 + br i1 %31, label %33, label %32, !dbg !61, !prof !65 + +32: ; preds = %exception-entry.us + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %28, i32 noundef -3, i64 noundef 8) #16, !dbg !61 + br label %sorbet_writeLocal.exit.us, !dbg !61 + +33: ; preds = %exception-entry.us + %34 = getelementptr inbounds i64, i64* %28, i64 -3, !dbg !61 + store i64 8, i64* %34, align 8, !dbg !61, !tbaa !13 + br label %sorbet_writeLocal.exit.us, !dbg !61 + +sorbet_writeLocal.exit.us: ; preds = %33, %32 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %8) #16, !dbg !61 + store i64 52, i64* %0, align 8, !dbg !61, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %9) #16, !dbg !61 + store i64 (i64**, i64)* @"func_Test.test_known_nil$block_1", i64 (i64**, i64)** %10, align 8, !dbg !61, !tbaa !4 + store i64** %7, i64*** %11, align 8, !dbg !61, !tbaa !10 + store i64 0, i64* %12, align 8, !dbg !61, !tbaa !11 + store i64* %0, i64** %13, align 8, !dbg !61, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !61, !tbaa !13 + %35 = load i64, i64* @rb_eException, align 8, !dbg !61, !tbaa !13 + %36 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %15, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %16, i64 %35, i32 0) #16, !dbg !61 + %37 = load i64, i64* %0, align 8, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %9) #16, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %8) #16, !dbg !61 + %isReturnValue.us = icmp ne i64 %37, 52, !dbg !61 + br i1 %isReturnValue.us, label %exception-body-return, label %exception-body-continue.us, !dbg !61 exception-body-continue.us: ; preds = %sorbet_writeLocal.exit.us - %49 = load i64, i64* %exceptionValue, align 8, !dbg !72 - %50 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %51 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %50, i64 0, i32 2, !dbg !72 - %52 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %51, align 8, !dbg !72, !tbaa !42 - %53 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %52, i64 0, i32 4, !dbg !72 - %54 = load i64*, i64** %53, align 8, !dbg !72, !tbaa !48 - %55 = load i64, i64* %54, align 8, !dbg !72, !tbaa !14 - %56 = and i64 %55, 8, !dbg !72 - %57 = icmp eq i64 %56, 0, !dbg !72 - br i1 %57, label %59, label %58, !dbg !72, !prof !76 - -58: ; preds = %exception-body-continue.us - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %54, i32 noundef -3, i64 %49) #16, !dbg !72 - br label %sorbet_writeLocal.exit32.us, !dbg !72 - -59: ; preds = %exception-body-continue.us - %60 = getelementptr inbounds i64, i64* %54, i64 -3, !dbg !72 - store i64 %49, i64* %60, align 8, !dbg !72, !tbaa !14 - br label %sorbet_writeLocal.exit32.us, !dbg !72 - -sorbet_writeLocal.exit32.us: ; preds = %59, %58 - %61 = icmp ne i64 %49, 8, !dbg !72 - %handler.us = select i1 %61, i64 (i64**, i64*, i64)* @"func_Test.test_known_nil$block_2", i64 (i64**, i64*, i64)* @"func_Test.test_known_nil$block_4", !dbg !72 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %27) #16, !dbg !72 - store i64 52, i64* %2, align 8, !dbg !72, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %28) #16, !dbg !72 - store i64 (i64**, i64*, i64)* %handler.us, i64 (i64**, i64*, i64)** %29, align 8, !dbg !72, !tbaa !4 - store i64** %7, i64*** %30, align 8, !dbg !72, !tbaa !10 - store i64* %13, i64** %31, align 8, !dbg !72, !tbaa !11 - store i64 0, i64* %32, align 8, !dbg !72, !tbaa !12 - store i64* %2, i64** %33, align 8, !dbg !72, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !72, !tbaa !14 - %62 = icmp eq i64 %49, 8, !dbg !72 - br i1 %62, label %sorbet_try.exit.us, label %63, !dbg !72 - -63: ; preds = %sorbet_writeLocal.exit32.us - call void @rb_set_errinfo(i64 %49) #16, !dbg !72 - br label %sorbet_try.exit.us, !dbg !72 - -sorbet_try.exit.us: ; preds = %63, %sorbet_writeLocal.exit32.us - %64 = load i64, i64* @rb_eException, align 8, !dbg !72, !tbaa !14 - %65 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %34, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %26, i64 %64, i32 0) #16, !dbg !72 - %66 = load i64, i64* %2, align 8, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %28) #16, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #16, !dbg !72 - %67 = load i64, i64* %exceptionValue, align 8, !dbg !72 - %68 = icmp ne i64 %67, 8, !dbg !72 - %69 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2, !dbg !72 - %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !dbg !72, !tbaa !42 - %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 4, !dbg !72 - %73 = load i64*, i64** %72, align 8, !dbg !72, !tbaa !48 - %74 = getelementptr inbounds i64, i64* %73, i64 -3, !dbg !72 - %75 = load i64, i64* %74, align 8, !dbg !72, !tbaa !14 - %76 = icmp ne i64 %75, 8, !dbg !72 - %77 = select i1 %76, i64 %75, i64 8, !dbg !72 - %78 = select i1 %68, i64 %67, i64 %77, !dbg !72 - call void @rb_set_errinfo(i64 %78), !dbg !72 - %".us" = load i64, i64* @"", align 8, !dbg !72 - %shouldRetry.us = icmp eq i64 %66, %".us", !dbg !72 - %79 = and i1 %61, %shouldRetry.us, !dbg !72 - br i1 %79, label %exception-entry.us, label %exception-ensure, !dbg !72 + %38 = load i64, i64* %exceptionValue, align 8, !dbg !61 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !61 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !61, !tbaa !41 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 4, !dbg !61 + %43 = load i64*, i64** %42, align 8, !dbg !61, !tbaa !47 + %44 = load i64, i64* %43, align 8, !dbg !61, !tbaa !13 + %45 = and i64 %44, 8, !dbg !61 + %46 = icmp eq i64 %45, 0, !dbg !61 + br i1 %46, label %48, label %47, !dbg !61, !prof !65 + +47: ; preds = %exception-body-continue.us + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %43, i32 noundef -3, i64 %38) #16, !dbg !61 + br label %sorbet_writeLocal.exit25.us, !dbg !61 + +48: ; preds = %exception-body-continue.us + %49 = getelementptr inbounds i64, i64* %43, i64 -3, !dbg !61 + store i64 %38, i64* %49, align 8, !dbg !61, !tbaa !13 + br label %sorbet_writeLocal.exit25.us, !dbg !61 + +sorbet_writeLocal.exit25.us: ; preds = %48, %47 + %50 = icmp ne i64 %38, 8, !dbg !61 + %handler.us = select i1 %50, i64 (i64**, i64)* @"func_Test.test_known_nil$block_2", i64 (i64**, i64)* @"func_Test.test_known_nil$block_4", !dbg !61 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %17) #16, !dbg !61 + store i64 52, i64* %2, align 8, !dbg !61, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %18) #16, !dbg !61 + store i64 (i64**, i64)* %handler.us, i64 (i64**, i64)** %19, align 8, !dbg !61, !tbaa !4 + store i64** %7, i64*** %20, align 8, !dbg !61, !tbaa !10 + store i64 0, i64* %21, align 8, !dbg !61, !tbaa !11 + store i64* %2, i64** %22, align 8, !dbg !61, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !61, !tbaa !13 + %51 = icmp eq i64 %38, 8, !dbg !61 + br i1 %51, label %sorbet_try.exit.us, label %52, !dbg !61 + +52: ; preds = %sorbet_writeLocal.exit25.us + call void @rb_set_errinfo(i64 %38) #16, !dbg !61 + br label %sorbet_try.exit.us, !dbg !61 + +sorbet_try.exit.us: ; preds = %52, %sorbet_writeLocal.exit25.us + %53 = load i64, i64* @rb_eException, align 8, !dbg !61, !tbaa !13 + %54 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %23, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %16, i64 %53, i32 0) #16, !dbg !61 + %55 = load i64, i64* %2, align 8, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %18) #16, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %17) #16, !dbg !61 + %56 = load i64, i64* %exceptionValue, align 8, !dbg !61 + %57 = icmp ne i64 %56, 8, !dbg !61 + %58 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %59 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %58, i64 0, i32 2, !dbg !61 + %60 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %59, align 8, !dbg !61, !tbaa !41 + %61 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %60, i64 0, i32 4, !dbg !61 + %62 = load i64*, i64** %61, align 8, !dbg !61, !tbaa !47 + %63 = getelementptr inbounds i64, i64* %62, i64 -3, !dbg !61 + %64 = load i64, i64* %63, align 8, !dbg !61, !tbaa !13 + %65 = icmp ne i64 %64, 8, !dbg !61 + %66 = select i1 %65, i64 %64, i64 8, !dbg !61 + %67 = select i1 %57, i64 %56, i64 %66, !dbg !61 + call void @rb_set_errinfo(i64 %67), !dbg !61 + %".us" = load i64, i64* @"", align 8, !dbg !61 + %shouldRetry.us = icmp eq i64 %55, %".us", !dbg !61 + %68 = and i1 %50, %shouldRetry.us, !dbg !61 + br i1 %68, label %exception-entry.us, label %exception-ensure, !dbg !61 exception-entry: ; preds = %fillRequiredArgs, %sorbet_try.exit - %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !72 - %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !72, !tbaa !42 - %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 4, !dbg !72 - %84 = load i64*, i64** %83, align 8, !dbg !72, !tbaa !48 - %85 = load i64, i64* %84, align 8, !dbg !72, !tbaa !14 - %86 = and i64 %85, 8, !dbg !72 - %87 = icmp eq i64 %86, 0, !dbg !72 - br i1 %87, label %88, label %90, !dbg !72, !prof !76 - -88: ; preds = %exception-entry - %89 = getelementptr inbounds i64, i64* %84, i64 -3, !dbg !72 - store i64 8, i64* %89, align 8, !dbg !72, !tbaa !14 - br label %sorbet_writeLocal.exit, !dbg !72 - -90: ; preds = %exception-entry - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %84, i32 noundef -3, i64 noundef 8) #16, !dbg !72 - br label %sorbet_writeLocal.exit, !dbg !72 - -sorbet_writeLocal.exit: ; preds = %88, %90 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %17) #16, !dbg !72 - store i64 52, i64* %0, align 8, !dbg !72, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %18) #16, !dbg !72 - store i64 (i64**, i64*, i64)* @"func_Test.test_known_nil$block_1", i64 (i64**, i64*, i64)** %19, align 8, !dbg !72, !tbaa !4 - store i64** %7, i64*** %20, align 8, !dbg !72, !tbaa !10 - store i64* %13, i64** %21, align 8, !dbg !72, !tbaa !11 - store i64 0, i64* %22, align 8, !dbg !72, !tbaa !12 - store i64* %0, i64** %23, align 8, !dbg !72, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !72, !tbaa !14 - call void @rb_set_errinfo(i64 %previousException) #16, !dbg !72 - %91 = load i64, i64* @rb_eException, align 8, !dbg !72, !tbaa !14 - %92 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %25, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %26, i64 %91, i32 0) #16, !dbg !72 - %93 = load i64, i64* %0, align 8, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %18) #16, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %17) #16, !dbg !72 - %isReturnValue = icmp ne i64 %93, 52, !dbg !72 - br i1 %isReturnValue, label %exception-body-return, label %exception-body-continue, !dbg !72 + %69 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2, !dbg !61 + %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !dbg !61, !tbaa !41 + %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 4, !dbg !61 + %73 = load i64*, i64** %72, align 8, !dbg !61, !tbaa !47 + %74 = load i64, i64* %73, align 8, !dbg !61, !tbaa !13 + %75 = and i64 %74, 8, !dbg !61 + %76 = icmp eq i64 %75, 0, !dbg !61 + br i1 %76, label %77, label %79, !dbg !61, !prof !65 + +77: ; preds = %exception-entry + %78 = getelementptr inbounds i64, i64* %73, i64 -3, !dbg !61 + store i64 8, i64* %78, align 8, !dbg !61, !tbaa !13 + br label %sorbet_writeLocal.exit, !dbg !61 + +79: ; preds = %exception-entry + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %73, i32 noundef -3, i64 noundef 8) #16, !dbg !61 + br label %sorbet_writeLocal.exit, !dbg !61 + +sorbet_writeLocal.exit: ; preds = %77, %79 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %8) #16, !dbg !61 + store i64 52, i64* %0, align 8, !dbg !61, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %9) #16, !dbg !61 + store i64 (i64**, i64)* @"func_Test.test_known_nil$block_1", i64 (i64**, i64)** %10, align 8, !dbg !61, !tbaa !4 + store i64** %7, i64*** %11, align 8, !dbg !61, !tbaa !10 + store i64 0, i64* %12, align 8, !dbg !61, !tbaa !11 + store i64* %0, i64** %13, align 8, !dbg !61, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !61, !tbaa !13 + call void @rb_set_errinfo(i64 %previousException) #16, !dbg !61 + %80 = load i64, i64* @rb_eException, align 8, !dbg !61, !tbaa !13 + %81 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %15, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %16, i64 %80, i32 0) #16, !dbg !61 + %82 = load i64, i64* %0, align 8, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %9) #16, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %8) #16, !dbg !61 + %isReturnValue = icmp ne i64 %82, 52, !dbg !61 + br i1 %isReturnValue, label %exception-body-return, label %exception-body-continue, !dbg !61 exception-body-return: ; preds = %sorbet_writeLocal.exit, %sorbet_writeLocal.exit.us - %.lcssa = phi i64 [ %48, %sorbet_writeLocal.exit.us ], [ %93, %sorbet_writeLocal.exit ], !dbg !72 - call void @rb_set_errinfo(i64 %previousException), !dbg !72 - %stackFrame.i36 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_known_nil$block_3", align 8 - %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 - %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2 - %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !tbaa !42 - call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %94, %struct.rb_control_frame_struct* %96, %struct.rb_iseq_struct* %stackFrame.i36) #16 - %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 0 - %98 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 2 - %99 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %98, align 8, !tbaa !46 - %100 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %99, i64 0, i32 2 - %101 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %100, align 8, !tbaa !49 - %102 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %101, i64 0, i32 2 - %103 = load i64*, i64** %102, align 8, !tbaa !51 - %104 = getelementptr inbounds i64, i64* %103, i64 1 - store i64* %104, i64** %97, align 8, !tbaa !41 + %.lcssa = phi i64 [ %37, %sorbet_writeLocal.exit.us ], [ %82, %sorbet_writeLocal.exit ], !dbg !61 + call void @rb_set_errinfo(i64 %previousException), !dbg !61 + %stackFrame.i30 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_known_nil$block_3", align 8 + %83 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 + %84 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %83, i64 0, i32 2 + %85 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %84, align 8, !tbaa !41 + call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %83, %struct.rb_control_frame_struct* %85, %struct.rb_iseq_struct* %stackFrame.i30) #16 + %86 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %85, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %86, align 8, !tbaa !40 call void @sorbet_popRubyStack() - ret i64 %.lcssa, !dbg !72 + ret i64 %.lcssa, !dbg !61 exception-body-continue: ; preds = %sorbet_writeLocal.exit - %105 = load i64, i64* %exceptionValue, align 8, !dbg !72 - %106 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %107 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %106, i64 0, i32 2, !dbg !72 - %108 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %107, align 8, !dbg !72, !tbaa !42 - %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %108, i64 0, i32 4, !dbg !72 - %110 = load i64*, i64** %109, align 8, !dbg !72, !tbaa !48 - %111 = load i64, i64* %110, align 8, !dbg !72, !tbaa !14 - %112 = and i64 %111, 8, !dbg !72 - %113 = icmp eq i64 %112, 0, !dbg !72 - br i1 %113, label %114, label %116, !dbg !72, !prof !76 - -114: ; preds = %exception-body-continue - %115 = getelementptr inbounds i64, i64* %110, i64 -3, !dbg !72 - store i64 %105, i64* %115, align 8, !dbg !72, !tbaa !14 - br label %sorbet_writeLocal.exit32, !dbg !72 - -116: ; preds = %exception-body-continue - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %110, i32 noundef -3, i64 %105) #16, !dbg !72 - br label %sorbet_writeLocal.exit32, !dbg !72 - -sorbet_writeLocal.exit32: ; preds = %114, %116 - %117 = icmp ne i64 %105, 8, !dbg !72 - %handler = select i1 %117, i64 (i64**, i64*, i64)* @"func_Test.test_known_nil$block_2", i64 (i64**, i64*, i64)* @"func_Test.test_known_nil$block_4", !dbg !72 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %27) #16, !dbg !72 - store i64 52, i64* %2, align 8, !dbg !72, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %28) #16, !dbg !72 - store i64 (i64**, i64*, i64)* %handler, i64 (i64**, i64*, i64)** %29, align 8, !dbg !72, !tbaa !4 - store i64** %7, i64*** %30, align 8, !dbg !72, !tbaa !10 - store i64* %13, i64** %31, align 8, !dbg !72, !tbaa !11 - store i64 0, i64* %32, align 8, !dbg !72, !tbaa !12 - store i64* %2, i64** %33, align 8, !dbg !72, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !72, !tbaa !14 - %118 = icmp eq i64 %105, 8, !dbg !72 - br i1 %118, label %sorbet_try.exit, label %119, !dbg !72 - -119: ; preds = %sorbet_writeLocal.exit32 - call void @rb_set_errinfo(i64 %105) #16, !dbg !72 - br label %sorbet_try.exit, !dbg !72 - -sorbet_try.exit: ; preds = %sorbet_writeLocal.exit32, %119 - %120 = load i64, i64* @rb_eException, align 8, !dbg !72, !tbaa !14 - %121 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %34, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %26, i64 %120, i32 0) #16, !dbg !72 - %122 = load i64, i64* %2, align 8, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %28) #16, !dbg !72 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %27) #16, !dbg !72 - %123 = load i64, i64* %exceptionValue, align 8, !dbg !72 - %124 = icmp ne i64 %123, 8, !dbg !72 - %125 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %126 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %125, i64 0, i32 2, !dbg !72 - %127 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %126, align 8, !dbg !72, !tbaa !42 - %128 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %127, i64 0, i32 4, !dbg !72 - %129 = load i64*, i64** %128, align 8, !dbg !72, !tbaa !48 - %130 = getelementptr inbounds i64, i64* %129, i64 -3, !dbg !72 - %131 = load i64, i64* %130, align 8, !dbg !72, !tbaa !14 - %132 = icmp ne i64 %131, 8, !dbg !72 - %133 = select i1 %132, i64 %131, i64 %previousException, !dbg !72 - %134 = select i1 %124, i64 %123, i64 %133, !dbg !72 - call void @rb_set_errinfo(i64 %134), !dbg !72 - %"" = load i64, i64* @"", align 8, !dbg !72 - %shouldRetry = icmp eq i64 %122, %"", !dbg !72 - %135 = and i1 %117, %shouldRetry, !dbg !72 - br i1 %135, label %exception-entry, label %exception-ensure, !dbg !72 + %87 = load i64, i64* %exceptionValue, align 8, !dbg !61 + %88 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %89 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %88, i64 0, i32 2, !dbg !61 + %90 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %89, align 8, !dbg !61, !tbaa !41 + %91 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 4, !dbg !61 + %92 = load i64*, i64** %91, align 8, !dbg !61, !tbaa !47 + %93 = load i64, i64* %92, align 8, !dbg !61, !tbaa !13 + %94 = and i64 %93, 8, !dbg !61 + %95 = icmp eq i64 %94, 0, !dbg !61 + br i1 %95, label %96, label %98, !dbg !61, !prof !65 + +96: ; preds = %exception-body-continue + %97 = getelementptr inbounds i64, i64* %92, i64 -3, !dbg !61 + store i64 %87, i64* %97, align 8, !dbg !61, !tbaa !13 + br label %sorbet_writeLocal.exit25, !dbg !61 + +98: ; preds = %exception-body-continue + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %92, i32 noundef -3, i64 %87) #16, !dbg !61 + br label %sorbet_writeLocal.exit25, !dbg !61 + +sorbet_writeLocal.exit25: ; preds = %96, %98 + %99 = icmp ne i64 %87, 8, !dbg !61 + %handler = select i1 %99, i64 (i64**, i64)* @"func_Test.test_known_nil$block_2", i64 (i64**, i64)* @"func_Test.test_known_nil$block_4", !dbg !61 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %17) #16, !dbg !61 + store i64 52, i64* %2, align 8, !dbg !61, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %18) #16, !dbg !61 + store i64 (i64**, i64)* %handler, i64 (i64**, i64)** %19, align 8, !dbg !61, !tbaa !4 + store i64** %7, i64*** %20, align 8, !dbg !61, !tbaa !10 + store i64 0, i64* %21, align 8, !dbg !61, !tbaa !11 + store i64* %2, i64** %22, align 8, !dbg !61, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !61, !tbaa !13 + %100 = icmp eq i64 %87, 8, !dbg !61 + br i1 %100, label %sorbet_try.exit, label %101, !dbg !61 + +101: ; preds = %sorbet_writeLocal.exit25 + call void @rb_set_errinfo(i64 %87) #16, !dbg !61 + br label %sorbet_try.exit, !dbg !61 + +sorbet_try.exit: ; preds = %sorbet_writeLocal.exit25, %101 + %102 = load i64, i64* @rb_eException, align 8, !dbg !61, !tbaa !13 + %103 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %23, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %16, i64 %102, i32 0) #16, !dbg !61 + %104 = load i64, i64* %2, align 8, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %18) #16, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %17) #16, !dbg !61 + %105 = load i64, i64* %exceptionValue, align 8, !dbg !61 + %106 = icmp ne i64 %105, 8, !dbg !61 + %107 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %108 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %107, i64 0, i32 2, !dbg !61 + %109 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %108, align 8, !dbg !61, !tbaa !41 + %110 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %109, i64 0, i32 4, !dbg !61 + %111 = load i64*, i64** %110, align 8, !dbg !61, !tbaa !47 + %112 = getelementptr inbounds i64, i64* %111, i64 -3, !dbg !61 + %113 = load i64, i64* %112, align 8, !dbg !61, !tbaa !13 + %114 = icmp ne i64 %113, 8, !dbg !61 + %115 = select i1 %114, i64 %113, i64 %previousException, !dbg !61 + %116 = select i1 %106, i64 %105, i64 %115, !dbg !61 + call void @rb_set_errinfo(i64 %116), !dbg !61 + %"" = load i64, i64* @"", align 8, !dbg !61 + %shouldRetry = icmp eq i64 %104, %"", !dbg !61 + %117 = and i1 %99, %shouldRetry, !dbg !61 + br i1 %117, label %exception-entry, label %exception-ensure, !dbg !61 exception-ensure: ; preds = %sorbet_try.exit, %sorbet_try.exit.us - %.lcssa39 = phi i64 [ %66, %sorbet_try.exit.us ], [ %122, %sorbet_try.exit ], !dbg !72 - %.lcssa38 = phi i64 [ %78, %sorbet_try.exit.us ], [ %134, %sorbet_try.exit ], !dbg !72 + %.lcssa33 = phi i64 [ %55, %sorbet_try.exit.us ], [ %104, %sorbet_try.exit ], !dbg !61 + %.lcssa32 = phi i64 [ %67, %sorbet_try.exit.us ], [ %116, %sorbet_try.exit ], !dbg !61 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_known_nil$block_3", align 8 - %136 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 - %137 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %136, i64 0, i32 2 - %138 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %137, align 8, !tbaa !42 - call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %136, %struct.rb_control_frame_struct* %138, %struct.rb_iseq_struct* %stackFrame.i) #16 - %139 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %138, i64 0, i32 0 - %140 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %138, i64 0, i32 2 - %141 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %140, align 8, !tbaa !46 - %142 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %141, i64 0, i32 2 - %143 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %142, align 8, !tbaa !49 - %144 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %143, i64 0, i32 2 - %145 = load i64*, i64** %144, align 8, !tbaa !51 - %146 = getelementptr inbounds i64, i64* %145, i64 1 - store i64* %146, i64** %139, align 8, !tbaa !41 + %118 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 + %119 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %118, i64 0, i32 2 + %120 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %119, align 8, !tbaa !41 + call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %118, %struct.rb_control_frame_struct* %120, %struct.rb_iseq_struct* %stackFrame.i) #16 + %121 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %121, align 8, !tbaa !40 call void @sorbet_popRubyStack() - %isReturnValue15 = icmp ne i64 %.lcssa39, 52, !dbg !72 - br i1 %isReturnValue15, label %exception-return, label %exception-continue, !dbg !72 + %isReturnValue15 = icmp ne i64 %.lcssa33, 52, !dbg !61 + br i1 %isReturnValue15, label %exception-return, label %exception-continue, !dbg !61 exception-continue: ; preds = %exception-ensure - %147 = icmp eq i64 %.lcssa38, 8, !dbg !72 - br i1 %147, label %sorbet_raiseIfNotNil.exit31, label %148, !dbg !72 - -148: ; preds = %exception-continue - call void @rb_exc_raise(i64 %.lcssa38) #17, !dbg !72 - unreachable, !dbg !72 - -sorbet_raiseIfNotNil.exit31: ; preds = %exception-continue - %149 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !72, !tbaa !41 - %150 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %149, i64 0, i32 2, !dbg !72 - %151 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %150, align 8, !dbg !72, !tbaa !42 - %152 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %151, i64 0, i32 4, !dbg !72 - %153 = load i64*, i64** %152, align 8, !dbg !72, !tbaa !48 - %154 = getelementptr inbounds i64, i64* %153, i64 -3, !dbg !72 - %155 = load i64, i64* %154, align 8, !dbg !72, !tbaa !14 - %156 = icmp eq i64 %155, 8, !dbg !72 - br i1 %156, label %sorbet_raiseIfNotNil.exit, label %157, !dbg !72 - -157: ; preds = %sorbet_raiseIfNotNil.exit31 - call void @rb_exc_raise(i64 %155) #17, !dbg !72 - unreachable, !dbg !72 - -sorbet_raiseIfNotNil.exit: ; preds = %sorbet_raiseIfNotNil.exit31 - %158 = getelementptr inbounds i64, i64* %13, i64 6 - %159 = getelementptr inbounds i64, i64* %158, i64 1 - store i64* %159, i64** %7, align 8, !tbaa !41 - %160 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !77, !tbaa !41 - %161 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %160, i64 0, i32 2, !dbg !77 - %162 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %161, align 8, !dbg !77, !tbaa !42 - %163 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %162, i64 0, i32 4, !dbg !77 - %164 = load i64*, i64** %163, align 8, !dbg !77, !tbaa !48 - %165 = getelementptr inbounds i64, i64* %164, i64 -5, !dbg !77 - %166 = load i64, i64* %165, align 8, !dbg !77, !tbaa !14 - ret i64 %166 + %122 = icmp eq i64 %.lcssa32, 8, !dbg !61 + br i1 %122, label %sorbet_raiseIfNotNil.exit26, label %123, !dbg !61 + +123: ; preds = %exception-continue + call void @rb_exc_raise(i64 %.lcssa32) #17, !dbg !61 + unreachable, !dbg !61 + +sorbet_raiseIfNotNil.exit26: ; preds = %exception-continue + %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !40 + %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !61 + %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !61, !tbaa !41 + %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 4, !dbg !61 + %128 = load i64*, i64** %127, align 8, !dbg !61, !tbaa !47 + %129 = getelementptr inbounds i64, i64* %128, i64 -3, !dbg !61 + %130 = load i64, i64* %129, align 8, !dbg !61, !tbaa !13 + %131 = icmp eq i64 %130, 8, !dbg !61 + br i1 %131, label %sorbet_raiseIfNotNil.exit, label %132, !dbg !61 + +132: ; preds = %sorbet_raiseIfNotNil.exit26 + call void @rb_exc_raise(i64 %130) #17, !dbg !61 + unreachable, !dbg !61 + +sorbet_raiseIfNotNil.exit: ; preds = %sorbet_raiseIfNotNil.exit26 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %7, align 8, !tbaa !40 + %133 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !66, !tbaa !40 + %134 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %133, i64 0, i32 2, !dbg !66 + %135 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %134, align 8, !dbg !66, !tbaa !41 + %136 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %135, i64 0, i32 4, !dbg !66 + %137 = load i64*, i64** %136, align 8, !dbg !66, !tbaa !47 + %138 = getelementptr inbounds i64, i64* %137, i64 -5, !dbg !66 + %139 = load i64, i64* %138, align 8, !dbg !66, !tbaa !13 + ret i64 %139 exception-return: ; preds = %exception-ensure - ret i64 %.lcssa39, !dbg !72 + ret i64 %.lcssa33, !dbg !61 } ; Function Attrs: nounwind ssp -define internal noundef i64 @"func_Test.test_known_nil$block_1"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64* %iseq_encoded, i64 %localsOffset) #9 !dbg !27 { +define internal noundef i64 @"func_Test.test_known_nil$block_1"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64 %localsOffset) #9 !dbg !26 { fastSymCallIntrinsic_T_must: %callArgs = alloca [2 x i64], align 8 - %0 = getelementptr inbounds i64, i64* %iseq_encoded, i64 2 - %1 = getelementptr inbounds i64, i64* %0, i64 1 - store i64* %1, i64** %pc, align 8, !tbaa !41 - %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !26 - store i64 8, i64* %callArgs0Addr, align 8, !dbg !26 - %2 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !26 - tail call void @llvm.experimental.noalias.scope.decl(metadata !78), !dbg !26 - %3 = load i64, i64* %2, align 8, !dbg !26, !tbaa !14, !alias.scope !78 - %4 = icmp eq i64 %3, 8, !dbg !26 - br i1 %4, label %16, label %afterSend, !dbg !26, !prof !74 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %pc, align 8, !tbaa !40 + %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !25 + store i64 8, i64* %callArgs0Addr, align 8, !dbg !25 + %0 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !25 + tail call void @llvm.experimental.noalias.scope.decl(metadata !67), !dbg !25 + %1 = load i64, i64* %0, align 8, !dbg !25, !tbaa !13, !alias.scope !67 + %2 = icmp eq i64 %1, 8, !dbg !25 + br i1 %2, label %14, label %afterSend, !dbg !25, !prof !63 afterSend: ; preds = %fastSymCallIntrinsic_T_must - %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !26, !tbaa !41 - %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 2, !dbg !26 - %7 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %6, align 8, !dbg !26, !tbaa !42 - %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %7, i64 0, i32 4, !dbg !26 - %9 = load i64*, i64** %8, align 8, !dbg !26, !tbaa !48 - %10 = load i64, i64* %9, align 8, !dbg !26, !tbaa !14 - %11 = and i64 %10, 8, !dbg !26 - %12 = icmp eq i64 %11, 0, !dbg !26 - br i1 %12, label %13, label %15, !dbg !26, !prof !76 + %3 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !25, !tbaa !40 + %4 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %3, i64 0, i32 2, !dbg !25 + %5 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %4, align 8, !dbg !25, !tbaa !41 + %6 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %5, i64 0, i32 4, !dbg !25 + %7 = load i64*, i64** %6, align 8, !dbg !25, !tbaa !47 + %8 = load i64, i64* %7, align 8, !dbg !25, !tbaa !13 + %9 = and i64 %8, 8, !dbg !25 + %10 = icmp eq i64 %9, 0, !dbg !25 + br i1 %10, label %11, label %13, !dbg !25, !prof !65 + +11: ; preds = %afterSend + %12 = getelementptr inbounds i64, i64* %7, i64 -5, !dbg !25 + store i64 %1, i64* %12, align 8, !dbg !25, !tbaa !13 + br label %sorbet_writeLocal.exit, !dbg !25 13: ; preds = %afterSend - %14 = getelementptr inbounds i64, i64* %9, i64 -5, !dbg !26 - store i64 %3, i64* %14, align 8, !dbg !26, !tbaa !14 - br label %sorbet_writeLocal.exit, !dbg !26 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %7, i32 noundef -5, i64 %1) #16, !dbg !25 + br label %sorbet_writeLocal.exit, !dbg !25 -15: ; preds = %afterSend - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %9, i32 noundef -5, i64 %3) #16, !dbg !26 - br label %sorbet_writeLocal.exit, !dbg !26 - -sorbet_writeLocal.exit: ; preds = %13, %15 +sorbet_writeLocal.exit: ; preds = %11, %13 ret i64 52 -16: ; preds = %fastSymCallIntrinsic_T_must - %17 = load i64, i64* @rb_eTypeError, align 8, !dbg !26, !tbaa !14, !noalias !78 - tail call void (i64, i8*, ...) @rb_raise(i64 %17, i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @.str.2, i64 0, i64 0)) #17, !dbg !26, !noalias !78 - unreachable, !dbg !26 +14: ; preds = %fastSymCallIntrinsic_T_must + %15 = load i64, i64* @rb_eTypeError, align 8, !dbg !25, !tbaa !13, !noalias !67 + tail call void (i64, i8*, ...) @rb_raise(i64 %15, i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @.str.2, i64 0, i64 0)) #17, !dbg !25, !noalias !67 + unreachable, !dbg !25 } ; Function Attrs: ssp -define internal noundef i64 @"func_Test.test_known_nil$block_2"(i64** nocapture nofree readnone %pc, i64* nocapture nofree readnone %iseq_encoded, i64 %localsOffset) #10 !dbg !30 { -vm_get_ep.exit34: - %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 +define internal noundef i64 @"func_Test.test_known_nil$block_2"(i64** nocapture nofree readnone %pc, i64 %localsOffset) #10 !dbg !29 { +vm_get_ep.exit30: + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 - %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !42 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !41 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 3 - %4 = load i64, i64* %3, align 8, !tbaa !81 + %4 = load i64, i64* %3, align 8, !tbaa !70 %stackFrame = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_known_nil$block_2", align 8 tail call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %0, %struct.rb_control_frame_struct* %2, %struct.rb_iseq_struct* %stackFrame) #16 %5 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %6 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %7 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %6, align 8, !tbaa !46 - %8 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %7, i64 0, i32 2 - %9 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %8, align 8, !tbaa !49 - %10 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %9, i64 0, i32 2 - %11 = load i64*, i64** %10, align 8, !tbaa !51 - %12 = getelementptr inbounds i64, i64* %11, i64 3 - %13 = getelementptr inbounds i64, i64* %12, i64 1 - store i64* %13, i64** %5, align 8, !tbaa !41 - %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !29, !tbaa !41 - %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2, !dbg !29 - %16 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %15, align 8, !dbg !29, !tbaa !42 - %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 4, !dbg !29 - %18 = load i64*, i64** %17, align 8, !dbg !29 - %19 = getelementptr inbounds i64, i64* %18, i64 -1, !dbg !29 - %20 = load i64, i64* %19, align 8, !dbg !29, !tbaa !14 - %21 = and i64 %20, -4, !dbg !29 - %22 = inttoptr i64 %21 to i64*, !dbg !29 - %23 = getelementptr inbounds i64, i64* %22, i64 -3, !dbg !29 - %24 = load i64, i64* %23, align 8, !dbg !29, !tbaa !14 - %25 = load i64, i64* @rb_eStandardError, align 8, !dbg !29 - %26 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 1, !dbg !29 - %27 = load i64*, i64** %26, align 8, !dbg !29, !tbaa !71 - %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !29 - store i64 %24, i64* %27, align 8, !dbg !29, !tbaa !14 - %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !29 - store i64* %29, i64** %26, align 8, !dbg !29, !tbaa !71 - store i64 %25, i64* %28, align 8, !dbg !29, !tbaa !14 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 0), !dbg !29 - %30 = and i64 %send, -9, !dbg !29 - %31 = icmp ne i64 %30, 0, !dbg !29 - br i1 %31, label %vm_get_ep.exit32, label %vm_get_ep.exit, !dbg !29 - -blockExit: ; preds = %87, %85, %70, %68 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %5, align 8, !tbaa !40 + %6 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !40 + %7 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %6, i64 0, i32 2, !dbg !28 + %8 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %7, align 8, !dbg !28, !tbaa !41 + %9 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %8, i64 0, i32 4, !dbg !28 + %10 = load i64*, i64** %9, align 8, !dbg !28 + %11 = getelementptr inbounds i64, i64* %10, i64 -1, !dbg !28 + %12 = load i64, i64* %11, align 8, !dbg !28, !tbaa !13 + %13 = and i64 %12, -4, !dbg !28 + %14 = inttoptr i64 %13 to i64*, !dbg !28 + %15 = getelementptr inbounds i64, i64* %14, i64 -3, !dbg !28 + %16 = load i64, i64* %15, align 8, !dbg !28, !tbaa !13 + %17 = load i64, i64* @rb_eStandardError, align 8, !dbg !28 + %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %8, i64 0, i32 1, !dbg !28 + %19 = load i64*, i64** %18, align 8, !dbg !28, !tbaa !60 + %20 = getelementptr inbounds i64, i64* %19, i64 1, !dbg !28 + store i64 %16, i64* %19, align 8, !dbg !28, !tbaa !13 + %21 = getelementptr inbounds i64, i64* %20, i64 1, !dbg !28 + store i64* %21, i64** %18, align 8, !dbg !28, !tbaa !60 + store i64 %17, i64* %20, align 8, !dbg !28, !tbaa !13 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_is_a?", i64 0), !dbg !28 + %22 = and i64 %send, -9, !dbg !28 + %23 = icmp ne i64 %22, 0, !dbg !28 + br i1 %23, label %vm_get_ep.exit28, label %vm_get_ep.exit, !dbg !28 + +blockExit: ; preds = %75, %73, %60, %58 tail call void @sorbet_popRubyStack() ret i64 52 -vm_get_ep.exit32: ; preds = %vm_get_ep.exit34 - %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !82, !tbaa !41 - %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !82 - %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !82, !tbaa !42 - %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 4, !dbg !82 - %36 = load i64*, i64** %35, align 8, !dbg !82 - %37 = getelementptr inbounds i64, i64* %36, i64 -1, !dbg !82 - %38 = load i64, i64* %37, align 8, !dbg !82, !tbaa !14 - %39 = and i64 %38, -4, !dbg !82 - %40 = inttoptr i64 %39 to i64*, !dbg !82 - %41 = load i64, i64* %40, align 8, !dbg !82, !tbaa !14 - %42 = and i64 %41, 8, !dbg !82 - %43 = icmp eq i64 %42, 0, !dbg !82 - br i1 %43, label %44, label %46, !dbg !82, !prof !76 - -44: ; preds = %vm_get_ep.exit32 - %45 = getelementptr inbounds i64, i64* %40, i64 -3, !dbg !82 - store i64 8, i64* %45, align 8, !dbg !82, !tbaa !14 - br label %vm_get_ep.exit30, !dbg !82 - -46: ; preds = %vm_get_ep.exit32 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %40, i32 noundef -3, i64 noundef 8) #16, !dbg !82 - br label %vm_get_ep.exit30, !dbg !82 - -vm_get_ep.exit30: ; preds = %44, %46 - %47 = getelementptr inbounds i64, i64* %11, i64 4, !dbg !83 - %48 = getelementptr inbounds i64, i64* %47, i64 1, !dbg !83 - store i64* %48, i64** %5, align 8, !dbg !83, !tbaa !41 - %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !41 - %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2, !dbg !31 - %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !dbg !31, !tbaa !42 - %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 1, !dbg !31 - %53 = load i64*, i64** %52, align 8, !dbg !31, !tbaa !71 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !31 - store i64 %4, i64* %53, align 8, !dbg !31, !tbaa !14 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !31 - store i64* %55, i64** %52, align 8, !dbg !31, !tbaa !71 - store i64 %24, i64* %54, align 8, !dbg !31, !tbaa !14 - %send16 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !31 - %56 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !41 - %57 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %56, i64 0, i32 2, !dbg !31 - %58 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %57, align 8, !dbg !31, !tbaa !42 - %59 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %58, i64 0, i32 4, !dbg !31 - %60 = load i64*, i64** %59, align 8, !dbg !31 - %61 = getelementptr inbounds i64, i64* %60, i64 -1, !dbg !31 - %62 = load i64, i64* %61, align 8, !dbg !31, !tbaa !14 - %63 = and i64 %62, -4, !dbg !31 - %64 = inttoptr i64 %63 to i64*, !dbg !31 - %65 = load i64, i64* %64, align 8, !dbg !31, !tbaa !14 - %66 = and i64 %65, 8, !dbg !31 - %67 = icmp eq i64 %66, 0, !dbg !31 - br i1 %67, label %68, label %70, !dbg !31, !prof !76 - -68: ; preds = %vm_get_ep.exit30 - %69 = getelementptr inbounds i64, i64* %64, i64 -5, !dbg !31 - store i64 %send16, i64* %69, align 8, !dbg !31, !tbaa !14 - br label %blockExit, !dbg !31 - -70: ; preds = %vm_get_ep.exit30 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %64, i32 noundef -5, i64 %send16) #16, !dbg !31 - br label %blockExit, !dbg !31 - -vm_get_ep.exit: ; preds = %vm_get_ep.exit34 - %71 = getelementptr inbounds i64, i64* %11, i64 2 - %72 = getelementptr inbounds i64, i64* %71, i64 1 - store i64* %72, i64** %5, align 8, !tbaa !41 - %73 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !84, !tbaa !41 - %74 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %73, i64 0, i32 2, !dbg !84 - %75 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %74, align 8, !dbg !84, !tbaa !42 - %76 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %75, i64 0, i32 4, !dbg !84 - %77 = load i64*, i64** %76, align 8, !dbg !84 - %78 = getelementptr inbounds i64, i64* %77, i64 -1, !dbg !84 - %79 = load i64, i64* %78, align 8, !dbg !84, !tbaa !14 - %80 = and i64 %79, -4, !dbg !84 - %81 = inttoptr i64 %80 to i64*, !dbg !84 - %82 = load i64, i64* %81, align 8, !dbg !84, !tbaa !14 - %83 = and i64 %82, 8, !dbg !84 - %84 = icmp eq i64 %83, 0, !dbg !84 - br i1 %84, label %85, label %87, !dbg !84, !prof !76 - -85: ; preds = %vm_get_ep.exit - %86 = getelementptr inbounds i64, i64* %81, i64 -6, !dbg !84 - store i64 20, i64* %86, align 8, !dbg !84, !tbaa !14 - br label %blockExit, !dbg !84 - -87: ; preds = %vm_get_ep.exit - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %81, i32 noundef -6, i64 noundef 20) #16, !dbg !84 - br label %blockExit, !dbg !84 +vm_get_ep.exit28: ; preds = %vm_get_ep.exit30 + %24 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !71, !tbaa !40 + %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2, !dbg !71 + %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !dbg !71, !tbaa !41 + %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4, !dbg !71 + %28 = load i64*, i64** %27, align 8, !dbg !71 + %29 = getelementptr inbounds i64, i64* %28, i64 -1, !dbg !71 + %30 = load i64, i64* %29, align 8, !dbg !71, !tbaa !13 + %31 = and i64 %30, -4, !dbg !71 + %32 = inttoptr i64 %31 to i64*, !dbg !71 + %33 = load i64, i64* %32, align 8, !dbg !71, !tbaa !13 + %34 = and i64 %33, 8, !dbg !71 + %35 = icmp eq i64 %34, 0, !dbg !71 + br i1 %35, label %36, label %38, !dbg !71, !prof !65 + +36: ; preds = %vm_get_ep.exit28 + %37 = getelementptr inbounds i64, i64* %32, i64 -3, !dbg !71 + store i64 8, i64* %37, align 8, !dbg !71, !tbaa !13 + br label %vm_get_ep.exit26, !dbg !71 + +38: ; preds = %vm_get_ep.exit28 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %32, i32 noundef -3, i64 noundef 8) #16, !dbg !71 + br label %vm_get_ep.exit26, !dbg !71 + +vm_get_ep.exit26: ; preds = %36, %38 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %5, align 8, !dbg !72, !tbaa !40 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !40 + %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !30 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !30, !tbaa !41 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 1, !dbg !30 + %43 = load i64*, i64** %42, align 8, !dbg !30, !tbaa !60 + %44 = getelementptr inbounds i64, i64* %43, i64 1, !dbg !30 + store i64 %4, i64* %43, align 8, !dbg !30, !tbaa !13 + %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !30 + store i64* %45, i64** %42, align 8, !dbg !30, !tbaa !60 + store i64 %16, i64* %44, align 8, !dbg !30, !tbaa !13 + %send16 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !30 + %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !30, !tbaa !40 + %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !30 + %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !30, !tbaa !41 + %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 4, !dbg !30 + %50 = load i64*, i64** %49, align 8, !dbg !30 + %51 = getelementptr inbounds i64, i64* %50, i64 -1, !dbg !30 + %52 = load i64, i64* %51, align 8, !dbg !30, !tbaa !13 + %53 = and i64 %52, -4, !dbg !30 + %54 = inttoptr i64 %53 to i64*, !dbg !30 + %55 = load i64, i64* %54, align 8, !dbg !30, !tbaa !13 + %56 = and i64 %55, 8, !dbg !30 + %57 = icmp eq i64 %56, 0, !dbg !30 + br i1 %57, label %58, label %60, !dbg !30, !prof !65 + +58: ; preds = %vm_get_ep.exit26 + %59 = getelementptr inbounds i64, i64* %54, i64 -5, !dbg !30 + store i64 %send16, i64* %59, align 8, !dbg !30, !tbaa !13 + br label %blockExit, !dbg !30 + +60: ; preds = %vm_get_ep.exit26 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %54, i32 noundef -5, i64 %send16) #16, !dbg !30 + br label %blockExit, !dbg !30 + +vm_get_ep.exit: ; preds = %vm_get_ep.exit30 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %5, align 8, !tbaa !40 + %61 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !73, !tbaa !40 + %62 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %61, i64 0, i32 2, !dbg !73 + %63 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %62, align 8, !dbg !73, !tbaa !41 + %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %63, i64 0, i32 4, !dbg !73 + %65 = load i64*, i64** %64, align 8, !dbg !73 + %66 = getelementptr inbounds i64, i64* %65, i64 -1, !dbg !73 + %67 = load i64, i64* %66, align 8, !dbg !73, !tbaa !13 + %68 = and i64 %67, -4, !dbg !73 + %69 = inttoptr i64 %68 to i64*, !dbg !73 + %70 = load i64, i64* %69, align 8, !dbg !73, !tbaa !13 + %71 = and i64 %70, 8, !dbg !73 + %72 = icmp eq i64 %71, 0, !dbg !73 + br i1 %72, label %73, label %75, !dbg !73, !prof !65 + +73: ; preds = %vm_get_ep.exit + %74 = getelementptr inbounds i64, i64* %69, i64 -6, !dbg !73 + store i64 20, i64* %74, align 8, !dbg !73, !tbaa !13 + br label %blockExit, !dbg !73 + +75: ; preds = %vm_get_ep.exit + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %69, i32 noundef -6, i64 noundef 20) #16, !dbg !73 + br label %blockExit, !dbg !73 } ; Function Attrs: argmemonly nofree norecurse nosync nounwind ssp willreturn writeonly -define internal noundef i64 @"func_Test.test_known_nil$block_4"(i64** nocapture nofree nonnull writeonly align 8 dereferenceable(8) %pc, i64* nofree writeonly %iseq_encoded, i64 %localsOffset) #11 !dbg !85 { +define internal noundef i64 @"func_Test.test_known_nil$block_4"(i64** nocapture nofree nonnull writeonly align 8 dereferenceable(8) %pc, i64 %localsOffset) #11 !dbg !74 { functionEntryInitializers: - %0 = getelementptr inbounds i64, i64* %iseq_encoded, i64 1 - store i64* %0, i64** %pc, align 8, !tbaa !41 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %pc, align 8, !tbaa !40 ret i64 52 } ; Function Attrs: nounwind sspreq uwtable -define i64 @func_Test.test_nilable_arg(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #8 !dbg !34 { +define i64 @func_Test.test_nilable_arg(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #8 !dbg !33 { functionEntryInitializers: %0 = alloca i64, align 8 %1 = alloca %struct.ExceptionClosure, align 8 %2 = alloca i64, align 8 %3 = alloca %struct.ExceptionClosure, align 8 - %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 + %4 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 %5 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %4, i64 0, i32 2 - %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !42 + %6 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %5, align 8, !tbaa !41 %7 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 0 - %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %6, i64 0, i32 2 - %9 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %8, align 8, !tbaa !46 - %10 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %9, i64 0, i32 2 - %11 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %10, align 8, !tbaa !49 - %12 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %11, i64 0, i32 2 - %13 = load i64*, i64** %12, align 8, !tbaa !51 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %7, align 8, !tbaa !41 - %exceptionValue = alloca i64, align 8, !dbg !86 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !87 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !87 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !87 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !87, !prof !88 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %7, align 8, !tbaa !40 + %exceptionValue = alloca i64, align 8, !dbg !75 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !76 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !76 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !76 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !76, !prof !77 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !87 - unreachable, !dbg !87 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #0, !dbg !76 + unreachable, !dbg !76 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !87 - %15 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !87, !tbaa !41 - %16 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %15, i64 0, i32 2, !dbg !87 - %17 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %16, align 8, !dbg !87, !tbaa !42 - %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 4, !dbg !87 - %19 = load i64*, i64** %18, align 8, !dbg !87, !tbaa !48 - %20 = load i64, i64* %19, align 8, !dbg !87, !tbaa !14 - %21 = and i64 %20, 8, !dbg !87 - %22 = icmp eq i64 %21, 0, !dbg !87 - br i1 %22, label %23, label %25, !dbg !87, !prof !76 - -23: ; preds = %fillRequiredArgs - %24 = getelementptr inbounds i64, i64* %19, i64 -4, !dbg !87 - store i64 %rawArg_arg, i64* %24, align 8, !dbg !87, !tbaa !14 - br label %sorbet_writeLocal.exit, !dbg !87 - -25: ; preds = %fillRequiredArgs - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %19, i32 noundef -4, i64 %rawArg_arg) #16, !dbg !87 - br label %sorbet_writeLocal.exit, !dbg !87 - -sorbet_writeLocal.exit: ; preds = %23, %25 - %26 = getelementptr inbounds i64, i64* %13, i64 2, !dbg !89 - %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !89 - store i64* %27, i64** %7, align 8, !dbg !89, !tbaa !41 - %previousException = tail call i64 @rb_errinfo(), !dbg !86 - %28 = bitcast i64* %0 to i8* - %29 = bitcast %struct.ExceptionClosure* %1 to i8* - %30 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 0 - %31 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 1 - %32 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 2 - %33 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 3 - %34 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 4 - %35 = icmp eq i64 %previousException, 8 - %36 = ptrtoint %struct.ExceptionClosure* %1 to i64 - %37 = ptrtoint i64* %exceptionValue to i64 - %38 = bitcast i64* %2 to i8* - %39 = bitcast %struct.ExceptionClosure* %3 to i8* - %40 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 0 - %41 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 1 - %42 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 2 - %43 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 3 - %44 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 4 - %45 = ptrtoint %struct.ExceptionClosure* %3 to i64 - br i1 %35, label %exception-entry.us, label %exception-entry, !dbg !86 + %rawArg_arg = load i64, i64* %argArray, align 8, !dbg !76 + %8 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !76, !tbaa !40 + %9 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %8, i64 0, i32 2, !dbg !76 + %10 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %9, align 8, !dbg !76, !tbaa !41 + %11 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %10, i64 0, i32 4, !dbg !76 + %12 = load i64*, i64** %11, align 8, !dbg !76, !tbaa !47 + %13 = load i64, i64* %12, align 8, !dbg !76, !tbaa !13 + %14 = and i64 %13, 8, !dbg !76 + %15 = icmp eq i64 %14, 0, !dbg !76 + br i1 %15, label %16, label %18, !dbg !76, !prof !65 + +16: ; preds = %fillRequiredArgs + %17 = getelementptr inbounds i64, i64* %12, i64 -4, !dbg !76 + store i64 %rawArg_arg, i64* %17, align 8, !dbg !76, !tbaa !13 + br label %sorbet_writeLocal.exit, !dbg !76 + +18: ; preds = %fillRequiredArgs + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %12, i32 noundef -4, i64 %rawArg_arg) #16, !dbg !76 + br label %sorbet_writeLocal.exit, !dbg !76 + +sorbet_writeLocal.exit: ; preds = %16, %18 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %7, align 8, !dbg !78, !tbaa !40 + %previousException = tail call i64 @rb_errinfo(), !dbg !75 + %19 = bitcast i64* %0 to i8* + %20 = bitcast %struct.ExceptionClosure* %1 to i8* + %21 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 0 + %22 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 1 + %23 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 2 + %24 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %1, i64 0, i32 3 + %25 = icmp eq i64 %previousException, 8 + %26 = ptrtoint %struct.ExceptionClosure* %1 to i64 + %27 = ptrtoint i64* %exceptionValue to i64 + %28 = bitcast i64* %2 to i8* + %29 = bitcast %struct.ExceptionClosure* %3 to i8* + %30 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 0 + %31 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 1 + %32 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 2 + %33 = getelementptr inbounds %struct.ExceptionClosure, %struct.ExceptionClosure* %3, i64 0, i32 3 + %34 = ptrtoint %struct.ExceptionClosure* %3 to i64 + br i1 %25, label %exception-entry.us, label %exception-entry, !dbg !75 exception-entry.us: ; preds = %sorbet_writeLocal.exit, %sorbet_try.exit.us - %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !86 - %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !86, !tbaa !42 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 4, !dbg !86 - %50 = load i64*, i64** %49, align 8, !dbg !86, !tbaa !48 - %51 = load i64, i64* %50, align 8, !dbg !86, !tbaa !14 - %52 = and i64 %51, 8, !dbg !86 - %53 = icmp eq i64 %52, 0, !dbg !86 - br i1 %53, label %55, label %54, !dbg !86, !prof !76 - -54: ; preds = %exception-entry.us - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %50, i32 noundef -3, i64 noundef 8) #16, !dbg !86 - br label %sorbet_writeLocal.exit35.us, !dbg !86 - -55: ; preds = %exception-entry.us - %56 = getelementptr inbounds i64, i64* %50, i64 -3, !dbg !86 - store i64 8, i64* %56, align 8, !dbg !86, !tbaa !14 - br label %sorbet_writeLocal.exit35.us, !dbg !86 - -sorbet_writeLocal.exit35.us: ; preds = %55, %54 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #16, !dbg !86 - store i64 52, i64* %0, align 8, !dbg !86, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %29) #16, !dbg !86 - store i64 (i64**, i64*, i64)* @"func_Test.test_nilable_arg$block_1", i64 (i64**, i64*, i64)** %30, align 8, !dbg !86, !tbaa !4 - store i64** %7, i64*** %31, align 8, !dbg !86, !tbaa !10 - store i64* %13, i64** %32, align 8, !dbg !86, !tbaa !11 - store i64 0, i64* %33, align 8, !dbg !86, !tbaa !12 - store i64* %0, i64** %34, align 8, !dbg !86, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !86, !tbaa !14 - %57 = load i64, i64* @rb_eException, align 8, !dbg !86, !tbaa !14 - %58 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %36, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %57, i32 0) #16, !dbg !86 - %59 = load i64, i64* %0, align 8, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %29) #16, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #16, !dbg !86 - %isReturnValue.us = icmp ne i64 %59, 52, !dbg !86 - br i1 %isReturnValue.us, label %exception-body-return, label %exception-body-continue.us, !dbg !86 - -exception-body-continue.us: ; preds = %sorbet_writeLocal.exit35.us - %60 = load i64, i64* %exceptionValue, align 8, !dbg !86 - %61 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %62 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %61, i64 0, i32 2, !dbg !86 - %63 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %62, align 8, !dbg !86, !tbaa !42 - %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %63, i64 0, i32 4, !dbg !86 - %65 = load i64*, i64** %64, align 8, !dbg !86, !tbaa !48 - %66 = load i64, i64* %65, align 8, !dbg !86, !tbaa !14 - %67 = and i64 %66, 8, !dbg !86 - %68 = icmp eq i64 %67, 0, !dbg !86 - br i1 %68, label %70, label %69, !dbg !86, !prof !76 - -69: ; preds = %exception-body-continue.us - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %65, i32 noundef -3, i64 %60) #16, !dbg !86 - br label %sorbet_writeLocal.exit36.us, !dbg !86 - -70: ; preds = %exception-body-continue.us - %71 = getelementptr inbounds i64, i64* %65, i64 -3, !dbg !86 - store i64 %60, i64* %71, align 8, !dbg !86, !tbaa !14 - br label %sorbet_writeLocal.exit36.us, !dbg !86 - -sorbet_writeLocal.exit36.us: ; preds = %70, %69 - %72 = icmp ne i64 %60, 8, !dbg !86 - %handler.us = select i1 %72, i64 (i64**, i64*, i64)* @"func_Test.test_nilable_arg$block_2", i64 (i64**, i64*, i64)* @"func_Test.test_nilable_arg$block_4", !dbg !86 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %38) #16, !dbg !86 - store i64 52, i64* %2, align 8, !dbg !86, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %39) #16, !dbg !86 - store i64 (i64**, i64*, i64)* %handler.us, i64 (i64**, i64*, i64)** %40, align 8, !dbg !86, !tbaa !4 - store i64** %7, i64*** %41, align 8, !dbg !86, !tbaa !10 - store i64* %13, i64** %42, align 8, !dbg !86, !tbaa !11 - store i64 0, i64* %43, align 8, !dbg !86, !tbaa !12 - store i64* %2, i64** %44, align 8, !dbg !86, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !86, !tbaa !14 - %73 = icmp eq i64 %60, 8, !dbg !86 - br i1 %73, label %sorbet_try.exit.us, label %74, !dbg !86 - -74: ; preds = %sorbet_writeLocal.exit36.us - call void @rb_set_errinfo(i64 %60) #16, !dbg !86 - br label %sorbet_try.exit.us, !dbg !86 - -sorbet_try.exit.us: ; preds = %74, %sorbet_writeLocal.exit36.us - %75 = load i64, i64* @rb_eException, align 8, !dbg !86, !tbaa !14 - %76 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %45, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %75, i32 0) #16, !dbg !86 - %77 = load i64, i64* %2, align 8, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %39) #16, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %38) #16, !dbg !86 - %78 = load i64, i64* %exceptionValue, align 8, !dbg !86 - %79 = icmp ne i64 %78, 8, !dbg !86 - %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !86 - %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !86, !tbaa !42 - %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 4, !dbg !86 - %84 = load i64*, i64** %83, align 8, !dbg !86, !tbaa !48 - %85 = getelementptr inbounds i64, i64* %84, i64 -3, !dbg !86 - %86 = load i64, i64* %85, align 8, !dbg !86, !tbaa !14 - %87 = icmp ne i64 %86, 8, !dbg !86 - %88 = select i1 %87, i64 %86, i64 8, !dbg !86 - %89 = select i1 %79, i64 %78, i64 %88, !dbg !86 - call void @rb_set_errinfo(i64 %89), !dbg !86 - %".us" = load i64, i64* @"", align 8, !dbg !86 - %shouldRetry.us = icmp eq i64 %77, %".us", !dbg !86 - %90 = and i1 %72, %shouldRetry.us, !dbg !86 - br i1 %90, label %exception-entry.us, label %exception-ensure, !dbg !86 + %35 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %36 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %35, i64 0, i32 2, !dbg !75 + %37 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %36, align 8, !dbg !75, !tbaa !41 + %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 4, !dbg !75 + %39 = load i64*, i64** %38, align 8, !dbg !75, !tbaa !47 + %40 = load i64, i64* %39, align 8, !dbg !75, !tbaa !13 + %41 = and i64 %40, 8, !dbg !75 + %42 = icmp eq i64 %41, 0, !dbg !75 + br i1 %42, label %44, label %43, !dbg !75, !prof !65 + +43: ; preds = %exception-entry.us + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %39, i32 noundef -3, i64 noundef 8) #16, !dbg !75 + br label %sorbet_writeLocal.exit28.us, !dbg !75 + +44: ; preds = %exception-entry.us + %45 = getelementptr inbounds i64, i64* %39, i64 -3, !dbg !75 + store i64 8, i64* %45, align 8, !dbg !75, !tbaa !13 + br label %sorbet_writeLocal.exit28.us, !dbg !75 + +sorbet_writeLocal.exit28.us: ; preds = %44, %43 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %19) #16, !dbg !75 + store i64 52, i64* %0, align 8, !dbg !75, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %20) #16, !dbg !75 + store i64 (i64**, i64)* @"func_Test.test_nilable_arg$block_1", i64 (i64**, i64)** %21, align 8, !dbg !75, !tbaa !4 + store i64** %7, i64*** %22, align 8, !dbg !75, !tbaa !10 + store i64 0, i64* %23, align 8, !dbg !75, !tbaa !11 + store i64* %0, i64** %24, align 8, !dbg !75, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !75, !tbaa !13 + %46 = load i64, i64* @rb_eException, align 8, !dbg !75, !tbaa !13 + %47 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %26, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %46, i32 0) #16, !dbg !75 + %48 = load i64, i64* %0, align 8, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %20) #16, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #16, !dbg !75 + %isReturnValue.us = icmp ne i64 %48, 52, !dbg !75 + br i1 %isReturnValue.us, label %exception-body-return, label %exception-body-continue.us, !dbg !75 + +exception-body-continue.us: ; preds = %sorbet_writeLocal.exit28.us + %49 = load i64, i64* %exceptionValue, align 8, !dbg !75 + %50 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %51 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %50, i64 0, i32 2, !dbg !75 + %52 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %51, align 8, !dbg !75, !tbaa !41 + %53 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %52, i64 0, i32 4, !dbg !75 + %54 = load i64*, i64** %53, align 8, !dbg !75, !tbaa !47 + %55 = load i64, i64* %54, align 8, !dbg !75, !tbaa !13 + %56 = and i64 %55, 8, !dbg !75 + %57 = icmp eq i64 %56, 0, !dbg !75 + br i1 %57, label %59, label %58, !dbg !75, !prof !65 + +58: ; preds = %exception-body-continue.us + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %54, i32 noundef -3, i64 %49) #16, !dbg !75 + br label %sorbet_writeLocal.exit29.us, !dbg !75 + +59: ; preds = %exception-body-continue.us + %60 = getelementptr inbounds i64, i64* %54, i64 -3, !dbg !75 + store i64 %49, i64* %60, align 8, !dbg !75, !tbaa !13 + br label %sorbet_writeLocal.exit29.us, !dbg !75 + +sorbet_writeLocal.exit29.us: ; preds = %59, %58 + %61 = icmp ne i64 %49, 8, !dbg !75 + %handler.us = select i1 %61, i64 (i64**, i64)* @"func_Test.test_nilable_arg$block_2", i64 (i64**, i64)* @"func_Test.test_nilable_arg$block_4", !dbg !75 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #16, !dbg !75 + store i64 52, i64* %2, align 8, !dbg !75, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %29) #16, !dbg !75 + store i64 (i64**, i64)* %handler.us, i64 (i64**, i64)** %30, align 8, !dbg !75, !tbaa !4 + store i64** %7, i64*** %31, align 8, !dbg !75, !tbaa !10 + store i64 0, i64* %32, align 8, !dbg !75, !tbaa !11 + store i64* %2, i64** %33, align 8, !dbg !75, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !75, !tbaa !13 + %62 = icmp eq i64 %49, 8, !dbg !75 + br i1 %62, label %sorbet_try.exit.us, label %63, !dbg !75 + +63: ; preds = %sorbet_writeLocal.exit29.us + call void @rb_set_errinfo(i64 %49) #16, !dbg !75 + br label %sorbet_try.exit.us, !dbg !75 + +sorbet_try.exit.us: ; preds = %63, %sorbet_writeLocal.exit29.us + %64 = load i64, i64* @rb_eException, align 8, !dbg !75, !tbaa !13 + %65 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %34, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %64, i32 0) #16, !dbg !75 + %66 = load i64, i64* %2, align 8, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %29) #16, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #16, !dbg !75 + %67 = load i64, i64* %exceptionValue, align 8, !dbg !75 + %68 = icmp ne i64 %67, 8, !dbg !75 + %69 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %70 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %69, i64 0, i32 2, !dbg !75 + %71 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %70, align 8, !dbg !75, !tbaa !41 + %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %71, i64 0, i32 4, !dbg !75 + %73 = load i64*, i64** %72, align 8, !dbg !75, !tbaa !47 + %74 = getelementptr inbounds i64, i64* %73, i64 -3, !dbg !75 + %75 = load i64, i64* %74, align 8, !dbg !75, !tbaa !13 + %76 = icmp ne i64 %75, 8, !dbg !75 + %77 = select i1 %76, i64 %75, i64 8, !dbg !75 + %78 = select i1 %68, i64 %67, i64 %77, !dbg !75 + call void @rb_set_errinfo(i64 %78), !dbg !75 + %".us" = load i64, i64* @"", align 8, !dbg !75 + %shouldRetry.us = icmp eq i64 %66, %".us", !dbg !75 + %79 = and i1 %61, %shouldRetry.us, !dbg !75 + br i1 %79, label %exception-entry.us, label %exception-ensure, !dbg !75 exception-entry: ; preds = %sorbet_writeLocal.exit, %sorbet_try.exit - %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !86 - %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !86, !tbaa !42 - %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 4, !dbg !86 - %95 = load i64*, i64** %94, align 8, !dbg !86, !tbaa !48 - %96 = load i64, i64* %95, align 8, !dbg !86, !tbaa !14 - %97 = and i64 %96, 8, !dbg !86 - %98 = icmp eq i64 %97, 0, !dbg !86 - br i1 %98, label %99, label %101, !dbg !86, !prof !76 - -99: ; preds = %exception-entry - %100 = getelementptr inbounds i64, i64* %95, i64 -3, !dbg !86 - store i64 8, i64* %100, align 8, !dbg !86, !tbaa !14 - br label %sorbet_writeLocal.exit35, !dbg !86 - -101: ; preds = %exception-entry - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %95, i32 noundef -3, i64 noundef 8) #16, !dbg !86 - br label %sorbet_writeLocal.exit35, !dbg !86 - -sorbet_writeLocal.exit35: ; preds = %99, %101 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #16, !dbg !86 - store i64 52, i64* %0, align 8, !dbg !86, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %29) #16, !dbg !86 - store i64 (i64**, i64*, i64)* @"func_Test.test_nilable_arg$block_1", i64 (i64**, i64*, i64)** %30, align 8, !dbg !86, !tbaa !4 - store i64** %7, i64*** %31, align 8, !dbg !86, !tbaa !10 - store i64* %13, i64** %32, align 8, !dbg !86, !tbaa !11 - store i64 0, i64* %33, align 8, !dbg !86, !tbaa !12 - store i64* %0, i64** %34, align 8, !dbg !86, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !86, !tbaa !14 - call void @rb_set_errinfo(i64 %previousException) #16, !dbg !86 - %102 = load i64, i64* @rb_eException, align 8, !dbg !86, !tbaa !14 - %103 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %36, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %102, i32 0) #16, !dbg !86 - %104 = load i64, i64* %0, align 8, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %29) #16, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #16, !dbg !86 - %isReturnValue = icmp ne i64 %104, 52, !dbg !86 - br i1 %isReturnValue, label %exception-body-return, label %exception-body-continue, !dbg !86 - -exception-body-return: ; preds = %sorbet_writeLocal.exit35, %sorbet_writeLocal.exit35.us - %.lcssa = phi i64 [ %59, %sorbet_writeLocal.exit35.us ], [ %104, %sorbet_writeLocal.exit35 ], !dbg !86 - call void @rb_set_errinfo(i64 %previousException), !dbg !86 - %stackFrame.i40 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_nilable_arg$block_3", align 8 - %105 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 - %106 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %105, i64 0, i32 2 - %107 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %106, align 8, !tbaa !42 - call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %105, %struct.rb_control_frame_struct* %107, %struct.rb_iseq_struct* %stackFrame.i40) #16 - %108 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 0 - %109 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 2 - %110 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %109, align 8, !tbaa !46 - %111 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %110, i64 0, i32 2 - %112 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %111, align 8, !tbaa !49 - %113 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %112, i64 0, i32 2 - %114 = load i64*, i64** %113, align 8, !tbaa !51 - %115 = getelementptr inbounds i64, i64* %114, i64 1 - store i64* %115, i64** %108, align 8, !tbaa !41 + %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !75 + %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !75, !tbaa !41 + %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 4, !dbg !75 + %84 = load i64*, i64** %83, align 8, !dbg !75, !tbaa !47 + %85 = load i64, i64* %84, align 8, !dbg !75, !tbaa !13 + %86 = and i64 %85, 8, !dbg !75 + %87 = icmp eq i64 %86, 0, !dbg !75 + br i1 %87, label %88, label %90, !dbg !75, !prof !65 + +88: ; preds = %exception-entry + %89 = getelementptr inbounds i64, i64* %84, i64 -3, !dbg !75 + store i64 8, i64* %89, align 8, !dbg !75, !tbaa !13 + br label %sorbet_writeLocal.exit28, !dbg !75 + +90: ; preds = %exception-entry + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %84, i32 noundef -3, i64 noundef 8) #16, !dbg !75 + br label %sorbet_writeLocal.exit28, !dbg !75 + +sorbet_writeLocal.exit28: ; preds = %88, %90 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %19) #16, !dbg !75 + store i64 52, i64* %0, align 8, !dbg !75, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %20) #16, !dbg !75 + store i64 (i64**, i64)* @"func_Test.test_nilable_arg$block_1", i64 (i64**, i64)** %21, align 8, !dbg !75, !tbaa !4 + store i64** %7, i64*** %22, align 8, !dbg !75, !tbaa !10 + store i64 0, i64* %23, align 8, !dbg !75, !tbaa !11 + store i64* %0, i64** %24, align 8, !dbg !75, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !75, !tbaa !13 + call void @rb_set_errinfo(i64 %previousException) #16, !dbg !75 + %91 = load i64, i64* @rb_eException, align 8, !dbg !75, !tbaa !13 + %92 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %26, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %91, i32 0) #16, !dbg !75 + %93 = load i64, i64* %0, align 8, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %20) #16, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #16, !dbg !75 + %isReturnValue = icmp ne i64 %93, 52, !dbg !75 + br i1 %isReturnValue, label %exception-body-return, label %exception-body-continue, !dbg !75 + +exception-body-return: ; preds = %sorbet_writeLocal.exit28, %sorbet_writeLocal.exit28.us + %.lcssa = phi i64 [ %48, %sorbet_writeLocal.exit28.us ], [ %93, %sorbet_writeLocal.exit28 ], !dbg !75 + call void @rb_set_errinfo(i64 %previousException), !dbg !75 + %stackFrame.i33 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_nilable_arg$block_3", align 8 + %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 + %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2 + %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !tbaa !41 + call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %94, %struct.rb_control_frame_struct* %96, %struct.rb_iseq_struct* %stackFrame.i33) #16 + %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %97, align 8, !tbaa !40 call void @sorbet_popRubyStack() - ret i64 %.lcssa, !dbg !86 - -exception-body-continue: ; preds = %sorbet_writeLocal.exit35 - %116 = load i64, i64* %exceptionValue, align 8, !dbg !86 - %117 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %118 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %117, i64 0, i32 2, !dbg !86 - %119 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %118, align 8, !dbg !86, !tbaa !42 - %120 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %119, i64 0, i32 4, !dbg !86 - %121 = load i64*, i64** %120, align 8, !dbg !86, !tbaa !48 - %122 = load i64, i64* %121, align 8, !dbg !86, !tbaa !14 - %123 = and i64 %122, 8, !dbg !86 - %124 = icmp eq i64 %123, 0, !dbg !86 - br i1 %124, label %125, label %127, !dbg !86, !prof !76 - -125: ; preds = %exception-body-continue - %126 = getelementptr inbounds i64, i64* %121, i64 -3, !dbg !86 - store i64 %116, i64* %126, align 8, !dbg !86, !tbaa !14 - br label %sorbet_writeLocal.exit36, !dbg !86 - -127: ; preds = %exception-body-continue - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %121, i32 noundef -3, i64 %116) #16, !dbg !86 - br label %sorbet_writeLocal.exit36, !dbg !86 - -sorbet_writeLocal.exit36: ; preds = %125, %127 - %128 = icmp ne i64 %116, 8, !dbg !86 - %handler = select i1 %128, i64 (i64**, i64*, i64)* @"func_Test.test_nilable_arg$block_2", i64 (i64**, i64*, i64)* @"func_Test.test_nilable_arg$block_4", !dbg !86 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %38) #16, !dbg !86 - store i64 52, i64* %2, align 8, !dbg !86, !tbaa !14 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull align 8 %39) #16, !dbg !86 - store i64 (i64**, i64*, i64)* %handler, i64 (i64**, i64*, i64)** %40, align 8, !dbg !86, !tbaa !4 - store i64** %7, i64*** %41, align 8, !dbg !86, !tbaa !10 - store i64* %13, i64** %42, align 8, !dbg !86, !tbaa !11 - store i64 0, i64* %43, align 8, !dbg !86, !tbaa !12 - store i64* %2, i64** %44, align 8, !dbg !86, !tbaa !13 - store i64 8, i64* %exceptionValue, align 8, !dbg !86, !tbaa !14 - %129 = icmp eq i64 %116, 8, !dbg !86 - br i1 %129, label %sorbet_try.exit, label %130, !dbg !86 - -130: ; preds = %sorbet_writeLocal.exit36 - call void @rb_set_errinfo(i64 %116) #16, !dbg !86 - br label %sorbet_try.exit, !dbg !86 - -sorbet_try.exit: ; preds = %sorbet_writeLocal.exit36, %130 - %131 = load i64, i64* @rb_eException, align 8, !dbg !86, !tbaa !14 - %132 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %45, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %37, i64 %131, i32 0) #16, !dbg !86 - %133 = load i64, i64* %2, align 8, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %39) #16, !dbg !86 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %38) #16, !dbg !86 - %134 = load i64, i64* %exceptionValue, align 8, !dbg !86 - %135 = icmp ne i64 %134, 8, !dbg !86 - %136 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %137 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %136, i64 0, i32 2, !dbg !86 - %138 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %137, align 8, !dbg !86, !tbaa !42 - %139 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %138, i64 0, i32 4, !dbg !86 - %140 = load i64*, i64** %139, align 8, !dbg !86, !tbaa !48 - %141 = getelementptr inbounds i64, i64* %140, i64 -3, !dbg !86 - %142 = load i64, i64* %141, align 8, !dbg !86, !tbaa !14 - %143 = icmp ne i64 %142, 8, !dbg !86 - %144 = select i1 %143, i64 %142, i64 %previousException, !dbg !86 - %145 = select i1 %135, i64 %134, i64 %144, !dbg !86 - call void @rb_set_errinfo(i64 %145), !dbg !86 - %"" = load i64, i64* @"", align 8, !dbg !86 - %shouldRetry = icmp eq i64 %133, %"", !dbg !86 - %146 = and i1 %128, %shouldRetry, !dbg !86 - br i1 %146, label %exception-entry, label %exception-ensure, !dbg !86 + ret i64 %.lcssa, !dbg !75 + +exception-body-continue: ; preds = %sorbet_writeLocal.exit28 + %98 = load i64, i64* %exceptionValue, align 8, !dbg !75 + %99 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %100 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %99, i64 0, i32 2, !dbg !75 + %101 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %100, align 8, !dbg !75, !tbaa !41 + %102 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %101, i64 0, i32 4, !dbg !75 + %103 = load i64*, i64** %102, align 8, !dbg !75, !tbaa !47 + %104 = load i64, i64* %103, align 8, !dbg !75, !tbaa !13 + %105 = and i64 %104, 8, !dbg !75 + %106 = icmp eq i64 %105, 0, !dbg !75 + br i1 %106, label %107, label %109, !dbg !75, !prof !65 + +107: ; preds = %exception-body-continue + %108 = getelementptr inbounds i64, i64* %103, i64 -3, !dbg !75 + store i64 %98, i64* %108, align 8, !dbg !75, !tbaa !13 + br label %sorbet_writeLocal.exit29, !dbg !75 + +109: ; preds = %exception-body-continue + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %103, i32 noundef -3, i64 %98) #16, !dbg !75 + br label %sorbet_writeLocal.exit29, !dbg !75 + +sorbet_writeLocal.exit29: ; preds = %107, %109 + %110 = icmp ne i64 %98, 8, !dbg !75 + %handler = select i1 %110, i64 (i64**, i64)* @"func_Test.test_nilable_arg$block_2", i64 (i64**, i64)* @"func_Test.test_nilable_arg$block_4", !dbg !75 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 %28) #16, !dbg !75 + store i64 52, i64* %2, align 8, !dbg !75, !tbaa !13 + call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull align 8 %29) #16, !dbg !75 + store i64 (i64**, i64)* %handler, i64 (i64**, i64)** %30, align 8, !dbg !75, !tbaa !4 + store i64** %7, i64*** %31, align 8, !dbg !75, !tbaa !10 + store i64 0, i64* %32, align 8, !dbg !75, !tbaa !11 + store i64* %2, i64** %33, align 8, !dbg !75, !tbaa !12 + store i64 8, i64* %exceptionValue, align 8, !dbg !75, !tbaa !13 + %111 = icmp eq i64 %98, 8, !dbg !75 + br i1 %111, label %sorbet_try.exit, label %112, !dbg !75 + +112: ; preds = %sorbet_writeLocal.exit29 + call void @rb_set_errinfo(i64 %98) #16, !dbg !75 + br label %sorbet_try.exit, !dbg !75 + +sorbet_try.exit: ; preds = %sorbet_writeLocal.exit29, %112 + %113 = load i64, i64* @rb_eException, align 8, !dbg !75, !tbaa !13 + %114 = call i64 (i64 (i64)*, i64, i64 (i64, i64)*, i64, ...) @rb_rescue2(i64 (i64)* noundef nonnull @sorbet_applyExceptionClosure, i64 noundef %34, i64 (i64, i64)* noundef nonnull @sorbet_rescueStoreException, i64 %27, i64 %113, i32 0) #16, !dbg !75 + %115 = load i64, i64* %2, align 8, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %29) #16, !dbg !75 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %28) #16, !dbg !75 + %116 = load i64, i64* %exceptionValue, align 8, !dbg !75 + %117 = icmp ne i64 %116, 8, !dbg !75 + %118 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %119 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %118, i64 0, i32 2, !dbg !75 + %120 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %119, align 8, !dbg !75, !tbaa !41 + %121 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %120, i64 0, i32 4, !dbg !75 + %122 = load i64*, i64** %121, align 8, !dbg !75, !tbaa !47 + %123 = getelementptr inbounds i64, i64* %122, i64 -3, !dbg !75 + %124 = load i64, i64* %123, align 8, !dbg !75, !tbaa !13 + %125 = icmp ne i64 %124, 8, !dbg !75 + %126 = select i1 %125, i64 %124, i64 %previousException, !dbg !75 + %127 = select i1 %117, i64 %116, i64 %126, !dbg !75 + call void @rb_set_errinfo(i64 %127), !dbg !75 + %"" = load i64, i64* @"", align 8, !dbg !75 + %shouldRetry = icmp eq i64 %115, %"", !dbg !75 + %128 = and i1 %110, %shouldRetry, !dbg !75 + br i1 %128, label %exception-entry, label %exception-ensure, !dbg !75 exception-ensure: ; preds = %sorbet_try.exit, %sorbet_try.exit.us - %.lcssa44 = phi i64 [ %77, %sorbet_try.exit.us ], [ %133, %sorbet_try.exit ], !dbg !86 - %.lcssa43 = phi i64 [ %89, %sorbet_try.exit.us ], [ %145, %sorbet_try.exit ], !dbg !86 + %.lcssa37 = phi i64 [ %66, %sorbet_try.exit.us ], [ %115, %sorbet_try.exit ], !dbg !75 + %.lcssa36 = phi i64 [ %78, %sorbet_try.exit.us ], [ %127, %sorbet_try.exit ], !dbg !75 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_nilable_arg$block_3", align 8 - %147 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 - %148 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %147, i64 0, i32 2 - %149 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %148, align 8, !tbaa !42 - call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %147, %struct.rb_control_frame_struct* %149, %struct.rb_iseq_struct* %stackFrame.i) #16 - %150 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %149, i64 0, i32 0 - %151 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %149, i64 0, i32 2 - %152 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %151, align 8, !tbaa !46 - %153 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %152, i64 0, i32 2 - %154 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %153, align 8, !tbaa !49 - %155 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %154, i64 0, i32 2 - %156 = load i64*, i64** %155, align 8, !tbaa !51 - %157 = getelementptr inbounds i64, i64* %156, i64 1 - store i64* %157, i64** %150, align 8, !tbaa !41 + %129 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 + %130 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %129, i64 0, i32 2 + %131 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %130, align 8, !tbaa !41 + call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %129, %struct.rb_control_frame_struct* %131, %struct.rb_iseq_struct* %stackFrame.i) #16 + %132 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %131, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %132, align 8, !tbaa !40 call void @sorbet_popRubyStack() - %isReturnValue17 = icmp ne i64 %.lcssa44, 52, !dbg !86 - br i1 %isReturnValue17, label %exception-return, label %exception-continue, !dbg !86 + %isReturnValue17 = icmp ne i64 %.lcssa37, 52, !dbg !75 + br i1 %isReturnValue17, label %exception-return, label %exception-continue, !dbg !75 exception-continue: ; preds = %exception-ensure - %158 = icmp eq i64 %.lcssa43, 8, !dbg !86 - br i1 %158, label %sorbet_raiseIfNotNil.exit37, label %159, !dbg !86 - -159: ; preds = %exception-continue - call void @rb_exc_raise(i64 %.lcssa43) #17, !dbg !86 - unreachable, !dbg !86 - -sorbet_raiseIfNotNil.exit37: ; preds = %exception-continue - %160 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !86, !tbaa !41 - %161 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %160, i64 0, i32 2, !dbg !86 - %162 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %161, align 8, !dbg !86, !tbaa !42 - %163 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %162, i64 0, i32 4, !dbg !86 - %164 = load i64*, i64** %163, align 8, !dbg !86, !tbaa !48 - %165 = getelementptr inbounds i64, i64* %164, i64 -3, !dbg !86 - %166 = load i64, i64* %165, align 8, !dbg !86, !tbaa !14 - %167 = icmp eq i64 %166, 8, !dbg !86 - br i1 %167, label %sorbet_raiseIfNotNil.exit, label %168, !dbg !86 - -168: ; preds = %sorbet_raiseIfNotNil.exit37 - call void @rb_exc_raise(i64 %166) #17, !dbg !86 - unreachable, !dbg !86 - -sorbet_raiseIfNotNil.exit: ; preds = %sorbet_raiseIfNotNil.exit37 - %169 = getelementptr inbounds i64, i64* %13, i64 7 - %170 = getelementptr inbounds i64, i64* %169, i64 1 - store i64* %170, i64** %7, align 8, !tbaa !41 - %171 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !90, !tbaa !41 - %172 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %171, i64 0, i32 2, !dbg !90 - %173 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %172, align 8, !dbg !90, !tbaa !42 - %174 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %173, i64 0, i32 4, !dbg !90 - %175 = load i64*, i64** %174, align 8, !dbg !90, !tbaa !48 - %176 = getelementptr inbounds i64, i64* %175, i64 -6, !dbg !90 - %177 = load i64, i64* %176, align 8, !dbg !90, !tbaa !14 - ret i64 %177 + %133 = icmp eq i64 %.lcssa36, 8, !dbg !75 + br i1 %133, label %sorbet_raiseIfNotNil.exit30, label %134, !dbg !75 + +134: ; preds = %exception-continue + call void @rb_exc_raise(i64 %.lcssa36) #17, !dbg !75 + unreachable, !dbg !75 + +sorbet_raiseIfNotNil.exit30: ; preds = %exception-continue + %135 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !75, !tbaa !40 + %136 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %135, i64 0, i32 2, !dbg !75 + %137 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %136, align 8, !dbg !75, !tbaa !41 + %138 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %137, i64 0, i32 4, !dbg !75 + %139 = load i64*, i64** %138, align 8, !dbg !75, !tbaa !47 + %140 = getelementptr inbounds i64, i64* %139, i64 -3, !dbg !75 + %141 = load i64, i64* %140, align 8, !dbg !75, !tbaa !13 + %142 = icmp eq i64 %141, 8, !dbg !75 + br i1 %142, label %sorbet_raiseIfNotNil.exit, label %143, !dbg !75 + +143: ; preds = %sorbet_raiseIfNotNil.exit30 + call void @rb_exc_raise(i64 %141) #17, !dbg !75 + unreachable, !dbg !75 + +sorbet_raiseIfNotNil.exit: ; preds = %sorbet_raiseIfNotNil.exit30 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 21), i64** %7, align 8, !tbaa !40 + %144 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !79, !tbaa !40 + %145 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %144, i64 0, i32 2, !dbg !79 + %146 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %145, align 8, !dbg !79, !tbaa !41 + %147 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %146, i64 0, i32 4, !dbg !79 + %148 = load i64*, i64** %147, align 8, !dbg !79, !tbaa !47 + %149 = getelementptr inbounds i64, i64* %148, i64 -6, !dbg !79 + %150 = load i64, i64* %149, align 8, !dbg !79, !tbaa !13 + ret i64 %150 exception-return: ; preds = %exception-ensure - ret i64 %.lcssa44, !dbg !86 + ret i64 %.lcssa37, !dbg !75 } ; Function Attrs: ssp -define internal noundef i64 @"func_Test.test_nilable_arg$block_1"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64* %iseq_encoded, i64 %localsOffset) #10 !dbg !33 { +define internal noundef i64 @"func_Test.test_nilable_arg$block_1"(i64** nocapture nonnull writeonly align 8 dereferenceable(8) %pc, i64 %localsOffset) #10 !dbg !32 { fastSymCallIntrinsic_T_must: %callArgs = alloca [3 x i64], align 8 - %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 - %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !42 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !41 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 3 - %4 = load i64, i64* %3, align 8, !tbaa !81 - %5 = getelementptr inbounds i64, i64* %iseq_encoded, i64 2 - %6 = getelementptr inbounds i64, i64* %5, i64 1 - store i64* %6, i64** %pc, align 8, !tbaa !41 - %7 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !32, !tbaa !41 - %8 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %7, i64 0, i32 2, !dbg !32 - %9 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %8, align 8, !dbg !32, !tbaa !42 - %10 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %9, i64 0, i32 4, !dbg !32 - %11 = load i64*, i64** %10, align 8, !dbg !32, !tbaa !48 - %12 = getelementptr inbounds i64, i64* %11, i64 -4, !dbg !32 - %13 = load i64, i64* %12, align 8, !dbg !32, !tbaa !14 - %callArgs0Addr = getelementptr [3 x i64], [3 x i64]* %callArgs, i32 0, i64 0, !dbg !32 - store i64 %13, i64* %callArgs0Addr, align 8, !dbg !32 - %14 = getelementptr [3 x i64], [3 x i64]* %callArgs, i64 0, i64 0, !dbg !32 - tail call void @llvm.experimental.noalias.scope.decl(metadata !91), !dbg !32 - %15 = load i64, i64* %14, align 8, !dbg !32, !tbaa !14, !alias.scope !91 - %16 = icmp eq i64 %15, 8, !dbg !32 - br i1 %16, label %44, label %afterSend, !dbg !32, !prof !74 + %4 = load i64, i64* %3, align 8, !tbaa !70 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %pc, align 8, !tbaa !40 + %5 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !31, !tbaa !40 + %6 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %5, i64 0, i32 2, !dbg !31 + %7 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %6, align 8, !dbg !31, !tbaa !41 + %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %7, i64 0, i32 4, !dbg !31 + %9 = load i64*, i64** %8, align 8, !dbg !31, !tbaa !47 + %10 = getelementptr inbounds i64, i64* %9, i64 -4, !dbg !31 + %11 = load i64, i64* %10, align 8, !dbg !31, !tbaa !13 + %callArgs0Addr = getelementptr [3 x i64], [3 x i64]* %callArgs, i32 0, i64 0, !dbg !31 + store i64 %11, i64* %callArgs0Addr, align 8, !dbg !31 + %12 = getelementptr [3 x i64], [3 x i64]* %callArgs, i64 0, i64 0, !dbg !31 + tail call void @llvm.experimental.noalias.scope.decl(metadata !80), !dbg !31 + %13 = load i64, i64* %12, align 8, !dbg !31, !tbaa !13, !alias.scope !80 + %14 = icmp eq i64 %13, 8, !dbg !31 + br i1 %14, label %40, label %afterSend, !dbg !31, !prof !63 afterSend: ; preds = %fastSymCallIntrinsic_T_must - %17 = getelementptr inbounds i64, i64* %iseq_encoded, i64 3, !dbg !32 - %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !32 - store i64* %18, i64** %pc, align 8, !dbg !32, !tbaa !41 - %"rubyStr_ wasn't nil" = load i64, i64* @"rubyStrFrozen_ wasn't nil", align 8, !dbg !94 - %19 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !95, !tbaa !41 - %20 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %19, i64 0, i32 2, !dbg !95 - %21 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %20, align 8, !dbg !95, !tbaa !42 - %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 4, !dbg !95 - %23 = load i64*, i64** %22, align 8, !dbg !95, !tbaa !48 - %24 = getelementptr inbounds i64, i64* %23, i64 -4, !dbg !95 - %25 = load i64, i64* %24, align 8, !dbg !95, !tbaa !14 - store i64 %25, i64* %callArgs0Addr, align 8, !dbg !95 - %callArgs1Addr = getelementptr [3 x i64], [3 x i64]* %callArgs, i32 0, i64 1, !dbg !95 - store i64 %"rubyStr_ wasn't nil", i64* %callArgs1Addr, align 8, !dbg !95 - %"rubyId_" = load i64, i64* @"rubyIdPrecomputed_", align 8, !dbg !95 - %rawSendResult14 = call i64 @sorbet_stringInterpolate(i64 noundef 8, i64 %"rubyId_", i32 noundef 2, i64* noundef nonnull %14, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0), !dbg !95 - %26 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !41 - %27 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %26, i64 0, i32 2, !dbg !35 - %28 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %27, align 8, !dbg !35, !tbaa !42 - %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 1, !dbg !35 - %30 = load i64*, i64** %29, align 8, !dbg !35, !tbaa !71 - %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !35 - store i64 %4, i64* %30, align 8, !dbg !35, !tbaa !14 - %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !35 - store i64* %32, i64** %29, align 8, !dbg !35, !tbaa !71 - store i64 %rawSendResult14, i64* %31, align 8, !dbg !35, !tbaa !14 - %send20 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 0), !dbg !35 - %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !41 - %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2, !dbg !35 - %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !dbg !35, !tbaa !42 - %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 4, !dbg !35 - %37 = load i64*, i64** %36, align 8, !dbg !35, !tbaa !48 - %38 = load i64, i64* %37, align 8, !dbg !35, !tbaa !14 - %39 = and i64 %38, 8, !dbg !35 - %40 = icmp eq i64 %39, 0, !dbg !35 - br i1 %40, label %41, label %43, !dbg !35, !prof !76 - -41: ; preds = %afterSend - %42 = getelementptr inbounds i64, i64* %37, i64 -6, !dbg !35 - store i64 %send20, i64* %42, align 8, !dbg !35, !tbaa !14 - br label %sorbet_writeLocal.exit, !dbg !35 - -43: ; preds = %afterSend - call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %37, i32 noundef -6, i64 %send20) #16, !dbg !35 - br label %sorbet_writeLocal.exit, !dbg !35 - -sorbet_writeLocal.exit: ; preds = %41, %43 - store i64* %6, i64** %pc, align 8, !dbg !35, !tbaa !41 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 17), i64** %pc, align 8, !dbg !31, !tbaa !40 + %"rubyStr_ wasn't nil" = load i64, i64* @"rubyStrFrozen_ wasn't nil", align 8, !dbg !83 + %15 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !84, !tbaa !40 + %16 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %15, i64 0, i32 2, !dbg !84 + %17 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %16, align 8, !dbg !84, !tbaa !41 + %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 4, !dbg !84 + %19 = load i64*, i64** %18, align 8, !dbg !84, !tbaa !47 + %20 = getelementptr inbounds i64, i64* %19, i64 -4, !dbg !84 + %21 = load i64, i64* %20, align 8, !dbg !84, !tbaa !13 + store i64 %21, i64* %callArgs0Addr, align 8, !dbg !84 + %callArgs1Addr = getelementptr [3 x i64], [3 x i64]* %callArgs, i32 0, i64 1, !dbg !84 + store i64 %"rubyStr_ wasn't nil", i64* %callArgs1Addr, align 8, !dbg !84 + %"rubyId_" = load i64, i64* @"rubyIdPrecomputed_", align 8, !dbg !84 + %rawSendResult14 = call i64 @sorbet_stringInterpolate(i64 noundef 8, i64 %"rubyId_", i32 noundef 2, i64* noundef nonnull %12, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0), !dbg !84 + %22 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !40 + %23 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %22, i64 0, i32 2, !dbg !34 + %24 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %23, align 8, !dbg !34, !tbaa !41 + %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 1, !dbg !34 + %26 = load i64*, i64** %25, align 8, !dbg !34, !tbaa !60 + %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !34 + store i64 %4, i64* %26, align 8, !dbg !34, !tbaa !13 + %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !34 + store i64* %28, i64** %25, align 8, !dbg !34, !tbaa !60 + store i64 %rawSendResult14, i64* %27, align 8, !dbg !34, !tbaa !13 + %send20 = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 0), !dbg !34 + %29 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !40 + %30 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %29, i64 0, i32 2, !dbg !34 + %31 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %30, align 8, !dbg !34, !tbaa !41 + %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %31, i64 0, i32 4, !dbg !34 + %33 = load i64*, i64** %32, align 8, !dbg !34, !tbaa !47 + %34 = load i64, i64* %33, align 8, !dbg !34, !tbaa !13 + %35 = and i64 %34, 8, !dbg !34 + %36 = icmp eq i64 %35, 0, !dbg !34 + br i1 %36, label %37, label %39, !dbg !34, !prof !65 + +37: ; preds = %afterSend + %38 = getelementptr inbounds i64, i64* %33, i64 -6, !dbg !34 + store i64 %send20, i64* %38, align 8, !dbg !34, !tbaa !13 + br label %sorbet_writeLocal.exit, !dbg !34 + +39: ; preds = %afterSend + call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %33, i32 noundef -6, i64 %send20) #16, !dbg !34 + br label %sorbet_writeLocal.exit, !dbg !34 + +sorbet_writeLocal.exit: ; preds = %37, %39 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %pc, align 8, !dbg !34, !tbaa !40 ret i64 52 -44: ; preds = %fastSymCallIntrinsic_T_must - %45 = load i64, i64* @rb_eTypeError, align 8, !dbg !32, !tbaa !14, !noalias !91 - tail call void (i64, i8*, ...) @rb_raise(i64 %45, i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @.str.2, i64 0, i64 0)) #17, !dbg !32, !noalias !91 - unreachable, !dbg !32 +40: ; preds = %fastSymCallIntrinsic_T_must + %41 = load i64, i64* @rb_eTypeError, align 8, !dbg !31, !tbaa !13, !noalias !80 + tail call void (i64, i8*, ...) @rb_raise(i64 %41, i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @.str.2, i64 0, i64 0)) #17, !dbg !31, !noalias !80 + unreachable, !dbg !31 } ; Function Attrs: ssp -define internal noundef i64 @"func_Test.test_nilable_arg$block_2"(i64** nocapture nofree readnone %pc, i64* nocapture nofree readnone %iseq_encoded, i64 %localsOffset) #10 !dbg !37 { -vm_get_ep.exit34: - %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !41 +define internal noundef i64 @"func_Test.test_nilable_arg$block_2"(i64** nocapture nofree readnone %pc, i64 %localsOffset) #10 !dbg !36 { +vm_get_ep.exit30: + %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !40 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 - %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !42 + %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !41 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 3 - %4 = load i64, i64* %3, align 8, !tbaa !81 + %4 = load i64, i64* %3, align 8, !tbaa !70 %stackFrame = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Test.test_nilable_arg$block_2", align 8 tail call void @sorbet_setExceptionStackFrame(%struct.rb_execution_context_struct* %0, %struct.rb_control_frame_struct* %2, %struct.rb_iseq_struct* %stackFrame) #16 %5 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %6 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %7 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %6, align 8, !tbaa !46 - %8 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %7, i64 0, i32 2 - %9 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %8, align 8, !tbaa !49 - %10 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %9, i64 0, i32 2 - %11 = load i64*, i64** %10, align 8, !tbaa !51 - %12 = getelementptr inbounds i64, i64* %11, i64 4 - %13 = getelementptr inbounds i64, i64* %12, i64 1 - store i64* %13, i64** %5, align 8, !tbaa !41 - %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !36, !tbaa !41 - %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2, !dbg !36 - %16 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %15, align 8, !dbg !36, !tbaa !42 - %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 4, !dbg !36 - %18 = load i64*, i64** %17, align 8, !dbg !36 - %19 = getelementptr inbounds i64, i64* %18, i64 -1, !dbg !36 - %20 = load i64, i64* %19, align 8, !dbg !36, !tbaa !14 - %21 = and i64 %20, -4, !dbg !36 - %22 = inttoptr i64 %21 to i64*, !dbg !36 - %23 = getelementptr inbounds i64, i64* %22, i64 -3, !dbg !36 - %24 = load i64, i64* %23, align 8, !dbg !36, !tbaa !14 - %25 = load i64, i64* @rb_eStandardError, align 8, !dbg !36 - %26 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 1, !dbg !36 - %27 = load i64*, i64** %26, align 8, !dbg !36, !tbaa !71 - %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !36 - store i64 %24, i64* %27, align 8, !dbg !36, !tbaa !14 - %29 = getelementptr inbounds i64, i64* %28, i64 1, !dbg !36 - store i64* %29, i64** %26, align 8, !dbg !36, !tbaa !71 - store i64 %25, i64* %28, align 8, !dbg !36, !tbaa !14 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_is_a?.5", i64 0), !dbg !36 - %30 = and i64 %send, -9, !dbg !36 - %31 = icmp ne i64 %30, 0, !dbg !36 - br i1 %31, label %vm_get_ep.exit32, label %vm_get_ep.exit, !dbg !36 - -blockExit: ; preds = %87, %85, %70, %68 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %5, align 8, !tbaa !40 + %6 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !35, !tbaa !40 + %7 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %6, i64 0, i32 2, !dbg !35 + %8 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %7, align 8, !dbg !35, !tbaa !41 + %9 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %8, i64 0, i32 4, !dbg !35 + %10 = load i64*, i64** %9, align 8, !dbg !35 + %11 = getelementptr inbounds i64, i64* %10, i64 -1, !dbg !35 + %12 = load i64, i64* %11, align 8, !dbg !35, !tbaa !13 + %13 = and i64 %12, -4, !dbg !35 + %14 = inttoptr i64 %13 to i64*, !dbg !35 + %15 = getelementptr inbounds i64, i64* %14, i64 -3, !dbg !35 + %16 = load i64, i64* %15, align 8, !dbg !35, !tbaa !13 + %17 = load i64, i64* @rb_eStandardError, align 8, !dbg !35 + %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %8, i64 0, i32 1, !dbg !35 + %19 = load i64*, i64** %18, align 8, !dbg !35, !tbaa !60 + %20 = getelementptr inbounds i64, i64* %19, i64 1, !dbg !35 + store i64 %16, i64* %19, align 8, !dbg !35, !tbaa !13 + %21 = getelementptr inbounds i64, i64* %20, i64 1, !dbg !35 + store i64* %21, i64** %18, align 8, !dbg !35, !tbaa !60 + store i64 %17, i64* %20, align 8, !dbg !35, !tbaa !13 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_is_a?.5", i64 0), !dbg !35 + %22 = and i64 %send, -9, !dbg !35 + %23 = icmp ne i64 %22, 0, !dbg !35 + br i1 %23, label %vm_get_ep.exit28, label %vm_get_ep.exit, !dbg !35 + +blockExit: ; preds = %75, %73, %60, %58 tail call void @sorbet_popRubyStack() ret i64 52 -vm_get_ep.exit32: ; preds = %vm_get_ep.exit34 - %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !96, !tbaa !41 - %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2, !dbg !96 - %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !dbg !96, !tbaa !42 - %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 4, !dbg !96 - %36 = load i64*, i64** %35, align 8, !dbg !96 - %37 = getelementptr inbounds i64, i64* %36, i64 -1, !dbg !96 - %38 = load i64, i64* %37, align 8, !dbg !96, !tbaa !14 - %39 = and i64 %38, -4, !dbg !96 - %40 = inttoptr i64 %39 to i64*, !dbg !96 - %41 = load i64, i64* %40, align 8, !dbg !96, !tbaa !14 - %42 = and i64 %41, 8, !dbg !96 - %43 = icmp eq i64 %42, 0, !dbg !96 - br i1 %43, label %44, label %46, !dbg !96, !prof !76 - -44: ; preds = %vm_get_ep.exit32 - %45 = getelementptr inbounds i64, i64* %40, i64 -3, !dbg !96 - store i64 8, i64* %45, align 8, !dbg !96, !tbaa !14 - br label %vm_get_ep.exit30, !dbg !96 - -46: ; preds = %vm_get_ep.exit32 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %40, i32 noundef -3, i64 noundef 8) #16, !dbg !96 - br label %vm_get_ep.exit30, !dbg !96 - -vm_get_ep.exit30: ; preds = %44, %46 - %47 = getelementptr inbounds i64, i64* %11, i64 5, !dbg !97 - %48 = getelementptr inbounds i64, i64* %47, i64 1, !dbg !97 - store i64* %48, i64** %5, align 8, !dbg !97, !tbaa !41 - %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !38, !tbaa !41 - %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2, !dbg !38 - %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !dbg !38, !tbaa !42 - %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 1, !dbg !38 - %53 = load i64*, i64** %52, align 8, !dbg !38, !tbaa !71 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !38 - store i64 %4, i64* %53, align 8, !dbg !38, !tbaa !14 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !38 - store i64* %55, i64** %52, align 8, !dbg !38, !tbaa !71 - store i64 %24, i64* %54, align 8, !dbg !38, !tbaa !14 - %send16 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0), !dbg !38 - %56 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !38, !tbaa !41 - %57 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %56, i64 0, i32 2, !dbg !38 - %58 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %57, align 8, !dbg !38, !tbaa !42 - %59 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %58, i64 0, i32 4, !dbg !38 - %60 = load i64*, i64** %59, align 8, !dbg !38 - %61 = getelementptr inbounds i64, i64* %60, i64 -1, !dbg !38 - %62 = load i64, i64* %61, align 8, !dbg !38, !tbaa !14 - %63 = and i64 %62, -4, !dbg !38 - %64 = inttoptr i64 %63 to i64*, !dbg !38 - %65 = load i64, i64* %64, align 8, !dbg !38, !tbaa !14 - %66 = and i64 %65, 8, !dbg !38 - %67 = icmp eq i64 %66, 0, !dbg !38 - br i1 %67, label %68, label %70, !dbg !38, !prof !76 - -68: ; preds = %vm_get_ep.exit30 - %69 = getelementptr inbounds i64, i64* %64, i64 -6, !dbg !38 - store i64 %send16, i64* %69, align 8, !dbg !38, !tbaa !14 - br label %blockExit, !dbg !38 - -70: ; preds = %vm_get_ep.exit30 - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %64, i32 noundef -6, i64 %send16) #16, !dbg !38 - br label %blockExit, !dbg !38 - -vm_get_ep.exit: ; preds = %vm_get_ep.exit34 - %71 = getelementptr inbounds i64, i64* %11, i64 2 - %72 = getelementptr inbounds i64, i64* %71, i64 1 - store i64* %72, i64** %5, align 8, !tbaa !41 - %73 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !98, !tbaa !41 - %74 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %73, i64 0, i32 2, !dbg !98 - %75 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %74, align 8, !dbg !98, !tbaa !42 - %76 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %75, i64 0, i32 4, !dbg !98 - %77 = load i64*, i64** %76, align 8, !dbg !98 - %78 = getelementptr inbounds i64, i64* %77, i64 -1, !dbg !98 - %79 = load i64, i64* %78, align 8, !dbg !98, !tbaa !14 - %80 = and i64 %79, -4, !dbg !98 - %81 = inttoptr i64 %80 to i64*, !dbg !98 - %82 = load i64, i64* %81, align 8, !dbg !98, !tbaa !14 - %83 = and i64 %82, 8, !dbg !98 - %84 = icmp eq i64 %83, 0, !dbg !98 - br i1 %84, label %85, label %87, !dbg !98, !prof !76 - -85: ; preds = %vm_get_ep.exit - %86 = getelementptr inbounds i64, i64* %81, i64 -7, !dbg !98 - store i64 20, i64* %86, align 8, !dbg !98, !tbaa !14 - br label %blockExit, !dbg !98 - -87: ; preds = %vm_get_ep.exit - tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %81, i32 noundef -7, i64 noundef 20) #16, !dbg !98 - br label %blockExit, !dbg !98 +vm_get_ep.exit28: ; preds = %vm_get_ep.exit30 + %24 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !85, !tbaa !40 + %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2, !dbg !85 + %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !dbg !85, !tbaa !41 + %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4, !dbg !85 + %28 = load i64*, i64** %27, align 8, !dbg !85 + %29 = getelementptr inbounds i64, i64* %28, i64 -1, !dbg !85 + %30 = load i64, i64* %29, align 8, !dbg !85, !tbaa !13 + %31 = and i64 %30, -4, !dbg !85 + %32 = inttoptr i64 %31 to i64*, !dbg !85 + %33 = load i64, i64* %32, align 8, !dbg !85, !tbaa !13 + %34 = and i64 %33, 8, !dbg !85 + %35 = icmp eq i64 %34, 0, !dbg !85 + br i1 %35, label %36, label %38, !dbg !85, !prof !65 + +36: ; preds = %vm_get_ep.exit28 + %37 = getelementptr inbounds i64, i64* %32, i64 -3, !dbg !85 + store i64 8, i64* %37, align 8, !dbg !85, !tbaa !13 + br label %vm_get_ep.exit26, !dbg !85 + +38: ; preds = %vm_get_ep.exit28 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %32, i32 noundef -3, i64 noundef 8) #16, !dbg !85 + br label %vm_get_ep.exit26, !dbg !85 + +vm_get_ep.exit26: ; preds = %36, %38 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %5, align 8, !dbg !86, !tbaa !40 + %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !40 + %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2, !dbg !37 + %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !dbg !37, !tbaa !41 + %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 1, !dbg !37 + %43 = load i64*, i64** %42, align 8, !dbg !37, !tbaa !60 + %44 = getelementptr inbounds i64, i64* %43, i64 1, !dbg !37 + store i64 %4, i64* %43, align 8, !dbg !37, !tbaa !13 + %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !37 + store i64* %45, i64** %42, align 8, !dbg !37, !tbaa !60 + store i64 %16, i64* %44, align 8, !dbg !37, !tbaa !13 + %send16 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0), !dbg !37 + %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !40 + %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !37 + %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !37, !tbaa !41 + %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 4, !dbg !37 + %50 = load i64*, i64** %49, align 8, !dbg !37 + %51 = getelementptr inbounds i64, i64* %50, i64 -1, !dbg !37 + %52 = load i64, i64* %51, align 8, !dbg !37, !tbaa !13 + %53 = and i64 %52, -4, !dbg !37 + %54 = inttoptr i64 %53 to i64*, !dbg !37 + %55 = load i64, i64* %54, align 8, !dbg !37, !tbaa !13 + %56 = and i64 %55, 8, !dbg !37 + %57 = icmp eq i64 %56, 0, !dbg !37 + br i1 %57, label %58, label %60, !dbg !37, !prof !65 + +58: ; preds = %vm_get_ep.exit26 + %59 = getelementptr inbounds i64, i64* %54, i64 -6, !dbg !37 + store i64 %send16, i64* %59, align 8, !dbg !37, !tbaa !13 + br label %blockExit, !dbg !37 + +60: ; preds = %vm_get_ep.exit26 + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %54, i32 noundef -6, i64 %send16) #16, !dbg !37 + br label %blockExit, !dbg !37 + +vm_get_ep.exit: ; preds = %vm_get_ep.exit30 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %5, align 8, !tbaa !40 + %61 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !87, !tbaa !40 + %62 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %61, i64 0, i32 2, !dbg !87 + %63 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %62, align 8, !dbg !87, !tbaa !41 + %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %63, i64 0, i32 4, !dbg !87 + %65 = load i64*, i64** %64, align 8, !dbg !87 + %66 = getelementptr inbounds i64, i64* %65, i64 -1, !dbg !87 + %67 = load i64, i64* %66, align 8, !dbg !87, !tbaa !13 + %68 = and i64 %67, -4, !dbg !87 + %69 = inttoptr i64 %68 to i64*, !dbg !87 + %70 = load i64, i64* %69, align 8, !dbg !87, !tbaa !13 + %71 = and i64 %70, 8, !dbg !87 + %72 = icmp eq i64 %71, 0, !dbg !87 + br i1 %72, label %73, label %75, !dbg !87, !prof !65 + +73: ; preds = %vm_get_ep.exit + %74 = getelementptr inbounds i64, i64* %69, i64 -7, !dbg !87 + store i64 20, i64* %74, align 8, !dbg !87, !tbaa !13 + br label %blockExit, !dbg !87 + +75: ; preds = %vm_get_ep.exit + tail call void @sorbet_vm_env_write_slowpath(i64* nonnull align 8 dereferenceable(8) %69, i32 noundef -7, i64 noundef 20) #16, !dbg !87 + br label %blockExit, !dbg !87 +} + +; Function Attrs: argmemonly nofree norecurse nosync nounwind ssp willreturn writeonly +define internal noundef i64 @"func_Test.test_nilable_arg$block_4"(i64** nocapture nofree nonnull writeonly align 8 dereferenceable(8) %pc, i64 %localsOffset) #11 !dbg !88 { +functionEntryInitializers: + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %pc, align 8, !tbaa !40 + ret i64 52 } ; Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly @@ -1705,13 +1601,6 @@ declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) ; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn declare void @llvm.experimental.noalias.scope.decl(metadata) #13 -; Function Attrs: argmemonly nofree norecurse nosync nounwind ssp willreturn writeonly -define internal noundef i64 @"func_Test.test_nilable_arg$block_4"(i64** nocapture nofree nonnull writeonly align 8 dereferenceable(8) %0, i64* nofree writeonly %1, i64 %2) #11 { - %4 = getelementptr inbounds i64, i64* %1, i64 1 - store i64* %4, i64** %0, align 8, !tbaa !41 - ret i64 52 -} - ; Function Attrs: nofree nosync nounwind willreturn declare void @llvm.assume(i1 noundef) #14 @@ -1719,7 +1608,7 @@ declare void @llvm.assume(i1 noundef) #14 define linkonce void @const_recompute_Test() local_unnamed_addr #10 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @str_Test, i64 0, i64 0), i64 4) store i64 %1, i64* @guarded_const_Test, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !64 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !52 store i64 %2, i64* @guard_epoch_Test, align 8 ret void } @@ -1751,97 +1640,87 @@ attributes #17 = { noreturn nounwind } !2 = !DIFile(filename: "test/testdata/compiler/intrinsics/t_must.rb", directory: ".") !3 = !{} !4 = !{!5, !6, i64 0} -!5 = !{!"ExceptionClosure", !6, i64 0, !6, i64 8, !6, i64 16, !9, i64 24, !6, i64 32} +!5 = !{!"ExceptionClosure", !6, i64 0, !6, i64 8, !9, i64 16, !6, i64 24} !6 = !{!"any pointer", !7, i64 0} !7 = !{!"omnipotent char", !8, i64 0} !8 = !{!"Simple C/C++ TBAA"} !9 = !{!"long", !7, i64 0} !10 = !{!5, !6, i64 8} -!11 = !{!5, !6, i64 16} -!12 = !{!5, !9, i64 24} -!13 = !{!5, !6, i64 32} -!14 = !{!9, !9, i64 0} -!15 = !DILocation(line: 14, column: 3, scope: !16, inlinedAt: !20) -!16 = distinct !DISubprogram(name: "Test.", linkageName: "func_Test.L62", scope: null, file: !2, line: 5, type: !17, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!17 = !DISubroutineType(types: !18) -!18 = !{!19} -!19 = !DIBasicType(name: "VALUE", size: 64, encoding: DW_ATE_signed) -!20 = distinct !DILocation(line: 5, column: 1, scope: !21) -!21 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !17, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!22 = !DILocation(line: 24, column: 1, scope: !21) -!23 = !DILocation(line: 25, column: 1, scope: !21) -!24 = !DILocation(line: 26, column: 1, scope: !21) -!25 = !DILocation(line: 27, column: 1, scope: !21) -!26 = !DILocation(line: 8, column: 7, scope: !27) -!27 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil$block_1", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!28 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil", scope: null, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!29 = !DILocation(line: 9, column: 15, scope: !30) -!30 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil$block_2", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!31 = !DILocation(line: 10, column: 7, scope: !30) -!32 = !DILocation(line: 16, column: 7, scope: !33) -!33 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg$block_1", scope: !34, file: !2, line: 14, type: !17, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!34 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg", scope: null, file: !2, line: 14, type: !17, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!35 = !DILocation(line: 17, column: 7, scope: !33) -!36 = !DILocation(line: 18, column: 15, scope: !37) -!37 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg$block_2", scope: !34, file: !2, line: 14, type: !17, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!38 = !DILocation(line: 19, column: 7, scope: !37) -!39 = !DILocation(line: 6, column: 3, scope: !16) -!40 = !DILocation(line: 14, column: 3, scope: !16) -!41 = !{!6, !6, i64 0} -!42 = !{!43, !6, i64 16} -!43 = !{!"rb_execution_context_struct", !6, i64 0, !9, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !44, i64 40, !44, i64 44, !6, i64 48, !6, i64 56, !6, i64 64, !9, i64 72, !9, i64 80, !6, i64 88, !9, i64 96, !6, i64 104, !6, i64 112, !9, i64 120, !9, i64 128, !7, i64 136, !7, i64 137, !9, i64 144, !45, i64 152} -!44 = !{!"int", !7, i64 0} -!45 = !{!"", !6, i64 0, !6, i64 8, !9, i64 16, !7, i64 24} -!46 = !{!47, !6, i64 16} -!47 = !{!"rb_control_frame_struct", !6, i64 0, !6, i64 8, !6, i64 16, !9, i64 24, !6, i64 32, !6, i64 40, !6, i64 48} -!48 = !{!47, !6, i64 32} -!49 = !{!50, !6, i64 16} -!50 = !{!"rb_iseq_struct", !9, i64 0, !9, i64 8, !6, i64 16, !7, i64 24} -!51 = !{!52, !6, i64 8} -!52 = !{!"rb_iseq_constant_body", !7, i64 0, !44, i64 4, !6, i64 8, !53, i64 16, !55, i64 64, !58, i64 120, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !59, i64 200, !44, i64 232, !44, i64 236, !44, i64 240, !44, i64 244, !44, i64 248, !7, i64 252, !9, i64 256} -!53 = !{!"", !54, i64 0, !44, i64 4, !44, i64 8, !44, i64 12, !44, i64 16, !44, i64 20, !44, i64 24, !44, i64 28, !6, i64 32, !6, i64 40} -!54 = !{!"", !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 0, !44, i64 1, !44, i64 1} -!55 = !{!"rb_iseq_location_struct", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !44, i64 32, !56, i64 36} -!56 = !{!"rb_code_location_struct", !57, i64 0, !57, i64 8} -!57 = !{!"rb_code_position_struct", !44, i64 0, !44, i64 4} -!58 = !{!"iseq_insn_info", !6, i64 0, !6, i64 8, !44, i64 16, !6, i64 24} -!59 = !{!"", !9, i64 0, !9, i64 8, !9, i64 16, !6, i64 24} -!60 = !DILocation(line: 0, scope: !21) -!61 = !DILocation(line: 5, column: 1, scope: !21) -!62 = !DILocation(line: 0, scope: !16, inlinedAt: !20) -!63 = !DILocation(line: 6, column: 3, scope: !16, inlinedAt: !20) -!64 = !{!65, !65, i64 0} -!65 = !{!"long long", !7, i64 0} -!66 = !{!"branch_weights", i32 1, i32 10000} -!67 = !{!68, !44, i64 8} -!68 = !{!"rb_sorbet_param_struct", !54, i64 0, !44, i64 4, !44, i64 8, !44, i64 12, !44, i64 16, !44, i64 20, !44, i64 24, !44, i64 28, !6, i64 32, !44, i64 40, !44, i64 44, !44, i64 48, !44, i64 52, !6, i64 56} -!69 = !{!68, !44, i64 4} -!70 = !{!68, !6, i64 32} -!71 = !{!47, !6, i64 8} -!72 = !DILocation(line: 8, column: 7, scope: !28) -!73 = !DILocation(line: 6, column: 3, scope: !28) -!74 = !{!"branch_weights", i32 1, i32 2000} -!75 = !DILocation(line: 0, scope: !28) -!76 = !{!"branch_weights", i32 2000, i32 1} -!77 = !DILocation(line: 12, column: 3, scope: !28) -!78 = !{!79} -!79 = distinct !{!79, !80, !"sorbet_T_must: argument 0"} -!80 = distinct !{!80, !"sorbet_T_must"} -!81 = !{!47, !9, i64 24} -!82 = !DILocation(line: 0, scope: !30) -!83 = !DILocation(line: 9, column: 5, scope: !30) -!84 = !DILocation(line: 8, column: 7, scope: !30) -!85 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil$block_4", scope: !28, file: !2, line: 6, type: !17, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!86 = !DILocation(line: 16, column: 7, scope: !34) -!87 = !DILocation(line: 14, column: 3, scope: !34) -!88 = !{!"branch_weights", i32 4001, i32 4000000} -!89 = !DILocation(line: 0, scope: !34) -!90 = !DILocation(line: 21, column: 3, scope: !34) -!91 = !{!92} -!92 = distinct !{!92, !93, !"sorbet_T_must: argument 0"} -!93 = distinct !{!93, !"sorbet_T_must"} -!94 = !DILocation(line: 17, column: 19, scope: !33) -!95 = !DILocation(line: 17, column: 12, scope: !33) -!96 = !DILocation(line: 0, scope: !37) -!97 = !DILocation(line: 18, column: 5, scope: !37) -!98 = !DILocation(line: 16, column: 7, scope: !37) +!11 = !{!5, !9, i64 16} +!12 = !{!5, !6, i64 24} +!13 = !{!9, !9, i64 0} +!14 = !DILocation(line: 14, column: 3, scope: !15, inlinedAt: !19) +!15 = distinct !DISubprogram(name: "Test.", linkageName: "func_Test.L62", scope: null, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!16 = !DISubroutineType(types: !17) +!17 = !{!18} +!18 = !DIBasicType(name: "VALUE", size: 64, encoding: DW_ATE_signed) +!19 = distinct !DILocation(line: 5, column: 1, scope: !20) +!20 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !16, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!21 = !DILocation(line: 24, column: 1, scope: !20) +!22 = !DILocation(line: 25, column: 1, scope: !20) +!23 = !DILocation(line: 26, column: 1, scope: !20) +!24 = !DILocation(line: 27, column: 1, scope: !20) +!25 = !DILocation(line: 8, column: 7, scope: !26) +!26 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil$block_1", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!27 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil", scope: null, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!28 = !DILocation(line: 9, column: 15, scope: !29) +!29 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil$block_2", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!30 = !DILocation(line: 10, column: 7, scope: !29) +!31 = !DILocation(line: 16, column: 7, scope: !32) +!32 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg$block_1", scope: !33, file: !2, line: 14, type: !16, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!33 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg", scope: null, file: !2, line: 14, type: !16, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!34 = !DILocation(line: 17, column: 7, scope: !32) +!35 = !DILocation(line: 18, column: 15, scope: !36) +!36 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg$block_2", scope: !33, file: !2, line: 14, type: !16, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!37 = !DILocation(line: 19, column: 7, scope: !36) +!38 = !DILocation(line: 6, column: 3, scope: !15) +!39 = !DILocation(line: 14, column: 3, scope: !15) +!40 = !{!6, !6, i64 0} +!41 = !{!42, !6, i64 16} +!42 = !{!"rb_execution_context_struct", !6, i64 0, !9, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !43, i64 40, !43, i64 44, !6, i64 48, !6, i64 56, !6, i64 64, !9, i64 72, !9, i64 80, !6, i64 88, !9, i64 96, !6, i64 104, !6, i64 112, !9, i64 120, !9, i64 128, !7, i64 136, !7, i64 137, !9, i64 144, !44, i64 152} +!43 = !{!"int", !7, i64 0} +!44 = !{!"", !6, i64 0, !6, i64 8, !9, i64 16, !7, i64 24} +!45 = !{!46, !6, i64 16} +!46 = !{!"rb_control_frame_struct", !6, i64 0, !6, i64 8, !6, i64 16, !9, i64 24, !6, i64 32, !6, i64 40, !6, i64 48} +!47 = !{!46, !6, i64 32} +!48 = !DILocation(line: 0, scope: !20) +!49 = !DILocation(line: 5, column: 1, scope: !20) +!50 = !DILocation(line: 0, scope: !15, inlinedAt: !19) +!51 = !DILocation(line: 6, column: 3, scope: !15, inlinedAt: !19) +!52 = !{!53, !53, i64 0} +!53 = !{!"long long", !7, i64 0} +!54 = !{!"branch_weights", i32 1, i32 10000} +!55 = !{!56, !43, i64 8} +!56 = !{!"rb_sorbet_param_struct", !57, i64 0, !43, i64 4, !43, i64 8, !43, i64 12, !43, i64 16, !43, i64 20, !43, i64 24, !43, i64 28, !6, i64 32, !43, i64 40, !43, i64 44, !43, i64 48, !43, i64 52, !6, i64 56} +!57 = !{!"", !43, i64 0, !43, i64 0, !43, i64 0, !43, i64 0, !43, i64 0, !43, i64 0, !43, i64 0, !43, i64 0, !43, i64 1, !43, i64 1} +!58 = !{!56, !43, i64 4} +!59 = !{!56, !6, i64 32} +!60 = !{!46, !6, i64 8} +!61 = !DILocation(line: 8, column: 7, scope: !27) +!62 = !DILocation(line: 6, column: 3, scope: !27) +!63 = !{!"branch_weights", i32 1, i32 2000} +!64 = !DILocation(line: 0, scope: !27) +!65 = !{!"branch_weights", i32 2000, i32 1} +!66 = !DILocation(line: 12, column: 3, scope: !27) +!67 = !{!68} +!68 = distinct !{!68, !69, !"sorbet_T_must: argument 0"} +!69 = distinct !{!69, !"sorbet_T_must"} +!70 = !{!46, !9, i64 24} +!71 = !DILocation(line: 0, scope: !29) +!72 = !DILocation(line: 9, column: 5, scope: !29) +!73 = !DILocation(line: 8, column: 7, scope: !29) +!74 = distinct !DISubprogram(name: "Test.test_known_nil", linkageName: "func_Test.test_known_nil$block_4", scope: !27, file: !2, line: 6, type: !16, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!75 = !DILocation(line: 16, column: 7, scope: !33) +!76 = !DILocation(line: 14, column: 3, scope: !33) +!77 = !{!"branch_weights", i32 4001, i32 4000000} +!78 = !DILocation(line: 0, scope: !33) +!79 = !DILocation(line: 21, column: 3, scope: !33) +!80 = !{!81} +!81 = distinct !{!81, !82, !"sorbet_T_must: argument 0"} +!82 = distinct !{!82, !"sorbet_T_must"} +!83 = !DILocation(line: 17, column: 19, scope: !32) +!84 = !DILocation(line: 17, column: 12, scope: !32) +!85 = !DILocation(line: 0, scope: !36) +!86 = !DILocation(line: 18, column: 5, scope: !36) +!87 = !DILocation(line: 16, column: 7, scope: !36) +!88 = distinct !DISubprogram(name: "Test.test_nilable_arg", linkageName: "func_Test.test_nilable_arg$block_4", scope: !33, file: !2, line: 14, type: !16, scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) diff --git a/test/testdata/compiler/literal_hash.llo.exp b/test/testdata/compiler/literal_hash.llo.exp index 4f47297771e..8dfb754874e 100644 --- a/test/testdata/compiler/literal_hash.llo.exp +++ b/test/testdata/compiler/literal_hash.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,7 +85,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/literal_hash.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/literal_hash.rb" = private unnamed_addr constant [39 x i8] c"test/testdata/compiler/literal_hash.rb\00", align 1 +@iseqEncodedArray = internal global [15 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @rubyStrFrozen_foo = internal unnamed_addr global i64 0, align 8 @str_foo = private unnamed_addr constant [4 x i8] c"foo\00", align 1 @rubyStrFrozen_bar = internal unnamed_addr global i64 0, align 8 @@ -121,7 +126,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -193,9 +200,12 @@ entry: store i64 %4, i64* @"rubyStrFrozen_", align 8 %5 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([39 x i8], [39 x i8]* @"str_test/testdata/compiler/literal_hash.rb", i64 0, i64 0), i64 noundef 38) #9 tail call void @rb_gc_register_mark_object(i64 %5) #9 + store i64 %5, i64* @"rubyStrFrozen_test/testdata/compiler/literal_hash.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 15) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %5, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 14, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 15) + %"rubyStr_test/testdata/compiler/literal_hash.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/literal_hash.rb", align 8 + %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/literal_hash.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 15) store %struct.rb_iseq_struct* %6, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %7 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 noundef 3) #9 call void @rb_gc_register_mark_object(i64 %7) #9 @@ -353,75 +363,54 @@ entry: store i64 %49, i64* %47, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %42, %struct.rb_control_frame_struct* align 8 %44, %struct.rb_iseq_struct* %stackFrame.i) #9 %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 0 - %51 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %45, align 8, !tbaa !28 - %52 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %51, i64 0, i32 2 - %53 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %52, align 8, !tbaa !31 - %54 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %53, i64 0, i32 2 - %55 = load i64*, i64** %54, align 8, !tbaa !33 - %56 = getelementptr inbounds i64, i64* %55, i64 5 - %57 = getelementptr inbounds i64, i64* %56, i64 1 - store i64* %57, i64** %50, align 8, !dbg !42, !tbaa !13 - %rubyId_do.i = load i64, i64* @rubyIdPrecomputed_do, align 8, !dbg !43 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_do.i) #9, !dbg !43 - %hashLiteral.i = load i64, i64* @ruby_hashLiteral1, align 8, !dbg !44 - %duplicatedHash.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral.i) #9, !dbg !44 - %58 = getelementptr inbounds i64, i64* %55, i64 7, !dbg !44 - %59 = getelementptr inbounds i64, i64* %58, i64 1, !dbg !44 - store i64* %59, i64** %50, align 8, !dbg !44, !tbaa !13 - %hashLiteral79.i = load i64, i64* @ruby_hashLiteral2, align 8, !dbg !45 - %duplicatedHash80.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral79.i) #9, !dbg !45 - %60 = getelementptr inbounds i64, i64* %55, i64 8, !dbg !45 - %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !45 - store i64* %61, i64** %50, align 8, !dbg !45, !tbaa !13 - %hashLiteral84.i = load i64, i64* @ruby_hashLiteral3, align 8, !dbg !46 - %duplicatedHash85.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral84.i) #9, !dbg !46 - %62 = getelementptr inbounds i64, i64* %55, i64 9, !dbg !46 - %63 = getelementptr inbounds i64, i64* %62, i64 1, !dbg !46 - store i64* %63, i64** %50, align 8, !dbg !46, !tbaa !13 - %hashLiteral89.i = load i64, i64* @ruby_hashLiteral4, align 8, !dbg !47 - %duplicatedHash90.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral89.i) #9, !dbg !47 - %64 = getelementptr inbounds i64, i64* %55, i64 10, !dbg !47 - %65 = getelementptr inbounds i64, i64* %64, i64 1, !dbg !47 - store i64* %65, i64** %50, align 8, !dbg !47, !tbaa !13 - %hashLiteral94.i = load i64, i64* @ruby_hashLiteral5, align 8, !dbg !48 - %duplicatedHash95.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral94.i) #9, !dbg !48 - %66 = getelementptr inbounds i64, i64* %55, i64 11, !dbg !48 - %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !48 - store i64* %67, i64** %50, align 8, !dbg !48, !tbaa !13 - %hashLiteral99.i = load i64, i64* @ruby_hashLiteral6, align 8, !dbg !49 - %duplicatedHash100.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral99.i) #9, !dbg !49 - %68 = getelementptr inbounds i64, i64* %55, i64 12, !dbg !49 - %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !49 - store i64* %69, i64** %50, align 8, !dbg !49, !tbaa !13 - %rubyId_symbol.i = load i64, i64* @rubyIdPrecomputed_symbol, align 8, !dbg !50 - %rawSym101.i = call i64 @rb_id2sym(i64 %rubyId_symbol.i) #9, !dbg !50 - %hashLiteral104.i = load i64, i64* @ruby_hashLiteral7, align 8, !dbg !51 - %duplicatedHash105.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral104.i) #9, !dbg !51 - %70 = getelementptr inbounds i64, i64* %55, i64 13, !dbg !51 - %71 = getelementptr inbounds i64, i64* %70, i64 1, !dbg !51 - store i64* %71, i64** %50, align 8, !dbg !51, !tbaa !13 - %72 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !13 - %73 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %72, i64 0, i32 2, !dbg !8 - %74 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %73, align 8, !dbg !8, !tbaa !25 - %75 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %74, i64 0, i32 1, !dbg !8 - %76 = load i64*, i64** %75, align 8, !dbg !8, !tbaa !52 - %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !8 - store i64 %41, i64* %76, align 8, !dbg !8, !tbaa !4 - %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !8 - store i64 %duplicatedHash.i, i64* %77, align 8, !dbg !8, !tbaa !4 - %79 = getelementptr inbounds i64, i64* %78, i64 1, !dbg !8 - store i64 %duplicatedHash80.i, i64* %78, align 8, !dbg !8, !tbaa !4 - %80 = getelementptr inbounds i64, i64* %79, i64 1, !dbg !8 - store i64 %duplicatedHash85.i, i64* %79, align 8, !dbg !8, !tbaa !4 - %81 = getelementptr inbounds i64, i64* %80, i64 1, !dbg !8 - store i64 %duplicatedHash90.i, i64* %80, align 8, !dbg !8, !tbaa !4 - %82 = getelementptr inbounds i64, i64* %81, i64 1, !dbg !8 - store i64 %duplicatedHash95.i, i64* %81, align 8, !dbg !8, !tbaa !4 - %83 = getelementptr inbounds i64, i64* %82, i64 1, !dbg !8 - store i64 %duplicatedHash100.i, i64* %82, align 8, !dbg !8, !tbaa !4 - %84 = getelementptr inbounds i64, i64* %83, i64 1, !dbg !8 - store i64* %84, i64** %75, align 8, !dbg !8, !tbaa !52 - store i64 %duplicatedHash105.i, i64* %83, align 8, !dbg !8, !tbaa !4 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %50, align 8, !dbg !31, !tbaa !13 + %rubyId_do.i = load i64, i64* @rubyIdPrecomputed_do, align 8, !dbg !32 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_do.i) #9, !dbg !32 + %hashLiteral.i = load i64, i64* @ruby_hashLiteral1, align 8, !dbg !33 + %duplicatedHash.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral.i) #9, !dbg !33 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %50, align 8, !dbg !33, !tbaa !13 + %hashLiteral79.i = load i64, i64* @ruby_hashLiteral2, align 8, !dbg !34 + %duplicatedHash80.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral79.i) #9, !dbg !34 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %50, align 8, !dbg !34, !tbaa !13 + %hashLiteral84.i = load i64, i64* @ruby_hashLiteral3, align 8, !dbg !35 + %duplicatedHash85.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral84.i) #9, !dbg !35 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %50, align 8, !dbg !35, !tbaa !13 + %hashLiteral89.i = load i64, i64* @ruby_hashLiteral4, align 8, !dbg !36 + %duplicatedHash90.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral89.i) #9, !dbg !36 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %50, align 8, !dbg !36, !tbaa !13 + %hashLiteral94.i = load i64, i64* @ruby_hashLiteral5, align 8, !dbg !37 + %duplicatedHash95.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral94.i) #9, !dbg !37 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %50, align 8, !dbg !37, !tbaa !13 + %hashLiteral99.i = load i64, i64* @ruby_hashLiteral6, align 8, !dbg !38 + %duplicatedHash100.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral99.i) #9, !dbg !38 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %50, align 8, !dbg !38, !tbaa !13 + %rubyId_symbol.i = load i64, i64* @rubyIdPrecomputed_symbol, align 8, !dbg !39 + %rawSym101.i = call i64 @rb_id2sym(i64 %rubyId_symbol.i) #9, !dbg !39 + %hashLiteral104.i = load i64, i64* @ruby_hashLiteral7, align 8, !dbg !40 + %duplicatedHash105.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral104.i) #9, !dbg !40 + store i64* getelementptr inbounds ([15 x i64], [15 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %50, align 8, !dbg !40, !tbaa !13 + %51 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !13 + %52 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %51, i64 0, i32 2, !dbg !8 + %53 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %52, align 8, !dbg !8, !tbaa !25 + %54 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %53, i64 0, i32 1, !dbg !8 + %55 = load i64*, i64** %54, align 8, !dbg !8, !tbaa !41 + %56 = getelementptr inbounds i64, i64* %55, i64 1, !dbg !8 + store i64 %41, i64* %55, align 8, !dbg !8, !tbaa !4 + %57 = getelementptr inbounds i64, i64* %56, i64 1, !dbg !8 + store i64 %duplicatedHash.i, i64* %56, align 8, !dbg !8, !tbaa !4 + %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !8 + store i64 %duplicatedHash80.i, i64* %57, align 8, !dbg !8, !tbaa !4 + %59 = getelementptr inbounds i64, i64* %58, i64 1, !dbg !8 + store i64 %duplicatedHash85.i, i64* %58, align 8, !dbg !8, !tbaa !4 + %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !8 + store i64 %duplicatedHash90.i, i64* %59, align 8, !dbg !8, !tbaa !4 + %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !8 + store i64 %duplicatedHash95.i, i64* %60, align 8, !dbg !8, !tbaa !4 + %62 = getelementptr inbounds i64, i64* %61, i64 1, !dbg !8 + store i64 %duplicatedHash100.i, i64* %61, align 8, !dbg !8, !tbaa !4 + %63 = getelementptr inbounds i64, i64* %62, i64 1, !dbg !8 + store i64* %63, i64** %54, align 8, !dbg !8, !tbaa !41 + store i64 %duplicatedHash105.i, i64* %62, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #9, !dbg !8 ret void } @@ -477,25 +466,14 @@ attributes #9 = { nounwind } !28 = !{!29, !14, i64 16} !29 = !{!"rb_control_frame_struct", !14, i64 0, !14, i64 8, !14, i64 16, !5, i64 24, !14, i64 32, !14, i64 40, !14, i64 48} !30 = !{!29, !14, i64 32} -!31 = !{!32, !14, i64 16} -!32 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !14, i64 16, !6, i64 24} -!33 = !{!34, !14, i64 8} -!34 = !{!"rb_iseq_constant_body", !6, i64 0, !20, i64 4, !14, i64 8, !35, i64 16, !37, i64 64, !40, i64 120, !14, i64 152, !14, i64 160, !14, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !41, i64 200, !20, i64 232, !20, i64 236, !20, i64 240, !20, i64 244, !20, i64 248, !6, i64 252, !5, i64 256} -!35 = !{!"", !36, i64 0, !20, i64 4, !20, i64 8, !20, i64 12, !20, i64 16, !20, i64 20, !20, i64 24, !20, i64 28, !14, i64 32, !14, i64 40} -!36 = !{!"", !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 0, !20, i64 1, !20, i64 1} -!37 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !20, i64 32, !38, i64 36} -!38 = !{!"rb_code_location_struct", !39, i64 0, !39, i64 8} -!39 = !{!"rb_code_position_struct", !20, i64 0, !20, i64 4} -!40 = !{!"iseq_insn_info", !14, i64 0, !14, i64 8, !20, i64 16, !14, i64 24} -!41 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !14, i64 24} -!42 = !DILocation(line: 0, scope: !9) -!43 = !DILocation(line: 6, column: 99, scope: !9) -!44 = !DILocation(line: 6, column: 5, scope: !9) -!45 = !DILocation(line: 8, column: 5, scope: !9) -!46 = !DILocation(line: 9, column: 5, scope: !9) -!47 = !DILocation(line: 10, column: 5, scope: !9) -!48 = !DILocation(line: 11, column: 5, scope: !9) -!49 = !DILocation(line: 12, column: 5, scope: !9) -!50 = !DILocation(line: 13, column: 7, scope: !9) -!51 = !DILocation(line: 13, column: 5, scope: !9) -!52 = !{!29, !14, i64 8} +!31 = !DILocation(line: 0, scope: !9) +!32 = !DILocation(line: 6, column: 99, scope: !9) +!33 = !DILocation(line: 6, column: 5, scope: !9) +!34 = !DILocation(line: 8, column: 5, scope: !9) +!35 = !DILocation(line: 9, column: 5, scope: !9) +!36 = !DILocation(line: 10, column: 5, scope: !9) +!37 = !DILocation(line: 11, column: 5, scope: !9) +!38 = !DILocation(line: 12, column: 5, scope: !9) +!39 = !DILocation(line: 13, column: 7, scope: !9) +!40 = !DILocation(line: 13, column: 5, scope: !9) +!41 = !{!29, !14, i64 8} diff --git a/test/testdata/compiler/literals.llo.exp b/test/testdata/compiler/literals.llo.exp index f78e50d9068..aafb1d100a1 100644 --- a/test/testdata/compiler/literals.llo.exp +++ b/test/testdata/compiler/literals.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,7 +85,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/literals.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/literals.rb" = private unnamed_addr constant [35 x i8] c"test/testdata/compiler/literals.rb\00", align 1 +@iseqEncodedArray = internal global [11 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @ic_puts = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 @@ -98,7 +103,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @ic_puts.5 = internal global %struct.FunctionInlineCache zeroinitializer @ic_puts.6 = internal global %struct.FunctionInlineCache zeroinitializer -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -158,9 +165,12 @@ entry: store i64 %3, i64* @"rubyStrFrozen_", align 8 %4 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([35 x i8], [35 x i8]* @"str_test/testdata/compiler/literals.rb", i64 0, i64 0), i64 noundef 34) #8 tail call void @rb_gc_register_mark_object(i64 %4) #8 + store i64 %4, i64* @"rubyStrFrozen_test/testdata/compiler/literals.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 11) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %5 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %4, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 10, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/literals.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/literals.rb", align 8 + %5 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/literals.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %5, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !8 @@ -195,111 +205,92 @@ entry: store i64 %17, i64* %15, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %10, %struct.rb_control_frame_struct* align 8 %12, %struct.rb_iseq_struct* %stackFrame.i) #8 %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %12, i64 0, i32 0 - %19 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %13, align 8, !tbaa !34 - %20 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %19, i64 0, i32 2 - %21 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %20, align 8, !tbaa !37 - %22 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %21, i64 0, i32 2 - %23 = load i64*, i64** %22, align 8, !tbaa !39 - %24 = getelementptr inbounds i64, i64* %23, i64 3 - %25 = getelementptr inbounds i64, i64* %24, i64 1 - store i64* %25, i64** %18, align 8, !dbg !48, !tbaa !19 - %26 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !19 - %27 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %26, i64 0, i32 2, !dbg !8 - %28 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %27, align 8, !dbg !8, !tbaa !31 - %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 1, !dbg !8 - %30 = load i64*, i64** %29, align 8, !dbg !8, !tbaa !49 - %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !8 - store i64 %9, i64* %30, align 8, !dbg !8, !tbaa !4 - %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !8 - store i64* %32, i64** %29, align 8, !dbg !8, !tbaa !49 - store i64 85, i64* %31, align 8, !dbg !8, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %18, align 8, !dbg !37, !tbaa !19 + %19 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !19 + %20 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %19, i64 0, i32 2, !dbg !8 + %21 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %20, align 8, !dbg !8, !tbaa !31 + %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 1, !dbg !8 + %23 = load i64*, i64** %22, align 8, !dbg !8, !tbaa !38 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !8 + store i64 %9, i64* %23, align 8, !dbg !8, !tbaa !4 + %25 = getelementptr inbounds i64, i64* %24, i64 1, !dbg !8 + store i64* %25, i64** %22, align 8, !dbg !8, !tbaa !38 + store i64 85, i64* %24, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #8, !dbg !8 - %33 = getelementptr inbounds i64, i64* %23, i64 4, !dbg !8 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !8 - store i64* %34, i64** %18, align 8, !dbg !8, !tbaa !19 - %35 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !19 - %36 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %35, i64 0, i32 2, !dbg !13 - %37 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %36, align 8, !dbg !13, !tbaa !31 - %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 1, !dbg !13 - %39 = load i64*, i64** %38, align 8, !dbg !13, !tbaa !49 - %40 = getelementptr inbounds i64, i64* %39, i64 1, !dbg !13 - store i64 %9, i64* %39, align 8, !dbg !13, !tbaa !4 - %41 = getelementptr inbounds i64, i64* %40, i64 1, !dbg !13 - store i64* %41, i64** %38, align 8, !dbg !13, !tbaa !49 - store i64 56565211319773434, i64* %40, align 8, !dbg !13, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %18, align 8, !dbg !8, !tbaa !19 + %26 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !19 + %27 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %26, i64 0, i32 2, !dbg !13 + %28 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %27, align 8, !dbg !13, !tbaa !31 + %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 1, !dbg !13 + %30 = load i64*, i64** %29, align 8, !dbg !13, !tbaa !38 + %31 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !13 + store i64 %9, i64* %30, align 8, !dbg !13, !tbaa !4 + %32 = getelementptr inbounds i64, i64* %31, i64 1, !dbg !13 + store i64* %32, i64** %29, align 8, !dbg !13, !tbaa !38 + store i64 56565211319773434, i64* %31, align 8, !dbg !13, !tbaa !4 %send38.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.1, i64 0) #8, !dbg !13 - %42 = getelementptr inbounds i64, i64* %23, i64 5, !dbg !13 - %43 = getelementptr inbounds i64, i64* %42, i64 1, !dbg !13 - store i64* %43, i64** %18, align 8, !dbg !13, !tbaa !19 - %rubyStr_str.i = load i64, i64* @rubyStrFrozen_str, align 8, !dbg !50 - %44 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !19 - %45 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %44, i64 0, i32 2, !dbg !14 - %46 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %45, align 8, !dbg !14, !tbaa !31 - %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %46, i64 0, i32 1, !dbg !14 - %48 = load i64*, i64** %47, align 8, !dbg !14, !tbaa !49 - %49 = getelementptr inbounds i64, i64* %48, i64 1, !dbg !14 - store i64 %9, i64* %48, align 8, !dbg !14, !tbaa !4 - %50 = getelementptr inbounds i64, i64* %49, i64 1, !dbg !14 - store i64* %50, i64** %47, align 8, !dbg !14, !tbaa !49 - store i64 %rubyStr_str.i, i64* %49, align 8, !dbg !14, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %18, align 8, !dbg !13, !tbaa !19 + %rubyStr_str.i = load i64, i64* @rubyStrFrozen_str, align 8, !dbg !39 + %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !19 + %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2, !dbg !14 + %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !dbg !14, !tbaa !31 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 1, !dbg !14 + %37 = load i64*, i64** %36, align 8, !dbg !14, !tbaa !38 + %38 = getelementptr inbounds i64, i64* %37, i64 1, !dbg !14 + store i64 %9, i64* %37, align 8, !dbg !14, !tbaa !4 + %39 = getelementptr inbounds i64, i64* %38, i64 1, !dbg !14 + store i64* %39, i64** %36, align 8, !dbg !14, !tbaa !38 + store i64 %rubyStr_str.i, i64* %38, align 8, !dbg !14, !tbaa !4 %send45.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0) #8, !dbg !14 - %51 = getelementptr inbounds i64, i64* %23, i64 6, !dbg !14 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !14 - store i64* %52, i64** %18, align 8, !dbg !14, !tbaa !19 - %rubyId_sym.i = load i64, i64* @rubyIdPrecomputed_sym, align 8, !dbg !51 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_sym.i) #8, !dbg !51 - %53 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !19 - %54 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %53, i64 0, i32 2, !dbg !15 - %55 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %54, align 8, !dbg !15, !tbaa !31 - %56 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %55, i64 0, i32 1, !dbg !15 - %57 = load i64*, i64** %56, align 8, !dbg !15, !tbaa !49 - %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !15 - store i64 %9, i64* %57, align 8, !dbg !15, !tbaa !4 - %59 = getelementptr inbounds i64, i64* %58, i64 1, !dbg !15 - store i64* %59, i64** %56, align 8, !dbg !15, !tbaa !49 - store i64 %rawSym.i, i64* %58, align 8, !dbg !15, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %18, align 8, !dbg !14, !tbaa !19 + %rubyId_sym.i = load i64, i64* @rubyIdPrecomputed_sym, align 8, !dbg !40 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_sym.i) #8, !dbg !40 + %40 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !19 + %41 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %40, i64 0, i32 2, !dbg !15 + %42 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %41, align 8, !dbg !15, !tbaa !31 + %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 1, !dbg !15 + %44 = load i64*, i64** %43, align 8, !dbg !15, !tbaa !38 + %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !15 + store i64 %9, i64* %44, align 8, !dbg !15, !tbaa !4 + %46 = getelementptr inbounds i64, i64* %45, i64 1, !dbg !15 + store i64* %46, i64** %43, align 8, !dbg !15, !tbaa !38 + store i64 %rawSym.i, i64* %45, align 8, !dbg !15, !tbaa !4 %send52.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.3, i64 0) #8, !dbg !15 - %60 = getelementptr inbounds i64, i64* %23, i64 7, !dbg !15 - %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !15 - store i64* %61, i64** %18, align 8, !dbg !15, !tbaa !19 - %62 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !19 - %63 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %62, i64 0, i32 2, !dbg !16 - %64 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %63, align 8, !dbg !16, !tbaa !31 - %65 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %64, i64 0, i32 1, !dbg !16 - %66 = load i64*, i64** %65, align 8, !dbg !16, !tbaa !49 - %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !16 - store i64 %9, i64* %66, align 8, !dbg !16, !tbaa !4 - %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !16 - store i64* %68, i64** %65, align 8, !dbg !16, !tbaa !49 - store i64 0, i64* %67, align 8, !dbg !16, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %18, align 8, !dbg !15, !tbaa !19 + %47 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !19 + %48 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %47, i64 0, i32 2, !dbg !16 + %49 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %48, align 8, !dbg !16, !tbaa !31 + %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %49, i64 0, i32 1, !dbg !16 + %51 = load i64*, i64** %50, align 8, !dbg !16, !tbaa !38 + %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !16 + store i64 %9, i64* %51, align 8, !dbg !16, !tbaa !4 + %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !16 + store i64* %53, i64** %50, align 8, !dbg !16, !tbaa !38 + store i64 0, i64* %52, align 8, !dbg !16, !tbaa !4 %send59.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.4, i64 0) #8, !dbg !16 - %69 = getelementptr inbounds i64, i64* %23, i64 8, !dbg !16 - %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !16 - store i64* %70, i64** %18, align 8, !dbg !16, !tbaa !19 - %71 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !19 - %72 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %71, i64 0, i32 2, !dbg !17 - %73 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %72, align 8, !dbg !17, !tbaa !31 - %74 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %73, i64 0, i32 1, !dbg !17 - %75 = load i64*, i64** %74, align 8, !dbg !17, !tbaa !49 - %76 = getelementptr inbounds i64, i64* %75, i64 1, !dbg !17 - store i64 %9, i64* %75, align 8, !dbg !17, !tbaa !4 - %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !17 - store i64* %77, i64** %74, align 8, !dbg !17, !tbaa !49 - store i64 20, i64* %76, align 8, !dbg !17, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %18, align 8, !dbg !16, !tbaa !19 + %54 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !19 + %55 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %54, i64 0, i32 2, !dbg !17 + %56 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %55, align 8, !dbg !17, !tbaa !31 + %57 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %56, i64 0, i32 1, !dbg !17 + %58 = load i64*, i64** %57, align 8, !dbg !17, !tbaa !38 + %59 = getelementptr inbounds i64, i64* %58, i64 1, !dbg !17 + store i64 %9, i64* %58, align 8, !dbg !17, !tbaa !4 + %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !17 + store i64* %60, i64** %57, align 8, !dbg !17, !tbaa !38 + store i64 20, i64* %59, align 8, !dbg !17, !tbaa !4 %send66.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.5, i64 0) #8, !dbg !17 - %78 = getelementptr inbounds i64, i64* %23, i64 9, !dbg !17 - %79 = getelementptr inbounds i64, i64* %78, i64 1, !dbg !17 - store i64* %79, i64** %18, align 8, !dbg !17, !tbaa !19 - %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !19 - %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !18 - %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !18, !tbaa !31 - %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 1, !dbg !18 - %84 = load i64*, i64** %83, align 8, !dbg !18, !tbaa !49 - %85 = getelementptr inbounds i64, i64* %84, i64 1, !dbg !18 - store i64 %9, i64* %84, align 8, !dbg !18, !tbaa !4 - %86 = getelementptr inbounds i64, i64* %85, i64 1, !dbg !18 - store i64* %86, i64** %83, align 8, !dbg !18, !tbaa !49 - store i64 8, i64* %85, align 8, !dbg !18, !tbaa !4 + store i64* getelementptr inbounds ([11 x i64], [11 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %18, align 8, !dbg !17, !tbaa !19 + %61 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !19 + %62 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %61, i64 0, i32 2, !dbg !18 + %63 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %62, align 8, !dbg !18, !tbaa !31 + %64 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %63, i64 0, i32 1, !dbg !18 + %65 = load i64*, i64** %64, align 8, !dbg !18, !tbaa !38 + %66 = getelementptr inbounds i64, i64* %65, i64 1, !dbg !18 + store i64 %9, i64* %65, align 8, !dbg !18, !tbaa !4 + %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !18 + store i64* %67, i64** %64, align 8, !dbg !18, !tbaa !38 + store i64 8, i64* %66, align 8, !dbg !18, !tbaa !4 %send74.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0) #8, !dbg !18 ret void } @@ -354,18 +345,7 @@ attributes #8 = { nounwind } !34 = !{!35, !20, i64 16} !35 = !{!"rb_control_frame_struct", !20, i64 0, !20, i64 8, !20, i64 16, !5, i64 24, !20, i64 32, !20, i64 40, !20, i64 48} !36 = !{!35, !20, i64 32} -!37 = !{!38, !20, i64 16} -!38 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !20, i64 16, !6, i64 24} -!39 = !{!40, !20, i64 8} -!40 = !{!"rb_iseq_constant_body", !6, i64 0, !26, i64 4, !20, i64 8, !41, i64 16, !43, i64 64, !46, i64 120, !20, i64 152, !20, i64 160, !20, i64 168, !20, i64 176, !20, i64 184, !20, i64 192, !47, i64 200, !26, i64 232, !26, i64 236, !26, i64 240, !26, i64 244, !26, i64 248, !6, i64 252, !5, i64 256} -!41 = !{!"", !42, i64 0, !26, i64 4, !26, i64 8, !26, i64 12, !26, i64 16, !26, i64 20, !26, i64 24, !26, i64 28, !20, i64 32, !20, i64 40} -!42 = !{!"", !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 0, !26, i64 1, !26, i64 1} -!43 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !26, i64 32, !44, i64 36} -!44 = !{!"rb_code_location_struct", !45, i64 0, !45, i64 8} -!45 = !{!"rb_code_position_struct", !26, i64 0, !26, i64 4} -!46 = !{!"iseq_insn_info", !20, i64 0, !20, i64 8, !26, i64 16, !20, i64 24} -!47 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !20, i64 24} -!48 = !DILocation(line: 0, scope: !9) -!49 = !{!35, !20, i64 8} -!50 = !DILocation(line: 6, column: 6, scope: !9) -!51 = !DILocation(line: 7, column: 6, scope: !9) +!37 = !DILocation(line: 0, scope: !9) +!38 = !{!35, !20, i64 8} +!39 = !DILocation(line: 6, column: 6, scope: !9) +!40 = !DILocation(line: 7, column: 6, scope: !9) diff --git a/test/testdata/compiler/method.llo.exp b/test/testdata/compiler/method.llo.exp index 5dc88974eb4..a27afb674fc 100644 --- a/test/testdata/compiler/method.llo.exp +++ b/test/testdata/compiler/method.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_hello = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/method.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/method.rb" = private unnamed_addr constant [33 x i8] c"test/testdata/compiler/method.rb\00", align 1 +@iseqEncodedArray = internal global [12 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"rubyIdPrecomputed_<" = internal unnamed_addr global i64 0, align 8 @"str_<" = private unnamed_addr constant [2 x i8] c"<\00", align 1 @"ic_<" = internal global %struct.FunctionInlineCache zeroinitializer @@ -119,7 +123,9 @@ declare i64 @rb_str_plus(i64, i64) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -190,209 +196,193 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !31 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !18 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !18 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !18 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 BB2: ; preds = %BB2.backedge, %fillRequiredArgs - %i.sroa.0.0 = phi i64 [ 1, %fillRequiredArgs ], [ %i.sroa.0.0.be, %BB2.backedge ], !dbg !33 - store i64* %38, i64** %3, align 8, !tbaa !12 - %11 = and i64 %i.sroa.0.0, 1, !dbg !34 - %12 = icmp eq i64 %11, 0, !dbg !34 - br i1 %12, label %13, label %"fastSymCallIntrinsic_Integer_<", !dbg !34, !prof !35 - -13: ; preds = %BB2 - %14 = and i64 %i.sroa.0.0, 7, !dbg !34 - %15 = icmp ne i64 %14, 0, !dbg !34 - %16 = and i64 %i.sroa.0.0, -9, !dbg !34 - %17 = icmp eq i64 %16, 0, !dbg !34 - %18 = or i1 %15, %17, !dbg !34 - br i1 %18, label %"alternativeCallIntrinsic_Integer_<", label %sorbet_isa_Integer.exit, !dbg !34, !prof !36 - -sorbet_isa_Integer.exit: ; preds = %13 - %19 = inttoptr i64 %i.sroa.0.0 to %struct.iseq_inline_iv_cache_entry*, !dbg !34 - %20 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %19, i64 0, i32 0, !dbg !34 - %21 = load i64, i64* %20, align 8, !dbg !34, !tbaa !37 - %22 = and i64 %21, 31, !dbg !34 - %23 = icmp eq i64 %22, 10, !dbg !34 - br i1 %23, label %"fastSymCallIntrinsic_Integer_<", label %"alternativeCallIntrinsic_Integer_<", !dbg !34, !prof !39 + %i.sroa.0.0 = phi i64 [ 1, %fillRequiredArgs ], [ %i.sroa.0.0.be, %BB2.backedge ], !dbg !20 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !tbaa !12 + %4 = and i64 %i.sroa.0.0, 1, !dbg !21 + %5 = icmp eq i64 %4, 0, !dbg !21 + br i1 %5, label %6, label %"fastSymCallIntrinsic_Integer_<", !dbg !21, !prof !22 + +6: ; preds = %BB2 + %7 = and i64 %i.sroa.0.0, 7, !dbg !21 + %8 = icmp ne i64 %7, 0, !dbg !21 + %9 = and i64 %i.sroa.0.0, -9, !dbg !21 + %10 = icmp eq i64 %9, 0, !dbg !21 + %11 = or i1 %8, %10, !dbg !21 + br i1 %11, label %"alternativeCallIntrinsic_Integer_<", label %sorbet_isa_Integer.exit, !dbg !21, !prof !23 + +sorbet_isa_Integer.exit: ; preds = %6 + %12 = inttoptr i64 %i.sroa.0.0 to %struct.iseq_inline_iv_cache_entry*, !dbg !21 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !21 + %14 = load i64, i64* %13, align 8, !dbg !21, !tbaa !24 + %15 = and i64 %14, 31, !dbg !21 + %16 = icmp eq i64 %15, 10, !dbg !21 + br i1 %16, label %"fastSymCallIntrinsic_Integer_<", label %"alternativeCallIntrinsic_Integer_<", !dbg !21, !prof !26 BB3: ; preds = %afterSend - %24 = getelementptr inbounds i64, i64* %9, i64 6, !dbg !40 - %25 = getelementptr inbounds i64, i64* %24, i64 1, !dbg !40 - store i64* %25, i64** %3, align 8, !dbg !40, !tbaa !12 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !dbg !27, !tbaa !12 ret i64 8 BB5: ; preds = %afterSend - store i64* %41, i64** %3, align 8, !tbaa !12 - %"rubyStr_hello " = load i64, i64* @"rubyStrFrozen_hello ", align 8, !dbg !41 - %26 = and i64 %"rubyStr_hello ", 7, !dbg !41 - %27 = icmp ne i64 %26, 0, !dbg !41 - %28 = and i64 %"rubyStr_hello ", -9, !dbg !41 - %29 = icmp eq i64 %28, 0, !dbg !41 - %30 = or i1 %27, %29, !dbg !41 - br i1 %30, label %"alternativeCallIntrinsic_String_+", label %sorbet_isa_String.exit, !dbg !41, !prof !36 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !tbaa !12 + %"rubyStr_hello " = load i64, i64* @"rubyStrFrozen_hello ", align 8, !dbg !28 + %17 = and i64 %"rubyStr_hello ", 7, !dbg !28 + %18 = icmp ne i64 %17, 0, !dbg !28 + %19 = and i64 %"rubyStr_hello ", -9, !dbg !28 + %20 = icmp eq i64 %19, 0, !dbg !28 + %21 = or i1 %18, %20, !dbg !28 + br i1 %21, label %"alternativeCallIntrinsic_String_+", label %sorbet_isa_String.exit, !dbg !28, !prof !23 sorbet_isa_String.exit: ; preds = %BB5 - %31 = inttoptr i64 %"rubyStr_hello " to %struct.iseq_inline_iv_cache_entry*, !dbg !41 - %32 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %31, i64 0, i32 0, !dbg !41 - %33 = load i64, i64* %32, align 8, !dbg !41, !tbaa !37 - %34 = and i64 %33, 31, !dbg !41 - %35 = icmp eq i64 %34, 5, !dbg !41 - br i1 %35, label %"fastSymCallIntrinsic_String_+", label %"alternativeCallIntrinsic_String_+", !dbg !41, !prof !39 + %22 = inttoptr i64 %"rubyStr_hello " to %struct.iseq_inline_iv_cache_entry*, !dbg !28 + %23 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %22, i64 0, i32 0, !dbg !28 + %24 = load i64, i64* %23, align 8, !dbg !28, !tbaa !24 + %25 = and i64 %24, 31, !dbg !28 + %26 = icmp eq i64 %25, 5, !dbg !28 + br i1 %26, label %"fastSymCallIntrinsic_String_+", label %"alternativeCallIntrinsic_String_+", !dbg !28, !prof !26 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_name = load i64, i64* %argArray, align 8, !dbg !31 - %36 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !42 - store i64* %36, i64** %3, align 8, !dbg !42, !tbaa !12 - %37 = getelementptr inbounds i64, i64* %9, i64 2 - %38 = getelementptr inbounds i64, i64* %37, i64 1 + %rawArg_name = load i64, i64* %argArray, align 8, !dbg !18 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !dbg !29, !tbaa !12 %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0 - %39 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0 - %40 = getelementptr inbounds i64, i64* %9, i64 3 - %41 = getelementptr inbounds i64, i64* %40, i64 1 - %42 = getelementptr inbounds i64, i64* %9, i64 4 - %43 = getelementptr inbounds i64, i64* %42, i64 1 - br label %BB2, !dbg !43 - -afterSend: ; preds = %57, %62, %"alternativeCallIntrinsic_Integer_<" - %44 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<" ], [ true, %57 ], [ true, %62 ] - %"symIntrinsicRawPhi_<" = phi i64 [ %send, %"alternativeCallIntrinsic_Integer_<" ], [ %61, %57 ], [ %63, %62 ], !dbg !34 - %45 = and i64 %"symIntrinsicRawPhi_<", -9, !dbg !34 - %46 = icmp ne i64 %45, 0, !dbg !34 - br i1 %46, label %BB5, label %BB3, !dbg !34 - -"alternativeCallIntrinsic_Integer_<": ; preds = %13, %sorbet_isa_Integer.exit - %47 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 - %48 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %47, i64 0, i32 2, !dbg !34 - %49 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %48, align 8, !dbg !34, !tbaa !14 - %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %49, i64 0, i32 1, !dbg !34 - %51 = load i64*, i64** %50, align 8, !dbg !34, !tbaa !44 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !34 - store i64 %i.sroa.0.0, i64* %51, align 8, !dbg !34, !tbaa !4 - %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !34 - store i64* %53, i64** %50, align 8, !dbg !34, !tbaa !44 - store i64 21, i64* %52, align 8, !dbg !34, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 0), !dbg !34 - br label %afterSend, !dbg !34 + %27 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0 + br label %BB2, !dbg !30 + +afterSend: ; preds = %41, %46, %"alternativeCallIntrinsic_Integer_<" + %28 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<" ], [ true, %41 ], [ true, %46 ] + %"symIntrinsicRawPhi_<" = phi i64 [ %send, %"alternativeCallIntrinsic_Integer_<" ], [ %45, %41 ], [ %47, %46 ], !dbg !21 + %29 = and i64 %"symIntrinsicRawPhi_<", -9, !dbg !21 + %30 = icmp ne i64 %29, 0, !dbg !21 + br i1 %30, label %BB5, label %BB3, !dbg !21 + +"alternativeCallIntrinsic_Integer_<": ; preds = %6, %sorbet_isa_Integer.exit + %31 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !12 + %32 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %31, i64 0, i32 2, !dbg !21 + %33 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %32, align 8, !dbg !21, !tbaa !14 + %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 1, !dbg !21 + %35 = load i64*, i64** %34, align 8, !dbg !21, !tbaa !31 + %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !21 + store i64 %i.sroa.0.0, i64* %35, align 8, !dbg !21, !tbaa !4 + %37 = getelementptr inbounds i64, i64* %36, i64 1, !dbg !21 + store i64* %37, i64** %34, align 8, !dbg !21, !tbaa !31 + store i64 21, i64* %36, align 8, !dbg !21, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 0), !dbg !21 + br label %afterSend, !dbg !21 "fastSymCallIntrinsic_Integer_<": ; preds = %BB2, %sorbet_isa_Integer.exit - store i64 21, i64* %callArgs0Addr, align 8, !dbg !34 - tail call void @llvm.experimental.noalias.scope.decl(metadata !45), !dbg !34 - %54 = load i64, i64* %39, align 8, !dbg !34, !tbaa !4, !alias.scope !45 - %55 = and i64 %54, %11, !dbg !34 - %56 = icmp eq i64 %55, 0, !dbg !34 - br i1 %56, label %62, label %57, !dbg !34, !prof !32 - -57: ; preds = %"fastSymCallIntrinsic_Integer_<" - %58 = ashr i64 %i.sroa.0.0, 1, !dbg !34 - %59 = ashr i64 %54, 1, !dbg !34 - %60 = icmp slt i64 %58, %59, !dbg !34 - %61 = select i1 %60, i64 20, i64 0, !dbg !34 - br label %afterSend, !dbg !34 - -62: ; preds = %"fastSymCallIntrinsic_Integer_<" - %63 = tail call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0, i64 %54) #13, !dbg !34, !noalias !45 - br label %afterSend, !dbg !34 + store i64 21, i64* %callArgs0Addr, align 8, !dbg !21 + tail call void @llvm.experimental.noalias.scope.decl(metadata !33), !dbg !21 + %38 = load i64, i64* %27, align 8, !dbg !21, !tbaa !4, !alias.scope !33 + %39 = and i64 %38, %4, !dbg !21 + %40 = icmp eq i64 %39, 0, !dbg !21 + br i1 %40, label %46, label %41, !dbg !21, !prof !19 + +41: ; preds = %"fastSymCallIntrinsic_Integer_<" + %42 = ashr i64 %i.sroa.0.0, 1, !dbg !21 + %43 = ashr i64 %38, 1, !dbg !21 + %44 = icmp slt i64 %42, %43, !dbg !21 + %45 = select i1 %44, i64 20, i64 0, !dbg !21 + br label %afterSend, !dbg !21 + +46: ; preds = %"fastSymCallIntrinsic_Integer_<" + %47 = tail call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0, i64 %38) #13, !dbg !21, !noalias !33 + br label %afterSend, !dbg !21 afterSend25: ; preds = %"alternativeCallIntrinsic_String_+", %"fastSymCallIntrinsic_String_+" - %"symIntrinsicRawPhi_+" = phi i64 [ %79, %"fastSymCallIntrinsic_String_+" ], [ %send35, %"alternativeCallIntrinsic_String_+" ], !dbg !41 - %64 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !12 - %65 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %64, i64 0, i32 2, !dbg !48 - %66 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %65, align 8, !dbg !48, !tbaa !14 - %67 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %66, i64 0, i32 1, !dbg !48 - %68 = load i64*, i64** %67, align 8, !dbg !48, !tbaa !44 - %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !48 - store i64 %selfRaw, i64* %68, align 8, !dbg !48, !tbaa !4 - %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !48 - store i64* %70, i64** %67, align 8, !dbg !48, !tbaa !44 - store i64 %"symIntrinsicRawPhi_+", i64* %69, align 8, !dbg !48, !tbaa !4 - %send41 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !48 - store i64* %43, i64** %3, align 8, !dbg !48, !tbaa !12 - br i1 %44, label %"fastSymCallIntrinsic_Integer_+", label %"alternativeCallIntrinsic_Integer_+", !dbg !49 + %"symIntrinsicRawPhi_+" = phi i64 [ %63, %"fastSymCallIntrinsic_String_+" ], [ %send35, %"alternativeCallIntrinsic_String_+" ], !dbg !28 + %48 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !36, !tbaa !12 + %49 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %48, i64 0, i32 2, !dbg !36 + %50 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %49, align 8, !dbg !36, !tbaa !14 + %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %50, i64 0, i32 1, !dbg !36 + %52 = load i64*, i64** %51, align 8, !dbg !36, !tbaa !31 + %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !36 + store i64 %selfRaw, i64* %52, align 8, !dbg !36, !tbaa !4 + %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !36 + store i64* %54, i64** %51, align 8, !dbg !36, !tbaa !31 + store i64 %"symIntrinsicRawPhi_+", i64* %53, align 8, !dbg !36, !tbaa !4 + %send41 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0), !dbg !36 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !36, !tbaa !12 + br i1 %28, label %"fastSymCallIntrinsic_Integer_+", label %"alternativeCallIntrinsic_Integer_+", !dbg !37 "alternativeCallIntrinsic_String_+": ; preds = %BB5, %sorbet_isa_String.exit - %71 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !41, !tbaa !12 - %72 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %71, i64 0, i32 2, !dbg !41 - %73 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %72, align 8, !dbg !41, !tbaa !14 - %74 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %73, i64 0, i32 1, !dbg !41 - %75 = load i64*, i64** %74, align 8, !dbg !41, !tbaa !44 - %76 = getelementptr inbounds i64, i64* %75, i64 1, !dbg !41 - store i64 %"rubyStr_hello ", i64* %75, align 8, !dbg !41, !tbaa !4 - %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !41 - store i64* %77, i64** %74, align 8, !dbg !41, !tbaa !44 - store i64 %rawArg_name, i64* %76, align 8, !dbg !41, !tbaa !4 - %send35 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !41 - br label %afterSend25, !dbg !41 + %55 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !12 + %56 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %55, i64 0, i32 2, !dbg !28 + %57 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %56, align 8, !dbg !28, !tbaa !14 + %58 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %57, i64 0, i32 1, !dbg !28 + %59 = load i64*, i64** %58, align 8, !dbg !28, !tbaa !31 + %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !28 + store i64 %"rubyStr_hello ", i64* %59, align 8, !dbg !28, !tbaa !4 + %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !28 + store i64* %61, i64** %58, align 8, !dbg !28, !tbaa !31 + store i64 %rawArg_name, i64* %60, align 8, !dbg !28, !tbaa !4 + %send35 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !28 + br label %afterSend25, !dbg !28 "fastSymCallIntrinsic_String_+": ; preds = %sorbet_isa_String.exit - store i64 %rawArg_name, i64* %callArgs0Addr, align 8, !dbg !41 - tail call void @llvm.experimental.noalias.scope.decl(metadata !50), !dbg !41 - %78 = load i64, i64* %39, align 8, !dbg !41, !tbaa !4, !alias.scope !50 - %79 = tail call i64 @rb_str_plus(i64 %"rubyStr_hello ", i64 %78) #13, !dbg !41, !noalias !50 - br label %afterSend25, !dbg !41 + store i64 %rawArg_name, i64* %callArgs0Addr, align 8, !dbg !28 + tail call void @llvm.experimental.noalias.scope.decl(metadata !38), !dbg !28 + %62 = load i64, i64* %27, align 8, !dbg !28, !tbaa !4, !alias.scope !38 + %63 = tail call i64 @rb_str_plus(i64 %"rubyStr_hello ", i64 %62) #13, !dbg !28, !noalias !38 + br label %afterSend25, !dbg !28 "alternativeCallIntrinsic_Integer_+": ; preds = %afterSend25 - %80 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !12 - %81 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %80, i64 0, i32 2, !dbg !49 - %82 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %81, align 8, !dbg !49, !tbaa !14 - %83 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %82, i64 0, i32 1, !dbg !49 - %84 = load i64*, i64** %83, align 8, !dbg !49, !tbaa !44 - %85 = getelementptr inbounds i64, i64* %84, i64 1, !dbg !49 - store i64 %i.sroa.0.0, i64* %84, align 8, !dbg !49, !tbaa !4 - %86 = getelementptr inbounds i64, i64* %85, i64 1, !dbg !49 - store i64* %86, i64** %83, align 8, !dbg !49, !tbaa !44 - store i64 3, i64* %85, align 8, !dbg !49, !tbaa !4 - %send56 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+.1", i64 0), !dbg !49 - br label %BB2.backedge, !dbg !49 + %64 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !12 + %65 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %64, i64 0, i32 2, !dbg !37 + %66 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %65, align 8, !dbg !37, !tbaa !14 + %67 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %66, i64 0, i32 1, !dbg !37 + %68 = load i64*, i64** %67, align 8, !dbg !37, !tbaa !31 + %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !37 + store i64 %i.sroa.0.0, i64* %68, align 8, !dbg !37, !tbaa !4 + %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !37 + store i64* %70, i64** %67, align 8, !dbg !37, !tbaa !31 + store i64 3, i64* %69, align 8, !dbg !37, !tbaa !4 + %send56 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+.1", i64 0), !dbg !37 + br label %BB2.backedge, !dbg !37 "fastSymCallIntrinsic_Integer_+": ; preds = %afterSend25 - store i64 3, i64* %callArgs0Addr, align 8, !dbg !49 - tail call void @llvm.experimental.noalias.scope.decl(metadata !53), !dbg !49 - %87 = load i64, i64* %39, align 8, !dbg !49, !tbaa !4, !alias.scope !53 - %88 = and i64 %87, %11, !dbg !49 - %89 = icmp eq i64 %88, 0, !dbg !49 - br i1 %89, label %99, label %90, !dbg !49, !prof !32 - -90: ; preds = %"fastSymCallIntrinsic_Integer_+" - %91 = add nsw i64 %87, -1, !dbg !49 - %92 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0, i64 %91) #14, !dbg !49 - %93 = extractvalue { i64, i1 } %92, 1, !dbg !49 - %94 = extractvalue { i64, i1 } %92, 0, !dbg !49 - br i1 %93, label %95, label %BB2.backedge, !dbg !49 - -95: ; preds = %90 - %96 = ashr i64 %94, 1, !dbg !49 - %97 = xor i64 %96, -9223372036854775808, !dbg !49 - %98 = tail call i64 @rb_int2big(i64 %97) #13, !dbg !49, !noalias !53 - br label %BB2.backedge, !dbg !49 - -BB2.backedge: ; preds = %95, %90, %99, %"alternativeCallIntrinsic_Integer_+" - %i.sroa.0.0.be = phi i64 [ %send56, %"alternativeCallIntrinsic_Integer_+" ], [ %100, %99 ], [ %98, %95 ], [ %94, %90 ] + store i64 3, i64* %callArgs0Addr, align 8, !dbg !37 + tail call void @llvm.experimental.noalias.scope.decl(metadata !41), !dbg !37 + %71 = load i64, i64* %27, align 8, !dbg !37, !tbaa !4, !alias.scope !41 + %72 = and i64 %71, %4, !dbg !37 + %73 = icmp eq i64 %72, 0, !dbg !37 + br i1 %73, label %83, label %74, !dbg !37, !prof !19 + +74: ; preds = %"fastSymCallIntrinsic_Integer_+" + %75 = add nsw i64 %71, -1, !dbg !37 + %76 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0, i64 %75) #14, !dbg !37 + %77 = extractvalue { i64, i1 } %76, 1, !dbg !37 + %78 = extractvalue { i64, i1 } %76, 0, !dbg !37 + br i1 %77, label %79, label %BB2.backedge, !dbg !37 + +79: ; preds = %74 + %80 = ashr i64 %78, 1, !dbg !37 + %81 = xor i64 %80, -9223372036854775808, !dbg !37 + %82 = tail call i64 @rb_int2big(i64 %81) #13, !dbg !37, !noalias !41 + br label %BB2.backedge, !dbg !37 + +BB2.backedge: ; preds = %79, %74, %83, %"alternativeCallIntrinsic_Integer_+" + %i.sroa.0.0.be = phi i64 [ %send56, %"alternativeCallIntrinsic_Integer_+" ], [ %84, %83 ], [ %82, %79 ], [ %78, %74 ] br label %BB2 -99: ; preds = %"fastSymCallIntrinsic_Integer_+" - %100 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0, i64 %87) #13, !dbg !49, !noalias !53 - br label %BB2.backedge, !dbg !49 +83: ; preds = %"fastSymCallIntrinsic_Integer_+" + %84 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0, i64 %71) #13, !dbg !37, !noalias !41 + br label %BB2.backedge, !dbg !37 } ; Function Attrs: sspreq define void @Init_method() local_unnamed_addr #8 { entry: - %positional_table.i = alloca i64, align 8, !dbg !56 + %positional_table.i = alloca i64, align 8, !dbg !44 %locals.i9.i = alloca i64, i32 0, align 8 %locals.i.i = alloca i64, i32 0, align 8 %realpath = tail call i64 @sorbet_readRealpath() @@ -418,37 +408,39 @@ entry: %9 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([33 x i8], [33 x i8]* @"str_test/testdata/compiler/method.rb", i64 0, i64 0), i64 noundef 32) #13 tail call void @rb_gc_register_mark_object(i64 %9) #13 store i64 %9, i64* @"rubyStrFrozen_test/testdata/compiler/method.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 12) %rubyId_hello.i.i = load i64, i64* @rubyIdPrecomputed_hello, align 8 %rubyStr_hello.i.i = load i64, i64* @rubyStrFrozen_hello, align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_hello.i.i, i64 %rubyId_hello.i.i, i64 %9, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 10, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/method.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/method.rb", align 8 + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_hello.i.i, i64 %rubyId_hello.i.i, i64 %"rubyStr_test/testdata/compiler/method.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#hello", align 8 - %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !34 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !34 + %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !21 %11 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @"str_hello ", i64 0, i64 0), i64 noundef 6) #13 call void @rb_gc_register_mark_object(i64 %11) #13 store i64 %11, i64* @"rubyStrFrozen_hello ", align 8 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !41 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !41 - %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !48 - %"rubyId_+3.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !49 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+.1", i64 %"rubyId_+3.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !49 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !28 + %rubyId_puts.i = load i64, i64* @rubyIdPrecomputed_puts, align 8, !dbg !36 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 %rubyId_puts.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !36 + %"rubyId_+3.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !37 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+.1", i64 %"rubyId_+3.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 %12 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #13 call void @rb_gc_register_mark_object(i64 %12) #13 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/method.rb.i8.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/method.rb", align 8 - %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %12, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/method.rb.i8.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 11, i64* noundef nonnull %locals.i9.i, i32 noundef 0, i32 noundef 4) + %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %12, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/method.rb.i8.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i9.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %13, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !56 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !56 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !44 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !44 %14 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_sorbet, i64 0, i64 0), i64 noundef 6) #13 call void @rb_gc_register_mark_object(i64 %14) #13 store i64 %14, i64* @rubyStrFrozen_sorbet, align 8 - %rubyId_hello.i = load i64, i64* @rubyIdPrecomputed_hello, align 8, !dbg !58 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_hello, i64 %rubyId_hello.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !58 + %rubyId_hello.i = load i64, i64* @rubyIdPrecomputed_hello, align 8, !dbg !46 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_hello, i64 %rubyId_hello.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !46 %15 = load %struct.rb_vm_struct*, %struct.rb_vm_struct** @ruby_current_vm_ptr, align 8, !tbaa !12 %16 = getelementptr inbounds %struct.rb_vm_struct, %struct.rb_vm_struct* %15, i64 0, i32 18 - %17 = load i64, i64* %16, align 8, !tbaa !59 + %17 = load i64, i64* %16, align 8, !tbaa !47 %18 = bitcast i64* %positional_table.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %18) %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 @@ -456,68 +448,59 @@ entry: %20 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %19, i64 0, i32 2 %21 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %20, align 8, !tbaa !14 %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %22, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %22, align 8, !tbaa !56 %23 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 4 - %24 = load i64*, i64** %23, align 8, !tbaa !68 + %24 = load i64*, i64** %23, align 8, !tbaa !57 %25 = load i64, i64* %24, align 8, !tbaa !4 %26 = and i64 %25, -33 store i64 %26, i64* %24, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %19, %struct.rb_control_frame_struct* align 8 %21, %struct.rb_iseq_struct* %stackFrame.i) #13 %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 0 - %28 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %22, align 8, !tbaa !18 - %29 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %28, i64 0, i32 2 - %30 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %29, align 8, !tbaa !20 - %31 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %30, i64 0, i32 2 - %32 = load i64*, i64** %31, align 8, !tbaa !22 - %33 = getelementptr inbounds i64, i64* %32, i64 3 - %34 = getelementptr inbounds i64, i64* %33, i64 1 - store i64* %34, i64** %27, align 8, !dbg !69, !tbaa !12 - %rubyId_hello.i1 = load i64, i64* @rubyIdPrecomputed_hello, align 8, !dbg !56 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_hello.i1) #13, !dbg !56 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !56 - %rawSym13.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #13, !dbg !56 - %35 = load i64, i64* @rb_cObject, align 8, !dbg !56 - %stackFrame14.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#hello", align 8, !dbg !56 - %36 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !56 - %37 = bitcast i8* %36 to i16*, !dbg !56 - %38 = load i16, i16* %37, align 8, !dbg !56 - %39 = and i16 %38, -384, !dbg !56 - %40 = or i16 %39, 1, !dbg !56 - store i16 %40, i16* %37, align 8, !dbg !56 - %41 = getelementptr inbounds i8, i8* %36, i64 8, !dbg !56 - %42 = bitcast i8* %41 to i32*, !dbg !56 - store i32 1, i32* %42, align 8, !dbg !56, !tbaa !70 - %43 = getelementptr inbounds i8, i8* %36, i64 12, !dbg !56 - %44 = getelementptr inbounds i8, i8* %36, i64 4, !dbg !56 - %45 = bitcast i8* %44 to i32*, !dbg !56 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %43, i8 0, i64 20, i1 false) #13, !dbg !56 - store i32 1, i32* %45, align 4, !dbg !56, !tbaa !72 - %rubyId_name.i = load i64, i64* @rubyIdPrecomputed_name, align 8, !dbg !56 - store i64 %rubyId_name.i, i64* %positional_table.i, align 8, !dbg !56 - %46 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !56 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %46, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %18, i64 noundef 8, i1 noundef false) #13, !dbg !56 - %47 = getelementptr inbounds i8, i8* %36, i64 32, !dbg !56 - %48 = bitcast i8* %47 to i8**, !dbg !56 - store i8* %46, i8** %48, align 8, !dbg !56, !tbaa !73 - %49 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_hello, i64 0, i64 0)) #13, !dbg !56 - %50 = bitcast i8* %36 to %struct.rb_sorbet_param_struct*, !dbg !56 - %51 = bitcast %struct.rb_iseq_struct* %stackFrame14.i to i8*, !dbg !56 - call void @rb_add_method_sorbet(i64 %35, i64 %49, i64 (i32, i64*, i64)* noundef @"func_Object#hello", %struct.rb_sorbet_param_struct* nonnull %50, i32 noundef 1, i8* %51) #13, !dbg !56 - %52 = getelementptr inbounds i64, i64* %32, i64 10, !dbg !56 - %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !56 - store i64* %53, i64** %27, align 8, !dbg !56, !tbaa !12 - %rubyStr_sorbet.i = load i64, i64* @rubyStrFrozen_sorbet, align 8, !dbg !74 - %54 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !58, !tbaa !12 - %55 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %54, i64 0, i32 2, !dbg !58 - %56 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %55, align 8, !dbg !58, !tbaa !14 - %57 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %56, i64 0, i32 1, !dbg !58 - %58 = load i64*, i64** %57, align 8, !dbg !58, !tbaa !44 - %59 = getelementptr inbounds i64, i64* %58, i64 1, !dbg !58 - store i64 %17, i64* %58, align 8, !dbg !58, !tbaa !4 - %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !58 - store i64* %60, i64** %57, align 8, !dbg !58, !tbaa !44 - store i64 %rubyStr_sorbet.i, i64* %59, align 8, !dbg !58, !tbaa !4 - %send24.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_hello, i64 0) #13, !dbg !58 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %27, align 8, !dbg !58, !tbaa !12 + %rubyId_hello.i1 = load i64, i64* @rubyIdPrecomputed_hello, align 8, !dbg !44 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_hello.i1) #13, !dbg !44 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !44 + %rawSym13.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #13, !dbg !44 + %28 = load i64, i64* @rb_cObject, align 8, !dbg !44 + %stackFrame14.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#hello", align 8, !dbg !44 + %29 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #11, !dbg !44 + %30 = bitcast i8* %29 to i16*, !dbg !44 + %31 = load i16, i16* %30, align 8, !dbg !44 + %32 = and i16 %31, -384, !dbg !44 + %33 = or i16 %32, 1, !dbg !44 + store i16 %33, i16* %30, align 8, !dbg !44 + %34 = getelementptr inbounds i8, i8* %29, i64 8, !dbg !44 + %35 = bitcast i8* %34 to i32*, !dbg !44 + store i32 1, i32* %35, align 8, !dbg !44, !tbaa !59 + %36 = getelementptr inbounds i8, i8* %29, i64 12, !dbg !44 + %37 = getelementptr inbounds i8, i8* %29, i64 4, !dbg !44 + %38 = bitcast i8* %37 to i32*, !dbg !44 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %36, i8 0, i64 20, i1 false) #13, !dbg !44 + store i32 1, i32* %38, align 4, !dbg !44, !tbaa !62 + %rubyId_name.i = load i64, i64* @rubyIdPrecomputed_name, align 8, !dbg !44 + store i64 %rubyId_name.i, i64* %positional_table.i, align 8, !dbg !44 + %39 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #11, !dbg !44 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %39, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %18, i64 noundef 8, i1 noundef false) #13, !dbg !44 + %40 = getelementptr inbounds i8, i8* %29, i64 32, !dbg !44 + %41 = bitcast i8* %40 to i8**, !dbg !44 + store i8* %39, i8** %41, align 8, !dbg !44, !tbaa !63 + %42 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @str_hello, i64 0, i64 0)) #13, !dbg !44 + %43 = bitcast i8* %29 to %struct.rb_sorbet_param_struct*, !dbg !44 + %44 = bitcast %struct.rb_iseq_struct* %stackFrame14.i to i8*, !dbg !44 + call void @rb_add_method_sorbet(i64 %28, i64 %42, i64 (i32, i64*, i64)* noundef @"func_Object#hello", %struct.rb_sorbet_param_struct* nonnull %43, i32 noundef 1, i8* %44) #13, !dbg !44 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %27, align 8, !dbg !44, !tbaa !12 + %rubyStr_sorbet.i = load i64, i64* @rubyStrFrozen_sorbet, align 8, !dbg !64 + %45 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !46, !tbaa !12 + %46 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %45, i64 0, i32 2, !dbg !46 + %47 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %46, align 8, !dbg !46, !tbaa !14 + %48 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %47, i64 0, i32 1, !dbg !46 + %49 = load i64*, i64** %48, align 8, !dbg !46, !tbaa !31 + %50 = getelementptr inbounds i64, i64* %49, i64 1, !dbg !46 + store i64 %17, i64* %49, align 8, !dbg !46, !tbaa !4 + %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !46 + store i64* %51, i64** %48, align 8, !dbg !46, !tbaa !31 + store i64 %rubyStr_sorbet.i, i64* %50, align 8, !dbg !46, !tbaa !4 + %send24.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_hello, i64 0) #13, !dbg !46 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %18) ret void } @@ -571,60 +554,50 @@ attributes #14 = { nounwind willreturn } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 4, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 4001, i32 4000000} -!33 = !DILocation(line: 0, scope: !8) -!34 = !DILocation(line: 6, column: 11, scope: !8) -!35 = !{!"branch_weights", i32 1, i32 2000} -!36 = !{!"branch_weights", i32 1073205, i32 2146410443} -!37 = !{!38, !5, i64 0} -!38 = !{!"RBasic", !5, i64 0, !5, i64 8} -!39 = !{!"branch_weights", i32 2000, i32 1} -!40 = !DILocation(line: 6, column: 4, scope: !8) -!41 = !DILocation(line: 7, column: 11, scope: !8) -!42 = !DILocation(line: 4, column: 11, scope: !8) -!43 = !DILocation(line: 5, column: 8, scope: !8) -!44 = !{!19, !13, i64 8} -!45 = !{!46} -!46 = distinct !{!46, !47, !"sorbet_rb_int_lt: argument 0"} -!47 = distinct !{!47, !"sorbet_rb_int_lt"} -!48 = !DILocation(line: 7, column: 6, scope: !8) -!49 = !DILocation(line: 8, column: 6, scope: !8) -!50 = !{!51} -!51 = distinct !{!51, !52, !"sorbet_int_rb_str_plus: argument 0"} -!52 = distinct !{!52, !"sorbet_int_rb_str_plus"} -!53 = !{!54} -!54 = distinct !{!54, !55, !"sorbet_rb_int_plus: argument 0"} -!55 = distinct !{!55, !"sorbet_rb_int_plus"} -!56 = !DILocation(line: 4, column: 1, scope: !57) -!57 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!58 = !DILocation(line: 11, column: 1, scope: !57) -!59 = !{!60, !5, i64 400} -!60 = !{!"rb_vm_struct", !5, i64 0, !61, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !64, i64 216, !6, i64 224, !62, i64 264, !62, i64 280, !62, i64 296, !62, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !65, i64 472, !66, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !62, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !67, i64 1200, !6, i64 1232} -!61 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !62, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} -!62 = !{!"list_head", !63, i64 0} -!63 = !{!"list_node", !13, i64 0, !13, i64 8} -!64 = !{!"long long", !6, i64 0} -!65 = !{!"", !6, i64 0} -!66 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} -!67 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} -!68 = !{!19, !13, i64 32} -!69 = !DILocation(line: 0, scope: !57) -!70 = !{!71, !16, i64 8} -!71 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!72 = !{!71, !16, i64 4} -!73 = !{!71, !13, i64 32} -!74 = !DILocation(line: 11, column: 7, scope: !57) +!18 = !DILocation(line: 4, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 4001, i32 4000000} +!20 = !DILocation(line: 0, scope: !8) +!21 = !DILocation(line: 6, column: 11, scope: !8) +!22 = !{!"branch_weights", i32 1, i32 2000} +!23 = !{!"branch_weights", i32 1073205, i32 2146410443} +!24 = !{!25, !5, i64 0} +!25 = !{!"RBasic", !5, i64 0, !5, i64 8} +!26 = !{!"branch_weights", i32 2000, i32 1} +!27 = !DILocation(line: 6, column: 4, scope: !8) +!28 = !DILocation(line: 7, column: 11, scope: !8) +!29 = !DILocation(line: 4, column: 11, scope: !8) +!30 = !DILocation(line: 5, column: 8, scope: !8) +!31 = !{!32, !13, i64 8} +!32 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!33 = !{!34} +!34 = distinct !{!34, !35, !"sorbet_rb_int_lt: argument 0"} +!35 = distinct !{!35, !"sorbet_rb_int_lt"} +!36 = !DILocation(line: 7, column: 6, scope: !8) +!37 = !DILocation(line: 8, column: 6, scope: !8) +!38 = !{!39} +!39 = distinct !{!39, !40, !"sorbet_int_rb_str_plus: argument 0"} +!40 = distinct !{!40, !"sorbet_int_rb_str_plus"} +!41 = !{!42} +!42 = distinct !{!42, !43, !"sorbet_rb_int_plus: argument 0"} +!43 = distinct !{!43, !"sorbet_rb_int_plus"} +!44 = !DILocation(line: 4, column: 1, scope: !45) +!45 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!46 = !DILocation(line: 11, column: 1, scope: !45) +!47 = !{!48, !5, i64 400} +!48 = !{!"rb_vm_struct", !5, i64 0, !49, i64 8, !13, i64 192, !13, i64 200, !13, i64 208, !52, i64 216, !6, i64 224, !50, i64 264, !50, i64 280, !50, i64 296, !50, i64 312, !5, i64 328, !16, i64 336, !16, i64 340, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 344, !16, i64 348, !5, i64 352, !6, i64 360, !5, i64 400, !5, i64 408, !5, i64 416, !5, i64 424, !5, i64 432, !5, i64 440, !5, i64 448, !13, i64 456, !13, i64 464, !53, i64 472, !54, i64 992, !13, i64 1016, !13, i64 1024, !16, i64 1032, !16, i64 1036, !50, i64 1040, !6, i64 1056, !5, i64 1096, !5, i64 1104, !5, i64 1112, !5, i64 1120, !5, i64 1128, !16, i64 1136, !13, i64 1144, !13, i64 1152, !13, i64 1160, !13, i64 1168, !13, i64 1176, !13, i64 1184, !16, i64 1192, !55, i64 1200, !6, i64 1232} +!49 = !{!"rb_global_vm_lock_struct", !13, i64 0, !6, i64 8, !50, i64 48, !13, i64 64, !16, i64 72, !6, i64 80, !6, i64 128, !16, i64 176, !16, i64 180} +!50 = !{!"list_head", !51, i64 0} +!51 = !{!"list_node", !13, i64 0, !13, i64 8} +!52 = !{!"long long", !6, i64 0} +!53 = !{!"", !6, i64 0} +!54 = !{!"rb_hook_list_struct", !13, i64 0, !16, i64 8, !16, i64 12, !16, i64 16} +!55 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24} +!56 = !{!32, !13, i64 16} +!57 = !{!32, !13, i64 32} +!58 = !DILocation(line: 0, scope: !45) +!59 = !{!60, !16, i64 8} +!60 = !{!"rb_sorbet_param_struct", !61, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!61 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!62 = !{!60, !16, i64 4} +!63 = !{!60, !13, i64 32} +!64 = !DILocation(line: 11, column: 7, scope: !45) diff --git a/test/testdata/compiler/repeated_casts.llo.exp b/test/testdata/compiler/repeated_casts.llo.exp index 065d65c50ba..71a5a47e206 100644 --- a/test/testdata/compiler/repeated_casts.llo.exp +++ b/test/testdata/compiler/repeated_casts.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -86,6 +88,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyStrFrozen_doubleCast = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/repeated_casts.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/repeated_casts.rb" = private unnamed_addr constant [41 x i8] c"test/testdata/compiler/repeated_casts.rb\00", align 1 +@iseqEncodedArray = internal global [12 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @str_T.cast = private unnamed_addr constant [7 x i8] c"T.cast\00", align 1 @ic_foo = internal global %struct.FunctionInlineCache zeroinitializer @@ -116,7 +120,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -188,79 +194,69 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !31 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !18 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !18 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !18 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_a = load i64, i64* %argArray, align 8, !dbg !31 - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !33 - store i64* %11, i64** %3, align 8, !dbg !33, !tbaa !12 - %12 = load i64, i64* @guard_epoch_A, align 8, !dbg !34 - %13 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !34, !tbaa !35 - %needTakeSlowPath = icmp ne i64 %12, %13, !dbg !34 - br i1 %needTakeSlowPath, label %14, label %15, !dbg !34, !prof !37 - -14: ; preds = %fillRequiredArgs - tail call void @const_recompute_A(), !dbg !34 - br label %15, !dbg !34 - -15: ; preds = %fillRequiredArgs, %14 - %16 = load i64, i64* @guarded_const_A, align 8, !dbg !34 - %17 = load i64, i64* @guard_epoch_A, align 8, !dbg !34 - %18 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !34, !tbaa !35 - %guardUpdated = icmp eq i64 %17, %18, !dbg !34 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !34 - %19 = tail call i64 @rb_obj_is_kind_of(i64 %rawArg_a, i64 %16), !dbg !34 - %20 = icmp eq i64 %19, 20, !dbg !34 - br i1 %20, label %typeTestSuccess, label %codeRepl, !dbg !34, !prof !38 - -typeTestSuccess: ; preds = %15 - %21 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !34, !tbaa !12 - %22 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %21, i64 0, i32 2, !dbg !34 - %23 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %22, align 8, !dbg !34, !tbaa !14 - %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 1, !dbg !34 - %25 = load i64*, i64** %24, align 8, !dbg !34, !tbaa !39 - %26 = getelementptr inbounds i64, i64* %25, i64 1, !dbg !34 - store i64* %26, i64** %24, align 8, !dbg !34, !tbaa !39 - store i64 %rawArg_a, i64* %25, align 8, !dbg !34, !tbaa !4 - %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0), !dbg !34 - %27 = getelementptr inbounds i64, i64* %9, i64 2, !dbg !34 - %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !34 - store i64* %28, i64** %3, align 8, !dbg !34, !tbaa !12 - %29 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !40, !tbaa !12 - %30 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %29, i64 0, i32 2, !dbg !40 - %31 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %30, align 8, !dbg !40, !tbaa !14 - %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %31, i64 0, i32 1, !dbg !40 - %33 = load i64*, i64** %32, align 8, !dbg !40, !tbaa !39 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !40 - store i64* %34, i64** %32, align 8, !dbg !40, !tbaa !39 - store i64 %rawArg_a, i64* %33, align 8, !dbg !40, !tbaa !4 - %send25 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 0), !dbg !40 + %rawArg_a = load i64, i64* %argArray, align 8, !dbg !18 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !20, !tbaa !12 + %4 = load i64, i64* @guard_epoch_A, align 8, !dbg !21 + %5 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !21, !tbaa !22 + %needTakeSlowPath = icmp ne i64 %4, %5, !dbg !21 + br i1 %needTakeSlowPath, label %6, label %7, !dbg !21, !prof !24 + +6: ; preds = %fillRequiredArgs + tail call void @const_recompute_A(), !dbg !21 + br label %7, !dbg !21 + +7: ; preds = %fillRequiredArgs, %6 + %8 = load i64, i64* @guarded_const_A, align 8, !dbg !21 + %9 = load i64, i64* @guard_epoch_A, align 8, !dbg !21 + %10 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !21, !tbaa !22 + %guardUpdated = icmp eq i64 %9, %10, !dbg !21 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !21 + %11 = tail call i64 @rb_obj_is_kind_of(i64 %rawArg_a, i64 %8), !dbg !21 + %12 = icmp eq i64 %11, 20, !dbg !21 + br i1 %12, label %typeTestSuccess, label %codeRepl, !dbg !21, !prof !25 + +typeTestSuccess: ; preds = %7 + %13 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !12 + %14 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %13, i64 0, i32 2, !dbg !21 + %15 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %14, align 8, !dbg !21, !tbaa !14 + %16 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %15, i64 0, i32 1, !dbg !21 + %17 = load i64*, i64** %16, align 8, !dbg !21, !tbaa !26 + %18 = getelementptr inbounds i64, i64* %17, i64 1, !dbg !21 + store i64* %18, i64** %16, align 8, !dbg !21, !tbaa !26 + store i64 %rawArg_a, i64* %17, align 8, !dbg !21, !tbaa !4 + %send = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0), !dbg !21 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 10), i64** %3, align 8, !dbg !21, !tbaa !12 + %19 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !12 + %20 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %19, i64 0, i32 2, !dbg !28 + %21 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %20, align 8, !dbg !28, !tbaa !14 + %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %21, i64 0, i32 1, !dbg !28 + %23 = load i64*, i64** %22, align 8, !dbg !28, !tbaa !26 + %24 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !28 + store i64* %24, i64** %22, align 8, !dbg !28, !tbaa !26 + store i64 %rawArg_a, i64* %23, align 8, !dbg !28, !tbaa !4 + %send25 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 0), !dbg !28 ret i64 %send25 -codeRepl: ; preds = %15 - tail call fastcc void @"func_Object#doubleCast.cold.1"(i64 %rawArg_a) #16, !dbg !34 +codeRepl: ; preds = %7 + tail call fastcc void @"func_Object#doubleCast.cold.1"(i64 %rawArg_a) #16, !dbg !21 unreachable } ; Function Attrs: sspreq define void @Init_repeated_casts() local_unnamed_addr #9 { entry: - %positional_table.i = alloca i64, align 8, !dbg !41 + %positional_table.i = alloca i64, align 8, !dbg !29 %locals.i13.i = alloca i64, i32 0, align 8 %locals.i9.i = alloca i64, i32 0, align 8 %locals.i7.i = alloca i64, i32 0, align 8 @@ -284,36 +280,38 @@ entry: %7 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([41 x i8], [41 x i8]* @"str_test/testdata/compiler/repeated_casts.rb", i64 0, i64 0), i64 noundef 40) #17 tail call void @rb_gc_register_mark_object(i64 %7) #17 store i64 %7, i64* @"rubyStrFrozen_test/testdata/compiler/repeated_casts.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 12) %rubyId_doubleCast.i.i = load i64, i64* @rubyIdPrecomputed_doubleCast, align 8 %rubyStr_doubleCast.i.i = load i64, i64* @rubyStrFrozen_doubleCast, align 8 - %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_doubleCast.i.i, i64 %rubyId_doubleCast.i.i, i64 %7, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 11, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 1) + %"rubyStr_test/testdata/compiler/repeated_casts.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/repeated_casts.rb", align 8 + %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %rubyStr_doubleCast.i.i, i64 %rubyId_doubleCast.i.i, i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 1) store %struct.rb_iseq_struct* %8, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#doubleCast", align 8 - %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !34 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !34 - %rubyId_foo1.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !40 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 %rubyId_foo1.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !40 + %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !21 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 %rubyId_foo.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !21 + %rubyId_foo1.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 %rubyId_foo1.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !28 %9 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([17 x i8], [17 x i8]* @"str_", i64 0, i64 0), i64 noundef 16) #17 call void @rb_gc_register_mark_object(i64 %9) #17 store i64 %9, i64* @"rubyStrFrozen_", align 8 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i6.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/repeated_casts.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i6.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 11, i64* noundef nonnull %locals.i7.i, i32 noundef 0, i32 noundef 4) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i6.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i7.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 - %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !41 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !41 + %rubyId_keep_def.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !29 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def, i64 %rubyId_keep_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !29 %11 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0), i64 noundef 3) #17 call void @rb_gc_register_mark_object(i64 %11) #17 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i8.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/repeated_casts.rb", align 8 - %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %11, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i8.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 6, i64* noundef nonnull %locals.i9.i, i32 noundef 0, i32 noundef 0) + %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %11, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i8.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i9.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %12, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#foo", align 8 %"rubyId_.i10.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i11.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i12.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/repeated_casts.rb", align 8 - %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i11.i", i64 %"rubyId_.i10.i", i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i12.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 4, i64* noundef nonnull %locals.i13.i, i32 noundef 0, i32 noundef 4) + %13 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i11.i", i64 %"rubyId_.i10.i", i64 %"rubyStr_test/testdata/compiler/repeated_casts.rb.i12.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i13.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %13, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %rubyId_keep_def4.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !43 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.2, i64 %rubyId_keep_def4.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !43 + %rubyId_keep_def4.i = load i64, i64* @rubyIdPrecomputed_keep_def, align 8, !dbg !31 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_def.2, i64 %rubyId_keep_def4.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !31 %14 = bitcast i64* %positional_table.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %14) %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 @@ -321,140 +319,116 @@ entry: %16 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %15, i64 0, i32 2 %17 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %16, align 8, !tbaa !14 %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %18, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %18, align 8, !tbaa !33 %19 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 4 - %20 = load i64*, i64** %19, align 8, !tbaa !45 + %20 = load i64*, i64** %19, align 8, !tbaa !34 %21 = load i64, i64* %20, align 8, !tbaa !4 %22 = and i64 %21, -33 store i64 %22, i64* %20, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %15, %struct.rb_control_frame_struct* align 8 %17, %struct.rb_iseq_struct* %stackFrame.i) #17 %23 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %17, i64 0, i32 0 - %24 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %18, align 8, !tbaa !18 - %25 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %24, i64 0, i32 2 - %26 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %25, align 8, !tbaa !20 - %27 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %26, i64 0, i32 2 - %28 = load i64*, i64** %27, align 8, !tbaa !22 - %29 = getelementptr inbounds i64, i64* %28, i64 3 - %30 = getelementptr inbounds i64, i64* %29, i64 1 - store i64* %30, i64** %23, align 8, !dbg !46, !tbaa !12 - %31 = load i64, i64* @rb_cObject, align 8, !dbg !47 - %32 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %31) #17, !dbg !47 - call void @sorbet_pushStaticInitFrame(i64 %32) #17, !dbg !47 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %23, align 8, !dbg !35, !tbaa !12 + %24 = load i64, i64* @rb_cObject, align 8, !dbg !36 + %25 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %24) #17, !dbg !36 + call void @sorbet_pushStaticInitFrame(i64 %25) #17, !dbg !36 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %33 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 - %34 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %33, i64 0, i32 2 - %35 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %34, align 8, !tbaa !14 - %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %36, align 8, !tbaa !18 - %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 4 - %38 = load i64*, i64** %37, align 8, !tbaa !45 - %39 = load i64, i64* %38, align 8, !tbaa !4 - %40 = and i64 %39, -33 - store i64 %40, i64* %38, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %33, %struct.rb_control_frame_struct* align 8 %35, %struct.rb_iseq_struct* %stackFrame.i.i) #17 - %41 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %35, i64 0, i32 0 - %42 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %36, align 8, !tbaa !18 - %43 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %42, i64 0, i32 2 - %44 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %43, align 8, !tbaa !20 - %45 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %44, i64 0, i32 2 - %46 = load i64*, i64** %45, align 8, !tbaa !22 - %47 = getelementptr inbounds i64, i64* %46, i64 1 - %48 = getelementptr inbounds i64, i64* %47, i64 1, !dbg !48 - store i64* %48, i64** %41, align 8, !dbg !48, !tbaa !12 - %rubyId_foo.i.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !50 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i1) #17, !dbg !50 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !50 - %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #17, !dbg !50 - %49 = load i64, i64* @guard_epoch_A, align 8, !dbg !50 - %50 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !50, !tbaa !35 - %needTakeSlowPath = icmp ne i64 %49, %50, !dbg !50 - br i1 %needTakeSlowPath, label %51, label %52, !dbg !50, !prof !37 - -51: ; preds = %entry - call void @const_recompute_A(), !dbg !50 - br label %52, !dbg !50 - -52: ; preds = %entry, %51 - %53 = load i64, i64* @guarded_const_A, align 8, !dbg !50 - %54 = load i64, i64* @guard_epoch_A, align 8, !dbg !50 - %55 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !50, !tbaa !35 - %guardUpdated = icmp eq i64 %54, %55, !dbg !50 - call void @llvm.assume(i1 %guardUpdated), !dbg !50 - %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#foo", align 8, !dbg !50 - %56 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !50 - %57 = bitcast i8* %56 to i16*, !dbg !50 - %58 = load i16, i16* %57, align 8, !dbg !50 - %59 = and i16 %58, -384, !dbg !50 - store i16 %59, i16* %57, align 8, !dbg !50 - %60 = getelementptr inbounds i8, i8* %56, i64 4, !dbg !50 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %60, i8 0, i64 28, i1 false) #17, !dbg !50 - %61 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !50 - %62 = bitcast i8* %56 to %struct.rb_sorbet_param_struct*, !dbg !50 - %63 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !50 - call void @rb_add_method_sorbet(i64 %53, i64 %61, i64 (i32, i64*, i64)* noundef @"func_A#foo", %struct.rb_sorbet_param_struct* nonnull %62, i32 noundef 1, i8* %63) #17, !dbg !50 - call void @sorbet_popRubyStack() #17, !dbg !47 - %64 = getelementptr inbounds i64, i64* %28, i64 7, !dbg !47 - %65 = getelementptr inbounds i64, i64* %64, i64 1, !dbg !47 - store i64* %65, i64** %23, align 8, !dbg !47, !tbaa !12 - %rubyId_doubleCast.i = load i64, i64* @rubyIdPrecomputed_doubleCast, align 8, !dbg !41 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_doubleCast.i) #17, !dbg !41 - %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !41 - %rawSym16.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #17, !dbg !41 - %stackFrame18.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#doubleCast", align 8, !dbg !41 - %66 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !41 - %67 = bitcast i8* %66 to i16*, !dbg !41 - %68 = load i16, i16* %67, align 8, !dbg !41 - %69 = and i16 %68, -384, !dbg !41 - %70 = or i16 %69, 1, !dbg !41 - store i16 %70, i16* %67, align 8, !dbg !41 - %71 = getelementptr inbounds i8, i8* %66, i64 8, !dbg !41 - %72 = bitcast i8* %71 to i32*, !dbg !41 - store i32 1, i32* %72, align 8, !dbg !41, !tbaa !51 - %73 = getelementptr inbounds i8, i8* %66, i64 12, !dbg !41 - %74 = getelementptr inbounds i8, i8* %66, i64 4, !dbg !41 - %75 = bitcast i8* %74 to i32*, !dbg !41 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %73, i8 0, i64 20, i1 false) #17, !dbg !41 - store i32 1, i32* %75, align 4, !dbg !41, !tbaa !53 - %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !41 - store i64 %rubyId_a.i, i64* %positional_table.i, align 8, !dbg !41 - %76 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !41 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %76, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %14, i64 noundef 8, i1 noundef false) #17, !dbg !41 - %77 = getelementptr inbounds i8, i8* %66, i64 32, !dbg !41 - %78 = bitcast i8* %77 to i8**, !dbg !41 - store i8* %76, i8** %78, align 8, !dbg !41, !tbaa !54 - %79 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_doubleCast, i64 0, i64 0)) #17, !dbg !41 - %80 = bitcast i8* %66 to %struct.rb_sorbet_param_struct*, !dbg !41 - %81 = bitcast %struct.rb_iseq_struct* %stackFrame18.i to i8*, !dbg !41 - call void @rb_add_method_sorbet(i64 %31, i64 %79, i64 (i32, i64*, i64)* noundef @"func_Object#doubleCast", %struct.rb_sorbet_param_struct* nonnull %80, i32 noundef 1, i8* %81) #17, !dbg !41 + %26 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 + %27 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %26, i64 0, i32 2 + %28 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %27, align 8, !tbaa !14 + %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %29, align 8, !tbaa !33 + %30 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 4 + %31 = load i64*, i64** %30, align 8, !tbaa !34 + %32 = load i64, i64* %31, align 8, !tbaa !4 + %33 = and i64 %32, -33 + store i64 %33, i64* %31, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %26, %struct.rb_control_frame_struct* align 8 %28, %struct.rb_iseq_struct* %stackFrame.i.i) #17 + %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %28, i64 0, i32 0 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %34, align 8, !dbg !37, !tbaa !12 + %rubyId_foo.i.i1 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !39 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i1) #17, !dbg !39 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !39 + %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #17, !dbg !39 + %35 = load i64, i64* @guard_epoch_A, align 8, !dbg !39 + %36 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !22 + %needTakeSlowPath = icmp ne i64 %35, %36, !dbg !39 + br i1 %needTakeSlowPath, label %37, label %38, !dbg !39, !prof !24 + +37: ; preds = %entry + call void @const_recompute_A(), !dbg !39 + br label %38, !dbg !39 + +38: ; preds = %entry, %37 + %39 = load i64, i64* @guarded_const_A, align 8, !dbg !39 + %40 = load i64, i64* @guard_epoch_A, align 8, !dbg !39 + %41 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !39, !tbaa !22 + %guardUpdated = icmp eq i64 %40, %41, !dbg !39 + call void @llvm.assume(i1 %guardUpdated), !dbg !39 + %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#foo", align 8, !dbg !39 + %42 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !39 + %43 = bitcast i8* %42 to i16*, !dbg !39 + %44 = load i16, i16* %43, align 8, !dbg !39 + %45 = and i16 %44, -384, !dbg !39 + store i16 %45, i16* %43, align 8, !dbg !39 + %46 = getelementptr inbounds i8, i8* %42, i64 4, !dbg !39 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %46, i8 0, i64 28, i1 false) #17, !dbg !39 + %47 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !39 + %48 = bitcast i8* %42 to %struct.rb_sorbet_param_struct*, !dbg !39 + %49 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !39 + call void @rb_add_method_sorbet(i64 %39, i64 %47, i64 (i32, i64*, i64)* noundef @"func_A#foo", %struct.rb_sorbet_param_struct* nonnull %48, i32 noundef 1, i8* %49) #17, !dbg !39 + call void @sorbet_popRubyStack() #17, !dbg !36 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %23, align 8, !dbg !36, !tbaa !12 + %rubyId_doubleCast.i = load i64, i64* @rubyIdPrecomputed_doubleCast, align 8, !dbg !29 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_doubleCast.i) #17, !dbg !29 + %rubyId_normal.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !29 + %rawSym16.i = call i64 @rb_id2sym(i64 %rubyId_normal.i) #17, !dbg !29 + %stackFrame18.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Object#doubleCast", align 8, !dbg !29 + %50 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #14, !dbg !29 + %51 = bitcast i8* %50 to i16*, !dbg !29 + %52 = load i16, i16* %51, align 8, !dbg !29 + %53 = and i16 %52, -384, !dbg !29 + %54 = or i16 %53, 1, !dbg !29 + store i16 %54, i16* %51, align 8, !dbg !29 + %55 = getelementptr inbounds i8, i8* %50, i64 8, !dbg !29 + %56 = bitcast i8* %55 to i32*, !dbg !29 + store i32 1, i32* %56, align 8, !dbg !29, !tbaa !40 + %57 = getelementptr inbounds i8, i8* %50, i64 12, !dbg !29 + %58 = getelementptr inbounds i8, i8* %50, i64 4, !dbg !29 + %59 = bitcast i8* %58 to i32*, !dbg !29 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %57, i8 0, i64 20, i1 false) #17, !dbg !29 + store i32 1, i32* %59, align 4, !dbg !29, !tbaa !43 + %rubyId_a.i = load i64, i64* @rubyIdPrecomputed_a, align 8, !dbg !29 + store i64 %rubyId_a.i, i64* %positional_table.i, align 8, !dbg !29 + %60 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #14, !dbg !29 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %60, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %14, i64 noundef 8, i1 noundef false) #17, !dbg !29 + %61 = getelementptr inbounds i8, i8* %50, i64 32, !dbg !29 + %62 = bitcast i8* %61 to i8**, !dbg !29 + store i8* %60, i8** %62, align 8, !dbg !29, !tbaa !44 + %63 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_doubleCast, i64 0, i64 0)) #17, !dbg !29 + %64 = bitcast i8* %50 to %struct.rb_sorbet_param_struct*, !dbg !29 + %65 = bitcast %struct.rb_iseq_struct* %stackFrame18.i to i8*, !dbg !29 + call void @rb_add_method_sorbet(i64 %24, i64 %63, i64 (i32, i64*, i64)* noundef @"func_Object#doubleCast", %struct.rb_sorbet_param_struct* nonnull %64, i32 noundef 1, i8* %65) #17, !dbg !29 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %14) ret void } ; Function Attrs: nounwind sspreq uwtable -define noundef i64 @"func_A#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #8 !dbg !55 { +define noundef i64 @"func_A#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #8 !dbg !45 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !56 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !56, !prof !57 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !46 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !46, !prof !47 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #1, !dbg !56 - unreachable, !dbg !56 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #1, !dbg !46 + unreachable, !dbg !46 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !58 - store i64* %11, i64** %3, align 8, !dbg !58, !tbaa !12 + store i64* getelementptr inbounds ([12 x i64], [12 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !dbg !48, !tbaa !12 ret i64 8 } @@ -468,10 +442,10 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #5 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #5 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_Object#doubleCast.cold.1"(i64 %rawArg_a) unnamed_addr #11 !dbg !59 { +define internal fastcc void @"func_Object#doubleCast.cold.1"(i64 %rawArg_a) unnamed_addr #11 !dbg !49 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_a, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0)) #1, !dbg !61 - unreachable, !dbg !61 + tail call void @sorbet_cast_failure(i64 %rawArg_a, i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_T.cast, i64 0, i64 0), i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0)) #1, !dbg !51 + unreachable, !dbg !51 } ; Function Attrs: nofree nosync nounwind willreturn @@ -481,7 +455,7 @@ declare void @llvm.assume(i1 noundef) #12 define linkonce void @const_recompute_A() local_unnamed_addr #13 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !35 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !22 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -526,47 +500,37 @@ attributes #17 = { nounwind } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 8, column: 1, scope: !8) -!32 = !{!"branch_weights", i32 4001, i32 4000000} -!33 = !DILocation(line: 8, column: 16, scope: !8) -!34 = !DILocation(line: 9, column: 3, scope: !8) -!35 = !{!36, !36, i64 0} -!36 = !{!"long long", !6, i64 0} -!37 = !{!"branch_weights", i32 1, i32 10000} -!38 = !{!"branch_weights", i32 2000, i32 1} -!39 = !{!19, !13, i64 8} -!40 = !DILocation(line: 10, column: 3, scope: !8) -!41 = !DILocation(line: 8, column: 1, scope: !42) -!42 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!43 = !DILocation(line: 5, column: 3, scope: !44) -!44 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L61", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!45 = !{!19, !13, i64 32} -!46 = !DILocation(line: 0, scope: !42) -!47 = !DILocation(line: 4, column: 1, scope: !42) -!48 = !DILocation(line: 0, scope: !44, inlinedAt: !49) -!49 = distinct !DILocation(line: 4, column: 1, scope: !42) -!50 = !DILocation(line: 5, column: 3, scope: !44, inlinedAt: !49) -!51 = !{!52, !16, i64 8} -!52 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!53 = !{!52, !16, i64 4} -!54 = !{!52, !13, i64 32} -!55 = distinct !DISubprogram(name: "A#foo", linkageName: "func_A#foo", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!56 = !DILocation(line: 5, column: 3, scope: !55) -!57 = !{!"branch_weights", i32 1, i32 2000} -!58 = !DILocation(line: 0, scope: !55) -!59 = distinct !DISubprogram(name: "func_Object#doubleCast.cold.1", linkageName: "func_Object#doubleCast.cold.1", scope: null, file: !2, type: !60, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!60 = !DISubroutineType(types: !3) -!61 = !DILocation(line: 9, column: 3, scope: !59) +!18 = !DILocation(line: 8, column: 1, scope: !8) +!19 = !{!"branch_weights", i32 4001, i32 4000000} +!20 = !DILocation(line: 8, column: 16, scope: !8) +!21 = !DILocation(line: 9, column: 3, scope: !8) +!22 = !{!23, !23, i64 0} +!23 = !{!"long long", !6, i64 0} +!24 = !{!"branch_weights", i32 1, i32 10000} +!25 = !{!"branch_weights", i32 2000, i32 1} +!26 = !{!27, !13, i64 8} +!27 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!28 = !DILocation(line: 10, column: 3, scope: !8) +!29 = !DILocation(line: 8, column: 1, scope: !30) +!30 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!31 = !DILocation(line: 5, column: 3, scope: !32) +!32 = distinct !DISubprogram(name: "A.", linkageName: "func_A.L61", scope: null, file: !2, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!33 = !{!27, !13, i64 16} +!34 = !{!27, !13, i64 32} +!35 = !DILocation(line: 0, scope: !30) +!36 = !DILocation(line: 4, column: 1, scope: !30) +!37 = !DILocation(line: 0, scope: !32, inlinedAt: !38) +!38 = distinct !DILocation(line: 4, column: 1, scope: !30) +!39 = !DILocation(line: 5, column: 3, scope: !32, inlinedAt: !38) +!40 = !{!41, !16, i64 8} +!41 = !{!"rb_sorbet_param_struct", !42, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!42 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!43 = !{!41, !16, i64 4} +!44 = !{!41, !13, i64 32} +!45 = distinct !DISubprogram(name: "A#foo", linkageName: "func_A#foo", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!46 = !DILocation(line: 5, column: 3, scope: !45) +!47 = !{!"branch_weights", i32 1, i32 2000} +!48 = !DILocation(line: 0, scope: !45) +!49 = distinct !DISubprogram(name: "func_Object#doubleCast.cold.1", linkageName: "func_Object#doubleCast.cold.1", scope: null, file: !2, type: !50, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!50 = !DISubroutineType(types: !3) +!51 = !DILocation(line: 9, column: 3, scope: !49) diff --git a/test/testdata/compiler/send_with_block_param.llo.exp b/test/testdata/compiler/send_with_block_param.llo.exp index f3b34e3d439..93bf42f23ad 100644 --- a/test/testdata/compiler/send_with_block_param.llo.exp +++ b/test/testdata/compiler/send_with_block_param.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -85,7 +87,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/send_with_block_param.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/send_with_block_param.rb" = private unnamed_addr constant [48 x i8] c"test/testdata/compiler/send_with_block_param.rb\00", align 1 +@iseqEncodedArray = internal global [7 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @ruby_hashLiteral1 = internal unnamed_addr global i64 0, align 8 @rubyIdPrecomputed_unsafe = internal unnamed_addr global i64 0, align 8 @str_unsafe = private unnamed_addr constant [7 x i8] c"unsafe\00", align 1 @@ -98,7 +103,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -175,9 +182,12 @@ entry: store i64 %5, i64* @"rubyStrFrozen_", align 8 %6 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([48 x i8], [48 x i8]* @"str_test/testdata/compiler/send_with_block_param.rb", i64 0, i64 0), i64 noundef 47) #10 tail call void @rb_gc_register_mark_object(i64 %6) #10 + store i64 %6, i64* @"rubyStrFrozen_test/testdata/compiler/send_with_block_param.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 7) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %6, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 6, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 4) + %"rubyStr_test/testdata/compiler/send_with_block_param.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/send_with_block_param.rb", align 8 + %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/send_with_block_param.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %7, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %8 = bitcast [2 x i64]* %argArray.i.i to i8* call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %8) @@ -214,50 +224,41 @@ entry: store i64 %24, i64* %22, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %17, %struct.rb_control_frame_struct* align 8 %19, %struct.rb_iseq_struct* %stackFrame.i) #10 %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %19, i64 0, i32 0 - %26 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %20, align 8, !tbaa !30 - %27 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %26, i64 0, i32 2 - %28 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %27, align 8, !tbaa !33 - %29 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %28, i64 0, i32 2 - %30 = load i64*, i64** %29, align 8, !tbaa !35 - %31 = getelementptr inbounds i64, i64* %30, i64 3 - %32 = getelementptr inbounds i64, i64* %31, i64 1 - store i64* %32, i64** %25, align 8, !dbg !44, !tbaa !15 - %hashLiteral.i = load i64, i64* @ruby_hashLiteral1, align 8, !dbg !45 - %duplicatedHash.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral.i) #10, !dbg !45 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %25, align 8, !dbg !33, !tbaa !15 + %hashLiteral.i = load i64, i64* @ruby_hashLiteral1, align 8, !dbg !34 + %duplicatedHash.i = call i64 @sorbet_globalConstDupHash(i64 %hashLiteral.i) #10, !dbg !34 %callArgs0Addr.i = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i32 0, i64 0, !dbg !8 store i64 %duplicatedHash.i, i64* %callArgs0Addr.i, align 8, !dbg !8 - %33 = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i64 0, i64 0, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !46) #10, !dbg !8 - %34 = load i64, i64* %33, align 8, !dbg !8, !tbaa !4, !alias.scope !46 - %35 = getelementptr inbounds i64, i64* %30, i64 5, !dbg !8 - %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !8 - store i64* %36, i64** %25, align 8, !dbg !8, !tbaa !15 + %26 = getelementptr [4 x i64], [4 x i64]* %callArgs.i, i64 0, i64 0, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !35) #10, !dbg !8 + %27 = load i64, i64* %26, align 8, !dbg !8, !tbaa !4, !alias.scope !35 + store i64* getelementptr inbounds ([7 x i64], [7 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %25, align 8, !dbg !8, !tbaa !15 store i64 3, i64* %callArgs0Addr.i, align 8, !dbg !13 - call void @llvm.experimental.noalias.scope.decl(metadata !49) #10, !dbg !13 - %37 = call i64 @rb_ary_new_from_values(i64 noundef 1, i64* noundef nonnull %33) #10, !dbg !13 + call void @llvm.experimental.noalias.scope.decl(metadata !38) #10, !dbg !13 + %28 = call i64 @rb_ary_new_from_values(i64 noundef 1, i64* noundef nonnull %26) #10, !dbg !13 %rubyId_map.i1 = load i64, i64* @rubyIdPrecomputed_map, align 8, !dbg !13 %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_map.i1) #10, !dbg !13 - %38 = call i64 @rb_intern2(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i64 0, i64 0), i64 noundef 7) #10, !dbg !13 - %39 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_makeBlockHandlerProc.rb_funcallv_data, i64 %34, i64 %38, i32 noundef 0, i64* noundef null) #10, !dbg !13 - %40 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !15 - %41 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %40, i64 0, i32 2, !dbg !13 - %42 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %41, align 8, !dbg !13, !tbaa !27 - %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %42, i64 0, i32 1, !dbg !13 - %44 = load i64*, i64** %43, align 8, !dbg !13, !tbaa !52 - %45 = getelementptr inbounds i64, i64* %44, i64 1, !dbg !13 - store i64* %45, i64** %43, align 8, !dbg !13, !tbaa !52 - store i64 %37, i64* %44, align 8, !dbg !13, !tbaa !4 - %send37.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_map, i64 %39) #10, !dbg !13 - %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !15 - %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !14 - %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !14, !tbaa !27 - %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 1, !dbg !14 - %50 = load i64*, i64** %49, align 8, !dbg !14, !tbaa !52 - %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !14 - store i64 %15, i64* %50, align 8, !dbg !14, !tbaa !4 - %52 = getelementptr inbounds i64, i64* %51, i64 1, !dbg !14 - store i64* %52, i64** %49, align 8, !dbg !14, !tbaa !52 - store i64 %send37.i, i64* %51, align 8, !dbg !14, !tbaa !4 + %29 = call i64 @rb_intern2(i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i64 0, i64 0), i64 noundef 7) #10, !dbg !13 + %30 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_makeBlockHandlerProc.rb_funcallv_data, i64 %27, i64 %29, i32 noundef 0, i64* noundef null) #10, !dbg !13 + %31 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !15 + %32 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %31, i64 0, i32 2, !dbg !13 + %33 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %32, align 8, !dbg !13, !tbaa !27 + %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 1, !dbg !13 + %35 = load i64*, i64** %34, align 8, !dbg !13, !tbaa !41 + %36 = getelementptr inbounds i64, i64* %35, i64 1, !dbg !13 + store i64* %36, i64** %34, align 8, !dbg !13, !tbaa !41 + store i64 %28, i64* %35, align 8, !dbg !13, !tbaa !4 + %send37.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_map, i64 %30) #10, !dbg !13 + %37 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !15 + %38 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %37, i64 0, i32 2, !dbg !14 + %39 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %38, align 8, !dbg !14, !tbaa !27 + %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %39, i64 0, i32 1, !dbg !14 + %41 = load i64*, i64** %40, align 8, !dbg !14, !tbaa !41 + %42 = getelementptr inbounds i64, i64* %41, i64 1, !dbg !14 + store i64 %15, i64* %41, align 8, !dbg !14, !tbaa !4 + %43 = getelementptr inbounds i64, i64* %42, i64 1, !dbg !14 + store i64* %43, i64** %40, align 8, !dbg !14, !tbaa !41 + store i64 %send37.i, i64* %42, align 8, !dbg !14, !tbaa !4 %send43.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !14 call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %16) ret void @@ -320,23 +321,12 @@ attributes #10 = { nounwind } !30 = !{!31, !16, i64 16} !31 = !{!"rb_control_frame_struct", !16, i64 0, !16, i64 8, !16, i64 16, !5, i64 24, !16, i64 32, !16, i64 40, !16, i64 48} !32 = !{!31, !16, i64 32} -!33 = !{!34, !16, i64 16} -!34 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !16, i64 16, !6, i64 24} -!35 = !{!36, !16, i64 8} -!36 = !{!"rb_iseq_constant_body", !6, i64 0, !22, i64 4, !16, i64 8, !37, i64 16, !39, i64 64, !42, i64 120, !16, i64 152, !16, i64 160, !16, i64 168, !16, i64 176, !16, i64 184, !16, i64 192, !43, i64 200, !22, i64 232, !22, i64 236, !22, i64 240, !22, i64 244, !22, i64 248, !6, i64 252, !5, i64 256} -!37 = !{!"", !38, i64 0, !22, i64 4, !22, i64 8, !22, i64 12, !22, i64 16, !22, i64 20, !22, i64 24, !22, i64 28, !16, i64 32, !16, i64 40} -!38 = !{!"", !22, i64 0, !22, i64 0, !22, i64 0, !22, i64 0, !22, i64 0, !22, i64 0, !22, i64 0, !22, i64 0, !22, i64 1, !22, i64 1} -!39 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !22, i64 32, !40, i64 36} -!40 = !{!"rb_code_location_struct", !41, i64 0, !41, i64 8} -!41 = !{!"rb_code_position_struct", !22, i64 0, !22, i64 4} -!42 = !{!"iseq_insn_info", !16, i64 0, !16, i64 8, !22, i64 16, !16, i64 24} -!43 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !16, i64 24} -!44 = !DILocation(line: 0, scope: !9) -!45 = !DILocation(line: 4, column: 14, scope: !9) -!46 = !{!47} -!47 = distinct !{!47, !48, !"sorbet_T_unsafe: argument 0"} -!48 = distinct !{!48, !"sorbet_T_unsafe"} -!49 = !{!50} -!50 = distinct !{!50, !51, !"sorbet_buildArrayIntrinsic: argument 0"} -!51 = distinct !{!51, !"sorbet_buildArrayIntrinsic"} -!52 = !{!31, !16, i64 8} +!33 = !DILocation(line: 0, scope: !9) +!34 = !DILocation(line: 4, column: 14, scope: !9) +!35 = !{!36} +!36 = distinct !{!36, !37, !"sorbet_T_unsafe: argument 0"} +!37 = distinct !{!37, !"sorbet_T_unsafe"} +!38 = !{!39} +!39 = distinct !{!39, !40, !"sorbet_buildArrayIntrinsic: argument 0"} +!40 = distinct !{!40, !"sorbet_buildArrayIntrinsic"} +!41 = !{!31, !16, i64 8} diff --git a/test/testdata/compiler/sig_rewriter.llo.exp b/test/testdata/compiler/sig_rewriter.llo.exp index ccd021f5f57..3e4cbe64a10 100644 --- a/test/testdata/compiler/sig_rewriter.llo.exp +++ b/test/testdata/compiler/sig_rewriter.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/sig_rewriter.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/sig_rewriter.rb" = private unnamed_addr constant [39 x i8] c"test/testdata/compiler/sig_rewriter.rb\00", align 1 +@iseqEncodedArray = internal global [14 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_A = private unnamed_addr constant [2 x i8] c"A\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_new = internal unnamed_addr global i64 0, align 8 @@ -126,7 +130,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -215,9 +221,11 @@ entry: %11 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([39 x i8], [39 x i8]* @"str_test/testdata/compiler/sig_rewriter.rb", i64 0, i64 0), i64 noundef 38) #12 tail call void @rb_gc_register_mark_object(i64 %11) #12 store i64 %11, i64* @"rubyStrFrozen_test/testdata/compiler/sig_rewriter.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 14) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %11, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 13, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/sig_rewriter.rb", align 8 + %12 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %12, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !8 @@ -229,19 +237,19 @@ entry: call void @rb_gc_register_mark_object(i64 %13) #12 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i10.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/sig_rewriter.rb", align 8 - %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i10.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 10, i64* noundef nonnull %locals.i11.i, i32 noundef 0, i32 noundef 0) + %14 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %13, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i10.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i11.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %14, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#foo", align 8 %"rubyId_.i12.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i13.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i14.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/sig_rewriter.rb", align 8 - %15 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i13.i", i64 %"rubyId_.i12.i", i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 4) + %15 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i13.i", i64 %"rubyId_.i12.i", i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i14.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i15.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %15, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %16 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #12 call void @rb_gc_register_mark_object(i64 %16) #12 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i16.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/sig_rewriter.rb", align 8 - %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %16, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i16.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %17 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %16, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/compiler/sig_rewriter.rb.i16.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %17, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.$block_1", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !14 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !14 @@ -267,159 +275,133 @@ entry: store i64 %28, i64* %26, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %21, %struct.rb_control_frame_struct* align 8 %23, %struct.rb_iseq_struct* %stackFrame.i) #12 %29 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 0 - %30 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %24, align 8, !tbaa !35 - %31 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %30, i64 0, i32 2 - %32 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %31, align 8, !tbaa !38 - %33 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %32, i64 0, i32 2 - %34 = load i64*, i64** %33, align 8, !tbaa !40 - %35 = getelementptr inbounds i64, i64* %34, i64 4 - %36 = getelementptr inbounds i64, i64* %35, i64 1 - store i64* %36, i64** %29, align 8, !dbg !49, !tbaa !20 - %37 = load i64, i64* @rb_cObject, align 8, !dbg !50 - %38 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %37) #12, !dbg !50 - call void @sorbet_pushStaticInitFrame(i64 %38) #12, !dbg !50 + store i64* getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %29, align 8, !dbg !38, !tbaa !20 + %30 = load i64, i64* @rb_cObject, align 8, !dbg !39 + %31 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 %30) #12, !dbg !39 + call void @sorbet_pushStaticInitFrame(i64 %31) #12, !dbg !39 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A.", align 8 - %39 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !20 - %40 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %39, i64 0, i32 2 - %41 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %40, align 8, !tbaa !32 - %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %42, align 8, !tbaa !35 - %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 4 - %44 = load i64*, i64** %43, align 8, !tbaa !37 - %45 = load i64, i64* %44, align 8, !tbaa !4 - %46 = and i64 %45, -33 - store i64 %46, i64* %44, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %39, %struct.rb_control_frame_struct* align 8 %41, %struct.rb_iseq_struct* %stackFrame.i.i1) #12 - %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 0 - %48 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %42, align 8, !tbaa !35 - %49 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %48, i64 0, i32 2 - %50 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %49, align 8, !tbaa !38 - %51 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %50, i64 0, i32 2 - %52 = load i64*, i64** %51, align 8, !tbaa !40 - %53 = getelementptr inbounds i64, i64* %52, i64 1 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !51 - store i64* %54, i64** %47, align 8, !dbg !51, !tbaa !20 - %55 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !53 - %56 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !53, !tbaa !54 - %needTakeSlowPath = icmp ne i64 %55, %56, !dbg !53 - br i1 %needTakeSlowPath, label %57, label %58, !dbg !53, !prof !55 - -57: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !53 - br label %58, !dbg !53 - -58: ; preds = %entry, %57 - %59 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !53 - %60 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !53 - %61 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !53, !tbaa !54 - %guardUpdated = icmp eq i64 %60, %61, !dbg !53 - call void @llvm.assume(i1 %guardUpdated), !dbg !53 - %62 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !53, !tbaa !20 - %63 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %62, i64 0, i32 2, !dbg !53 - %64 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %63, align 8, !dbg !53, !tbaa !32 - %65 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %64, i64 0, i32 1, !dbg !53 - %66 = load i64*, i64** %65, align 8, !dbg !53, !tbaa !56 - %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !53 - store i64 %38, i64* %66, align 8, !dbg !53, !tbaa !4 - %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !53 - store i64* %68, i64** %65, align 8, !dbg !53, !tbaa !56 - store i64 %59, i64* %67, align 8, !dbg !53, !tbaa !4 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #12, !dbg !53 - %69 = getelementptr inbounds i64, i64* %52, i64 3, !dbg !53 - %70 = getelementptr inbounds i64, i64* %69, i64 1, !dbg !53 - store i64* %70, i64** %47, align 8, !dbg !53, !tbaa !20 - %rubyId_foo.i.i2 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !57 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i2) #12, !dbg !57 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !57 - %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #12, !dbg !57 - %71 = load i64, i64* @guard_epoch_A, align 8, !dbg !57 - %72 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !57, !tbaa !54 - %needTakeSlowPath3 = icmp ne i64 %71, %72, !dbg !57 - br i1 %needTakeSlowPath3, label %73, label %74, !dbg !57, !prof !55 - -73: ; preds = %58 - call void @const_recompute_A(), !dbg !57 - br label %74, !dbg !57 - -74: ; preds = %58, %73 - %75 = load i64, i64* @guarded_const_A, align 8, !dbg !57 - %76 = load i64, i64* @guard_epoch_A, align 8, !dbg !57 - %77 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !57, !tbaa !54 - %guardUpdated4 = icmp eq i64 %76, %77, !dbg !57 - call void @llvm.assume(i1 %guardUpdated4), !dbg !57 - %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#foo", align 8, !dbg !57 - %78 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !57 - %79 = bitcast i8* %78 to i16*, !dbg !57 - %80 = load i16, i16* %79, align 8, !dbg !57 - %81 = and i16 %80, -384, !dbg !57 - store i16 %81, i16* %79, align 8, !dbg !57 - %82 = getelementptr inbounds i8, i8* %78, i64 4, !dbg !57 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %82, i8 0, i64 28, i1 false) #12, !dbg !57 - %83 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #12, !dbg !57 - %84 = bitcast i8* %78 to %struct.rb_sorbet_param_struct*, !dbg !57 - %85 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !57 - call void @rb_add_method_sorbet(i64 %75, i64 %83, i64 (i32, i64*, i64)* noundef @"func_A#foo", %struct.rb_sorbet_param_struct* nonnull %84, i32 noundef 1, i8* %85) #12, !dbg !57 - call void @sorbet_popRubyStack() #12, !dbg !50 - %86 = getelementptr inbounds i64, i64* %34, i64 12, !dbg !50 - %87 = getelementptr inbounds i64, i64* %86, i64 1, !dbg !50 - store i64* %87, i64** %29, align 8, !dbg !50, !tbaa !20 - %88 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !20 - %89 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %88, i64 0, i32 2, !dbg !8 - %90 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %89, align 8, !dbg !8, !tbaa !32 - %91 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %90, i64 0, i32 1, !dbg !8 - %92 = load i64*, i64** %91, align 8, !dbg !8, !tbaa !56 - %93 = getelementptr inbounds i64, i64* %92, i64 1, !dbg !8 - store i64* %93, i64** %91, align 8, !dbg !8, !tbaa !56 - store i64 %75, i64* %92, align 8, !dbg !8, !tbaa !4 + %32 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !20 + %33 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %32, i64 0, i32 2 + %34 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %33, align 8, !tbaa !32 + %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %35, align 8, !tbaa !35 + %36 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 4 + %37 = load i64*, i64** %36, align 8, !tbaa !37 + %38 = load i64, i64* %37, align 8, !tbaa !4 + %39 = and i64 %38, -33 + store i64 %39, i64* %37, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %32, %struct.rb_control_frame_struct* align 8 %34, %struct.rb_iseq_struct* %stackFrame.i.i1) #12 + %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %34, i64 0, i32 0 + store i64* getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %40, align 8, !dbg !40, !tbaa !20 + %41 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !42 + %42 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !42, !tbaa !43 + %needTakeSlowPath = icmp ne i64 %41, %42, !dbg !42 + br i1 %needTakeSlowPath, label %43, label %44, !dbg !42, !prof !44 + +43: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !42 + br label %44, !dbg !42 + +44: ; preds = %entry, %43 + %45 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !42 + %46 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !42 + %47 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !42, !tbaa !43 + %guardUpdated = icmp eq i64 %46, %47, !dbg !42 + call void @llvm.assume(i1 %guardUpdated), !dbg !42 + %48 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !42, !tbaa !20 + %49 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %48, i64 0, i32 2, !dbg !42 + %50 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %49, align 8, !dbg !42, !tbaa !32 + %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %50, i64 0, i32 1, !dbg !42 + %52 = load i64*, i64** %51, align 8, !dbg !42, !tbaa !45 + %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !42 + store i64 %31, i64* %52, align 8, !dbg !42, !tbaa !4 + %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !42 + store i64* %54, i64** %51, align 8, !dbg !42, !tbaa !45 + store i64 %45, i64* %53, align 8, !dbg !42, !tbaa !4 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #12, !dbg !42 + store i64* getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %40, align 8, !dbg !42, !tbaa !20 + %rubyId_foo.i.i2 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !46 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_foo.i.i2) #12, !dbg !46 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !46 + %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #12, !dbg !46 + %55 = load i64, i64* @guard_epoch_A, align 8, !dbg !46 + %56 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !46, !tbaa !43 + %needTakeSlowPath3 = icmp ne i64 %55, %56, !dbg !46 + br i1 %needTakeSlowPath3, label %57, label %58, !dbg !46, !prof !44 + +57: ; preds = %44 + call void @const_recompute_A(), !dbg !46 + br label %58, !dbg !46 + +58: ; preds = %44, %57 + %59 = load i64, i64* @guarded_const_A, align 8, !dbg !46 + %60 = load i64, i64* @guard_epoch_A, align 8, !dbg !46 + %61 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !46, !tbaa !43 + %guardUpdated4 = icmp eq i64 %60, %61, !dbg !46 + call void @llvm.assume(i1 %guardUpdated4), !dbg !46 + %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_A#foo", align 8, !dbg !46 + %62 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !46 + %63 = bitcast i8* %62 to i16*, !dbg !46 + %64 = load i16, i16* %63, align 8, !dbg !46 + %65 = and i16 %64, -384, !dbg !46 + store i16 %65, i16* %63, align 8, !dbg !46 + %66 = getelementptr inbounds i8, i8* %62, i64 4, !dbg !46 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %66, i8 0, i64 28, i1 false) #12, !dbg !46 + %67 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #12, !dbg !46 + %68 = bitcast i8* %62 to %struct.rb_sorbet_param_struct*, !dbg !46 + %69 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !46 + call void @rb_add_method_sorbet(i64 %59, i64 %67, i64 (i32, i64*, i64)* noundef @"func_A#foo", %struct.rb_sorbet_param_struct* nonnull %68, i32 noundef 1, i8* %69) #12, !dbg !46 + call void @sorbet_popRubyStack() #12, !dbg !39 + store i64* getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %29, align 8, !dbg !39, !tbaa !20 + %70 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !20 + %71 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %70, i64 0, i32 2, !dbg !8 + %72 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %71, align 8, !dbg !8, !tbaa !32 + %73 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %72, i64 0, i32 1, !dbg !8 + %74 = load i64*, i64** %73, align 8, !dbg !8, !tbaa !45 + %75 = getelementptr inbounds i64, i64* %74, i64 1, !dbg !8 + store i64* %75, i64** %73, align 8, !dbg !8, !tbaa !45 + store i64 %59, i64* %74, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #12, !dbg !8 - %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !20 - %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2, !dbg !8 - %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !dbg !8, !tbaa !32 - %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 1, !dbg !8 - %98 = load i64*, i64** %97, align 8, !dbg !8, !tbaa !56 - %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !8 - store i64* %99, i64** %97, align 8, !dbg !8, !tbaa !56 - store i64 %send.i, i64* %98, align 8, !dbg !8, !tbaa !4 + %76 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !20 + %77 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %76, i64 0, i32 2, !dbg !8 + %78 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %77, align 8, !dbg !8, !tbaa !32 + %79 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %78, i64 0, i32 1, !dbg !8 + %80 = load i64*, i64** %79, align 8, !dbg !8, !tbaa !45 + %81 = getelementptr inbounds i64, i64* %80, i64 1, !dbg !8 + store i64* %81, i64** %79, align 8, !dbg !8, !tbaa !45 + store i64 %send.i, i64* %80, align 8, !dbg !8, !tbaa !4 %send21.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #12, !dbg !8 - %100 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !20 - %101 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %100, i64 0, i32 2, !dbg !13 - %102 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %101, align 8, !dbg !13, !tbaa !32 - %103 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %102, i64 0, i32 1, !dbg !13 - %104 = load i64*, i64** %103, align 8, !dbg !13, !tbaa !56 - %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !13 - store i64 %20, i64* %104, align 8, !dbg !13, !tbaa !4 - %106 = getelementptr inbounds i64, i64* %105, i64 1, !dbg !13 - store i64* %106, i64** %103, align 8, !dbg !13, !tbaa !56 - store i64 %send21.i, i64* %105, align 8, !dbg !13, !tbaa !4 + %82 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !20 + %83 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %82, i64 0, i32 2, !dbg !13 + %84 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %83, align 8, !dbg !13, !tbaa !32 + %85 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %84, i64 0, i32 1, !dbg !13 + %86 = load i64*, i64** %85, align 8, !dbg !13, !tbaa !45 + %87 = getelementptr inbounds i64, i64* %86, i64 1, !dbg !13 + store i64 %20, i64* %86, align 8, !dbg !13, !tbaa !4 + %88 = getelementptr inbounds i64, i64* %87, i64 1, !dbg !13 + store i64* %88, i64** %85, align 8, !dbg !13, !tbaa !45 + store i64 %send21.i, i64* %87, align 8, !dbg !13, !tbaa !4 %send27.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #12, !dbg !13 ret void } ; Function Attrs: nounwind sspreq uwtable -define noundef i64 @"func_A#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !58 { +define noundef i64 @"func_A#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !47 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !20 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !32 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !35 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !38 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !40 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !20 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !59 - br i1 %tooManyArgs, label %argCountFailBlock, label %typeTestSuccess, !dbg !59, !prof !60 + store i64* getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !tbaa !20 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !48 + br i1 %tooManyArgs, label %argCountFailBlock, label %typeTestSuccess, !dbg !48, !prof !49 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !59 - unreachable, !dbg !59 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !48 + unreachable, !dbg !48 typeTestSuccess: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !61 - store i64* %11, i64** %3, align 8, !dbg !61, !tbaa !20 + store i64* getelementptr inbounds ([14 x i64], [14 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !50, !tbaa !20 ret i64 183 } @@ -433,7 +415,7 @@ declare void @llvm.assume(i1 noundef) #8 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !54 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !43 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -442,7 +424,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #9 { define linkonce void @const_recompute_A() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @str_A, i64 0, i64 0), i64 1) store i64 %1, i64* @guarded_const_A, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !54 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !43 store i64 %2, i64* @guard_epoch_A, align 8 ret void } @@ -502,27 +484,16 @@ attributes #12 = { nounwind } !35 = !{!36, !21, i64 16} !36 = !{!"rb_control_frame_struct", !21, i64 0, !21, i64 8, !21, i64 16, !5, i64 24, !21, i64 32, !21, i64 40, !21, i64 48} !37 = !{!36, !21, i64 32} -!38 = !{!39, !21, i64 16} -!39 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !21, i64 16, !6, i64 24} -!40 = !{!41, !21, i64 8} -!41 = !{!"rb_iseq_constant_body", !6, i64 0, !27, i64 4, !21, i64 8, !42, i64 16, !44, i64 64, !47, i64 120, !21, i64 152, !21, i64 160, !21, i64 168, !21, i64 176, !21, i64 184, !21, i64 192, !48, i64 200, !27, i64 232, !27, i64 236, !27, i64 240, !27, i64 244, !27, i64 248, !6, i64 252, !5, i64 256} -!42 = !{!"", !43, i64 0, !27, i64 4, !27, i64 8, !27, i64 12, !27, i64 16, !27, i64 20, !27, i64 24, !27, i64 28, !21, i64 32, !21, i64 40} -!43 = !{!"", !27, i64 0, !27, i64 0, !27, i64 0, !27, i64 0, !27, i64 0, !27, i64 0, !27, i64 0, !27, i64 0, !27, i64 1, !27, i64 1} -!44 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !27, i64 32, !45, i64 36} -!45 = !{!"rb_code_location_struct", !46, i64 0, !46, i64 8} -!46 = !{!"rb_code_position_struct", !27, i64 0, !27, i64 4} -!47 = !{!"iseq_insn_info", !21, i64 0, !21, i64 8, !27, i64 16, !21, i64 24} -!48 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !21, i64 24} -!49 = !DILocation(line: 0, scope: !9) -!50 = !DILocation(line: 5, column: 1, scope: !9) -!51 = !DILocation(line: 7, column: 3, scope: !15, inlinedAt: !52) -!52 = distinct !DILocation(line: 5, column: 1, scope: !9) -!53 = !DILocation(line: 6, column: 3, scope: !15, inlinedAt: !52) -!54 = !{!28, !28, i64 0} -!55 = !{!"branch_weights", i32 1, i32 10000} -!56 = !{!36, !21, i64 8} -!57 = !DILocation(line: 8, column: 3, scope: !15, inlinedAt: !52) -!58 = distinct !DISubprogram(name: "A#foo", linkageName: "func_A#foo", scope: null, file: !2, line: 8, type: !10, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!59 = !DILocation(line: 8, column: 3, scope: !58) -!60 = !{!"branch_weights", i32 1, i32 2000} -!61 = !DILocation(line: 0, scope: !58) +!38 = !DILocation(line: 0, scope: !9) +!39 = !DILocation(line: 5, column: 1, scope: !9) +!40 = !DILocation(line: 7, column: 3, scope: !15, inlinedAt: !41) +!41 = distinct !DILocation(line: 5, column: 1, scope: !9) +!42 = !DILocation(line: 6, column: 3, scope: !15, inlinedAt: !41) +!43 = !{!28, !28, i64 0} +!44 = !{!"branch_weights", i32 1, i32 10000} +!45 = !{!36, !21, i64 8} +!46 = !DILocation(line: 8, column: 3, scope: !15, inlinedAt: !41) +!47 = distinct !DISubprogram(name: "A#foo", linkageName: "func_A#foo", scope: null, file: !2, line: 8, type: !10, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!48 = !DILocation(line: 8, column: 3, scope: !47) +!49 = !{!"branch_weights", i32 1, i32 2000} +!50 = !DILocation(line: 0, scope: !47) diff --git a/test/testdata/compiler/splat_assign.llo.exp b/test/testdata/compiler/splat_assign.llo.exp index 8c58bbb411f..770db681824 100644 --- a/test/testdata/compiler/splat_assign.llo.exp +++ b/test/testdata/compiler/splat_assign.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -84,7 +86,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/splat_assign.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/splat_assign.rb" = private unnamed_addr constant [39 x i8] c"test/testdata/compiler/splat_assign.rb\00", align 1 +@iseqEncodedArray = internal global [13 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"str_" = private unnamed_addr constant [14 x i8] c"\00", align 1 @"str_" = private unnamed_addr constant [15 x i8] c"\00", align 1 @"rubyIdPrecomputed_[]" = internal unnamed_addr global i64 0, align 8 @@ -104,7 +109,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"ic_[].9" = internal global %struct.FunctionInlineCache zeroinitializer @ic_puts.10 = internal global %struct.FunctionInlineCache zeroinitializer -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -175,9 +182,12 @@ entry: store i64 %5, i64* @"rubyStrFrozen_", align 8 %6 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([39 x i8], [39 x i8]* @"str_test/testdata/compiler/splat_assign.rb", i64 0, i64 0), i64 noundef 38) #10 tail call void @rb_gc_register_mark_object(i64 %6) #10 + store i64 %6, i64* @"rubyStrFrozen_test/testdata/compiler/splat_assign.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 13) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %6, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 12, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 8) + %"rubyStr_test/testdata/compiler/splat_assign.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/splat_assign.rb", align 8 + %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/splat_assign.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 8) store %struct.rb_iseq_struct* %7, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_[].i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_[]", i64 %"rubyId_[].i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !8 @@ -221,446 +231,429 @@ entry: store i64 %19, i64* %17, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %12, %struct.rb_control_frame_struct* align 8 %14, %struct.rb_iseq_struct* %stackFrame.i) #10 %20 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %14, i64 0, i32 0 - %21 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %15, align 8, !tbaa !33 - %22 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %21, i64 0, i32 2 - %23 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %22, align 8, !tbaa !36 - %24 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %23, i64 0, i32 2 - %25 = load i64*, i64** %24, align 8, !tbaa !38 - %26 = getelementptr inbounds i64, i64* %25, i64 4 - %27 = getelementptr inbounds i64, i64* %26, i64 1 - store i64* %27, i64** %20, align 8, !dbg !47, !tbaa !18 - %callArgs0Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 0, !dbg !48 - %callArgs1Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 1, !dbg !48 - %callArgs2Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 2, !dbg !48 - %28 = bitcast i64* %callArgs0Addr.i to <4 x i64>*, !dbg !48 - store <4 x i64> , <4 x i64>* %28, align 8, !dbg !48 - %callArgs4Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 4, !dbg !48 - %29 = bitcast i64* %callArgs4Addr.i to <2 x i64>*, !dbg !48 - store <2 x i64> , <2 x i64>* %29, align 8, !dbg !48 - %callArgs6Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 6, !dbg !48 - store i64 15, i64* %callArgs6Addr.i, align 8, !dbg !48 - %30 = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i64 0, i64 0, !dbg !48 - call void @llvm.experimental.noalias.scope.decl(metadata !49) #10, !dbg !48 - %31 = call i64 @rb_ary_new_from_values(i64 noundef 7, i64* noundef nonnull align 8 %30) #10, !dbg !48 - store i64 %31, i64* %callArgs0Addr.i, align 8, !dbg !8 - %32 = bitcast i64* %callArgs1Addr.i to <2 x i64>*, !dbg !8 - store <2 x i64> , <2 x i64>* %32, align 8, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !52) #10, !dbg !8 - %33 = load i64, i64* %30, align 8, !dbg !8, !tbaa !4, !alias.scope !52 - %34 = getelementptr inbounds i64, i64* %30, i64 1, !dbg !8 - %35 = getelementptr inbounds i64, i64* %30, i64 2, !dbg !8 - %36 = call i64 @sorbet_vm_expandSplatIntrinsic(i64 %33, i64 3, i64 5) #10, !dbg !8, !noalias !52 - %37 = and i64 %36, 7, !dbg !8 - %38 = icmp ne i64 %37, 0, !dbg !8 - %39 = and i64 %36, -9, !dbg !8 - %40 = icmp eq i64 %39, 0, !dbg !8 - %41 = or i1 %38, %40, !dbg !8 - br i1 %41, label %"alternativeCallIntrinsic_Array_[]144.i", label %sorbet_isa_Array.exit2.i, !dbg !8, !prof !55 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %20, align 8, !dbg !36, !tbaa !18 + %callArgs0Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 0, !dbg !37 + %callArgs1Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 1, !dbg !37 + %callArgs2Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 2, !dbg !37 + %21 = bitcast i64* %callArgs0Addr.i to <4 x i64>*, !dbg !37 + store <4 x i64> , <4 x i64>* %21, align 8, !dbg !37 + %callArgs4Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 4, !dbg !37 + %22 = bitcast i64* %callArgs4Addr.i to <2 x i64>*, !dbg !37 + store <2 x i64> , <2 x i64>* %22, align 8, !dbg !37 + %callArgs6Addr.i = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i32 0, i64 6, !dbg !37 + store i64 15, i64* %callArgs6Addr.i, align 8, !dbg !37 + %23 = getelementptr [8 x i64], [8 x i64]* %callArgs.i, i64 0, i64 0, !dbg !37 + call void @llvm.experimental.noalias.scope.decl(metadata !38) #10, !dbg !37 + %24 = call i64 @rb_ary_new_from_values(i64 noundef 7, i64* noundef nonnull align 8 %23) #10, !dbg !37 + store i64 %24, i64* %callArgs0Addr.i, align 8, !dbg !8 + %25 = bitcast i64* %callArgs1Addr.i to <2 x i64>*, !dbg !8 + store <2 x i64> , <2 x i64>* %25, align 8, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !41) #10, !dbg !8 + %26 = load i64, i64* %23, align 8, !dbg !8, !tbaa !4, !alias.scope !41 + %27 = getelementptr inbounds i64, i64* %23, i64 1, !dbg !8 + %28 = getelementptr inbounds i64, i64* %23, i64 2, !dbg !8 + %29 = call i64 @sorbet_vm_expandSplatIntrinsic(i64 %26, i64 3, i64 5) #10, !dbg !8, !noalias !41 + %30 = and i64 %29, 7, !dbg !8 + %31 = icmp ne i64 %30, 0, !dbg !8 + %32 = and i64 %29, -9, !dbg !8 + %33 = icmp eq i64 %32, 0, !dbg !8 + %34 = or i1 %31, %33, !dbg !8 + br i1 %34, label %"alternativeCallIntrinsic_Array_[]144.i", label %sorbet_isa_Array.exit2.i, !dbg !8, !prof !44 sorbet_isa_Array.exit2.i: ; preds = %entry - %42 = inttoptr i64 %36 to %struct.iseq_inline_iv_cache_entry*, !dbg !8 - %43 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %42, i64 0, i32 0, !dbg !8 - %44 = load i64, i64* %43, align 8, !dbg !8, !tbaa !56 - %45 = and i64 %44, 31, !dbg !8 - %46 = icmp eq i64 %45, 7, !dbg !8 - br i1 %46, label %"fastSymCallIntrinsic_Array_[].i", label %"alternativeCallIntrinsic_Array_[]144.i", !dbg !8, !prof !58 + %35 = inttoptr i64 %29 to %struct.iseq_inline_iv_cache_entry*, !dbg !8 + %36 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %35, i64 0, i32 0, !dbg !8 + %37 = load i64, i64* %36, align 8, !dbg !8, !tbaa !45 + %38 = and i64 %37, 31, !dbg !8 + %39 = icmp eq i64 %38, 7, !dbg !8 + br i1 %39, label %"fastSymCallIntrinsic_Array_[].i", label %"alternativeCallIntrinsic_Array_[]144.i", !dbg !8, !prof !47 "fastSymCallIntrinsic_Array_[].i": ; preds = %sorbet_isa_Array.exit2.i %"rubyId_[].i1" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !8 store i64 1, i64* %callArgs0Addr.i, align 8, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !59) #10, !dbg !8 - %47 = load i64, i64* %30, align 8, !dbg !8, !tbaa !4, !alias.scope !59 - %48 = and i64 %47, 1, !dbg !8 - %49 = icmp eq i64 %48, 0, !dbg !8 - br i1 %49, label %53, label %50, !dbg !8, !prof !62 - -50: ; preds = %"fastSymCallIntrinsic_Array_[].i" - %51 = ashr i64 %47, 1, !dbg !8 - %52 = call i64 @rb_ary_entry(i64 %36, i64 %51) #10, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !48) #10, !dbg !8 + %40 = load i64, i64* %23, align 8, !dbg !8, !tbaa !4, !alias.scope !48 + %41 = and i64 %40, 1, !dbg !8 + %42 = icmp eq i64 %41, 0, !dbg !8 + br i1 %42, label %46, label %43, !dbg !8, !prof !51 + +43: ; preds = %"fastSymCallIntrinsic_Array_[].i" + %44 = ashr i64 %40, 1, !dbg !8 + %45 = call i64 @rb_ary_entry(i64 %29, i64 %44) #10, !dbg !8 br label %"fastSymCallIntrinsic_Array_[]129.i", !dbg !8 -53: ; preds = %"fastSymCallIntrinsic_Array_[].i" - %54 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %36, i64 %"rubyId_[].i1", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !8 +46: ; preds = %"fastSymCallIntrinsic_Array_[].i" + %47 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %29, i64 %"rubyId_[].i1", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !8 br label %"fastSymCallIntrinsic_Array_[]129.i", !dbg !8 -"fastSymCallIntrinsic_Array_[]129.i": ; preds = %53, %50 - %"symIntrinsicRawPhi_[].ph.i" = phi i64 [ %52, %50 ], [ %54, %53 ] +"fastSymCallIntrinsic_Array_[]129.i": ; preds = %46, %43 + %"symIntrinsicRawPhi_[].ph.i" = phi i64 [ %45, %43 ], [ %47, %46 ] %"rubyId_[]132.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !8 store i64 -3, i64* %callArgs0Addr.i, align 8, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !63) #10, !dbg !8 - %55 = load i64, i64* %30, align 8, !dbg !8, !tbaa !4, !alias.scope !63 - %56 = and i64 %55, 1, !dbg !8 - %57 = icmp eq i64 %56, 0, !dbg !8 - br i1 %57, label %61, label %58, !dbg !8, !prof !62 - -58: ; preds = %"fastSymCallIntrinsic_Array_[]129.i" - %59 = ashr i64 %55, 1, !dbg !8 - %60 = call i64 @rb_ary_entry(i64 %36, i64 %59) #10, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !52) #10, !dbg !8 + %48 = load i64, i64* %23, align 8, !dbg !8, !tbaa !4, !alias.scope !52 + %49 = and i64 %48, 1, !dbg !8 + %50 = icmp eq i64 %49, 0, !dbg !8 + br i1 %50, label %54, label %51, !dbg !8, !prof !51 + +51: ; preds = %"fastSymCallIntrinsic_Array_[]129.i" + %52 = ashr i64 %48, 1, !dbg !8 + %53 = call i64 @rb_ary_entry(i64 %29, i64 %52) #10, !dbg !8 br label %"fastSymCallIntrinsic_Array_[]145.i", !dbg !8 -61: ; preds = %"fastSymCallIntrinsic_Array_[]129.i" - %62 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %36, i64 %"rubyId_[]132.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !8 +54: ; preds = %"fastSymCallIntrinsic_Array_[]129.i" + %55 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %29, i64 %"rubyId_[]132.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !8 br label %"fastSymCallIntrinsic_Array_[]145.i", !dbg !8 -afterSend142.i: ; preds = %116, %113, %"alternativeCallIntrinsic_Array_[]144.i" - %"symIntrinsicRawPhi_[]12710.i" = phi i64 [ %send140.i, %"alternativeCallIntrinsic_Array_[]144.i" ], [ %"symIntrinsicRawPhi_[]127.ph.i", %116 ], [ %"symIntrinsicRawPhi_[]127.ph.i", %113 ] - %"symIntrinsicRawPhi_[]48.i" = phi i64 [ %send.i, %"alternativeCallIntrinsic_Array_[]144.i" ], [ %"symIntrinsicRawPhi_[].ph.i", %116 ], [ %"symIntrinsicRawPhi_[].ph.i", %113 ] - %"symIntrinsicRawPhi_[]143.i" = phi i64 [ %send156.i, %"alternativeCallIntrinsic_Array_[]144.i" ], [ %117, %116 ], [ %115, %113 ], !dbg !8 - %63 = getelementptr inbounds i64, i64* %25, i64 5, !dbg !47 - %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !47 - store i64* %64, i64** %20, align 8, !dbg !47, !tbaa !18 - store i64 %"symIntrinsicRawPhi_[]48.i", i64* %callArgs0Addr.i, align 8, !dbg !66 - store i64 %"symIntrinsicRawPhi_[]12710.i", i64* %callArgs1Addr.i, align 8, !dbg !66 - store i64 %"symIntrinsicRawPhi_[]143.i", i64* %callArgs2Addr.i, align 8, !dbg !66 - call void @llvm.experimental.noalias.scope.decl(metadata !67) #10, !dbg !66 - %65 = call i64 @rb_ary_new_from_values(i64 noundef 3, i64* noundef nonnull %30) #10, !dbg !66 - %66 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !18 - %67 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %66, i64 0, i32 2, !dbg !13 - %68 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %67, align 8, !dbg !13, !tbaa !30 - %69 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %68, i64 0, i32 1, !dbg !13 - %70 = load i64*, i64** %69, align 8, !dbg !13, !tbaa !70 - %71 = getelementptr inbounds i64, i64* %70, i64 1, !dbg !13 - store i64 %10, i64* %70, align 8, !dbg !13, !tbaa !4 - %72 = getelementptr inbounds i64, i64* %71, i64 1, !dbg !13 - store i64* %72, i64** %69, align 8, !dbg !13, !tbaa !70 - store i64 %65, i64* %71, align 8, !dbg !13, !tbaa !4 +afterSend142.i: ; preds = %105, %102, %"alternativeCallIntrinsic_Array_[]144.i" + %"symIntrinsicRawPhi_[]12710.i" = phi i64 [ %send140.i, %"alternativeCallIntrinsic_Array_[]144.i" ], [ %"symIntrinsicRawPhi_[]127.ph.i", %105 ], [ %"symIntrinsicRawPhi_[]127.ph.i", %102 ] + %"symIntrinsicRawPhi_[]48.i" = phi i64 [ %send.i, %"alternativeCallIntrinsic_Array_[]144.i" ], [ %"symIntrinsicRawPhi_[].ph.i", %105 ], [ %"symIntrinsicRawPhi_[].ph.i", %102 ] + %"symIntrinsicRawPhi_[]143.i" = phi i64 [ %send156.i, %"alternativeCallIntrinsic_Array_[]144.i" ], [ %106, %105 ], [ %104, %102 ], !dbg !8 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %20, align 8, !dbg !36, !tbaa !18 + store i64 %"symIntrinsicRawPhi_[]48.i", i64* %callArgs0Addr.i, align 8, !dbg !55 + store i64 %"symIntrinsicRawPhi_[]12710.i", i64* %callArgs1Addr.i, align 8, !dbg !55 + store i64 %"symIntrinsicRawPhi_[]143.i", i64* %callArgs2Addr.i, align 8, !dbg !55 + call void @llvm.experimental.noalias.scope.decl(metadata !56) #10, !dbg !55 + %56 = call i64 @rb_ary_new_from_values(i64 noundef 3, i64* noundef nonnull %23) #10, !dbg !55 + %57 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !18 + %58 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %57, i64 0, i32 2, !dbg !13 + %59 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %58, align 8, !dbg !13, !tbaa !30 + %60 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %59, i64 0, i32 1, !dbg !13 + %61 = load i64*, i64** %60, align 8, !dbg !13, !tbaa !59 + %62 = getelementptr inbounds i64, i64* %61, i64 1, !dbg !13 + store i64 %10, i64* %61, align 8, !dbg !13, !tbaa !4 + %63 = getelementptr inbounds i64, i64* %62, i64 1, !dbg !13 + store i64* %63, i64** %60, align 8, !dbg !13, !tbaa !59 + store i64 %56, i64* %62, align 8, !dbg !13, !tbaa !4 %send173.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !13 - %73 = getelementptr inbounds i64, i64* %25, i64 7, !dbg !13 - %74 = getelementptr inbounds i64, i64* %73, i64 1, !dbg !13 - store i64* %74, i64** %20, align 8, !dbg !13, !tbaa !18 - %75 = bitcast i64* %callArgs0Addr.i to <2 x i64>*, !dbg !71 - store <2 x i64> , <2 x i64>* %75, align 8, !dbg !71 - call void @llvm.experimental.noalias.scope.decl(metadata !72) #10, !dbg !71 - %76 = call i64 @rb_ary_new_from_values(i64 noundef 2, i64* noundef nonnull %30) #10, !dbg !71 - store i64 %76, i64* %callArgs0Addr.i, align 8, !dbg !14 - store <2 x i64> , <2 x i64>* %32, align 8, !dbg !14 - call void @llvm.experimental.noalias.scope.decl(metadata !75) #10, !dbg !14 - %77 = load i64, i64* %30, align 8, !dbg !14, !tbaa !4, !alias.scope !75 - %78 = call i64 @sorbet_vm_expandSplatIntrinsic(i64 %77, i64 3, i64 5) #10, !dbg !14, !noalias !75 - %79 = and i64 %78, 7, !dbg !14 - %80 = icmp ne i64 %79, 0, !dbg !14 - %81 = and i64 %78, -9, !dbg !14 - %82 = icmp eq i64 %81, 0, !dbg !14 - %83 = or i1 %80, %82, !dbg !14 - br i1 %83, label %"alternativeCallIntrinsic_Array_[]233.i", label %sorbet_isa_Array.exit1.i, !dbg !14, !prof !55 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %20, align 8, !dbg !13, !tbaa !18 + %64 = bitcast i64* %callArgs0Addr.i to <2 x i64>*, !dbg !60 + store <2 x i64> , <2 x i64>* %64, align 8, !dbg !60 + call void @llvm.experimental.noalias.scope.decl(metadata !61) #10, !dbg !60 + %65 = call i64 @rb_ary_new_from_values(i64 noundef 2, i64* noundef nonnull %23) #10, !dbg !60 + store i64 %65, i64* %callArgs0Addr.i, align 8, !dbg !14 + store <2 x i64> , <2 x i64>* %25, align 8, !dbg !14 + call void @llvm.experimental.noalias.scope.decl(metadata !64) #10, !dbg !14 + %66 = load i64, i64* %23, align 8, !dbg !14, !tbaa !4, !alias.scope !64 + %67 = call i64 @sorbet_vm_expandSplatIntrinsic(i64 %66, i64 3, i64 5) #10, !dbg !14, !noalias !64 + %68 = and i64 %67, 7, !dbg !14 + %69 = icmp ne i64 %68, 0, !dbg !14 + %70 = and i64 %67, -9, !dbg !14 + %71 = icmp eq i64 %70, 0, !dbg !14 + %72 = or i1 %69, %71, !dbg !14 + br i1 %72, label %"alternativeCallIntrinsic_Array_[]233.i", label %sorbet_isa_Array.exit1.i, !dbg !14, !prof !44 sorbet_isa_Array.exit1.i: ; preds = %afterSend142.i - %84 = inttoptr i64 %78 to %struct.iseq_inline_iv_cache_entry*, !dbg !14 - %85 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %84, i64 0, i32 0, !dbg !14 - %86 = load i64, i64* %85, align 8, !dbg !14, !tbaa !56 - %87 = and i64 %86, 31, !dbg !14 - %88 = icmp eq i64 %87, 7, !dbg !14 - br i1 %88, label %"fastSymCallIntrinsic_Array_[]202.i", label %"alternativeCallIntrinsic_Array_[]233.i", !dbg !14, !prof !58 + %73 = inttoptr i64 %67 to %struct.iseq_inline_iv_cache_entry*, !dbg !14 + %74 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %73, i64 0, i32 0, !dbg !14 + %75 = load i64, i64* %74, align 8, !dbg !14, !tbaa !45 + %76 = and i64 %75, 31, !dbg !14 + %77 = icmp eq i64 %76, 7, !dbg !14 + br i1 %77, label %"fastSymCallIntrinsic_Array_[]202.i", label %"alternativeCallIntrinsic_Array_[]233.i", !dbg !14, !prof !47 "alternativeCallIntrinsic_Array_[]144.i": ; preds = %sorbet_isa_Array.exit2.i, %entry - %89 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !18 - %90 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %89, i64 0, i32 2, !dbg !8 - %91 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %90, align 8, !dbg !8, !tbaa !30 - %92 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %91, i64 0, i32 1, !dbg !8 - %93 = load i64*, i64** %92, align 8, !dbg !8, !tbaa !70 - %94 = getelementptr inbounds i64, i64* %93, i64 1, !dbg !8 - store i64 %36, i64* %93, align 8, !dbg !8, !tbaa !4 - %95 = getelementptr inbounds i64, i64* %94, i64 1, !dbg !8 - store i64* %95, i64** %92, align 8, !dbg !8, !tbaa !70 - store i64 1, i64* %94, align 8, !dbg !8, !tbaa !4 + %78 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !18 + %79 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %78, i64 0, i32 2, !dbg !8 + %80 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %79, align 8, !dbg !8, !tbaa !30 + %81 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %80, i64 0, i32 1, !dbg !8 + %82 = load i64*, i64** %81, align 8, !dbg !8, !tbaa !59 + %83 = getelementptr inbounds i64, i64* %82, i64 1, !dbg !8 + store i64 %29, i64* %82, align 8, !dbg !8, !tbaa !4 + %84 = getelementptr inbounds i64, i64* %83, i64 1, !dbg !8 + store i64* %84, i64** %81, align 8, !dbg !8, !tbaa !59 + store i64 1, i64* %83, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[]", i64 0) #10, !dbg !8 - %96 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !18 - %97 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %96, i64 0, i32 2, !dbg !8 - %98 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %97, align 8, !dbg !8, !tbaa !30 - %99 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %98, i64 0, i32 1, !dbg !8 - %100 = load i64*, i64** %99, align 8, !dbg !8, !tbaa !70 - %101 = getelementptr inbounds i64, i64* %100, i64 1, !dbg !8 - store i64 %36, i64* %100, align 8, !dbg !8, !tbaa !4 - %102 = getelementptr inbounds i64, i64* %101, i64 1, !dbg !8 - store i64* %102, i64** %99, align 8, !dbg !8, !tbaa !70 - store i64 -3, i64* %101, align 8, !dbg !8, !tbaa !4 + %85 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !18 + %86 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %85, i64 0, i32 2, !dbg !8 + %87 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %86, align 8, !dbg !8, !tbaa !30 + %88 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %87, i64 0, i32 1, !dbg !8 + %89 = load i64*, i64** %88, align 8, !dbg !8, !tbaa !59 + %90 = getelementptr inbounds i64, i64* %89, i64 1, !dbg !8 + store i64 %29, i64* %89, align 8, !dbg !8, !tbaa !4 + %91 = getelementptr inbounds i64, i64* %90, i64 1, !dbg !8 + store i64* %91, i64** %88, align 8, !dbg !8, !tbaa !59 + store i64 -3, i64* %90, align 8, !dbg !8, !tbaa !4 %send140.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].1", i64 0) #10, !dbg !8 - %103 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !18 - %104 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %103, i64 0, i32 2, !dbg !8 - %105 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %104, align 8, !dbg !8, !tbaa !30 - %106 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %105, i64 0, i32 1, !dbg !8 - %107 = load i64*, i64** %106, align 8, !dbg !8, !tbaa !70 - %108 = getelementptr inbounds i64, i64* %107, i64 1, !dbg !8 - store i64 %36, i64* %107, align 8, !dbg !8, !tbaa !4 - %109 = getelementptr inbounds i64, i64* %108, i64 1, !dbg !8 - store i64* %109, i64** %106, align 8, !dbg !8, !tbaa !70 - store i64 -1, i64* %108, align 8, !dbg !8, !tbaa !4 + %92 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !18 + %93 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %92, i64 0, i32 2, !dbg !8 + %94 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %93, align 8, !dbg !8, !tbaa !30 + %95 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %94, i64 0, i32 1, !dbg !8 + %96 = load i64*, i64** %95, align 8, !dbg !8, !tbaa !59 + %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !8 + store i64 %29, i64* %96, align 8, !dbg !8, !tbaa !4 + %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !8 + store i64* %98, i64** %95, align 8, !dbg !8, !tbaa !59 + store i64 -1, i64* %97, align 8, !dbg !8, !tbaa !4 %send156.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].2", i64 0) #10, !dbg !8 br label %afterSend142.i, !dbg !8 -"fastSymCallIntrinsic_Array_[]145.i": ; preds = %61, %58 - %"symIntrinsicRawPhi_[]127.ph.i" = phi i64 [ %60, %58 ], [ %62, %61 ] +"fastSymCallIntrinsic_Array_[]145.i": ; preds = %54, %51 + %"symIntrinsicRawPhi_[]127.ph.i" = phi i64 [ %53, %51 ], [ %55, %54 ] %"rubyId_[]148.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !8 store i64 -1, i64* %callArgs0Addr.i, align 8, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !78) #10, !dbg !8 - %110 = load i64, i64* %30, align 8, !dbg !8, !tbaa !4, !alias.scope !78 - %111 = and i64 %110, 1, !dbg !8 - %112 = icmp eq i64 %111, 0, !dbg !8 - br i1 %112, label %116, label %113, !dbg !8, !prof !62 - -113: ; preds = %"fastSymCallIntrinsic_Array_[]145.i" - %114 = ashr i64 %110, 1, !dbg !8 - %115 = call i64 @rb_ary_entry(i64 %36, i64 %114) #10, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !67) #10, !dbg !8 + %99 = load i64, i64* %23, align 8, !dbg !8, !tbaa !4, !alias.scope !67 + %100 = and i64 %99, 1, !dbg !8 + %101 = icmp eq i64 %100, 0, !dbg !8 + br i1 %101, label %105, label %102, !dbg !8, !prof !51 + +102: ; preds = %"fastSymCallIntrinsic_Array_[]145.i" + %103 = ashr i64 %99, 1, !dbg !8 + %104 = call i64 @rb_ary_entry(i64 %29, i64 %103) #10, !dbg !8 br label %afterSend142.i, !dbg !8 -116: ; preds = %"fastSymCallIntrinsic_Array_[]145.i" - %117 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %36, i64 %"rubyId_[]148.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !8 +105: ; preds = %"fastSymCallIntrinsic_Array_[]145.i" + %106 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %29, i64 %"rubyId_[]148.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !8 br label %afterSend142.i, !dbg !8 "fastSymCallIntrinsic_Array_[]202.i": ; preds = %sorbet_isa_Array.exit1.i %"rubyId_[]205.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !14 store i64 1, i64* %callArgs0Addr.i, align 8, !dbg !14 - call void @llvm.experimental.noalias.scope.decl(metadata !81) #10, !dbg !14 - %118 = load i64, i64* %30, align 8, !dbg !14, !tbaa !4, !alias.scope !81 - %119 = and i64 %118, 1, !dbg !14 - %120 = icmp eq i64 %119, 0, !dbg !14 - br i1 %120, label %124, label %121, !dbg !14, !prof !62 - -121: ; preds = %"fastSymCallIntrinsic_Array_[]202.i" - %122 = ashr i64 %118, 1, !dbg !14 - %123 = call i64 @rb_ary_entry(i64 %78, i64 %122) #10, !dbg !14 + call void @llvm.experimental.noalias.scope.decl(metadata !70) #10, !dbg !14 + %107 = load i64, i64* %23, align 8, !dbg !14, !tbaa !4, !alias.scope !70 + %108 = and i64 %107, 1, !dbg !14 + %109 = icmp eq i64 %108, 0, !dbg !14 + br i1 %109, label %113, label %110, !dbg !14, !prof !51 + +110: ; preds = %"fastSymCallIntrinsic_Array_[]202.i" + %111 = ashr i64 %107, 1, !dbg !14 + %112 = call i64 @rb_ary_entry(i64 %67, i64 %111) #10, !dbg !14 br label %"fastSymCallIntrinsic_Array_[]218.i", !dbg !14 -124: ; preds = %"fastSymCallIntrinsic_Array_[]202.i" - %125 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %78, i64 %"rubyId_[]205.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !14 +113: ; preds = %"fastSymCallIntrinsic_Array_[]202.i" + %114 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %67, i64 %"rubyId_[]205.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !14 br label %"fastSymCallIntrinsic_Array_[]218.i", !dbg !14 -"fastSymCallIntrinsic_Array_[]218.i": ; preds = %124, %121 - %"symIntrinsicRawPhi_[]200.ph.i" = phi i64 [ %123, %121 ], [ %125, %124 ] +"fastSymCallIntrinsic_Array_[]218.i": ; preds = %113, %110 + %"symIntrinsicRawPhi_[]200.ph.i" = phi i64 [ %112, %110 ], [ %114, %113 ] %"rubyId_[]221.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !14 store i64 -3, i64* %callArgs0Addr.i, align 8, !dbg !14 - call void @llvm.experimental.noalias.scope.decl(metadata !84) #10, !dbg !14 - %126 = load i64, i64* %30, align 8, !dbg !14, !tbaa !4, !alias.scope !84 - %127 = and i64 %126, 1, !dbg !14 - %128 = icmp eq i64 %127, 0, !dbg !14 - br i1 %128, label %132, label %129, !dbg !14, !prof !62 - -129: ; preds = %"fastSymCallIntrinsic_Array_[]218.i" - %130 = ashr i64 %126, 1, !dbg !14 - %131 = call i64 @rb_ary_entry(i64 %78, i64 %130) #10, !dbg !14 + call void @llvm.experimental.noalias.scope.decl(metadata !73) #10, !dbg !14 + %115 = load i64, i64* %23, align 8, !dbg !14, !tbaa !4, !alias.scope !73 + %116 = and i64 %115, 1, !dbg !14 + %117 = icmp eq i64 %116, 0, !dbg !14 + br i1 %117, label %121, label %118, !dbg !14, !prof !51 + +118: ; preds = %"fastSymCallIntrinsic_Array_[]218.i" + %119 = ashr i64 %115, 1, !dbg !14 + %120 = call i64 @rb_ary_entry(i64 %67, i64 %119) #10, !dbg !14 br label %"fastSymCallIntrinsic_Array_[]234.i", !dbg !14 -132: ; preds = %"fastSymCallIntrinsic_Array_[]218.i" - %133 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %78, i64 %"rubyId_[]221.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !14 +121: ; preds = %"fastSymCallIntrinsic_Array_[]218.i" + %122 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %67, i64 %"rubyId_[]221.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !14 br label %"fastSymCallIntrinsic_Array_[]234.i", !dbg !14 -afterSend231.i: ; preds = %186, %183, %"alternativeCallIntrinsic_Array_[]233.i" - %"symIntrinsicRawPhi_[]21622.i" = phi i64 [ %send229.i, %"alternativeCallIntrinsic_Array_[]233.i" ], [ %"symIntrinsicRawPhi_[]216.ph.i", %186 ], [ %"symIntrinsicRawPhi_[]216.ph.i", %183 ] - %"symIntrinsicRawPhi_[]2001520.i" = phi i64 [ %send213.i, %"alternativeCallIntrinsic_Array_[]233.i" ], [ %"symIntrinsicRawPhi_[]200.ph.i", %186 ], [ %"symIntrinsicRawPhi_[]200.ph.i", %183 ] - %"symIntrinsicRawPhi_[]232.i" = phi i64 [ %send245.i, %"alternativeCallIntrinsic_Array_[]233.i" ], [ %187, %186 ], [ %185, %183 ], !dbg !14 - %134 = getelementptr inbounds i64, i64* %25, i64 8, !dbg !47 - %135 = getelementptr inbounds i64, i64* %134, i64 1, !dbg !47 - store i64* %135, i64** %20, align 8, !dbg !47, !tbaa !18 - store i64 %"symIntrinsicRawPhi_[]2001520.i", i64* %callArgs0Addr.i, align 8, !dbg !87 - store i64 %"symIntrinsicRawPhi_[]21622.i", i64* %callArgs1Addr.i, align 8, !dbg !87 - store i64 %"symIntrinsicRawPhi_[]232.i", i64* %callArgs2Addr.i, align 8, !dbg !87 - call void @llvm.experimental.noalias.scope.decl(metadata !88) #10, !dbg !87 - %136 = call i64 @rb_ary_new_from_values(i64 noundef 3, i64* noundef nonnull %30) #10, !dbg !87 - %137 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !18 - %138 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %137, i64 0, i32 2, !dbg !15 - %139 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %138, align 8, !dbg !15, !tbaa !30 - %140 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %139, i64 0, i32 1, !dbg !15 - %141 = load i64*, i64** %140, align 8, !dbg !15, !tbaa !70 - %142 = getelementptr inbounds i64, i64* %141, i64 1, !dbg !15 - store i64 %10, i64* %141, align 8, !dbg !15, !tbaa !4 - %143 = getelementptr inbounds i64, i64* %142, i64 1, !dbg !15 - store i64* %143, i64** %140, align 8, !dbg !15, !tbaa !70 - store i64 %136, i64* %142, align 8, !dbg !15, !tbaa !4 +afterSend231.i: ; preds = %171, %168, %"alternativeCallIntrinsic_Array_[]233.i" + %"symIntrinsicRawPhi_[]21622.i" = phi i64 [ %send229.i, %"alternativeCallIntrinsic_Array_[]233.i" ], [ %"symIntrinsicRawPhi_[]216.ph.i", %171 ], [ %"symIntrinsicRawPhi_[]216.ph.i", %168 ] + %"symIntrinsicRawPhi_[]2001520.i" = phi i64 [ %send213.i, %"alternativeCallIntrinsic_Array_[]233.i" ], [ %"symIntrinsicRawPhi_[]200.ph.i", %171 ], [ %"symIntrinsicRawPhi_[]200.ph.i", %168 ] + %"symIntrinsicRawPhi_[]232.i" = phi i64 [ %send245.i, %"alternativeCallIntrinsic_Array_[]233.i" ], [ %172, %171 ], [ %170, %168 ], !dbg !14 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %20, align 8, !dbg !36, !tbaa !18 + store i64 %"symIntrinsicRawPhi_[]2001520.i", i64* %callArgs0Addr.i, align 8, !dbg !76 + store i64 %"symIntrinsicRawPhi_[]21622.i", i64* %callArgs1Addr.i, align 8, !dbg !76 + store i64 %"symIntrinsicRawPhi_[]232.i", i64* %callArgs2Addr.i, align 8, !dbg !76 + call void @llvm.experimental.noalias.scope.decl(metadata !77) #10, !dbg !76 + %123 = call i64 @rb_ary_new_from_values(i64 noundef 3, i64* noundef nonnull %23) #10, !dbg !76 + %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !18 + %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !15 + %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !15, !tbaa !30 + %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 1, !dbg !15 + %128 = load i64*, i64** %127, align 8, !dbg !15, !tbaa !59 + %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !15 + store i64 %10, i64* %128, align 8, !dbg !15, !tbaa !4 + %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !15 + store i64* %130, i64** %127, align 8, !dbg !15, !tbaa !59 + store i64 %123, i64* %129, align 8, !dbg !15, !tbaa !4 %send263.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.6, i64 0) #10, !dbg !15 - %144 = getelementptr inbounds i64, i64* %25, i64 10, !dbg !47 - %145 = getelementptr inbounds i64, i64* %144, i64 1, !dbg !47 - store i64* %145, i64** %20, align 8, !dbg !47, !tbaa !18 - call void @llvm.experimental.noalias.scope.decl(metadata !91) #10, !dbg !94 - %146 = call i64 @rb_ary_new() #10, !dbg !94 - store i64 %146, i64* %callArgs0Addr.i, align 8, !dbg !16 - store <2 x i64> , <2 x i64>* %32, align 8, !dbg !16 - call void @llvm.experimental.noalias.scope.decl(metadata !95) #10, !dbg !16 - %147 = load i64, i64* %30, align 8, !dbg !16, !tbaa !4, !alias.scope !95 - %148 = call i64 @sorbet_vm_expandSplatIntrinsic(i64 %147, i64 3, i64 5) #10, !dbg !16, !noalias !95 - %149 = and i64 %148, 7, !dbg !16 - %150 = icmp ne i64 %149, 0, !dbg !16 - %151 = and i64 %148, -9, !dbg !16 - %152 = icmp eq i64 %151, 0, !dbg !16 - %153 = or i1 %150, %152, !dbg !16 - br i1 %153, label %"alternativeCallIntrinsic_Array_[]317.i", label %sorbet_isa_Array.exit.i, !dbg !16, !prof !55 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %20, align 8, !dbg !36, !tbaa !18 + call void @llvm.experimental.noalias.scope.decl(metadata !80) #10, !dbg !83 + %131 = call i64 @rb_ary_new() #10, !dbg !83 + store i64 %131, i64* %callArgs0Addr.i, align 8, !dbg !16 + store <2 x i64> , <2 x i64>* %25, align 8, !dbg !16 + call void @llvm.experimental.noalias.scope.decl(metadata !84) #10, !dbg !16 + %132 = load i64, i64* %23, align 8, !dbg !16, !tbaa !4, !alias.scope !84 + %133 = call i64 @sorbet_vm_expandSplatIntrinsic(i64 %132, i64 3, i64 5) #10, !dbg !16, !noalias !84 + %134 = and i64 %133, 7, !dbg !16 + %135 = icmp ne i64 %134, 0, !dbg !16 + %136 = and i64 %133, -9, !dbg !16 + %137 = icmp eq i64 %136, 0, !dbg !16 + %138 = or i1 %135, %137, !dbg !16 + br i1 %138, label %"alternativeCallIntrinsic_Array_[]317.i", label %sorbet_isa_Array.exit.i, !dbg !16, !prof !44 sorbet_isa_Array.exit.i: ; preds = %afterSend231.i - %154 = inttoptr i64 %148 to %struct.iseq_inline_iv_cache_entry*, !dbg !16 - %155 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %154, i64 0, i32 0, !dbg !16 - %156 = load i64, i64* %155, align 8, !dbg !16, !tbaa !56 - %157 = and i64 %156, 31, !dbg !16 - %158 = icmp eq i64 %157, 7, !dbg !16 - br i1 %158, label %"fastSymCallIntrinsic_Array_[]286.i", label %"alternativeCallIntrinsic_Array_[]317.i", !dbg !16, !prof !58 + %139 = inttoptr i64 %133 to %struct.iseq_inline_iv_cache_entry*, !dbg !16 + %140 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %139, i64 0, i32 0, !dbg !16 + %141 = load i64, i64* %140, align 8, !dbg !16, !tbaa !45 + %142 = and i64 %141, 31, !dbg !16 + %143 = icmp eq i64 %142, 7, !dbg !16 + br i1 %143, label %"fastSymCallIntrinsic_Array_[]286.i", label %"alternativeCallIntrinsic_Array_[]317.i", !dbg !16, !prof !47 "alternativeCallIntrinsic_Array_[]233.i": ; preds = %sorbet_isa_Array.exit1.i, %afterSend142.i - %159 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !18 - %160 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %159, i64 0, i32 2, !dbg !14 - %161 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %160, align 8, !dbg !14, !tbaa !30 - %162 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %161, i64 0, i32 1, !dbg !14 - %163 = load i64*, i64** %162, align 8, !dbg !14, !tbaa !70 - %164 = getelementptr inbounds i64, i64* %163, i64 1, !dbg !14 - store i64 %78, i64* %163, align 8, !dbg !14, !tbaa !4 - %165 = getelementptr inbounds i64, i64* %164, i64 1, !dbg !14 - store i64* %165, i64** %162, align 8, !dbg !14, !tbaa !70 - store i64 1, i64* %164, align 8, !dbg !14, !tbaa !4 + %144 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !18 + %145 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %144, i64 0, i32 2, !dbg !14 + %146 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %145, align 8, !dbg !14, !tbaa !30 + %147 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %146, i64 0, i32 1, !dbg !14 + %148 = load i64*, i64** %147, align 8, !dbg !14, !tbaa !59 + %149 = getelementptr inbounds i64, i64* %148, i64 1, !dbg !14 + store i64 %67, i64* %148, align 8, !dbg !14, !tbaa !4 + %150 = getelementptr inbounds i64, i64* %149, i64 1, !dbg !14 + store i64* %150, i64** %147, align 8, !dbg !14, !tbaa !59 + store i64 1, i64* %149, align 8, !dbg !14, !tbaa !4 %send213.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].3", i64 0) #10, !dbg !14 - %166 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !18 - %167 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %166, i64 0, i32 2, !dbg !14 - %168 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %167, align 8, !dbg !14, !tbaa !30 - %169 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %168, i64 0, i32 1, !dbg !14 - %170 = load i64*, i64** %169, align 8, !dbg !14, !tbaa !70 - %171 = getelementptr inbounds i64, i64* %170, i64 1, !dbg !14 - store i64 %78, i64* %170, align 8, !dbg !14, !tbaa !4 - %172 = getelementptr inbounds i64, i64* %171, i64 1, !dbg !14 - store i64* %172, i64** %169, align 8, !dbg !14, !tbaa !70 - store i64 -3, i64* %171, align 8, !dbg !14, !tbaa !4 + %151 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !18 + %152 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %151, i64 0, i32 2, !dbg !14 + %153 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %152, align 8, !dbg !14, !tbaa !30 + %154 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %153, i64 0, i32 1, !dbg !14 + %155 = load i64*, i64** %154, align 8, !dbg !14, !tbaa !59 + %156 = getelementptr inbounds i64, i64* %155, i64 1, !dbg !14 + store i64 %67, i64* %155, align 8, !dbg !14, !tbaa !4 + %157 = getelementptr inbounds i64, i64* %156, i64 1, !dbg !14 + store i64* %157, i64** %154, align 8, !dbg !14, !tbaa !59 + store i64 -3, i64* %156, align 8, !dbg !14, !tbaa !4 %send229.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].4", i64 0) #10, !dbg !14 - %173 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !18 - %174 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %173, i64 0, i32 2, !dbg !14 - %175 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %174, align 8, !dbg !14, !tbaa !30 - %176 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %175, i64 0, i32 1, !dbg !14 - %177 = load i64*, i64** %176, align 8, !dbg !14, !tbaa !70 - %178 = getelementptr inbounds i64, i64* %177, i64 1, !dbg !14 - store i64 %78, i64* %177, align 8, !dbg !14, !tbaa !4 - %179 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !14 - store i64* %179, i64** %176, align 8, !dbg !14, !tbaa !70 - store i64 -1, i64* %178, align 8, !dbg !14, !tbaa !4 + %158 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !14, !tbaa !18 + %159 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %158, i64 0, i32 2, !dbg !14 + %160 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %159, align 8, !dbg !14, !tbaa !30 + %161 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %160, i64 0, i32 1, !dbg !14 + %162 = load i64*, i64** %161, align 8, !dbg !14, !tbaa !59 + %163 = getelementptr inbounds i64, i64* %162, i64 1, !dbg !14 + store i64 %67, i64* %162, align 8, !dbg !14, !tbaa !4 + %164 = getelementptr inbounds i64, i64* %163, i64 1, !dbg !14 + store i64* %164, i64** %161, align 8, !dbg !14, !tbaa !59 + store i64 -1, i64* %163, align 8, !dbg !14, !tbaa !4 %send245.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].5", i64 0) #10, !dbg !14 br label %afterSend231.i, !dbg !14 -"fastSymCallIntrinsic_Array_[]234.i": ; preds = %132, %129 - %"symIntrinsicRawPhi_[]216.ph.i" = phi i64 [ %131, %129 ], [ %133, %132 ] +"fastSymCallIntrinsic_Array_[]234.i": ; preds = %121, %118 + %"symIntrinsicRawPhi_[]216.ph.i" = phi i64 [ %120, %118 ], [ %122, %121 ] %"rubyId_[]237.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !14 store i64 -1, i64* %callArgs0Addr.i, align 8, !dbg !14 - call void @llvm.experimental.noalias.scope.decl(metadata !98) #10, !dbg !14 - %180 = load i64, i64* %30, align 8, !dbg !14, !tbaa !4, !alias.scope !98 - %181 = and i64 %180, 1, !dbg !14 - %182 = icmp eq i64 %181, 0, !dbg !14 - br i1 %182, label %186, label %183, !dbg !14, !prof !62 - -183: ; preds = %"fastSymCallIntrinsic_Array_[]234.i" - %184 = ashr i64 %180, 1, !dbg !14 - %185 = call i64 @rb_ary_entry(i64 %78, i64 %184) #10, !dbg !14 + call void @llvm.experimental.noalias.scope.decl(metadata !87) #10, !dbg !14 + %165 = load i64, i64* %23, align 8, !dbg !14, !tbaa !4, !alias.scope !87 + %166 = and i64 %165, 1, !dbg !14 + %167 = icmp eq i64 %166, 0, !dbg !14 + br i1 %167, label %171, label %168, !dbg !14, !prof !51 + +168: ; preds = %"fastSymCallIntrinsic_Array_[]234.i" + %169 = ashr i64 %165, 1, !dbg !14 + %170 = call i64 @rb_ary_entry(i64 %67, i64 %169) #10, !dbg !14 br label %afterSend231.i, !dbg !14 -186: ; preds = %"fastSymCallIntrinsic_Array_[]234.i" - %187 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %78, i64 %"rubyId_[]237.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !14 +171: ; preds = %"fastSymCallIntrinsic_Array_[]234.i" + %172 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %67, i64 %"rubyId_[]237.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !14 br label %afterSend231.i, !dbg !14 "fastSymCallIntrinsic_Array_[]286.i": ; preds = %sorbet_isa_Array.exit.i %"rubyId_[]289.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !16 store i64 1, i64* %callArgs0Addr.i, align 8, !dbg !16 - call void @llvm.experimental.noalias.scope.decl(metadata !101) #10, !dbg !16 - %188 = load i64, i64* %30, align 8, !dbg !16, !tbaa !4, !alias.scope !101 - %189 = and i64 %188, 1, !dbg !16 - %190 = icmp eq i64 %189, 0, !dbg !16 - br i1 %190, label %194, label %191, !dbg !16, !prof !62 - -191: ; preds = %"fastSymCallIntrinsic_Array_[]286.i" - %192 = ashr i64 %188, 1, !dbg !16 - %193 = call i64 @rb_ary_entry(i64 %148, i64 %192) #10, !dbg !16 + call void @llvm.experimental.noalias.scope.decl(metadata !90) #10, !dbg !16 + %173 = load i64, i64* %23, align 8, !dbg !16, !tbaa !4, !alias.scope !90 + %174 = and i64 %173, 1, !dbg !16 + %175 = icmp eq i64 %174, 0, !dbg !16 + br i1 %175, label %179, label %176, !dbg !16, !prof !51 + +176: ; preds = %"fastSymCallIntrinsic_Array_[]286.i" + %177 = ashr i64 %173, 1, !dbg !16 + %178 = call i64 @rb_ary_entry(i64 %133, i64 %177) #10, !dbg !16 br label %"fastSymCallIntrinsic_Array_[]302.i", !dbg !16 -194: ; preds = %"fastSymCallIntrinsic_Array_[]286.i" - %195 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %148, i64 %"rubyId_[]289.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !16 +179: ; preds = %"fastSymCallIntrinsic_Array_[]286.i" + %180 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %133, i64 %"rubyId_[]289.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !16 br label %"fastSymCallIntrinsic_Array_[]302.i", !dbg !16 -"fastSymCallIntrinsic_Array_[]302.i": ; preds = %194, %191 - %"symIntrinsicRawPhi_[]284.ph.i" = phi i64 [ %193, %191 ], [ %195, %194 ] +"fastSymCallIntrinsic_Array_[]302.i": ; preds = %179, %176 + %"symIntrinsicRawPhi_[]284.ph.i" = phi i64 [ %178, %176 ], [ %180, %179 ] %"rubyId_[]305.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !16 store i64 -3, i64* %callArgs0Addr.i, align 8, !dbg !16 - call void @llvm.experimental.noalias.scope.decl(metadata !104) #10, !dbg !16 - %196 = load i64, i64* %30, align 8, !dbg !16, !tbaa !4, !alias.scope !104 - %197 = and i64 %196, 1, !dbg !16 - %198 = icmp eq i64 %197, 0, !dbg !16 - br i1 %198, label %202, label %199, !dbg !16, !prof !62 - -199: ; preds = %"fastSymCallIntrinsic_Array_[]302.i" - %200 = ashr i64 %196, 1, !dbg !16 - %201 = call i64 @rb_ary_entry(i64 %148, i64 %200) #10, !dbg !16 + call void @llvm.experimental.noalias.scope.decl(metadata !93) #10, !dbg !16 + %181 = load i64, i64* %23, align 8, !dbg !16, !tbaa !4, !alias.scope !93 + %182 = and i64 %181, 1, !dbg !16 + %183 = icmp eq i64 %182, 0, !dbg !16 + br i1 %183, label %187, label %184, !dbg !16, !prof !51 + +184: ; preds = %"fastSymCallIntrinsic_Array_[]302.i" + %185 = ashr i64 %181, 1, !dbg !16 + %186 = call i64 @rb_ary_entry(i64 %133, i64 %185) #10, !dbg !16 br label %"fastSymCallIntrinsic_Array_[]318.i", !dbg !16 -202: ; preds = %"fastSymCallIntrinsic_Array_[]302.i" - %203 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %148, i64 %"rubyId_[]305.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !16 +187: ; preds = %"fastSymCallIntrinsic_Array_[]302.i" + %188 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %133, i64 %"rubyId_[]305.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !16 br label %"fastSymCallIntrinsic_Array_[]318.i", !dbg !16 "alternativeCallIntrinsic_Array_[]317.i": ; preds = %sorbet_isa_Array.exit.i, %afterSend231.i - %204 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !18 - %205 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %204, i64 0, i32 2, !dbg !16 - %206 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %205, align 8, !dbg !16, !tbaa !30 - %207 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %206, i64 0, i32 1, !dbg !16 - %208 = load i64*, i64** %207, align 8, !dbg !16, !tbaa !70 - %209 = getelementptr inbounds i64, i64* %208, i64 1, !dbg !16 - store i64 %148, i64* %208, align 8, !dbg !16, !tbaa !4 - %210 = getelementptr inbounds i64, i64* %209, i64 1, !dbg !16 - store i64* %210, i64** %207, align 8, !dbg !16, !tbaa !70 - store i64 1, i64* %209, align 8, !dbg !16, !tbaa !4 + %189 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !18 + %190 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %189, i64 0, i32 2, !dbg !16 + %191 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %190, align 8, !dbg !16, !tbaa !30 + %192 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %191, i64 0, i32 1, !dbg !16 + %193 = load i64*, i64** %192, align 8, !dbg !16, !tbaa !59 + %194 = getelementptr inbounds i64, i64* %193, i64 1, !dbg !16 + store i64 %133, i64* %193, align 8, !dbg !16, !tbaa !4 + %195 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !16 + store i64* %195, i64** %192, align 8, !dbg !16, !tbaa !59 + store i64 1, i64* %194, align 8, !dbg !16, !tbaa !4 %send297.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].7", i64 0) #10, !dbg !16 - %211 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !18 - %212 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %211, i64 0, i32 2, !dbg !16 - %213 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %212, align 8, !dbg !16, !tbaa !30 - %214 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %213, i64 0, i32 1, !dbg !16 - %215 = load i64*, i64** %214, align 8, !dbg !16, !tbaa !70 - %216 = getelementptr inbounds i64, i64* %215, i64 1, !dbg !16 - store i64 %148, i64* %215, align 8, !dbg !16, !tbaa !4 - %217 = getelementptr inbounds i64, i64* %216, i64 1, !dbg !16 - store i64* %217, i64** %214, align 8, !dbg !16, !tbaa !70 - store i64 -3, i64* %216, align 8, !dbg !16, !tbaa !4 + %196 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !18 + %197 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %196, i64 0, i32 2, !dbg !16 + %198 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %197, align 8, !dbg !16, !tbaa !30 + %199 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %198, i64 0, i32 1, !dbg !16 + %200 = load i64*, i64** %199, align 8, !dbg !16, !tbaa !59 + %201 = getelementptr inbounds i64, i64* %200, i64 1, !dbg !16 + store i64 %133, i64* %200, align 8, !dbg !16, !tbaa !4 + %202 = getelementptr inbounds i64, i64* %201, i64 1, !dbg !16 + store i64* %202, i64** %199, align 8, !dbg !16, !tbaa !59 + store i64 -3, i64* %201, align 8, !dbg !16, !tbaa !4 %send313.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].8", i64 0) #10, !dbg !16 - %218 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !18 - %219 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %218, i64 0, i32 2, !dbg !16 - %220 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %219, align 8, !dbg !16, !tbaa !30 - %221 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %220, i64 0, i32 1, !dbg !16 - %222 = load i64*, i64** %221, align 8, !dbg !16, !tbaa !70 - %223 = getelementptr inbounds i64, i64* %222, i64 1, !dbg !16 - store i64 %148, i64* %222, align 8, !dbg !16, !tbaa !4 - %224 = getelementptr inbounds i64, i64* %223, i64 1, !dbg !16 - store i64* %224, i64** %221, align 8, !dbg !16, !tbaa !70 - store i64 -1, i64* %223, align 8, !dbg !16, !tbaa !4 + %203 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !18 + %204 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %203, i64 0, i32 2, !dbg !16 + %205 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %204, align 8, !dbg !16, !tbaa !30 + %206 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %205, i64 0, i32 1, !dbg !16 + %207 = load i64*, i64** %206, align 8, !dbg !16, !tbaa !59 + %208 = getelementptr inbounds i64, i64* %207, i64 1, !dbg !16 + store i64 %133, i64* %207, align 8, !dbg !16, !tbaa !4 + %209 = getelementptr inbounds i64, i64* %208, i64 1, !dbg !16 + store i64* %209, i64** %206, align 8, !dbg !16, !tbaa !59 + store i64 -1, i64* %208, align 8, !dbg !16, !tbaa !4 %send329.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_[].9", i64 0) #10, !dbg !16 br label %"func_.$152.exit", !dbg !16 -"fastSymCallIntrinsic_Array_[]318.i": ; preds = %202, %199 - %"symIntrinsicRawPhi_[]300.ph.i" = phi i64 [ %201, %199 ], [ %203, %202 ] +"fastSymCallIntrinsic_Array_[]318.i": ; preds = %187, %184 + %"symIntrinsicRawPhi_[]300.ph.i" = phi i64 [ %186, %184 ], [ %188, %187 ] %"rubyId_[]321.i" = load i64, i64* @"rubyIdPrecomputed_[]", align 8, !dbg !16 store i64 -1, i64* %callArgs0Addr.i, align 8, !dbg !16 - call void @llvm.experimental.noalias.scope.decl(metadata !107) #10, !dbg !16 - %225 = load i64, i64* %30, align 8, !dbg !16, !tbaa !4, !alias.scope !107 - %226 = and i64 %225, 1, !dbg !16 - %227 = icmp eq i64 %226, 0, !dbg !16 - br i1 %227, label %231, label %228, !dbg !16, !prof !62 - -228: ; preds = %"fastSymCallIntrinsic_Array_[]318.i" - %229 = ashr i64 %225, 1, !dbg !16 - %230 = call i64 @rb_ary_entry(i64 %148, i64 %229) #10, !dbg !16 + call void @llvm.experimental.noalias.scope.decl(metadata !96) #10, !dbg !16 + %210 = load i64, i64* %23, align 8, !dbg !16, !tbaa !4, !alias.scope !96 + %211 = and i64 %210, 1, !dbg !16 + %212 = icmp eq i64 %211, 0, !dbg !16 + br i1 %212, label %216, label %213, !dbg !16, !prof !51 + +213: ; preds = %"fastSymCallIntrinsic_Array_[]318.i" + %214 = ashr i64 %210, 1, !dbg !16 + %215 = call i64 @rb_ary_entry(i64 %133, i64 %214) #10, !dbg !16 br label %"func_.$152.exit", !dbg !16 -231: ; preds = %"fastSymCallIntrinsic_Array_[]318.i" - %232 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %148, i64 %"rubyId_[]321.i", i32 noundef 1, i64* noundef nonnull %30, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !16 +216: ; preds = %"fastSymCallIntrinsic_Array_[]318.i" + %217 = call i64 @sorbet_rb_array_square_br_slowpath(i64 %133, i64 %"rubyId_[]321.i", i32 noundef 1, i64* noundef nonnull %23, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #10, !dbg !16 br label %"func_.$152.exit", !dbg !16 -"func_.$152.exit": ; preds = %"alternativeCallIntrinsic_Array_[]317.i", %228, %231 - %"symIntrinsicRawPhi_[]30034.i" = phi i64 [ %send313.i, %"alternativeCallIntrinsic_Array_[]317.i" ], [ %"symIntrinsicRawPhi_[]300.ph.i", %231 ], [ %"symIntrinsicRawPhi_[]300.ph.i", %228 ] - %"symIntrinsicRawPhi_[]2842732.i" = phi i64 [ %send297.i, %"alternativeCallIntrinsic_Array_[]317.i" ], [ %"symIntrinsicRawPhi_[]284.ph.i", %231 ], [ %"symIntrinsicRawPhi_[]284.ph.i", %228 ] - %"symIntrinsicRawPhi_[]316.i" = phi i64 [ %send329.i, %"alternativeCallIntrinsic_Array_[]317.i" ], [ %232, %231 ], [ %230, %228 ], !dbg !16 - %233 = getelementptr inbounds i64, i64* %25, i64 11, !dbg !47 - %234 = getelementptr inbounds i64, i64* %233, i64 1, !dbg !47 - store i64* %234, i64** %20, align 8, !dbg !47, !tbaa !18 - store i64 %"symIntrinsicRawPhi_[]2842732.i", i64* %callArgs0Addr.i, align 8, !dbg !110 - store i64 %"symIntrinsicRawPhi_[]30034.i", i64* %callArgs1Addr.i, align 8, !dbg !110 - store i64 %"symIntrinsicRawPhi_[]316.i", i64* %callArgs2Addr.i, align 8, !dbg !110 - call void @llvm.experimental.noalias.scope.decl(metadata !111) #10, !dbg !110 - %235 = call i64 @rb_ary_new_from_values(i64 noundef 3, i64* noundef nonnull %30) #10, !dbg !110 - %236 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !18 - %237 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %236, i64 0, i32 2, !dbg !17 - %238 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %237, align 8, !dbg !17, !tbaa !30 - %239 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %238, i64 0, i32 1, !dbg !17 - %240 = load i64*, i64** %239, align 8, !dbg !17, !tbaa !70 - %241 = getelementptr inbounds i64, i64* %240, i64 1, !dbg !17 - store i64 %10, i64* %240, align 8, !dbg !17, !tbaa !4 - %242 = getelementptr inbounds i64, i64* %241, i64 1, !dbg !17 - store i64* %242, i64** %239, align 8, !dbg !17, !tbaa !70 - store i64 %235, i64* %241, align 8, !dbg !17, !tbaa !4 +"func_.$152.exit": ; preds = %"alternativeCallIntrinsic_Array_[]317.i", %213, %216 + %"symIntrinsicRawPhi_[]30034.i" = phi i64 [ %send313.i, %"alternativeCallIntrinsic_Array_[]317.i" ], [ %"symIntrinsicRawPhi_[]300.ph.i", %216 ], [ %"symIntrinsicRawPhi_[]300.ph.i", %213 ] + %"symIntrinsicRawPhi_[]2842732.i" = phi i64 [ %send297.i, %"alternativeCallIntrinsic_Array_[]317.i" ], [ %"symIntrinsicRawPhi_[]284.ph.i", %216 ], [ %"symIntrinsicRawPhi_[]284.ph.i", %213 ] + %"symIntrinsicRawPhi_[]316.i" = phi i64 [ %send329.i, %"alternativeCallIntrinsic_Array_[]317.i" ], [ %217, %216 ], [ %215, %213 ], !dbg !16 + store i64* getelementptr inbounds ([13 x i64], [13 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %20, align 8, !dbg !36, !tbaa !18 + store i64 %"symIntrinsicRawPhi_[]2842732.i", i64* %callArgs0Addr.i, align 8, !dbg !99 + store i64 %"symIntrinsicRawPhi_[]30034.i", i64* %callArgs1Addr.i, align 8, !dbg !99 + store i64 %"symIntrinsicRawPhi_[]316.i", i64* %callArgs2Addr.i, align 8, !dbg !99 + call void @llvm.experimental.noalias.scope.decl(metadata !100) #10, !dbg !99 + %218 = call i64 @rb_ary_new_from_values(i64 noundef 3, i64* noundef nonnull %23) #10, !dbg !99 + %219 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !18 + %220 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %219, i64 0, i32 2, !dbg !17 + %221 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %220, align 8, !dbg !17, !tbaa !30 + %222 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %221, i64 0, i32 1, !dbg !17 + %223 = load i64*, i64** %222, align 8, !dbg !17, !tbaa !59 + %224 = getelementptr inbounds i64, i64* %223, i64 1, !dbg !17 + store i64 %10, i64* %223, align 8, !dbg !17, !tbaa !4 + %225 = getelementptr inbounds i64, i64* %224, i64 1, !dbg !17 + store i64* %225, i64** %222, align 8, !dbg !17, !tbaa !59 + store i64 %218, i64* %224, align 8, !dbg !17, !tbaa !4 %send347.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.10, i64 0) #10, !dbg !17 call void @llvm.lifetime.end.p0i8(i64 64, i8* nonnull %11) ret void @@ -726,81 +719,70 @@ attributes #10 = { nounwind } !33 = !{!34, !19, i64 16} !34 = !{!"rb_control_frame_struct", !19, i64 0, !19, i64 8, !19, i64 16, !5, i64 24, !19, i64 32, !19, i64 40, !19, i64 48} !35 = !{!34, !19, i64 32} -!36 = !{!37, !19, i64 16} -!37 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !19, i64 16, !6, i64 24} -!38 = !{!39, !19, i64 8} -!39 = !{!"rb_iseq_constant_body", !6, i64 0, !25, i64 4, !19, i64 8, !40, i64 16, !42, i64 64, !45, i64 120, !19, i64 152, !19, i64 160, !19, i64 168, !19, i64 176, !19, i64 184, !19, i64 192, !46, i64 200, !25, i64 232, !25, i64 236, !25, i64 240, !25, i64 244, !25, i64 248, !6, i64 252, !5, i64 256} -!40 = !{!"", !41, i64 0, !25, i64 4, !25, i64 8, !25, i64 12, !25, i64 16, !25, i64 20, !25, i64 24, !25, i64 28, !19, i64 32, !19, i64 40} -!41 = !{!"", !25, i64 0, !25, i64 0, !25, i64 0, !25, i64 0, !25, i64 0, !25, i64 0, !25, i64 0, !25, i64 0, !25, i64 1, !25, i64 1} -!42 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !25, i64 32, !43, i64 36} -!43 = !{!"rb_code_location_struct", !44, i64 0, !44, i64 8} -!44 = !{!"rb_code_position_struct", !25, i64 0, !25, i64 4} -!45 = !{!"iseq_insn_info", !19, i64 0, !19, i64 8, !25, i64 16, !19, i64 24} -!46 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !19, i64 24} -!47 = !DILocation(line: 0, scope: !9) -!48 = !DILocation(line: 5, column: 11, scope: !9) -!49 = !{!50} -!50 = distinct !{!50, !51, !"sorbet_buildArrayIntrinsic: argument 0"} -!51 = distinct !{!51, !"sorbet_buildArrayIntrinsic"} +!36 = !DILocation(line: 0, scope: !9) +!37 = !DILocation(line: 5, column: 11, scope: !9) +!38 = !{!39} +!39 = distinct !{!39, !40, !"sorbet_buildArrayIntrinsic: argument 0"} +!40 = distinct !{!40, !"sorbet_buildArrayIntrinsic"} +!41 = !{!42} +!42 = distinct !{!42, !43, !"sorbet_expandSplatIntrinsic: argument 0"} +!43 = distinct !{!43, !"sorbet_expandSplatIntrinsic"} +!44 = !{!"branch_weights", i32 1073205, i32 2146410443} +!45 = !{!46, !5, i64 0} +!46 = !{!"RBasic", !5, i64 0, !5, i64 8} +!47 = !{!"branch_weights", i32 2000, i32 1} +!48 = !{!49} +!49 = distinct !{!49, !50, !"sorbet_rb_array_square_br: argument 0"} +!50 = distinct !{!50, !"sorbet_rb_array_square_br"} +!51 = !{!"branch_weights", i32 1, i32 2000} !52 = !{!53} -!53 = distinct !{!53, !54, !"sorbet_expandSplatIntrinsic: argument 0"} -!54 = distinct !{!54, !"sorbet_expandSplatIntrinsic"} -!55 = !{!"branch_weights", i32 1073205, i32 2146410443} -!56 = !{!57, !5, i64 0} -!57 = !{!"RBasic", !5, i64 0, !5, i64 8} -!58 = !{!"branch_weights", i32 2000, i32 1} -!59 = !{!60} -!60 = distinct !{!60, !61, !"sorbet_rb_array_square_br: argument 0"} -!61 = distinct !{!61, !"sorbet_rb_array_square_br"} -!62 = !{!"branch_weights", i32 1, i32 2000} -!63 = !{!64} -!64 = distinct !{!64, !65, !"sorbet_rb_array_square_br: argument 0"} -!65 = distinct !{!65, !"sorbet_rb_array_square_br"} -!66 = !DILocation(line: 6, column: 6, scope: !9) +!53 = distinct !{!53, !54, !"sorbet_rb_array_square_br: argument 0"} +!54 = distinct !{!54, !"sorbet_rb_array_square_br"} +!55 = !DILocation(line: 6, column: 6, scope: !9) +!56 = !{!57} +!57 = distinct !{!57, !58, !"sorbet_buildArrayIntrinsic: argument 0"} +!58 = distinct !{!58, !"sorbet_buildArrayIntrinsic"} +!59 = !{!34, !19, i64 8} +!60 = !DILocation(line: 8, column: 11, scope: !9) +!61 = !{!62} +!62 = distinct !{!62, !63, !"sorbet_buildArrayIntrinsic: argument 0"} +!63 = distinct !{!63, !"sorbet_buildArrayIntrinsic"} +!64 = !{!65} +!65 = distinct !{!65, !66, !"sorbet_expandSplatIntrinsic: argument 0"} +!66 = distinct !{!66, !"sorbet_expandSplatIntrinsic"} !67 = !{!68} -!68 = distinct !{!68, !69, !"sorbet_buildArrayIntrinsic: argument 0"} -!69 = distinct !{!69, !"sorbet_buildArrayIntrinsic"} -!70 = !{!34, !19, i64 8} -!71 = !DILocation(line: 8, column: 11, scope: !9) -!72 = !{!73} -!73 = distinct !{!73, !74, !"sorbet_buildArrayIntrinsic: argument 0"} -!74 = distinct !{!74, !"sorbet_buildArrayIntrinsic"} -!75 = !{!76} -!76 = distinct !{!76, !77, !"sorbet_expandSplatIntrinsic: argument 0"} -!77 = distinct !{!77, !"sorbet_expandSplatIntrinsic"} -!78 = !{!79} -!79 = distinct !{!79, !80, !"sorbet_rb_array_square_br: argument 0"} -!80 = distinct !{!80, !"sorbet_rb_array_square_br"} -!81 = !{!82} -!82 = distinct !{!82, !83, !"sorbet_rb_array_square_br: argument 0"} -!83 = distinct !{!83, !"sorbet_rb_array_square_br"} +!68 = distinct !{!68, !69, !"sorbet_rb_array_square_br: argument 0"} +!69 = distinct !{!69, !"sorbet_rb_array_square_br"} +!70 = !{!71} +!71 = distinct !{!71, !72, !"sorbet_rb_array_square_br: argument 0"} +!72 = distinct !{!72, !"sorbet_rb_array_square_br"} +!73 = !{!74} +!74 = distinct !{!74, !75, !"sorbet_rb_array_square_br: argument 0"} +!75 = distinct !{!75, !"sorbet_rb_array_square_br"} +!76 = !DILocation(line: 9, column: 6, scope: !9) +!77 = !{!78} +!78 = distinct !{!78, !79, !"sorbet_buildArrayIntrinsic: argument 0"} +!79 = distinct !{!79, !"sorbet_buildArrayIntrinsic"} +!80 = !{!81} +!81 = distinct !{!81, !82, !"sorbet_buildArrayIntrinsic: argument 0"} +!82 = distinct !{!82, !"sorbet_buildArrayIntrinsic"} +!83 = !DILocation(line: 11, column: 11, scope: !9) !84 = !{!85} -!85 = distinct !{!85, !86, !"sorbet_rb_array_square_br: argument 0"} -!86 = distinct !{!86, !"sorbet_rb_array_square_br"} -!87 = !DILocation(line: 9, column: 6, scope: !9) -!88 = !{!89} -!89 = distinct !{!89, !90, !"sorbet_buildArrayIntrinsic: argument 0"} -!90 = distinct !{!90, !"sorbet_buildArrayIntrinsic"} -!91 = !{!92} -!92 = distinct !{!92, !93, !"sorbet_buildArrayIntrinsic: argument 0"} -!93 = distinct !{!93, !"sorbet_buildArrayIntrinsic"} -!94 = !DILocation(line: 11, column: 11, scope: !9) -!95 = !{!96} -!96 = distinct !{!96, !97, !"sorbet_expandSplatIntrinsic: argument 0"} -!97 = distinct !{!97, !"sorbet_expandSplatIntrinsic"} -!98 = !{!99} -!99 = distinct !{!99, !100, !"sorbet_rb_array_square_br: argument 0"} -!100 = distinct !{!100, !"sorbet_rb_array_square_br"} -!101 = !{!102} -!102 = distinct !{!102, !103, !"sorbet_rb_array_square_br: argument 0"} -!103 = distinct !{!103, !"sorbet_rb_array_square_br"} -!104 = !{!105} -!105 = distinct !{!105, !106, !"sorbet_rb_array_square_br: argument 0"} -!106 = distinct !{!106, !"sorbet_rb_array_square_br"} -!107 = !{!108} -!108 = distinct !{!108, !109, !"sorbet_rb_array_square_br: argument 0"} -!109 = distinct !{!109, !"sorbet_rb_array_square_br"} -!110 = !DILocation(line: 12, column: 6, scope: !9) -!111 = !{!112} -!112 = distinct !{!112, !113, !"sorbet_buildArrayIntrinsic: argument 0"} -!113 = distinct !{!113, !"sorbet_buildArrayIntrinsic"} +!85 = distinct !{!85, !86, !"sorbet_expandSplatIntrinsic: argument 0"} +!86 = distinct !{!86, !"sorbet_expandSplatIntrinsic"} +!87 = !{!88} +!88 = distinct !{!88, !89, !"sorbet_rb_array_square_br: argument 0"} +!89 = distinct !{!89, !"sorbet_rb_array_square_br"} +!90 = !{!91} +!91 = distinct !{!91, !92, !"sorbet_rb_array_square_br: argument 0"} +!92 = distinct !{!92, !"sorbet_rb_array_square_br"} +!93 = !{!94} +!94 = distinct !{!94, !95, !"sorbet_rb_array_square_br: argument 0"} +!95 = distinct !{!95, !"sorbet_rb_array_square_br"} +!96 = !{!97} +!97 = distinct !{!97, !98, !"sorbet_rb_array_square_br: argument 0"} +!98 = distinct !{!98, !"sorbet_rb_array_square_br"} +!99 = !DILocation(line: 12, column: 6, scope: !9) +!100 = !{!101} +!101 = distinct !{!101, !102, !"sorbet_buildArrayIntrinsic: argument 0"} +!102 = distinct !{!102, !"sorbet_buildArrayIntrinsic"} diff --git a/test/testdata/compiler/static_method.llo.exp b/test/testdata/compiler/static_method.llo.exp index 84049a51927..1794b1ad44c 100644 --- a/test/testdata/compiler/static_method.llo.exp +++ b/test/testdata/compiler/static_method.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -86,6 +88,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/compiler/static_method.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/static_method.rb" = private unnamed_addr constant [40 x i8] c"test/testdata/compiler/static_method.rb\00", align 1 +@iseqEncodedArray = internal global [10 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_Foo = private unnamed_addr constant [4 x i8] c"Foo\00", align 1 @ic_bar = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_bar = internal unnamed_addr global i64 0, align 8 @@ -107,7 +111,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #1 @@ -184,9 +190,11 @@ entry: %6 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([40 x i8], [40 x i8]* @"str_test/testdata/compiler/static_method.rb", i64 0, i64 0), i64 noundef 39) #12 tail call void @rb_gc_register_mark_object(i64 %6) #12 store i64 %6, i64* @"rubyStrFrozen_test/testdata/compiler/static_method.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 10) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %6, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 9, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/static_method.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/static_method.rb", align 8 + %7 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/static_method.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %7, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_bar.i = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 %rubyId_bar.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !8 @@ -197,12 +205,12 @@ entry: store i64 %8, i64* @rubyStrFrozen_bar, align 8 %rubyId_bar.i.i = load i64, i64* @rubyIdPrecomputed_bar, align 8 %"rubyStr_test/testdata/compiler/static_method.rb.i3.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/static_method.rb", align 8 - %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %8, i64 %rubyId_bar.i.i, i64 %"rubyStr_test/testdata/compiler/static_method.rb.i3.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 7, i64* noundef nonnull %locals.i4.i, i32 noundef 0, i32 noundef 0) + %9 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %8, i64 %rubyId_bar.i.i, i64 %"rubyStr_test/testdata/compiler/static_method.rb.i3.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i4.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %9, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Foo.bar, align 8 %"rubyId_.i5.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i6.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/compiler/static_method.rb.i7.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/static_method.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i6.i", i64 %"rubyId_.i5.i", i64 %"rubyStr_test/testdata/compiler/static_method.rb.i7.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 4, i32 noundef 4, i64* noundef nonnull %locals.i8.i, i32 noundef 0, i32 noundef 4) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i6.i", i64 %"rubyId_.i5.i", i64 %"rubyStr_test/testdata/compiler/static_method.rb.i7.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i8.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !14 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !14 @@ -222,119 +230,95 @@ entry: store i64 %21, i64* %19, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %14, %struct.rb_control_frame_struct* align 8 %16, %struct.rb_iseq_struct* %stackFrame.i) #12 %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 0 - %23 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %17, align 8, !tbaa !31 - %24 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %23, i64 0, i32 2 - %25 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %24, align 8, !tbaa !34 - %26 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %25, i64 0, i32 2 - %27 = load i64*, i64** %26, align 8, !tbaa !36 - %28 = getelementptr inbounds i64, i64* %27, i64 3 - %29 = getelementptr inbounds i64, i64* %28, i64 1 - store i64* %29, i64** %22, align 8, !dbg !45, !tbaa !16 - %30 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0)) #12, !dbg !46 - call void @sorbet_pushStaticInitFrame(i64 %30) #12, !dbg !46 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %22, align 8, !dbg !34, !tbaa !16 + %23 = call i64 @rb_define_module(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0)) #12, !dbg !35 + call void @sorbet_pushStaticInitFrame(i64 %23) #12, !dbg !35 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_Foo.", align 8 - %31 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !16 - %32 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %31, i64 0, i32 2 - %33 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %32, align 8, !tbaa !28 - %34 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %34, align 8, !tbaa !31 - %35 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 4 - %36 = load i64*, i64** %35, align 8, !tbaa !33 - %37 = load i64, i64* %36, align 8, !tbaa !4 - %38 = and i64 %37, -33 - store i64 %38, i64* %36, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %31, %struct.rb_control_frame_struct* align 8 %33, %struct.rb_iseq_struct* %stackFrame.i.i) #12 - %39 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %33, i64 0, i32 0 - %40 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %34, align 8, !tbaa !31 - %41 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %40, i64 0, i32 2 - %42 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %41, align 8, !tbaa !34 - %43 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %42, i64 0, i32 2 - %44 = load i64*, i64** %43, align 8, !tbaa !36 - %45 = getelementptr inbounds i64, i64* %44, i64 1 - %46 = getelementptr inbounds i64, i64* %45, i64 1, !dbg !47 - store i64* %46, i64** %39, align 8, !dbg !47, !tbaa !16 - %rubyId_bar.i.i1 = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !49 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_bar.i.i1) #12, !dbg !49 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !49 - %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #12, !dbg !49 - %47 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !49 - %48 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !49, !tbaa !50 - %needTakeSlowPath = icmp ne i64 %47, %48, !dbg !49 - br i1 %needTakeSlowPath, label %49, label %50, !dbg !49, !prof !51 - -49: ; preds = %entry - call void @const_recompute_Foo(), !dbg !49 - br label %50, !dbg !49 - -50: ; preds = %entry, %49 - %51 = load i64, i64* @guarded_const_Foo, align 8, !dbg !49 - %52 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !49 - %53 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !49, !tbaa !50 - %guardUpdated = icmp eq i64 %52, %53, !dbg !49 - call void @llvm.assume(i1 %guardUpdated), !dbg !49 - %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Foo.bar, align 8, !dbg !49 - %54 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !49 - %55 = bitcast i8* %54 to i16*, !dbg !49 - %56 = load i16, i16* %55, align 8, !dbg !49 - %57 = and i16 %56, -384, !dbg !49 - store i16 %57, i16* %55, align 8, !dbg !49 - %58 = getelementptr inbounds i8, i8* %54, i64 4, !dbg !49 - %59 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !49 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %58, i8 0, i64 28, i1 false) #12, !dbg !49 - call void @rb_define_singleton_sorbet_method(i64 %51, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Foo.bar, i8* nonnull %54, i8* %59) #12, !dbg !49 - call void @sorbet_popRubyStack() #12, !dbg !46 - %60 = getelementptr inbounds i64, i64* %27, i64 8, !dbg !46 - %61 = getelementptr inbounds i64, i64* %60, i64 1, !dbg !46 - store i64* %61, i64** %22, align 8, !dbg !46, !tbaa !16 - %62 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !16 - %63 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %62, i64 0, i32 2, !dbg !8 - %64 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %63, align 8, !dbg !8, !tbaa !28 - %65 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %64, i64 0, i32 1, !dbg !8 - %66 = load i64*, i64** %65, align 8, !dbg !8, !tbaa !52 - %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !8 - store i64* %67, i64** %65, align 8, !dbg !8, !tbaa !52 - store i64 %51, i64* %66, align 8, !dbg !8, !tbaa !4 + %24 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !16 + %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2 + %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !tbaa !28 + %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i, %struct.rb_iseq_struct** %27, align 8, !tbaa !31 + %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4 + %29 = load i64*, i64** %28, align 8, !tbaa !33 + %30 = load i64, i64* %29, align 8, !tbaa !4 + %31 = and i64 %30, -33 + store i64 %31, i64* %29, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %24, %struct.rb_control_frame_struct* align 8 %26, %struct.rb_iseq_struct* %stackFrame.i.i) #12 + %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 0 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %32, align 8, !dbg !36, !tbaa !16 + %rubyId_bar.i.i1 = load i64, i64* @rubyIdPrecomputed_bar, align 8, !dbg !38 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_bar.i.i1) #12, !dbg !38 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !38 + %rawSym7.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #12, !dbg !38 + %33 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !38 + %34 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !38, !tbaa !39 + %needTakeSlowPath = icmp ne i64 %33, %34, !dbg !38 + br i1 %needTakeSlowPath, label %35, label %36, !dbg !38, !prof !40 + +35: ; preds = %entry + call void @const_recompute_Foo(), !dbg !38 + br label %36, !dbg !38 + +36: ; preds = %entry, %35 + %37 = load i64, i64* @guarded_const_Foo, align 8, !dbg !38 + %38 = load i64, i64* @guard_epoch_Foo, align 8, !dbg !38 + %39 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !38, !tbaa !39 + %guardUpdated = icmp eq i64 %38, %39, !dbg !38 + call void @llvm.assume(i1 %guardUpdated), !dbg !38 + %stackFrame8.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_Foo.bar, align 8, !dbg !38 + %40 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #10, !dbg !38 + %41 = bitcast i8* %40 to i16*, !dbg !38 + %42 = load i16, i16* %41, align 8, !dbg !38 + %43 = and i16 %42, -384, !dbg !38 + store i16 %43, i16* %41, align 8, !dbg !38 + %44 = getelementptr inbounds i8, i8* %40, i64 4, !dbg !38 + %45 = bitcast %struct.rb_iseq_struct* %stackFrame8.i.i to i8*, !dbg !38 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %44, i8 0, i64 28, i1 false) #12, !dbg !38 + call void @rb_define_singleton_sorbet_method(i64 %37, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_bar, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_Foo.bar, i8* nonnull %40, i8* %45) #12, !dbg !38 + call void @sorbet_popRubyStack() #12, !dbg !35 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %22, align 8, !dbg !35, !tbaa !16 + %46 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !16 + %47 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %46, i64 0, i32 2, !dbg !8 + %48 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %47, align 8, !dbg !8, !tbaa !28 + %49 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %48, i64 0, i32 1, !dbg !8 + %50 = load i64*, i64** %49, align 8, !dbg !8, !tbaa !41 + %51 = getelementptr inbounds i64, i64* %50, i64 1, !dbg !8 + store i64* %51, i64** %49, align 8, !dbg !8, !tbaa !41 + store i64 %37, i64* %50, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_bar, i64 0) #12, !dbg !8 - %68 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !16 - %69 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %68, i64 0, i32 2, !dbg !13 - %70 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %69, align 8, !dbg !13, !tbaa !28 - %71 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %70, i64 0, i32 1, !dbg !13 - %72 = load i64*, i64** %71, align 8, !dbg !13, !tbaa !52 - %73 = getelementptr inbounds i64, i64* %72, i64 1, !dbg !13 - store i64 %13, i64* %72, align 8, !dbg !13, !tbaa !4 - %74 = getelementptr inbounds i64, i64* %73, i64 1, !dbg !13 - store i64* %74, i64** %71, align 8, !dbg !13, !tbaa !52 - store i64 %send.i, i64* %73, align 8, !dbg !13, !tbaa !4 + %52 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !16 + %53 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %52, i64 0, i32 2, !dbg !13 + %54 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %53, align 8, !dbg !13, !tbaa !28 + %55 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %54, i64 0, i32 1, !dbg !13 + %56 = load i64*, i64** %55, align 8, !dbg !13, !tbaa !41 + %57 = getelementptr inbounds i64, i64* %56, i64 1, !dbg !13 + store i64 %13, i64* %56, align 8, !dbg !13, !tbaa !4 + %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !13 + store i64* %58, i64** %55, align 8, !dbg !13, !tbaa !41 + store i64 %send.i, i64* %57, align 8, !dbg !13, !tbaa !4 %send20.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #12, !dbg !13 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @func_Foo.bar(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !53 { +define i64 @func_Foo.bar(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #6 !dbg !42 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !16 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !28 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !31 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !34 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !36 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !16 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !54 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !54, !prof !55 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !tbaa !16 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !43 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !43, !prof !44 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !54 - unreachable, !dbg !54 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #0, !dbg !43 + unreachable, !dbg !43 fillRequiredArgs: ; preds = %functionEntryInitializers - %11 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !56 - store i64* %11, i64** %3, align 8, !dbg !56, !tbaa !16 - %rubyStr_bar = load i64, i64* @rubyStrFrozen_bar, align 8, !dbg !57 + store i64* getelementptr inbounds ([10 x i64], [10 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !dbg !45, !tbaa !16 + %rubyStr_bar = load i64, i64* @rubyStrFrozen_bar, align 8, !dbg !46 ret i64 %rubyStr_bar } @@ -348,7 +332,7 @@ declare void @llvm.assume(i1 noundef) #8 define linkonce void @const_recompute_Foo() local_unnamed_addr #9 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str_Foo, i64 0, i64 0), i64 3) store i64 %1, i64* @guarded_const_Foo, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !50 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !39 store i64 %2, i64* @guard_epoch_Foo, align 8 ret void } @@ -404,27 +388,16 @@ attributes #12 = { nounwind } !31 = !{!32, !17, i64 16} !32 = !{!"rb_control_frame_struct", !17, i64 0, !17, i64 8, !17, i64 16, !5, i64 24, !17, i64 32, !17, i64 40, !17, i64 48} !33 = !{!32, !17, i64 32} -!34 = !{!35, !17, i64 16} -!35 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !17, i64 16, !6, i64 24} -!36 = !{!37, !17, i64 8} -!37 = !{!"rb_iseq_constant_body", !6, i64 0, !23, i64 4, !17, i64 8, !38, i64 16, !40, i64 64, !43, i64 120, !17, i64 152, !17, i64 160, !17, i64 168, !17, i64 176, !17, i64 184, !17, i64 192, !44, i64 200, !23, i64 232, !23, i64 236, !23, i64 240, !23, i64 244, !23, i64 248, !6, i64 252, !5, i64 256} -!38 = !{!"", !39, i64 0, !23, i64 4, !23, i64 8, !23, i64 12, !23, i64 16, !23, i64 20, !23, i64 24, !23, i64 28, !17, i64 32, !17, i64 40} -!39 = !{!"", !23, i64 0, !23, i64 0, !23, i64 0, !23, i64 0, !23, i64 0, !23, i64 0, !23, i64 0, !23, i64 0, !23, i64 1, !23, i64 1} -!40 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !23, i64 32, !41, i64 36} -!41 = !{!"rb_code_location_struct", !42, i64 0, !42, i64 8} -!42 = !{!"rb_code_position_struct", !23, i64 0, !23, i64 4} -!43 = !{!"iseq_insn_info", !17, i64 0, !17, i64 8, !23, i64 16, !17, i64 24} -!44 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !17, i64 24} -!45 = !DILocation(line: 0, scope: !9) -!46 = !DILocation(line: 4, column: 1, scope: !9) -!47 = !DILocation(line: 0, scope: !15, inlinedAt: !48) -!48 = distinct !DILocation(line: 4, column: 1, scope: !9) -!49 = !DILocation(line: 5, column: 3, scope: !15, inlinedAt: !48) -!50 = !{!24, !24, i64 0} -!51 = !{!"branch_weights", i32 1, i32 10000} -!52 = !{!32, !17, i64 8} -!53 = distinct !DISubprogram(name: "Foo.bar", linkageName: "func_Foo.bar", scope: null, file: !2, line: 5, type: !10, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!54 = !DILocation(line: 5, column: 3, scope: !53) -!55 = !{!"branch_weights", i32 1, i32 2000} -!56 = !DILocation(line: 0, scope: !53) -!57 = !DILocation(line: 6, column: 5, scope: !53) +!34 = !DILocation(line: 0, scope: !9) +!35 = !DILocation(line: 4, column: 1, scope: !9) +!36 = !DILocation(line: 0, scope: !15, inlinedAt: !37) +!37 = distinct !DILocation(line: 4, column: 1, scope: !9) +!38 = !DILocation(line: 5, column: 3, scope: !15, inlinedAt: !37) +!39 = !{!24, !24, i64 0} +!40 = !{!"branch_weights", i32 1, i32 10000} +!41 = !{!32, !17, i64 8} +!42 = distinct !DISubprogram(name: "Foo.bar", linkageName: "func_Foo.bar", scope: null, file: !2, line: 5, type: !10, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!43 = !DILocation(line: 5, column: 3, scope: !42) +!44 = !{!"branch_weights", i32 1, i32 2000} +!45 = !DILocation(line: 0, scope: !42) +!46 = !DILocation(line: 6, column: 5, scope: !42) diff --git a/test/testdata/compiler/unsafe.llo.exp b/test/testdata/compiler/unsafe.llo.exp index 319f8eb790f..eeceefbcaa8 100644 --- a/test/testdata/compiler/unsafe.llo.exp +++ b/test/testdata/compiler/unsafe.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,7 +85,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/compiler/unsafe.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/compiler/unsafe.rb" = private unnamed_addr constant [33 x i8] c"test/testdata/compiler/unsafe.rb\00", align 1 +@iseqEncodedArray = internal global [5 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @rubyIdPrecomputed_unsafe = internal unnamed_addr global i64 0, align 8 @str_unsafe = private unnamed_addr constant [7 x i8] c"unsafe\00", align 1 @ic_unsafe = internal global %struct.FunctionInlineCache zeroinitializer @@ -91,7 +96,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @rubyIdPrecomputed_puts = internal unnamed_addr global i64 0, align 8 @str_puts = private unnamed_addr constant [5 x i8] c"puts\00", align 1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -150,9 +157,12 @@ entry: store i64 %3, i64* @"rubyStrFrozen_", align 8 %4 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([33 x i8], [33 x i8]* @"str_test/testdata/compiler/unsafe.rb", i64 0, i64 0), i64 noundef 32) #10 tail call void @rb_gc_register_mark_object(i64 %4) #10 + store i64 %4, i64* @"rubyStrFrozen_test/testdata/compiler/unsafe.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 5) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %5 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %4, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 4, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/compiler/unsafe.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/compiler/unsafe.rb", align 8 + %5 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/compiler/unsafe.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %5, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_unsafe.i = load i64, i64* @rubyIdPrecomputed_unsafe, align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_unsafe, i64 %rubyId_unsafe.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !8 @@ -176,29 +186,22 @@ entry: store i64 %17, i64* %15, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %10, %struct.rb_control_frame_struct* align 8 %12, %struct.rb_iseq_struct* %stackFrame.i) #10 %18 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %12, i64 0, i32 0 - %19 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %13, align 8, !tbaa !29 - %20 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %19, i64 0, i32 2 - %21 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %20, align 8, !tbaa !32 - %22 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %21, i64 0, i32 2 - %23 = load i64*, i64** %22, align 8, !tbaa !34 - %24 = getelementptr inbounds i64, i64* %23, i64 3 - %25 = getelementptr inbounds i64, i64* %24, i64 1 - store i64* %25, i64** %18, align 8, !dbg !43, !tbaa !14 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %18, align 8, !dbg !32, !tbaa !14 %callArgs0Addr.i = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i32 0, i64 0, !dbg !8 store i64 3, i64* %callArgs0Addr.i, align 8, !dbg !8 - %26 = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i64 0, i64 0, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !44) #10, !dbg !8 - %27 = load i64, i64* %26, align 8, !dbg !8, !tbaa !4, !alias.scope !44 - %28 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !14 - %29 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %28, i64 0, i32 2, !dbg !13 - %30 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %29, align 8, !dbg !13, !tbaa !26 - %31 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 1, !dbg !13 - %32 = load i64*, i64** %31, align 8, !dbg !13, !tbaa !47 - %33 = getelementptr inbounds i64, i64* %32, i64 1, !dbg !13 - store i64 %8, i64* %32, align 8, !dbg !13, !tbaa !4 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !13 - store i64* %34, i64** %31, align 8, !dbg !13, !tbaa !47 - store i64 %27, i64* %33, align 8, !dbg !13, !tbaa !4 + %19 = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i64 0, i64 0, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !33) #10, !dbg !8 + %20 = load i64, i64* %19, align 8, !dbg !8, !tbaa !4, !alias.scope !33 + %21 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !13, !tbaa !14 + %22 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %21, i64 0, i32 2, !dbg !13 + %23 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %22, align 8, !dbg !13, !tbaa !26 + %24 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %23, i64 0, i32 1, !dbg !13 + %25 = load i64*, i64** %24, align 8, !dbg !13, !tbaa !36 + %26 = getelementptr inbounds i64, i64* %25, i64 1, !dbg !13 + store i64 %8, i64* %25, align 8, !dbg !13, !tbaa !4 + %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !13 + store i64* %27, i64** %24, align 8, !dbg !13, !tbaa !36 + store i64 %20, i64* %26, align 8, !dbg !13, !tbaa !4 %send14.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #10, !dbg !13 call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %9) ret void @@ -260,19 +263,8 @@ attributes #10 = { nounwind } !29 = !{!30, !15, i64 16} !30 = !{!"rb_control_frame_struct", !15, i64 0, !15, i64 8, !15, i64 16, !5, i64 24, !15, i64 32, !15, i64 40, !15, i64 48} !31 = !{!30, !15, i64 32} -!32 = !{!33, !15, i64 16} -!33 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !15, i64 16, !6, i64 24} -!34 = !{!35, !15, i64 8} -!35 = !{!"rb_iseq_constant_body", !6, i64 0, !21, i64 4, !15, i64 8, !36, i64 16, !38, i64 64, !41, i64 120, !15, i64 152, !15, i64 160, !15, i64 168, !15, i64 176, !15, i64 184, !15, i64 192, !42, i64 200, !21, i64 232, !21, i64 236, !21, i64 240, !21, i64 244, !21, i64 248, !6, i64 252, !5, i64 256} -!36 = !{!"", !37, i64 0, !21, i64 4, !21, i64 8, !21, i64 12, !21, i64 16, !21, i64 20, !21, i64 24, !21, i64 28, !15, i64 32, !15, i64 40} -!37 = !{!"", !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 1, !21, i64 1} -!38 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !21, i64 32, !39, i64 36} -!39 = !{!"rb_code_location_struct", !40, i64 0, !40, i64 8} -!40 = !{!"rb_code_position_struct", !21, i64 0, !21, i64 4} -!41 = !{!"iseq_insn_info", !15, i64 0, !15, i64 8, !21, i64 16, !15, i64 24} -!42 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !15, i64 24} -!43 = !DILocation(line: 0, scope: !9) -!44 = !{!45} -!45 = distinct !{!45, !46, !"sorbet_T_unsafe: argument 0"} -!46 = distinct !{!46, !"sorbet_T_unsafe"} -!47 = !{!30, !15, i64 8} +!32 = !DILocation(line: 0, scope: !9) +!33 = !{!34} +!34 = distinct !{!34, !35, !"sorbet_T_unsafe: argument 0"} +!35 = distinct !{!35, !"sorbet_T_unsafe"} +!36 = !{!30, !15, i64 8} diff --git a/test/testdata/ruby_benchmark/app_fib.llo.exp b/test/testdata/ruby_benchmark/app_fib.llo.exp index 158b9f38675..0f32b3de705 100644 --- a/test/testdata/ruby_benchmark/app_fib.llo.exp +++ b/test/testdata/ruby_benchmark/app_fib.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -87,6 +89,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/ruby_benchmark/app_fib.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/ruby_benchmark/app_fib.rb" = private unnamed_addr constant [40 x i8] c"test/testdata/ruby_benchmark/app_fib.rb\00", align 1 +@iseqEncodedArray = internal global [18 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_HasFib = private unnamed_addr constant [7 x i8] c"HasFib\00", align 1 @ic_fib = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_fib = internal unnamed_addr global i64 0, align 8 @@ -142,7 +146,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -234,340 +240,326 @@ functionEntryInitializers: %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !14 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !18 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !20 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !22 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !12 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !31 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !31 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !31 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !31, !prof !32 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %3, align 8, !tbaa !12 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !18 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !18 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !18 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !18, !prof !19 BB4.thread: ; preds = %sorbet_rb_int_lt.exit - %11 = getelementptr inbounds i64, i64* %9, i64 6 - %12 = getelementptr inbounds i64, i64* %11, i64 1 - store i64* %12, i64** %3, align 8, !tbaa !12 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !tbaa !12 br label %typeTestSuccess91 BB3: ; preds = %sorbet_rb_int_lt.exit - %13 = getelementptr inbounds i64, i64* %9, i64 4 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %3, align 8, !tbaa !12 - store i64 3, i64* %callArgs0Addr, align 8, !dbg !33 - tail call void @llvm.experimental.noalias.scope.decl(metadata !34), !dbg !33 - %15 = load i64, i64* %73, align 8, !dbg !33, !tbaa !4, !alias.scope !34 - %16 = and i64 %15, %59, !dbg !33 - %17 = icmp eq i64 %16, 0, !dbg !33 - br i1 %17, label %27, label %18, !dbg !33, !prof !32 - -18: ; preds = %BB3 - %19 = add nsw i64 %15, -1, !dbg !33 - %20 = tail call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %rawArg_n, i64 %19) #18, !dbg !33 - %21 = extractvalue { i64, i1 } %20, 1, !dbg !33 - %22 = extractvalue { i64, i1 } %20, 0, !dbg !33 - br i1 %21, label %23, label %sorbet_rb_int_minus.exit, !dbg !33 - -23: ; preds = %18 - %24 = ashr i64 %22, 1, !dbg !33 - %25 = xor i64 %24, -9223372036854775808, !dbg !33 - %26 = tail call i64 @rb_int2big(i64 %25) #19, !dbg !33, !noalias !34 - br label %sorbet_rb_int_minus.exit, !dbg !33 - -27: ; preds = %BB3 - %28 = tail call i64 @sorbet_rb_int_minus_slowpath(i64 %rawArg_n, i64 %15) #19, !dbg !33, !noalias !34 - br label %sorbet_rb_int_minus.exit, !dbg !33 - -sorbet_rb_int_minus.exit: ; preds = %23, %18, %27 - %29 = phi i64 [ %28, %27 ], [ %26, %23 ], [ %22, %18 ], !dbg !33 - %30 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !37 - %31 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !37, !tbaa !38 - %needTakeSlowPath = icmp ne i64 %30, %31, !dbg !37 - br i1 %needTakeSlowPath, label %32, label %33, !dbg !37, !prof !40 - -32: ; preds = %sorbet_rb_int_minus.exit - tail call void @const_recompute_HasFib(), !dbg !37 - br label %33, !dbg !37 - -33: ; preds = %sorbet_rb_int_minus.exit, %32 - %34 = load i64, i64* @guarded_const_HasFib, align 8, !dbg !37 - %35 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !37 - %36 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !37, !tbaa !38 - %guardUpdated = icmp eq i64 %35, %36, !dbg !37 - tail call void @llvm.assume(i1 %guardUpdated), !dbg !37 - %37 = icmp eq i64 %selfRaw, %34, !dbg !37 - br i1 %37, label %fastFinalCall_fib, label %38, !dbg !37 - -38: ; preds = %33 - %39 = load i64, i64* @rb_cModule, align 8, !dbg !37, !tbaa !4 - %40 = tail call i64 @rb_obj_is_kind_of(i64 %selfRaw, i64 %39), !dbg !37 - %41 = icmp eq i64 %40, 0, !dbg !37 - br i1 %41, label %slowFinalCall_fib, label %sorbet_isa_class_of.exit, !dbg !37, !prof !41 - -sorbet_isa_class_of.exit: ; preds = %38 - %42 = tail call i64 @rb_class_inherited_p(i64 %selfRaw, i64 %34) #3, !dbg !37 - %43 = icmp ne i64 %42, 0, !dbg !37 - br i1 %43, label %fastFinalCall_fib, label %slowFinalCall_fib, !dbg !37, !prof !42 - -BB4: ; preds = %154, %149, %158, %"alternativeCallIntrinsic_Integer_+" - %".sroa.0.0" = phi i64 [ %send87, %"alternativeCallIntrinsic_Integer_+" ], [ %159, %158 ], [ %157, %154 ], [ %153, %149 ], !dbg !43 - %44 = getelementptr inbounds i64, i64* %9, i64 6 - %45 = getelementptr inbounds i64, i64* %44, i64 1 - store i64* %45, i64** %3, align 8, !tbaa !12 - %46 = and i64 %".sroa.0.0", 1 - %47 = icmp eq i64 %46, 0 - br i1 %47, label %48, label %typeTestSuccess91, !prof !44 - -48: ; preds = %BB4 - %49 = and i64 %".sroa.0.0", 7 - %50 = icmp ne i64 %49, 0 - %51 = and i64 %".sroa.0.0", -9 - %52 = icmp eq i64 %51, 0 - %53 = or i1 %50, %52 - br i1 %53, label %codeRepl140, label %sorbet_isa_Integer.exit, !prof !41 - -sorbet_isa_Integer.exit: ; preds = %48 - %54 = inttoptr i64 %".sroa.0.0" to %struct.iseq_inline_iv_cache_entry* - %55 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %54, i64 0, i32 0 - %56 = load i64, i64* %55, align 8, !tbaa !45 - %57 = and i64 %56, 31 - %58 = icmp eq i64 %57, 10 - br i1 %58, label %typeTestSuccess91, label %codeRepl140, !prof !42 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %3, align 8, !tbaa !12 + store i64 3, i64* %callArgs0Addr, align 8, !dbg !20 + tail call void @llvm.experimental.noalias.scope.decl(metadata !21), !dbg !20 + %4 = load i64, i64* %59, align 8, !dbg !20, !tbaa !4, !alias.scope !21 + %5 = and i64 %4, %46, !dbg !20 + %6 = icmp eq i64 %5, 0, !dbg !20 + br i1 %6, label %16, label %7, !dbg !20, !prof !19 + +7: ; preds = %BB3 + %8 = add nsw i64 %4, -1, !dbg !20 + %9 = tail call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %rawArg_n, i64 %8) #18, !dbg !20 + %10 = extractvalue { i64, i1 } %9, 1, !dbg !20 + %11 = extractvalue { i64, i1 } %9, 0, !dbg !20 + br i1 %10, label %12, label %sorbet_rb_int_minus.exit, !dbg !20 + +12: ; preds = %7 + %13 = ashr i64 %11, 1, !dbg !20 + %14 = xor i64 %13, -9223372036854775808, !dbg !20 + %15 = tail call i64 @rb_int2big(i64 %14) #19, !dbg !20, !noalias !21 + br label %sorbet_rb_int_minus.exit, !dbg !20 + +16: ; preds = %BB3 + %17 = tail call i64 @sorbet_rb_int_minus_slowpath(i64 %rawArg_n, i64 %4) #19, !dbg !20, !noalias !21 + br label %sorbet_rb_int_minus.exit, !dbg !20 + +sorbet_rb_int_minus.exit: ; preds = %12, %7, %16 + %18 = phi i64 [ %17, %16 ], [ %15, %12 ], [ %11, %7 ], !dbg !20 + %19 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !24 + %20 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !24, !tbaa !25 + %needTakeSlowPath = icmp ne i64 %19, %20, !dbg !24 + br i1 %needTakeSlowPath, label %21, label %22, !dbg !24, !prof !27 + +21: ; preds = %sorbet_rb_int_minus.exit + tail call void @const_recompute_HasFib(), !dbg !24 + br label %22, !dbg !24 + +22: ; preds = %sorbet_rb_int_minus.exit, %21 + %23 = load i64, i64* @guarded_const_HasFib, align 8, !dbg !24 + %24 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !24 + %25 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !24, !tbaa !25 + %guardUpdated = icmp eq i64 %24, %25, !dbg !24 + tail call void @llvm.assume(i1 %guardUpdated), !dbg !24 + %26 = icmp eq i64 %selfRaw, %23, !dbg !24 + br i1 %26, label %fastFinalCall_fib, label %27, !dbg !24 + +27: ; preds = %22 + %28 = load i64, i64* @rb_cModule, align 8, !dbg !24, !tbaa !4 + %29 = tail call i64 @rb_obj_is_kind_of(i64 %selfRaw, i64 %28), !dbg !24 + %30 = icmp eq i64 %29, 0, !dbg !24 + br i1 %30, label %slowFinalCall_fib, label %sorbet_isa_class_of.exit, !dbg !24, !prof !28 + +sorbet_isa_class_of.exit: ; preds = %27 + %31 = tail call i64 @rb_class_inherited_p(i64 %selfRaw, i64 %23) #3, !dbg !24 + %32 = icmp ne i64 %31, 0, !dbg !24 + br i1 %32, label %fastFinalCall_fib, label %slowFinalCall_fib, !dbg !24, !prof !29 + +BB4: ; preds = %140, %135, %144, %"alternativeCallIntrinsic_Integer_+" + %".sroa.0.0" = phi i64 [ %send87, %"alternativeCallIntrinsic_Integer_+" ], [ %145, %144 ], [ %143, %140 ], [ %139, %135 ], !dbg !30 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !tbaa !12 + %33 = and i64 %".sroa.0.0", 1 + %34 = icmp eq i64 %33, 0 + br i1 %34, label %35, label %typeTestSuccess91, !prof !31 + +35: ; preds = %BB4 + %36 = and i64 %".sroa.0.0", 7 + %37 = icmp ne i64 %36, 0 + %38 = and i64 %".sroa.0.0", -9 + %39 = icmp eq i64 %38, 0 + %40 = or i1 %37, %39 + br i1 %40, label %codeRepl135, label %sorbet_isa_Integer.exit, !prof !28 + +sorbet_isa_Integer.exit: ; preds = %35 + %41 = inttoptr i64 %".sroa.0.0" to %struct.iseq_inline_iv_cache_entry* + %42 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %41, i64 0, i32 0 + %43 = load i64, i64* %42, align 8, !tbaa !32 + %44 = and i64 %43, 31 + %45 = icmp eq i64 %44, 10 + br i1 %45, label %typeTestSuccess91, label %codeRepl135, !prof !29 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !31 - unreachable, !dbg !31 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !18 + unreachable, !dbg !18 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_n = load i64, i64* %argArray, align 8, !dbg !31 - %59 = and i64 %rawArg_n, 1, !dbg !47 - %60 = icmp eq i64 %59, 0, !dbg !47 - br i1 %60, label %61, label %typeTestSuccess, !dbg !47, !prof !44 - -61: ; preds = %fillRequiredArgs - %62 = and i64 %rawArg_n, 7, !dbg !47 - %63 = icmp ne i64 %62, 0, !dbg !47 - %64 = and i64 %rawArg_n, -9, !dbg !47 - %65 = icmp eq i64 %64, 0, !dbg !47 - %66 = or i1 %63, %65, !dbg !47 - br i1 %66, label %codeRepl, label %sorbet_isa_Integer.exit127, !dbg !47, !prof !41 - -sorbet_isa_Integer.exit127: ; preds = %61 - %67 = inttoptr i64 %rawArg_n to %struct.iseq_inline_iv_cache_entry*, !dbg !47 - %68 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %67, i64 0, i32 0, !dbg !47 - %69 = load i64, i64* %68, align 8, !dbg !47, !tbaa !45 - %70 = and i64 %69, 31, !dbg !47 - %71 = icmp eq i64 %70, 10, !dbg !47 - br i1 %71, label %typeTestSuccess, label %codeRepl, !dbg !47, !prof !42 - -typeTestSuccess: ; preds = %fillRequiredArgs, %sorbet_isa_Integer.exit127 - %72 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !47 - store i64* %72, i64** %3, align 8, !dbg !47, !tbaa !12 - %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !48 - store i64 7, i64* %callArgs0Addr, align 8, !dbg !48 - %73 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !48 - tail call void @llvm.experimental.noalias.scope.decl(metadata !49), !dbg !48 - %74 = load i64, i64* %73, align 8, !dbg !48, !tbaa !4, !alias.scope !49 - %75 = and i64 %74, %59, !dbg !48 - %76 = icmp eq i64 %75, 0, !dbg !48 - br i1 %76, label %82, label %77, !dbg !48, !prof !32 - -77: ; preds = %typeTestSuccess - %78 = ashr i64 %rawArg_n, 1, !dbg !48 - %79 = ashr i64 %74, 1, !dbg !48 - %80 = icmp slt i64 %78, %79, !dbg !48 - %81 = select i1 %80, i64 20, i64 0, !dbg !48 - br label %sorbet_rb_int_lt.exit, !dbg !48 - -82: ; preds = %typeTestSuccess - %83 = tail call i64 @sorbet_rb_int_lt_slowpath(i64 %rawArg_n, i64 %74) #19, !dbg !48, !noalias !49 - br label %sorbet_rb_int_lt.exit, !dbg !48 - -sorbet_rb_int_lt.exit: ; preds = %82, %77 - %rawSendResult124 = phi i64 [ %81, %77 ], [ %83, %82 ] - %84 = and i64 %rawSendResult124, -9, !dbg !48 - %85 = icmp ne i64 %84, 0, !dbg !48 - br i1 %85, label %BB4.thread, label %BB3, !dbg !48 - -codeRepl: ; preds = %sorbet_isa_Integer.exit127, %61 - tail call fastcc void @func_HasFib.fib.cold.1(i64 %rawArg_n) #20, !dbg !47 + %rawArg_n = load i64, i64* %argArray, align 8, !dbg !18 + %46 = and i64 %rawArg_n, 1, !dbg !34 + %47 = icmp eq i64 %46, 0, !dbg !34 + br i1 %47, label %48, label %typeTestSuccess, !dbg !34, !prof !31 + +48: ; preds = %fillRequiredArgs + %49 = and i64 %rawArg_n, 7, !dbg !34 + %50 = icmp ne i64 %49, 0, !dbg !34 + %51 = and i64 %rawArg_n, -9, !dbg !34 + %52 = icmp eq i64 %51, 0, !dbg !34 + %53 = or i1 %50, %52, !dbg !34 + br i1 %53, label %codeRepl, label %sorbet_isa_Integer.exit122, !dbg !34, !prof !28 + +sorbet_isa_Integer.exit122: ; preds = %48 + %54 = inttoptr i64 %rawArg_n to %struct.iseq_inline_iv_cache_entry*, !dbg !34 + %55 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %54, i64 0, i32 0, !dbg !34 + %56 = load i64, i64* %55, align 8, !dbg !34, !tbaa !32 + %57 = and i64 %56, 31, !dbg !34 + %58 = icmp eq i64 %57, 10, !dbg !34 + br i1 %58, label %typeTestSuccess, label %codeRepl, !dbg !34, !prof !29 + +typeTestSuccess: ; preds = %fillRequiredArgs, %sorbet_isa_Integer.exit122 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !dbg !34, !tbaa !12 + %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !35 + store i64 7, i64* %callArgs0Addr, align 8, !dbg !35 + %59 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !35 + tail call void @llvm.experimental.noalias.scope.decl(metadata !36), !dbg !35 + %60 = load i64, i64* %59, align 8, !dbg !35, !tbaa !4, !alias.scope !36 + %61 = and i64 %60, %46, !dbg !35 + %62 = icmp eq i64 %61, 0, !dbg !35 + br i1 %62, label %68, label %63, !dbg !35, !prof !19 + +63: ; preds = %typeTestSuccess + %64 = ashr i64 %rawArg_n, 1, !dbg !35 + %65 = ashr i64 %60, 1, !dbg !35 + %66 = icmp slt i64 %64, %65, !dbg !35 + %67 = select i1 %66, i64 20, i64 0, !dbg !35 + br label %sorbet_rb_int_lt.exit, !dbg !35 + +68: ; preds = %typeTestSuccess + %69 = tail call i64 @sorbet_rb_int_lt_slowpath(i64 %rawArg_n, i64 %60) #19, !dbg !35, !noalias !36 + br label %sorbet_rb_int_lt.exit, !dbg !35 + +sorbet_rb_int_lt.exit: ; preds = %68, %63 + %rawSendResult119 = phi i64 [ %67, %63 ], [ %69, %68 ] + %70 = and i64 %rawSendResult119, -9, !dbg !35 + %71 = icmp ne i64 %70, 0, !dbg !35 + br i1 %71, label %BB4.thread, label %BB3, !dbg !35 + +codeRepl: ; preds = %sorbet_isa_Integer.exit122, %48 + tail call fastcc void @func_HasFib.fib.cold.1(i64 %rawArg_n) #20, !dbg !34 unreachable -fastFinalCall_fib: ; preds = %33, %sorbet_isa_class_of.exit - store i64 %29, i64* %callArgs0Addr, align 8, !dbg !37 - %86 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !37 - %87 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_fib.3, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !37, !tbaa !52 - %88 = icmp eq %struct.rb_callable_method_entry_struct* %87, null, !dbg !37 - br i1 %88, label %89, label %sorbet_callFuncDirect.exit126, !dbg !37, !prof !44 - -89: ; preds = %fastFinalCall_fib - tail call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_fib.3, i64 %selfRaw) #19, !dbg !37 - br label %sorbet_callFuncDirect.exit126, !dbg !37 - -sorbet_callFuncDirect.exit126: ; preds = %fastFinalCall_fib, %89 - tail call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_fib.3, i64 %selfRaw, %struct.rb_iseq_struct* %86) #19, !dbg !37 - %90 = call i64 @func_HasFib.fib(i32 noundef 1, i64* nocapture noundef nonnull readonly align 8 dereferenceable(16) %73, i64 %selfRaw) #19, !dbg !37 - tail call void @sorbet_popRubyStack() #19, !dbg !37 - br label %afterFinalCall_fib, !dbg !37 - -slowFinalCall_fib: ; preds = %38, %sorbet_isa_class_of.exit - %91 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !12 - %92 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %91, i64 0, i32 2, !dbg !37 - %93 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %92, align 8, !dbg !37, !tbaa !14 - %94 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %93, i64 0, i32 1, !dbg !37 - %95 = load i64*, i64** %94, align 8, !dbg !37, !tbaa !58 - %96 = getelementptr inbounds i64, i64* %95, i64 1, !dbg !37 - store i64 %selfRaw, i64* %95, align 8, !dbg !37, !tbaa !4 - %97 = getelementptr inbounds i64, i64* %96, i64 1, !dbg !37 - store i64* %97, i64** %94, align 8, !dbg !37, !tbaa !58 - store i64 %29, i64* %96, align 8, !dbg !37, !tbaa !4 - %send45 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fib.4, i64 0), !dbg !37 - br label %afterFinalCall_fib, !dbg !37 - -afterFinalCall_fib: ; preds = %slowFinalCall_fib, %sorbet_callFuncDirect.exit126 - %98 = phi i1 [ true, %sorbet_callFuncDirect.exit126 ], [ false, %slowFinalCall_fib ] - %finalCallResult_fib = phi i64 [ %90, %sorbet_callFuncDirect.exit126 ], [ %send45, %slowFinalCall_fib ], !dbg !37 - store i64 5, i64* %callArgs0Addr, align 8, !dbg !59 - tail call void @llvm.experimental.noalias.scope.decl(metadata !60), !dbg !59 - %99 = load i64, i64* %73, align 8, !dbg !59, !tbaa !4, !alias.scope !60 - %100 = and i64 %99, %59, !dbg !59 - %101 = icmp eq i64 %100, 0, !dbg !59 - br i1 %101, label %111, label %102, !dbg !59, !prof !32 - -102: ; preds = %afterFinalCall_fib - %103 = add nsw i64 %99, -1, !dbg !59 - %104 = tail call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %rawArg_n, i64 %103) #18, !dbg !59 - %105 = extractvalue { i64, i1 } %104, 1, !dbg !59 - %106 = extractvalue { i64, i1 } %104, 0, !dbg !59 - br i1 %105, label %107, label %sorbet_rb_int_minus.exit125, !dbg !59 - -107: ; preds = %102 - %108 = ashr i64 %106, 1, !dbg !59 - %109 = xor i64 %108, -9223372036854775808, !dbg !59 - %110 = tail call i64 @rb_int2big(i64 %109) #19, !dbg !59, !noalias !60 - br label %sorbet_rb_int_minus.exit125, !dbg !59 - -111: ; preds = %afterFinalCall_fib - %112 = tail call i64 @sorbet_rb_int_minus_slowpath(i64 %rawArg_n, i64 %99) #19, !dbg !59, !noalias !60 - br label %sorbet_rb_int_minus.exit125, !dbg !59 - -sorbet_rb_int_minus.exit125: ; preds = %107, %102, %111 - %113 = phi i64 [ %112, %111 ], [ %110, %107 ], [ %106, %102 ], !dbg !59 - br i1 %98, label %fastFinalCall_fib65, label %slowFinalCall_fib66, !dbg !63 - -fastFinalCall_fib65: ; preds = %sorbet_rb_int_minus.exit125 - store i64 %113, i64* %callArgs0Addr, align 8, !dbg !63 - %114 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !63 - %115 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_fib.6, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !63, !tbaa !52 - %116 = icmp eq %struct.rb_callable_method_entry_struct* %115, null, !dbg !63 - br i1 %116, label %117, label %sorbet_callFuncDirect.exit, !dbg !63, !prof !44 - -117: ; preds = %fastFinalCall_fib65 - tail call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_fib.6, i64 %selfRaw) #19, !dbg !63 - br label %sorbet_callFuncDirect.exit, !dbg !63 - -sorbet_callFuncDirect.exit: ; preds = %fastFinalCall_fib65, %117 - tail call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_fib.6, i64 %selfRaw, %struct.rb_iseq_struct* %114) #19, !dbg !63 - %118 = call i64 @func_HasFib.fib(i32 noundef 1, i64* nocapture noundef nonnull readonly align 8 dereferenceable(16) %73, i64 %selfRaw) #19, !dbg !63 - tail call void @sorbet_popRubyStack() #19, !dbg !63 - br label %afterFinalCall_fib67, !dbg !63 - -slowFinalCall_fib66: ; preds = %sorbet_rb_int_minus.exit125 - %119 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !12 - %120 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %119, i64 0, i32 2, !dbg !63 - %121 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %120, align 8, !dbg !63, !tbaa !14 - %122 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %121, i64 0, i32 1, !dbg !63 - %123 = load i64*, i64** %122, align 8, !dbg !63, !tbaa !58 - %124 = getelementptr inbounds i64, i64* %123, i64 1, !dbg !63 - store i64 %selfRaw, i64* %123, align 8, !dbg !63, !tbaa !4 - %125 = getelementptr inbounds i64, i64* %124, i64 1, !dbg !63 - store i64* %125, i64** %122, align 8, !dbg !63, !tbaa !58 - store i64 %113, i64* %124, align 8, !dbg !63, !tbaa !4 - %send75 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fib.7, i64 0), !dbg !63 - br label %afterFinalCall_fib67, !dbg !63 +fastFinalCall_fib: ; preds = %22, %sorbet_isa_class_of.exit + store i64 %18, i64* %callArgs0Addr, align 8, !dbg !24 + %72 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !24 + %73 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_fib.3, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !24, !tbaa !39 + %74 = icmp eq %struct.rb_callable_method_entry_struct* %73, null, !dbg !24 + br i1 %74, label %75, label %sorbet_callFuncDirect.exit120, !dbg !24, !prof !31 + +75: ; preds = %fastFinalCall_fib + tail call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_fib.3, i64 %selfRaw) #19, !dbg !24 + br label %sorbet_callFuncDirect.exit120, !dbg !24 + +sorbet_callFuncDirect.exit120: ; preds = %fastFinalCall_fib, %75 + tail call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_fib.3, i64 %selfRaw, %struct.rb_iseq_struct* %72) #19, !dbg !24 + %76 = call i64 @func_HasFib.fib(i32 noundef 1, i64* nocapture noundef nonnull readonly align 8 dereferenceable(16) %59, i64 %selfRaw) #19, !dbg !24 + tail call void @sorbet_popRubyStack() #19, !dbg !24 + br label %afterFinalCall_fib, !dbg !24 + +slowFinalCall_fib: ; preds = %27, %sorbet_isa_class_of.exit + %77 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !12 + %78 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %77, i64 0, i32 2, !dbg !24 + %79 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %78, align 8, !dbg !24, !tbaa !14 + %80 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %79, i64 0, i32 1, !dbg !24 + %81 = load i64*, i64** %80, align 8, !dbg !24, !tbaa !45 + %82 = getelementptr inbounds i64, i64* %81, i64 1, !dbg !24 + store i64 %selfRaw, i64* %81, align 8, !dbg !24, !tbaa !4 + %83 = getelementptr inbounds i64, i64* %82, i64 1, !dbg !24 + store i64* %83, i64** %80, align 8, !dbg !24, !tbaa !45 + store i64 %18, i64* %82, align 8, !dbg !24, !tbaa !4 + %send45 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fib.4, i64 0), !dbg !24 + br label %afterFinalCall_fib, !dbg !24 + +afterFinalCall_fib: ; preds = %slowFinalCall_fib, %sorbet_callFuncDirect.exit120 + %84 = phi i1 [ true, %sorbet_callFuncDirect.exit120 ], [ false, %slowFinalCall_fib ] + %finalCallResult_fib = phi i64 [ %76, %sorbet_callFuncDirect.exit120 ], [ %send45, %slowFinalCall_fib ], !dbg !24 + store i64 5, i64* %callArgs0Addr, align 8, !dbg !47 + tail call void @llvm.experimental.noalias.scope.decl(metadata !48), !dbg !47 + %85 = load i64, i64* %59, align 8, !dbg !47, !tbaa !4, !alias.scope !48 + %86 = and i64 %85, %46, !dbg !47 + %87 = icmp eq i64 %86, 0, !dbg !47 + br i1 %87, label %97, label %88, !dbg !47, !prof !19 + +88: ; preds = %afterFinalCall_fib + %89 = add nsw i64 %85, -1, !dbg !47 + %90 = tail call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %rawArg_n, i64 %89) #18, !dbg !47 + %91 = extractvalue { i64, i1 } %90, 1, !dbg !47 + %92 = extractvalue { i64, i1 } %90, 0, !dbg !47 + br i1 %91, label %93, label %sorbet_rb_int_minus.exit121, !dbg !47 + +93: ; preds = %88 + %94 = ashr i64 %92, 1, !dbg !47 + %95 = xor i64 %94, -9223372036854775808, !dbg !47 + %96 = tail call i64 @rb_int2big(i64 %95) #19, !dbg !47, !noalias !48 + br label %sorbet_rb_int_minus.exit121, !dbg !47 + +97: ; preds = %afterFinalCall_fib + %98 = tail call i64 @sorbet_rb_int_minus_slowpath(i64 %rawArg_n, i64 %85) #19, !dbg !47, !noalias !48 + br label %sorbet_rb_int_minus.exit121, !dbg !47 + +sorbet_rb_int_minus.exit121: ; preds = %93, %88, %97 + %99 = phi i64 [ %98, %97 ], [ %96, %93 ], [ %92, %88 ], !dbg !47 + br i1 %84, label %fastFinalCall_fib65, label %slowFinalCall_fib66, !dbg !51 + +fastFinalCall_fib65: ; preds = %sorbet_rb_int_minus.exit121 + store i64 %99, i64* %callArgs0Addr, align 8, !dbg !51 + %100 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !51 + %101 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_fib.6, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !51, !tbaa !39 + %102 = icmp eq %struct.rb_callable_method_entry_struct* %101, null, !dbg !51 + br i1 %102, label %103, label %sorbet_callFuncDirect.exit, !dbg !51, !prof !31 + +103: ; preds = %fastFinalCall_fib65 + tail call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_fib.6, i64 %selfRaw) #19, !dbg !51 + br label %sorbet_callFuncDirect.exit, !dbg !51 + +sorbet_callFuncDirect.exit: ; preds = %fastFinalCall_fib65, %103 + tail call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_fib.6, i64 %selfRaw, %struct.rb_iseq_struct* %100) #19, !dbg !51 + %104 = call i64 @func_HasFib.fib(i32 noundef 1, i64* nocapture noundef nonnull readonly align 8 dereferenceable(16) %59, i64 %selfRaw) #19, !dbg !51 + tail call void @sorbet_popRubyStack() #19, !dbg !51 + br label %afterFinalCall_fib67, !dbg !51 + +slowFinalCall_fib66: ; preds = %sorbet_rb_int_minus.exit121 + %105 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !51, !tbaa !12 + %106 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %105, i64 0, i32 2, !dbg !51 + %107 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %106, align 8, !dbg !51, !tbaa !14 + %108 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %107, i64 0, i32 1, !dbg !51 + %109 = load i64*, i64** %108, align 8, !dbg !51, !tbaa !45 + %110 = getelementptr inbounds i64, i64* %109, i64 1, !dbg !51 + store i64 %selfRaw, i64* %109, align 8, !dbg !51, !tbaa !4 + %111 = getelementptr inbounds i64, i64* %110, i64 1, !dbg !51 + store i64* %111, i64** %108, align 8, !dbg !51, !tbaa !45 + store i64 %99, i64* %110, align 8, !dbg !51, !tbaa !4 + %send75 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_fib.7, i64 0), !dbg !51 + br label %afterFinalCall_fib67, !dbg !51 afterFinalCall_fib67: ; preds = %slowFinalCall_fib66, %sorbet_callFuncDirect.exit - %finalCallResult_fib76 = phi i64 [ %118, %sorbet_callFuncDirect.exit ], [ %send75, %slowFinalCall_fib66 ], !dbg !63 - %126 = and i64 %finalCallResult_fib, 1, !dbg !37 - %127 = icmp eq i64 %126, 0, !dbg !37 - br i1 %127, label %128, label %"fastSymCallIntrinsic_Integer_+", !dbg !37, !prof !44 - -128: ; preds = %afterFinalCall_fib67 - %129 = and i64 %finalCallResult_fib, 7, !dbg !37 - %130 = icmp ne i64 %129, 0, !dbg !37 - %131 = and i64 %finalCallResult_fib, -9, !dbg !37 - %132 = icmp eq i64 %131, 0, !dbg !37 - %133 = or i1 %130, %132, !dbg !37 - br i1 %133, label %"alternativeCallIntrinsic_Integer_+", label %sorbet_isa_Integer.exit128, !dbg !37, !prof !41 - -sorbet_isa_Integer.exit128: ; preds = %128 - %134 = inttoptr i64 %finalCallResult_fib to %struct.iseq_inline_iv_cache_entry*, !dbg !37 - %135 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %134, i64 0, i32 0, !dbg !37 - %136 = load i64, i64* %135, align 8, !dbg !37, !tbaa !45 - %137 = and i64 %136, 31, !dbg !37 - %138 = icmp eq i64 %137, 10, !dbg !37 - br i1 %138, label %"fastSymCallIntrinsic_Integer_+", label %"alternativeCallIntrinsic_Integer_+", !dbg !37, !prof !42 - -"alternativeCallIntrinsic_Integer_+": ; preds = %128, %sorbet_isa_Integer.exit128 - %139 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !12 - %140 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %139, i64 0, i32 2, !dbg !37 - %141 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %140, align 8, !dbg !37, !tbaa !14 - %142 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %141, i64 0, i32 1, !dbg !37 - %143 = load i64*, i64** %142, align 8, !dbg !37, !tbaa !58 - %144 = getelementptr inbounds i64, i64* %143, i64 1, !dbg !37 - store i64 %finalCallResult_fib, i64* %143, align 8, !dbg !37, !tbaa !4 - %145 = getelementptr inbounds i64, i64* %144, i64 1, !dbg !37 - store i64* %145, i64** %142, align 8, !dbg !37, !tbaa !58 - store i64 %finalCallResult_fib76, i64* %144, align 8, !dbg !37, !tbaa !4 - %send87 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !37 - br label %BB4, !dbg !37 - -"fastSymCallIntrinsic_Integer_+": ; preds = %afterFinalCall_fib67, %sorbet_isa_Integer.exit128 - store i64 %finalCallResult_fib76, i64* %callArgs0Addr, align 8, !dbg !37 - tail call void @llvm.experimental.noalias.scope.decl(metadata !64), !dbg !37 - %146 = load i64, i64* %73, align 8, !dbg !37, !tbaa !4, !alias.scope !64 - %147 = and i64 %146, %126, !dbg !37 - %148 = icmp eq i64 %147, 0, !dbg !37 - br i1 %148, label %158, label %149, !dbg !37, !prof !32 - -149: ; preds = %"fastSymCallIntrinsic_Integer_+" - %150 = add nsw i64 %146, -1, !dbg !37 - %151 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %finalCallResult_fib, i64 %150) #18, !dbg !37 - %152 = extractvalue { i64, i1 } %151, 1, !dbg !37 - %153 = extractvalue { i64, i1 } %151, 0, !dbg !37 - br i1 %152, label %154, label %BB4, !dbg !37 - -154: ; preds = %149 - %155 = ashr i64 %153, 1, !dbg !37 - %156 = xor i64 %155, -9223372036854775808, !dbg !37 - %157 = tail call i64 @rb_int2big(i64 %156) #19, !dbg !37, !noalias !64 - br label %BB4, !dbg !37 - -158: ; preds = %"fastSymCallIntrinsic_Integer_+" - %159 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %finalCallResult_fib, i64 %146) #19, !dbg !37, !noalias !64 - br label %BB4, !dbg !37 + %finalCallResult_fib76 = phi i64 [ %104, %sorbet_callFuncDirect.exit ], [ %send75, %slowFinalCall_fib66 ], !dbg !51 + %112 = and i64 %finalCallResult_fib, 1, !dbg !24 + %113 = icmp eq i64 %112, 0, !dbg !24 + br i1 %113, label %114, label %"fastSymCallIntrinsic_Integer_+", !dbg !24, !prof !31 + +114: ; preds = %afterFinalCall_fib67 + %115 = and i64 %finalCallResult_fib, 7, !dbg !24 + %116 = icmp ne i64 %115, 0, !dbg !24 + %117 = and i64 %finalCallResult_fib, -9, !dbg !24 + %118 = icmp eq i64 %117, 0, !dbg !24 + %119 = or i1 %116, %118, !dbg !24 + br i1 %119, label %"alternativeCallIntrinsic_Integer_+", label %sorbet_isa_Integer.exit123, !dbg !24, !prof !28 + +sorbet_isa_Integer.exit123: ; preds = %114 + %120 = inttoptr i64 %finalCallResult_fib to %struct.iseq_inline_iv_cache_entry*, !dbg !24 + %121 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %120, i64 0, i32 0, !dbg !24 + %122 = load i64, i64* %121, align 8, !dbg !24, !tbaa !32 + %123 = and i64 %122, 31, !dbg !24 + %124 = icmp eq i64 %123, 10, !dbg !24 + br i1 %124, label %"fastSymCallIntrinsic_Integer_+", label %"alternativeCallIntrinsic_Integer_+", !dbg !24, !prof !29 + +"alternativeCallIntrinsic_Integer_+": ; preds = %114, %sorbet_isa_Integer.exit123 + %125 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !12 + %126 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %125, i64 0, i32 2, !dbg !24 + %127 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %126, align 8, !dbg !24, !tbaa !14 + %128 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %127, i64 0, i32 1, !dbg !24 + %129 = load i64*, i64** %128, align 8, !dbg !24, !tbaa !45 + %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !24 + store i64 %finalCallResult_fib, i64* %129, align 8, !dbg !24, !tbaa !4 + %131 = getelementptr inbounds i64, i64* %130, i64 1, !dbg !24 + store i64* %131, i64** %128, align 8, !dbg !24, !tbaa !45 + store i64 %finalCallResult_fib76, i64* %130, align 8, !dbg !24, !tbaa !4 + %send87 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0), !dbg !24 + br label %BB4, !dbg !24 + +"fastSymCallIntrinsic_Integer_+": ; preds = %afterFinalCall_fib67, %sorbet_isa_Integer.exit123 + store i64 %finalCallResult_fib76, i64* %callArgs0Addr, align 8, !dbg !24 + tail call void @llvm.experimental.noalias.scope.decl(metadata !52), !dbg !24 + %132 = load i64, i64* %59, align 8, !dbg !24, !tbaa !4, !alias.scope !52 + %133 = and i64 %132, %112, !dbg !24 + %134 = icmp eq i64 %133, 0, !dbg !24 + br i1 %134, label %144, label %135, !dbg !24, !prof !19 + +135: ; preds = %"fastSymCallIntrinsic_Integer_+" + %136 = add nsw i64 %132, -1, !dbg !24 + %137 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %finalCallResult_fib, i64 %136) #18, !dbg !24 + %138 = extractvalue { i64, i1 } %137, 1, !dbg !24 + %139 = extractvalue { i64, i1 } %137, 0, !dbg !24 + br i1 %138, label %140, label %BB4, !dbg !24 + +140: ; preds = %135 + %141 = ashr i64 %139, 1, !dbg !24 + %142 = xor i64 %141, -9223372036854775808, !dbg !24 + %143 = tail call i64 @rb_int2big(i64 %142) #19, !dbg !24, !noalias !52 + br label %BB4, !dbg !24 + +144: ; preds = %"fastSymCallIntrinsic_Integer_+" + %145 = tail call i64 @sorbet_rb_int_plus_slowpath(i64 %finalCallResult_fib, i64 %132) #19, !dbg !24, !noalias !52 + br label %BB4, !dbg !24 typeTestSuccess91: ; preds = %BB4.thread, %BB4, %sorbet_isa_Integer.exit - %".sroa.0.0132134" = phi i64 [ %".sroa.0.0", %sorbet_isa_Integer.exit ], [ 3, %BB4.thread ], [ %".sroa.0.0", %BB4 ] - ret i64 %".sroa.0.0132134" + %".sroa.0.0127129" = phi i64 [ %".sroa.0.0", %sorbet_isa_Integer.exit ], [ 3, %BB4.thread ], [ %".sroa.0.0", %BB4 ] + ret i64 %".sroa.0.0127129" -codeRepl140: ; preds = %sorbet_isa_Integer.exit, %48 - tail call fastcc void @func_HasFib.fib.cold.2(i64 %".sroa.0.0") #20, !dbg !43 +codeRepl135: ; preds = %sorbet_isa_Integer.exit, %35 + tail call fastcc void @func_HasFib.fib.cold.2(i64 %".sroa.0.0") #20, !dbg !30 unreachable } ; Function Attrs: sspreq define void @Init_app_fib() local_unnamed_addr #10 { entry: - %positional_table.i.i = alloca i64, align 8, !dbg !67 + %positional_table.i.i = alloca i64, align 8, !dbg !55 %callArgs.i = alloca [2 x i64], align 8 %locals.i27.i = alloca i64, i32 0, align 8 %locals.i23.i = alloca i64, i32 0, align 8 %locals.i.i = alloca i64, i32 0, align 8 - %keywords.i = alloca i64, align 8, !dbg !71 + %keywords.i = alloca i64, align 8, !dbg !59 %realpath = tail call i64 @sorbet_readRealpath() %0 = bitcast i64* %keywords.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0) @@ -603,61 +595,63 @@ entry: %15 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([40 x i8], [40 x i8]* @"str_test/testdata/ruby_benchmark/app_fib.rb", i64 0, i64 0), i64 noundef 39) #19 tail call void @rb_gc_register_mark_object(i64 %15) #19 store i64 %15, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_fib.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 18) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %15, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 16, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_fib.rb", align 8 + %16 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %16, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_fib.i = load i64, i64* @rubyIdPrecomputed_fib, align 8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib, i64 %rubyId_fib.i, i32 noundef 1, i32 noundef 1, i32 noundef 0, i64* noundef null) - %rubyId_fib1.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !73 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.1, i64 %rubyId_fib1.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !73 - %rubyId_fib2.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !73 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.2, i64 %rubyId_fib2.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !73 + %rubyId_fib1.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !61 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.1, i64 %rubyId_fib1.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !61 + %rubyId_fib2.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !61 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.2, i64 %rubyId_fib2.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !61 %17 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_fib, i64 0, i64 0), i64 noundef 3) #19 call void @rb_gc_register_mark_object(i64 %17) #19 %rubyId_fib.i.i = load i64, i64* @rubyIdPrecomputed_fib, align 8 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i22.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_fib.rb", align 8 - %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %rubyId_fib.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i22.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 7, i32 noundef 13, i64* noundef nonnull %locals.i23.i, i32 noundef 0, i32 noundef 2) + %18 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %17, i64 %rubyId_fib.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i22.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i23.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %18, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8 - %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !48 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !48 - %rubyId_-.i = load i64, i64* @rubyIdPrecomputed_-, align 8, !dbg !33 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_-, i64 %rubyId_-.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !33 - %rubyId_fib6.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.3, i64 %rubyId_fib6.i, i32 noundef 4, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !37 - %rubyId_fib7.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.4, i64 %rubyId_fib7.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 - %rubyId_-10.i = load i64, i64* @rubyIdPrecomputed_-, align 8, !dbg !59 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_-.5, i64 %rubyId_-10.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !59 - %rubyId_fib12.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !63 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.6, i64 %rubyId_fib12.i, i32 noundef 4, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !63 - %rubyId_fib14.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !63 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.7, i64 %rubyId_fib14.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !63 - %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !37 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !37 + %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !35 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !35 + %rubyId_-.i = load i64, i64* @rubyIdPrecomputed_-, align 8, !dbg !20 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_-, i64 %rubyId_-.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !20 + %rubyId_fib6.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !24 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.3, i64 %rubyId_fib6.i, i32 noundef 4, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !24 + %rubyId_fib7.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !24 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.4, i64 %rubyId_fib7.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 + %rubyId_-10.i = load i64, i64* @rubyIdPrecomputed_-, align 8, !dbg !47 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_-.5, i64 %rubyId_-10.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !47 + %rubyId_fib12.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !51 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.6, i64 %rubyId_fib12.i, i32 noundef 4, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !51 + %rubyId_fib14.i = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !51 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_fib.7, i64 %rubyId_fib14.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !51 + %"rubyId_+.i" = load i64, i64* @"rubyIdPrecomputed_+", align 8, !dbg !24 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 %"rubyId_+.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 %"rubyId_.i24.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i25.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i26.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_fib.rb", align 8 - %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i25.i", i64 %"rubyId_.i24.i", i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 4) + %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i25.i", i64 %"rubyId_.i24.i", i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %19, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_HasFib.", align 8 %20 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #19 call void @rb_gc_register_mark_object(i64 %20) #19 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_HasFib.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i28.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_fib.rb", align 8 - %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %20, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i28.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %20, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/app_fib.rb.i28.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %21, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_HasFib.$block_1", align 8 - %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !74 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !74 - %rubyId_params.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !71 - %rubyId_n.i = load i64, i64* @rubyIdPrecomputed_n, align 8, !dbg !71 - %22 = call i64 @rb_id2sym(i64 %rubyId_n.i) #19, !dbg !71 - store i64 %22, i64* %keywords.i, align 8, !dbg !71 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params, i64 %rubyId_params.i, i32 noundef 68, i32 noundef 1, i32 noundef 1, i64* noundef nonnull %keywords.i), !dbg !71 - %rubyId_returns.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !71 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns, i64 %rubyId_returns.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !71 - %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !75 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !75 + %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !62 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !62 + %rubyId_params.i = load i64, i64* @rubyIdPrecomputed_params, align 8, !dbg !59 + %rubyId_n.i = load i64, i64* @rubyIdPrecomputed_n, align 8, !dbg !59 + %22 = call i64 @rb_id2sym(i64 %rubyId_n.i) #19, !dbg !59 + store i64 %22, i64* %keywords.i, align 8, !dbg !59 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_params, i64 %rubyId_params.i, i32 noundef 68, i32 noundef 1, i32 noundef 1, i64* noundef nonnull %keywords.i), !dbg !59 + %rubyId_returns.i = load i64, i64* @rubyIdPrecomputed_returns, align 8, !dbg !59 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_returns, i64 %rubyId_returns.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !59 + %rubyId_keep_self_def.i = load i64, i64* @rubyIdPrecomputed_keep_self_def, align 8, !dbg !63 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_keep_self_def, i64 %rubyId_keep_self_def.i, i32 noundef 16, i32 noundef 3, i32 noundef 0, i64* noundef null), !dbg !63 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %0) %23 = bitcast [2 x i64]* %callArgs.i to i8* call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %23) @@ -666,117 +660,99 @@ entry: %25 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %24, i64 0, i32 2 %26 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %25, align 8, !tbaa !14 %27 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %27, align 8, !tbaa !18 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %27, align 8, !tbaa !64 %28 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 4 - %29 = load i64*, i64** %28, align 8, !tbaa !76 + %29 = load i64*, i64** %28, align 8, !tbaa !65 %30 = load i64, i64* %29, align 8, !tbaa !4 %31 = and i64 %30, -33 store i64 %31, i64* %29, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %24, %struct.rb_control_frame_struct* align 8 %26, %struct.rb_iseq_struct* %stackFrame.i) #19 %32 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %26, i64 0, i32 0 - %33 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %27, align 8, !tbaa !18 - %34 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %33, i64 0, i32 2 - %35 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %34, align 8, !tbaa !20 - %36 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %35, i64 0, i32 2 - %37 = load i64*, i64** %36, align 8, !tbaa !22 - %38 = getelementptr inbounds i64, i64* %37, i64 4 - %39 = getelementptr inbounds i64, i64* %38, i64 1 - store i64* %39, i64** %32, align 8, !dbg !77, !tbaa !12 - %40 = load i64, i64* @rb_cObject, align 8, !dbg !78 - %41 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_HasFib, i64 0, i64 0), i64 %40) #19, !dbg !78 - call void @sorbet_pushStaticInitFrame(i64 %41) #19, !dbg !78 - %42 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %42) #19 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %32, align 8, !dbg !66, !tbaa !12 + %33 = load i64, i64* @rb_cObject, align 8, !dbg !67 + %34 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @str_HasFib, i64 0, i64 0), i64 %33) #19, !dbg !67 + call void @sorbet_pushStaticInitFrame(i64 %34) #19, !dbg !67 + %35 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %35) #19 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_HasFib.", align 8 - %43 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 - %44 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %43, i64 0, i32 2 - %45 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %44, align 8, !tbaa !14 - %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %46, align 8, !tbaa !18 - %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 4 - %48 = load i64*, i64** %47, align 8, !tbaa !76 - %49 = load i64, i64* %48, align 8, !tbaa !4 - %50 = and i64 %49, -33 - store i64 %50, i64* %48, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %43, %struct.rb_control_frame_struct* align 8 %45, %struct.rb_iseq_struct* %stackFrame.i.i1) #19 - %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 0 - %52 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %46, align 8, !tbaa !18 - %53 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %52, i64 0, i32 2 - %54 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %53, align 8, !tbaa !20 - %55 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %54, i64 0, i32 2 - %56 = load i64*, i64** %55, align 8, !tbaa !22 - %57 = getelementptr inbounds i64, i64* %56, i64 1 - %58 = getelementptr inbounds i64, i64* %57, i64 1, !dbg !79 - store i64* %58, i64** %51, align 8, !dbg !79, !tbaa !12 - %rubyId_final.i.i = load i64, i64* @rubyIdPrecomputed_final, align 8, !dbg !80 - %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_final.i.i) #19, !dbg !80 - %59 = getelementptr inbounds i64, i64* %56, i64 2, !dbg !81 - %60 = getelementptr inbounds i64, i64* %59, i64 1, !dbg !81 - store i64* %60, i64** %51, align 8, !dbg !81, !tbaa !12 - %rubyId_fib.i.i2 = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !67 - %rawSym28.i.i = call i64 @rb_id2sym(i64 %rubyId_fib.i.i2) #19, !dbg !67 - %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !67 - %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #19, !dbg !67 - %61 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !67 - %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !67, !tbaa !38 - %needTakeSlowPath = icmp ne i64 %61, %62, !dbg !67 - br i1 %needTakeSlowPath, label %63, label %64, !dbg !67, !prof !40 - -63: ; preds = %entry - call void @const_recompute_HasFib(), !dbg !67 - br label %64, !dbg !67 - -64: ; preds = %entry, %63 - %65 = load i64, i64* @guarded_const_HasFib, align 8, !dbg !67 - %66 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !67 - %67 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !67, !tbaa !38 - %guardUpdated = icmp eq i64 %66, %67, !dbg !67 - call void @llvm.assume(i1 %guardUpdated), !dbg !67 - %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !67 - %68 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #16, !dbg !67 - %69 = bitcast i8* %68 to i16*, !dbg !67 - %70 = load i16, i16* %69, align 8, !dbg !67 - %71 = and i16 %70, -384, !dbg !67 - %72 = or i16 %71, 1, !dbg !67 - store i16 %72, i16* %69, align 8, !dbg !67 - %73 = getelementptr inbounds i8, i8* %68, i64 8, !dbg !67 - %74 = bitcast i8* %73 to i32*, !dbg !67 - store i32 1, i32* %74, align 8, !dbg !67, !tbaa !82 - %75 = getelementptr inbounds i8, i8* %68, i64 12, !dbg !67 - %76 = getelementptr inbounds i8, i8* %68, i64 4, !dbg !67 - %77 = bitcast i8* %76 to i32*, !dbg !67 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %75, i8 0, i64 20, i1 false) #19, !dbg !67 - store i32 1, i32* %77, align 4, !dbg !67, !tbaa !84 - %rubyId_n.i.i = load i64, i64* @rubyIdPrecomputed_n, align 8, !dbg !67 - store i64 %rubyId_n.i.i, i64* %positional_table.i.i, align 8, !dbg !67 - %78 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #16, !dbg !67 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %78, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %42, i64 noundef 8, i1 noundef false) #19, !dbg !67 - %79 = getelementptr inbounds i8, i8* %68, i64 32, !dbg !67 - %80 = bitcast i8* %79 to i8**, !dbg !67 - store i8* %78, i8** %80, align 8, !dbg !67, !tbaa !85 - %81 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !67 - call void @rb_define_singleton_sorbet_method(i64 %65, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_fib, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_HasFib.fib, i8* nonnull %68, i8* %81) #19, !dbg !67 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %42) #19 - call void @sorbet_popRubyStack() #19, !dbg !78 - %82 = getelementptr inbounds i64, i64* %37, i64 15, !dbg !78 - %83 = getelementptr inbounds i64, i64* %82, i64 1, !dbg !78 - store i64* %83, i64** %32, align 8, !dbg !78, !tbaa !12 - %callArgs0Addr.i = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i32 0, i64 0, !dbg !73 - store i64 69, i64* %callArgs0Addr.i, align 8, !dbg !73 - %84 = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i64 0, i64 0, !dbg !73 - %85 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !73 - %86 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_fib.1, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !73, !tbaa !52 - %87 = icmp eq %struct.rb_callable_method_entry_struct* %86, null, !dbg !73 - br i1 %87, label %88, label %"func_.$152.exit", !dbg !73, !prof !44 - -88: ; preds = %64 - call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_fib.1, i64 %65) #19, !dbg !73 - br label %"func_.$152.exit", !dbg !73 - -"func_.$152.exit": ; preds = %64, %88 - call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_fib.1, i64 %65, %struct.rb_iseq_struct* %85) #19, !dbg !73 - %89 = call i64 @func_HasFib.fib(i32 noundef 1, i64* nocapture noundef nonnull readonly align 8 dereferenceable(16) %84, i64 %65) #19, !dbg !73 - call void @sorbet_popRubyStack() #19, !dbg !73 + %36 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !12 + %37 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %36, i64 0, i32 2 + %38 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %37, align 8, !tbaa !14 + %39 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %39, align 8, !tbaa !64 + %40 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 4 + %41 = load i64*, i64** %40, align 8, !tbaa !65 + %42 = load i64, i64* %41, align 8, !tbaa !4 + %43 = and i64 %42, -33 + store i64 %43, i64* %41, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %36, %struct.rb_control_frame_struct* align 8 %38, %struct.rb_iseq_struct* %stackFrame.i.i1) #19 + %44 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %38, i64 0, i32 0 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %44, align 8, !dbg !68, !tbaa !12 + %rubyId_final.i.i = load i64, i64* @rubyIdPrecomputed_final, align 8, !dbg !69 + %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_final.i.i) #19, !dbg !69 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %44, align 8, !dbg !70, !tbaa !12 + %rubyId_fib.i.i2 = load i64, i64* @rubyIdPrecomputed_fib, align 8, !dbg !55 + %rawSym28.i.i = call i64 @rb_id2sym(i64 %rubyId_fib.i.i2) #19, !dbg !55 + %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !55 + %rawSym29.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #19, !dbg !55 + %45 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !55 + %46 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !55, !tbaa !25 + %needTakeSlowPath = icmp ne i64 %45, %46, !dbg !55 + br i1 %needTakeSlowPath, label %47, label %48, !dbg !55, !prof !27 + +47: ; preds = %entry + call void @const_recompute_HasFib(), !dbg !55 + br label %48, !dbg !55 + +48: ; preds = %entry, %47 + %49 = load i64, i64* @guarded_const_HasFib, align 8, !dbg !55 + %50 = load i64, i64* @guard_epoch_HasFib, align 8, !dbg !55 + %51 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !55, !tbaa !25 + %guardUpdated = icmp eq i64 %50, %51, !dbg !55 + call void @llvm.assume(i1 %guardUpdated), !dbg !55 + %stackFrame31.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !55 + %52 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #16, !dbg !55 + %53 = bitcast i8* %52 to i16*, !dbg !55 + %54 = load i16, i16* %53, align 8, !dbg !55 + %55 = and i16 %54, -384, !dbg !55 + %56 = or i16 %55, 1, !dbg !55 + store i16 %56, i16* %53, align 8, !dbg !55 + %57 = getelementptr inbounds i8, i8* %52, i64 8, !dbg !55 + %58 = bitcast i8* %57 to i32*, !dbg !55 + store i32 1, i32* %58, align 8, !dbg !55, !tbaa !71 + %59 = getelementptr inbounds i8, i8* %52, i64 12, !dbg !55 + %60 = getelementptr inbounds i8, i8* %52, i64 4, !dbg !55 + %61 = bitcast i8* %60 to i32*, !dbg !55 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %59, i8 0, i64 20, i1 false) #19, !dbg !55 + store i32 1, i32* %61, align 4, !dbg !55, !tbaa !74 + %rubyId_n.i.i = load i64, i64* @rubyIdPrecomputed_n, align 8, !dbg !55 + store i64 %rubyId_n.i.i, i64* %positional_table.i.i, align 8, !dbg !55 + %62 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #16, !dbg !55 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %62, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %35, i64 noundef 8, i1 noundef false) #19, !dbg !55 + %63 = getelementptr inbounds i8, i8* %52, i64 32, !dbg !55 + %64 = bitcast i8* %63 to i8**, !dbg !55 + store i8* %62, i8** %64, align 8, !dbg !55, !tbaa !75 + %65 = bitcast %struct.rb_iseq_struct* %stackFrame31.i.i to i8*, !dbg !55 + call void @rb_define_singleton_sorbet_method(i64 %49, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_fib, i64 0, i64 0), i64 (i32, i64*, i64)* noundef @func_HasFib.fib, i8* nonnull %52, i8* %65) #19, !dbg !55 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %35) #19 + call void @sorbet_popRubyStack() #19, !dbg !67 + store i64* getelementptr inbounds ([18 x i64], [18 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %32, align 8, !dbg !67, !tbaa !12 + %callArgs0Addr.i = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i32 0, i64 0, !dbg !61 + store i64 69, i64* %callArgs0Addr.i, align 8, !dbg !61 + %66 = getelementptr [2 x i64], [2 x i64]* %callArgs.i, i64 0, i64 0, !dbg !61 + %67 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @stackFramePrecomputed_func_HasFib.fib, align 8, !dbg !61 + %68 = load %struct.rb_callable_method_entry_struct*, %struct.rb_callable_method_entry_struct** getelementptr inbounds (%struct.FunctionInlineCache, %struct.FunctionInlineCache* @ic_fib.1, i64 0, i32 0, i32 0, i32 2), align 16, !dbg !61, !tbaa !39 + %69 = icmp eq %struct.rb_callable_method_entry_struct* %68, null, !dbg !61 + br i1 %69, label %70, label %"func_.$152.exit", !dbg !61, !prof !31 + +70: ; preds = %48 + call void @sorbet_vmMethodSearch(%struct.FunctionInlineCache* noundef @ic_fib.1, i64 %49) #19, !dbg !61 + br label %"func_.$152.exit", !dbg !61 + +"func_.$152.exit": ; preds = %48, %70 + call void @sorbet_pushCfuncFrame(%struct.FunctionInlineCache* noundef @ic_fib.1, i64 %49, %struct.rb_iseq_struct* %67) #19, !dbg !61 + %71 = call i64 @func_HasFib.fib(i32 noundef 1, i64* nocapture noundef nonnull readonly align 8 dereferenceable(16) %66, i64 %49) #19, !dbg !61 + call void @sorbet_popRubyStack() #19, !dbg !61 call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %23) ret void } @@ -794,14 +770,14 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #7 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #7 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @func_HasFib.fib.cold.1(i64 %rawArg_n) unnamed_addr #13 !dbg !86 { +define internal fastcc void @func_HasFib.fib.cold.1(i64 %rawArg_n) unnamed_addr #13 !dbg !76 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_n, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !88 - unreachable, !dbg !88 + tail call void @sorbet_cast_failure(i64 %rawArg_n, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !78 + unreachable, !dbg !78 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @func_HasFib.fib.cold.2(i64 %".sroa.0.0") unnamed_addr #13 !dbg !89 { +define internal fastcc void @func_HasFib.fib.cold.2(i64 %".sroa.0.0") unnamed_addr #13 !dbg !79 { newFuncRoot: tail call void @sorbet_cast_failure(i64 %".sroa.0.0", i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @"str_Return value", i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1 unreachable @@ -814,7 +790,7 @@ declare void @llvm.assume(i1 noundef) #14 define linkonce void @const_recompute_HasFib() local_unnamed_addr #15 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @str_HasFib, i64 0, i64 0), i64 6) store i64 %1, i64* @guarded_const_HasFib, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !38 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !25 store i64 %2, i64* @guard_epoch_HasFib, align 8 ret void } @@ -862,75 +838,65 @@ attributes #20 = { noinline } !15 = !{!"rb_execution_context_struct", !13, i64 0, !5, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !16, i64 40, !16, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !5, i64 72, !5, i64 80, !13, i64 88, !5, i64 96, !13, i64 104, !13, i64 112, !5, i64 120, !5, i64 128, !6, i64 136, !6, i64 137, !5, i64 144, !17, i64 152} !16 = !{!"int", !6, i64 0} !17 = !{!"", !13, i64 0, !13, i64 8, !5, i64 16, !6, i64 24} -!18 = !{!19, !13, i64 16} -!19 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} -!20 = !{!21, !13, i64 16} -!21 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !13, i64 16, !6, i64 24} -!22 = !{!23, !13, i64 8} -!23 = !{!"rb_iseq_constant_body", !6, i64 0, !16, i64 4, !13, i64 8, !24, i64 16, !26, i64 64, !29, i64 120, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !30, i64 200, !16, i64 232, !16, i64 236, !16, i64 240, !16, i64 244, !16, i64 248, !6, i64 252, !5, i64 256} -!24 = !{!"", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !13, i64 40} -!25 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} -!26 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !16, i64 32, !27, i64 36} -!27 = !{!"rb_code_location_struct", !28, i64 0, !28, i64 8} -!28 = !{!"rb_code_position_struct", !16, i64 0, !16, i64 4} -!29 = !{!"iseq_insn_info", !13, i64 0, !13, i64 8, !16, i64 16, !13, i64 24} -!30 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !13, i64 24} -!31 = !DILocation(line: 7, column: 3, scope: !8) -!32 = !{!"branch_weights", i32 4001, i32 4000000} -!33 = !DILocation(line: 11, column: 11, scope: !8) -!34 = !{!35} -!35 = distinct !{!35, !36, !"sorbet_rb_int_minus: argument 0"} -!36 = distinct !{!36, !"sorbet_rb_int_minus"} -!37 = !DILocation(line: 11, column: 7, scope: !8) -!38 = !{!39, !39, i64 0} -!39 = !{!"long long", !6, i64 0} -!40 = !{!"branch_weights", i32 1, i32 10000} -!41 = !{!"branch_weights", i32 1073205, i32 2146410443} -!42 = !{!"branch_weights", i32 2000, i32 1} -!43 = !DILocation(line: 0, scope: !8) -!44 = !{!"branch_weights", i32 1, i32 2000} -!45 = !{!46, !5, i64 0} -!46 = !{!"RBasic", !5, i64 0, !5, i64 8} -!47 = !DILocation(line: 7, column: 16, scope: !8) -!48 = !DILocation(line: 8, column: 8, scope: !8) -!49 = !{!50} -!50 = distinct !{!50, !51, !"sorbet_rb_int_lt: argument 0"} -!51 = distinct !{!51, !"sorbet_rb_int_lt"} -!52 = !{!53, !13, i64 32} -!53 = !{!"FunctionInlineCache", !54, i64 0} -!54 = !{!"rb_kwarg_call_data", !55, i64 0, !56, i64 64} -!55 = !{!"rb_call_cache", !39, i64 0, !6, i64 8, !13, i64 32, !5, i64 40, !13, i64 48, !6, i64 56} -!56 = !{!"rb_call_info_with_kwarg", !57, i64 0, !13, i64 16} -!57 = !{!"rb_call_info", !5, i64 0, !16, i64 8, !16, i64 12} -!58 = !{!19, !13, i64 8} -!59 = !DILocation(line: 11, column: 22, scope: !8) -!60 = !{!61} -!61 = distinct !{!61, !62, !"sorbet_rb_int_minus: argument 0"} -!62 = distinct !{!62, !"sorbet_rb_int_minus"} -!63 = !DILocation(line: 11, column: 18, scope: !8) -!64 = !{!65} -!65 = distinct !{!65, !66, !"sorbet_rb_int_plus: argument 0"} -!66 = distinct !{!66, !"sorbet_rb_int_plus"} -!67 = !DILocation(line: 7, column: 3, scope: !68, inlinedAt: !69) -!68 = distinct !DISubprogram(name: "HasFib.", linkageName: "func_HasFib.L64", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!69 = distinct !DILocation(line: 5, column: 1, scope: !70) -!70 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!71 = !DILocation(line: 6, column: 39, scope: !72) -!72 = distinct !DISubprogram(name: "HasFib.", linkageName: "func_HasFib.L64$block_1", scope: !68, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!73 = !DILocation(line: 16, column: 1, scope: !70) -!74 = !DILocation(line: 6, column: 3, scope: !68) -!75 = !DILocation(line: 7, column: 3, scope: !68) -!76 = !{!19, !13, i64 32} -!77 = !DILocation(line: 0, scope: !70) -!78 = !DILocation(line: 5, column: 1, scope: !70) -!79 = !DILocation(line: 0, scope: !68, inlinedAt: !69) -!80 = !DILocation(line: 6, column: 30, scope: !68, inlinedAt: !69) -!81 = !DILocation(line: 6, column: 3, scope: !68, inlinedAt: !69) -!82 = !{!83, !16, i64 8} -!83 = !{!"rb_sorbet_param_struct", !25, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} -!84 = !{!83, !16, i64 4} -!85 = !{!83, !13, i64 32} -!86 = distinct !DISubprogram(name: "func_HasFib.fib.cold.1", linkageName: "func_HasFib.fib.cold.1", scope: null, file: !2, type: !87, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!87 = !DISubroutineType(types: !3) -!88 = !DILocation(line: 7, column: 16, scope: !86) -!89 = distinct !DISubprogram(name: "func_HasFib.fib.cold.2", linkageName: "func_HasFib.fib.cold.2", scope: null, file: !2, type: !87, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!18 = !DILocation(line: 7, column: 3, scope: !8) +!19 = !{!"branch_weights", i32 4001, i32 4000000} +!20 = !DILocation(line: 11, column: 11, scope: !8) +!21 = !{!22} +!22 = distinct !{!22, !23, !"sorbet_rb_int_minus: argument 0"} +!23 = distinct !{!23, !"sorbet_rb_int_minus"} +!24 = !DILocation(line: 11, column: 7, scope: !8) +!25 = !{!26, !26, i64 0} +!26 = !{!"long long", !6, i64 0} +!27 = !{!"branch_weights", i32 1, i32 10000} +!28 = !{!"branch_weights", i32 1073205, i32 2146410443} +!29 = !{!"branch_weights", i32 2000, i32 1} +!30 = !DILocation(line: 0, scope: !8) +!31 = !{!"branch_weights", i32 1, i32 2000} +!32 = !{!33, !5, i64 0} +!33 = !{!"RBasic", !5, i64 0, !5, i64 8} +!34 = !DILocation(line: 7, column: 16, scope: !8) +!35 = !DILocation(line: 8, column: 8, scope: !8) +!36 = !{!37} +!37 = distinct !{!37, !38, !"sorbet_rb_int_lt: argument 0"} +!38 = distinct !{!38, !"sorbet_rb_int_lt"} +!39 = !{!40, !13, i64 32} +!40 = !{!"FunctionInlineCache", !41, i64 0} +!41 = !{!"rb_kwarg_call_data", !42, i64 0, !43, i64 64} +!42 = !{!"rb_call_cache", !26, i64 0, !6, i64 8, !13, i64 32, !5, i64 40, !13, i64 48, !6, i64 56} +!43 = !{!"rb_call_info_with_kwarg", !44, i64 0, !13, i64 16} +!44 = !{!"rb_call_info", !5, i64 0, !16, i64 8, !16, i64 12} +!45 = !{!46, !13, i64 8} +!46 = !{!"rb_control_frame_struct", !13, i64 0, !13, i64 8, !13, i64 16, !5, i64 24, !13, i64 32, !13, i64 40, !13, i64 48} +!47 = !DILocation(line: 11, column: 22, scope: !8) +!48 = !{!49} +!49 = distinct !{!49, !50, !"sorbet_rb_int_minus: argument 0"} +!50 = distinct !{!50, !"sorbet_rb_int_minus"} +!51 = !DILocation(line: 11, column: 18, scope: !8) +!52 = !{!53} +!53 = distinct !{!53, !54, !"sorbet_rb_int_plus: argument 0"} +!54 = distinct !{!54, !"sorbet_rb_int_plus"} +!55 = !DILocation(line: 7, column: 3, scope: !56, inlinedAt: !57) +!56 = distinct !DISubprogram(name: "HasFib.", linkageName: "func_HasFib.L64", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!57 = distinct !DILocation(line: 5, column: 1, scope: !58) +!58 = distinct !DISubprogram(name: ".", linkageName: "func_.$152", scope: null, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!59 = !DILocation(line: 6, column: 39, scope: !60) +!60 = distinct !DISubprogram(name: "HasFib.", linkageName: "func_HasFib.L64$block_1", scope: !56, file: !2, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!61 = !DILocation(line: 16, column: 1, scope: !58) +!62 = !DILocation(line: 6, column: 3, scope: !56) +!63 = !DILocation(line: 7, column: 3, scope: !56) +!64 = !{!46, !13, i64 16} +!65 = !{!46, !13, i64 32} +!66 = !DILocation(line: 0, scope: !58) +!67 = !DILocation(line: 5, column: 1, scope: !58) +!68 = !DILocation(line: 0, scope: !56, inlinedAt: !57) +!69 = !DILocation(line: 6, column: 30, scope: !56, inlinedAt: !57) +!70 = !DILocation(line: 6, column: 3, scope: !56, inlinedAt: !57) +!71 = !{!72, !16, i64 8} +!72 = !{!"rb_sorbet_param_struct", !73, i64 0, !16, i64 4, !16, i64 8, !16, i64 12, !16, i64 16, !16, i64 20, !16, i64 24, !16, i64 28, !13, i64 32, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !13, i64 56} +!73 = !{!"", !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 0, !16, i64 1, !16, i64 1} +!74 = !{!72, !16, i64 4} +!75 = !{!72, !13, i64 32} +!76 = distinct !DISubprogram(name: "func_HasFib.fib.cold.1", linkageName: "func_HasFib.fib.cold.1", scope: null, file: !2, type: !77, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!77 = !DISubroutineType(types: !3) +!78 = !DILocation(line: 7, column: 16, scope: !76) +!79 = distinct !DISubprogram(name: "func_HasFib.fib.cold.2", linkageName: "func_HasFib.fib.cold.2", scope: null, file: !2, type: !77, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) diff --git a/test/testdata/ruby_benchmark/app_strconcat.llo.exp b/test/testdata/ruby_benchmark/app_strconcat.llo.exp index 1877a0a6743..155c75fda27 100644 --- a/test/testdata/ruby_benchmark/app_strconcat.llo.exp +++ b/test/testdata/ruby_benchmark/app_strconcat.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,26 +50,27 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -83,7 +85,10 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyIdPrecomputed_" = internal unnamed_addr global i64 0, align 8 @"str_" = private unnamed_addr constant [17 x i8] c"\00", align 1 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 +@"rubyStrFrozen_test/testdata/ruby_benchmark/app_strconcat.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/ruby_benchmark/app_strconcat.rb" = private unnamed_addr constant [46 x i8] c"test/testdata/ruby_benchmark/app_strconcat.rb\00", align 1 +@iseqEncodedArray = internal global [9 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"rubyIdPrecomputed_<" = internal unnamed_addr global i64 0, align 8 @"str_<" = private unnamed_addr constant [2 x i8] c"<\00", align 1 @"ic_<" = internal global %struct.FunctionInlineCache zeroinitializer @@ -98,7 +103,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"str_" = private unnamed_addr constant [21 x i8] c"\00", align 1 @"ic_+.3" = internal global %struct.FunctionInlineCache zeroinitializer -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #0 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #0 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #0 declare i64 @sorbet_readRealpath() local_unnamed_addr #0 @@ -170,9 +177,12 @@ entry: store i64 %4, i64* @"rubyStrFrozen_", align 8 %5 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([46 x i8], [46 x i8]* @"str_test/testdata/ruby_benchmark/app_strconcat.rb", i64 0, i64 0), i64 noundef 45) #11 tail call void @rb_gc_register_mark_object(i64 %5) #11 + store i64 %5, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_strconcat.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 9) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %5, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 8, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 6) + %"rubyStr_test/testdata/ruby_benchmark/app_strconcat.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/app_strconcat.rb", align 8 + %6 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/app_strconcat.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 6) store %struct.rb_iseq_struct* %6, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_<.i" = load i64, i64* @"rubyIdPrecomputed_<", align 8, !dbg !8 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 %"rubyId_<.i", i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !8 @@ -202,230 +212,215 @@ entry: store i64 %16, i64* %14, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %9, %struct.rb_control_frame_struct* align 8 %11, %struct.rb_iseq_struct* %stackFrame.i) #11 %17 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %11, i64 0, i32 0 - %18 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %12, align 8, !tbaa !23 - %19 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %18, i64 0, i32 2 - %20 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %19, align 8, !tbaa !26 - %21 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %20, i64 0, i32 2 - %22 = load i64*, i64** %21, align 8, !tbaa !28 - %23 = getelementptr inbounds i64, i64* %22, i64 3 - %24 = getelementptr inbounds i64, i64* %23, i64 1 - store i64* %24, i64** %17, align 8, !dbg !37, !tbaa !17 - %25 = getelementptr inbounds i64, i64* %22, i64 4 - %26 = getelementptr inbounds i64, i64* %25, i64 1 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %17, align 8, !dbg !26, !tbaa !17 %callArgs0Addr.i = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i32 0, i64 0 - %27 = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i64 0, i64 0 - %28 = getelementptr inbounds i64, i64* %22, i64 5 - %29 = getelementptr inbounds i64, i64* %28, i64 1 + %18 = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i64 0, i64 0 %callArgs1Addr.i = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i32 0, i64 1 %callArgs2Addr.i = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i32 0, i64 2 %callArgs3Addr.i = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i32 0, i64 3 %callArgs4Addr.i = getelementptr [6 x i64], [6 x i64]* %callArgs.i, i32 0, i64 4 - %30 = getelementptr inbounds i64, i64* %22, i64 6 - %31 = getelementptr inbounds i64, i64* %30, i64 1 - br label %BB2.i, !dbg !38 + br label %BB2.i, !dbg !27 BB2.i: ; preds = %BB2.i.backedge, %entry - %i.sroa.0.0.i = phi i64 [ 1, %entry ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !37 - store i64* %26, i64** %17, align 8, !tbaa !17 - %32 = and i64 %i.sroa.0.0.i, 1, !dbg !8 - %33 = icmp eq i64 %32, 0, !dbg !8 - br i1 %33, label %34, label %"fastSymCallIntrinsic_Integer_<.i", !dbg !8, !prof !39 - -34: ; preds = %BB2.i - %35 = and i64 %i.sroa.0.0.i, 7, !dbg !8 - %36 = icmp ne i64 %35, 0, !dbg !8 - %37 = and i64 %i.sroa.0.0.i, -9, !dbg !8 - %38 = icmp eq i64 %37, 0, !dbg !8 - %39 = or i1 %36, %38, !dbg !8 - br i1 %39, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !8, !prof !40 - -sorbet_isa_Integer.exit.i: ; preds = %34 - %40 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !8 - %41 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %40, i64 0, i32 0, !dbg !8 - %42 = load i64, i64* %41, align 8, !dbg !8, !tbaa !41 - %43 = and i64 %42, 31, !dbg !8 - %44 = icmp eq i64 %43, 10, !dbg !8 - br i1 %44, label %"fastSymCallIntrinsic_Integer_<.i", label %"alternativeCallIntrinsic_Integer_<.i", !dbg !8, !prof !43 - -afterSend.i: ; preds = %63, %58, %"alternativeCallIntrinsic_Integer_<.i" - %45 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %58 ], [ true, %63 ] - %"symIntrinsicRawPhi_<.i" = phi i64 [ %send.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %62, %58 ], [ %64, %63 ], !dbg !8 - %46 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !8 - %47 = icmp ne i64 %46, 0, !dbg !8 - br i1 %47, label %"fastSymCallIntrinsic_Integer_+.i", label %"func_.$152.exit", !dbg !8 - -"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %34 - %48 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !17 - %49 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %48, i64 0, i32 2, !dbg !8 - %50 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %49, align 8, !dbg !8, !tbaa !19 - %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %50, i64 0, i32 1, !dbg !8 - %52 = load i64*, i64** %51, align 8, !dbg !8, !tbaa !44 - %53 = getelementptr inbounds i64, i64* %52, i64 1, !dbg !8 - store i64 %i.sroa.0.0.i, i64* %52, align 8, !dbg !8, !tbaa !4 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !8 - store i64* %54, i64** %51, align 8, !dbg !8, !tbaa !44 - store i64 4000001, i64* %53, align 8, !dbg !8, !tbaa !4 + %i.sroa.0.0.i = phi i64 [ 1, %entry ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !26 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %17, align 8, !tbaa !17 + %19 = and i64 %i.sroa.0.0.i, 1, !dbg !8 + %20 = icmp eq i64 %19, 0, !dbg !8 + br i1 %20, label %21, label %"fastSymCallIntrinsic_Integer_<.i", !dbg !8, !prof !28 + +21: ; preds = %BB2.i + %22 = and i64 %i.sroa.0.0.i, 7, !dbg !8 + %23 = icmp ne i64 %22, 0, !dbg !8 + %24 = and i64 %i.sroa.0.0.i, -9, !dbg !8 + %25 = icmp eq i64 %24, 0, !dbg !8 + %26 = or i1 %23, %25, !dbg !8 + br i1 %26, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !8, !prof !29 + +sorbet_isa_Integer.exit.i: ; preds = %21 + %27 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !8 + %28 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %27, i64 0, i32 0, !dbg !8 + %29 = load i64, i64* %28, align 8, !dbg !8, !tbaa !30 + %30 = and i64 %29, 31, !dbg !8 + %31 = icmp eq i64 %30, 10, !dbg !8 + br i1 %31, label %"fastSymCallIntrinsic_Integer_<.i", label %"alternativeCallIntrinsic_Integer_<.i", !dbg !8, !prof !32 + +afterSend.i: ; preds = %50, %45, %"alternativeCallIntrinsic_Integer_<.i" + %32 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %45 ], [ true, %50 ] + %"symIntrinsicRawPhi_<.i" = phi i64 [ %send.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %49, %45 ], [ %51, %50 ], !dbg !8 + %33 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !8 + %34 = icmp ne i64 %33, 0, !dbg !8 + br i1 %34, label %"fastSymCallIntrinsic_Integer_+.i", label %"func_.$152.exit", !dbg !8 + +"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %21 + %35 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !8, !tbaa !17 + %36 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %35, i64 0, i32 2, !dbg !8 + %37 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %36, align 8, !dbg !8, !tbaa !19 + %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 1, !dbg !8 + %39 = load i64*, i64** %38, align 8, !dbg !8, !tbaa !33 + %40 = getelementptr inbounds i64, i64* %39, i64 1, !dbg !8 + store i64 %i.sroa.0.0.i, i64* %39, align 8, !dbg !8, !tbaa !4 + %41 = getelementptr inbounds i64, i64* %40, i64 1, !dbg !8 + store i64* %41, i64** %38, align 8, !dbg !8, !tbaa !33 + store i64 4000001, i64* %40, align 8, !dbg !8, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 0) #11, !dbg !8 br label %afterSend.i, !dbg !8 "fastSymCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %BB2.i store i64 4000001, i64* %callArgs0Addr.i, align 8, !dbg !8 - call void @llvm.experimental.noalias.scope.decl(metadata !45) #11, !dbg !8 - %55 = load i64, i64* %27, align 8, !dbg !8, !tbaa !4, !alias.scope !45 - %56 = and i64 %55, %32, !dbg !8 - %57 = icmp eq i64 %56, 0, !dbg !8 - br i1 %57, label %63, label %58, !dbg !8, !prof !48 - -58: ; preds = %"fastSymCallIntrinsic_Integer_<.i" - %59 = ashr i64 %i.sroa.0.0.i, 1, !dbg !8 - %60 = ashr i64 %55, 1, !dbg !8 - %61 = icmp slt i64 %59, %60, !dbg !8 - %62 = select i1 %61, i64 20, i64 0, !dbg !8 + call void @llvm.experimental.noalias.scope.decl(metadata !34) #11, !dbg !8 + %42 = load i64, i64* %18, align 8, !dbg !8, !tbaa !4, !alias.scope !34 + %43 = and i64 %42, %19, !dbg !8 + %44 = icmp eq i64 %43, 0, !dbg !8 + br i1 %44, label %50, label %45, !dbg !8, !prof !37 + +45: ; preds = %"fastSymCallIntrinsic_Integer_<.i" + %46 = ashr i64 %i.sroa.0.0.i, 1, !dbg !8 + %47 = ashr i64 %42, 1, !dbg !8 + %48 = icmp slt i64 %46, %47, !dbg !8 + %49 = select i1 %48, i64 20, i64 0, !dbg !8 br label %afterSend.i, !dbg !8 -63: ; preds = %"fastSymCallIntrinsic_Integer_<.i" - %64 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 %55) #11, !dbg !8, !noalias !45 +50: ; preds = %"fastSymCallIntrinsic_Integer_<.i" + %51 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 %42) #11, !dbg !8, !noalias !34 br label %afterSend.i, !dbg !8 "fastSymCallIntrinsic_Integer_+.i": ; preds = %afterSend.i - store i64* %29, i64** %17, align 8, !tbaa !17 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %17, align 8, !tbaa !17 store i64 3, i64* %callArgs0Addr.i, align 8, !dbg !13 - call void @llvm.experimental.noalias.scope.decl(metadata !49) #11, !dbg !13 - %65 = load i64, i64* %27, align 8, !dbg !13, !tbaa !4, !alias.scope !49 - %66 = and i64 %65, 1, !dbg !13 - %67 = icmp eq i64 %66, 0, !dbg !13 - br i1 %67, label %77, label %68, !dbg !13, !prof !48 - -68: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %69 = add nsw i64 %65, -1, !dbg !13 - %70 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 3, i64 %69) #12, !dbg !13 - %71 = extractvalue { i64, i1 } %70, 1, !dbg !13 - %72 = extractvalue { i64, i1 } %70, 0, !dbg !13 - br i1 %71, label %73, label %"fastSymCallIntrinsic_Integer_+60.i", !dbg !13 - -73: ; preds = %68 - %74 = ashr i64 %72, 1, !dbg !13 - %75 = xor i64 %74, -9223372036854775808, !dbg !13 - %76 = call i64 @rb_int2big(i64 %75) #11, !dbg !13, !noalias !49 + call void @llvm.experimental.noalias.scope.decl(metadata !38) #11, !dbg !13 + %52 = load i64, i64* %18, align 8, !dbg !13, !tbaa !4, !alias.scope !38 + %53 = and i64 %52, 1, !dbg !13 + %54 = icmp eq i64 %53, 0, !dbg !13 + br i1 %54, label %64, label %55, !dbg !13, !prof !37 + +55: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %56 = add nsw i64 %52, -1, !dbg !13 + %57 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 3, i64 %56) #12, !dbg !13 + %58 = extractvalue { i64, i1 } %57, 1, !dbg !13 + %59 = extractvalue { i64, i1 } %57, 0, !dbg !13 + br i1 %58, label %60, label %"fastSymCallIntrinsic_Integer_+60.i", !dbg !13 + +60: ; preds = %55 + %61 = ashr i64 %59, 1, !dbg !13 + %62 = xor i64 %61, -9223372036854775808, !dbg !13 + %63 = call i64 @rb_int2big(i64 %62) #11, !dbg !13, !noalias !38 br label %"fastSymCallIntrinsic_Integer_+60.i", !dbg !13 -77: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %78 = call i64 @sorbet_rb_int_plus_slowpath(i64 noundef 3, i64 %65) #11, !dbg !13, !noalias !49 +64: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %65 = call i64 @sorbet_rb_int_plus_slowpath(i64 noundef 3, i64 %52) #11, !dbg !13, !noalias !38 br label %"fastSymCallIntrinsic_Integer_+60.i", !dbg !13 -"fastSymCallIntrinsic_Integer_+60.i": ; preds = %77, %73, %68 - %"symIntrinsicRawPhi_+.i" = phi i64 [ %78, %77 ], [ %76, %73 ], [ %72, %68 ], !dbg !13 - %"rubyStr_ .i" = load i64, i64* @"rubyStrFrozen_ ", align 8, !dbg !52 +"fastSymCallIntrinsic_Integer_+60.i": ; preds = %64, %60, %55 + %"symIntrinsicRawPhi_+.i" = phi i64 [ %65, %64 ], [ %63, %60 ], [ %59, %55 ], !dbg !13 + %"rubyStr_ .i" = load i64, i64* @"rubyStrFrozen_ ", align 8, !dbg !41 store i64 3, i64* %callArgs0Addr.i, align 8, !dbg !14 - call void @llvm.experimental.noalias.scope.decl(metadata !53) #11, !dbg !14 - %79 = load i64, i64* %27, align 8, !dbg !14, !tbaa !4, !alias.scope !53 - %80 = and i64 %79, 1, !dbg !14 - %81 = icmp eq i64 %80, 0, !dbg !14 - br i1 %81, label %91, label %82, !dbg !14, !prof !48 - -82: ; preds = %"fastSymCallIntrinsic_Integer_+60.i" - %83 = add nsw i64 %79, -1, !dbg !14 - %84 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 3, i64 %83) #12, !dbg !14 - %85 = extractvalue { i64, i1 } %84, 1, !dbg !14 - %86 = extractvalue { i64, i1 } %84, 0, !dbg !14 - br i1 %85, label %87, label %"fastSymCallIntrinsic_Integer_+78.i", !dbg !14 - -87: ; preds = %82 - %88 = ashr i64 %86, 1, !dbg !14 - %89 = xor i64 %88, -9223372036854775808, !dbg !14 - %90 = call i64 @rb_int2big(i64 %89) #11, !dbg !14, !noalias !53 + call void @llvm.experimental.noalias.scope.decl(metadata !42) #11, !dbg !14 + %66 = load i64, i64* %18, align 8, !dbg !14, !tbaa !4, !alias.scope !42 + %67 = and i64 %66, 1, !dbg !14 + %68 = icmp eq i64 %67, 0, !dbg !14 + br i1 %68, label %78, label %69, !dbg !14, !prof !37 + +69: ; preds = %"fastSymCallIntrinsic_Integer_+60.i" + %70 = add nsw i64 %66, -1, !dbg !14 + %71 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 3, i64 %70) #12, !dbg !14 + %72 = extractvalue { i64, i1 } %71, 1, !dbg !14 + %73 = extractvalue { i64, i1 } %71, 0, !dbg !14 + br i1 %72, label %74, label %"fastSymCallIntrinsic_Integer_+78.i", !dbg !14 + +74: ; preds = %69 + %75 = ashr i64 %73, 1, !dbg !14 + %76 = xor i64 %75, -9223372036854775808, !dbg !14 + %77 = call i64 @rb_int2big(i64 %76) #11, !dbg !14, !noalias !42 br label %"fastSymCallIntrinsic_Integer_+78.i", !dbg !14 -91: ; preds = %"fastSymCallIntrinsic_Integer_+60.i" - %92 = call i64 @sorbet_rb_int_plus_slowpath(i64 noundef 3, i64 %79) #11, !dbg !14, !noalias !53 +78: ; preds = %"fastSymCallIntrinsic_Integer_+60.i" + %79 = call i64 @sorbet_rb_int_plus_slowpath(i64 noundef 3, i64 %66) #11, !dbg !14, !noalias !42 br label %"fastSymCallIntrinsic_Integer_+78.i", !dbg !14 -afterSend75.i: ; preds = %105, %101, %96 - %"symIntrinsicRawPhi_+76.i" = phi i64 [ %106, %105 ], [ %104, %101 ], [ %100, %96 ], !dbg !15 - store i64 %"symIntrinsicRawPhi_+.i", i64* %callArgs0Addr.i, align 8, !dbg !56 - store i64 %"rubyStr_ .i", i64* %callArgs1Addr.i, align 8, !dbg !56 - store i64 %"symIntrinsicRawPhi_+58.i", i64* %callArgs2Addr.i, align 8, !dbg !56 - store i64 %"rubyStr_ 72.i", i64* %callArgs3Addr.i, align 8, !dbg !56 - store i64 %"symIntrinsicRawPhi_+76.i", i64* %callArgs4Addr.i, align 8, !dbg !56 - %"rubyId_.i" = load i64, i64* @"rubyIdPrecomputed_", align 8, !dbg !56 - %rawSendResult98.i = call i64 @sorbet_stringInterpolate(i64 noundef 8, i64 %"rubyId_.i", i32 noundef 5, i64* noundef nonnull align 8 %27, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #11, !dbg !56 - store i64* %31, i64** %17, align 8, !dbg !56, !tbaa !17 - br i1 %45, label %"fastSymCallIntrinsic_Integer_+104.i", label %"alternativeCallIntrinsic_Integer_+103.i", !dbg !16 - -"fastSymCallIntrinsic_Integer_+78.i": ; preds = %91, %87, %82 - %"symIntrinsicRawPhi_+58.i" = phi i64 [ %92, %91 ], [ %90, %87 ], [ %86, %82 ], !dbg !14 - %"rubyStr_ 72.i" = load i64, i64* @"rubyStrFrozen_ ", align 8, !dbg !57 +afterSend75.i: ; preds = %92, %88, %83 + %"symIntrinsicRawPhi_+76.i" = phi i64 [ %93, %92 ], [ %91, %88 ], [ %87, %83 ], !dbg !15 + store i64 %"symIntrinsicRawPhi_+.i", i64* %callArgs0Addr.i, align 8, !dbg !45 + store i64 %"rubyStr_ .i", i64* %callArgs1Addr.i, align 8, !dbg !45 + store i64 %"symIntrinsicRawPhi_+58.i", i64* %callArgs2Addr.i, align 8, !dbg !45 + store i64 %"rubyStr_ 72.i", i64* %callArgs3Addr.i, align 8, !dbg !45 + store i64 %"symIntrinsicRawPhi_+76.i", i64* %callArgs4Addr.i, align 8, !dbg !45 + %"rubyId_.i" = load i64, i64* @"rubyIdPrecomputed_", align 8, !dbg !45 + %rawSendResult98.i = call i64 @sorbet_stringInterpolate(i64 noundef 8, i64 %"rubyId_.i", i32 noundef 5, i64* noundef nonnull align 8 %18, i64 (i64, i64, i32, i64*, i64)* noundef null, i64 noundef 0) #11, !dbg !45 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 7), i64** %17, align 8, !dbg !45, !tbaa !17 + br i1 %32, label %"fastSymCallIntrinsic_Integer_+104.i", label %"alternativeCallIntrinsic_Integer_+103.i", !dbg !16 + +"fastSymCallIntrinsic_Integer_+78.i": ; preds = %78, %74, %69 + %"symIntrinsicRawPhi_+58.i" = phi i64 [ %79, %78 ], [ %77, %74 ], [ %73, %69 ], !dbg !14 + %"rubyStr_ 72.i" = load i64, i64* @"rubyStrFrozen_ ", align 8, !dbg !46 store i64 3, i64* %callArgs0Addr.i, align 8, !dbg !15 - call void @llvm.experimental.noalias.scope.decl(metadata !58) #11, !dbg !15 - %93 = load i64, i64* %27, align 8, !dbg !15, !tbaa !4, !alias.scope !58 - %94 = and i64 %93, 1, !dbg !15 - %95 = icmp eq i64 %94, 0, !dbg !15 - br i1 %95, label %105, label %96, !dbg !15, !prof !48 - -96: ; preds = %"fastSymCallIntrinsic_Integer_+78.i" - %97 = add nsw i64 %93, -1, !dbg !15 - %98 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 3, i64 %97) #12, !dbg !15 - %99 = extractvalue { i64, i1 } %98, 1, !dbg !15 - %100 = extractvalue { i64, i1 } %98, 0, !dbg !15 - br i1 %99, label %101, label %afterSend75.i, !dbg !15 - -101: ; preds = %96 - %102 = ashr i64 %100, 1, !dbg !15 - %103 = xor i64 %102, -9223372036854775808, !dbg !15 - %104 = call i64 @rb_int2big(i64 %103) #11, !dbg !15, !noalias !58 + call void @llvm.experimental.noalias.scope.decl(metadata !47) #11, !dbg !15 + %80 = load i64, i64* %18, align 8, !dbg !15, !tbaa !4, !alias.scope !47 + %81 = and i64 %80, 1, !dbg !15 + %82 = icmp eq i64 %81, 0, !dbg !15 + br i1 %82, label %92, label %83, !dbg !15, !prof !37 + +83: ; preds = %"fastSymCallIntrinsic_Integer_+78.i" + %84 = add nsw i64 %80, -1, !dbg !15 + %85 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 3, i64 %84) #12, !dbg !15 + %86 = extractvalue { i64, i1 } %85, 1, !dbg !15 + %87 = extractvalue { i64, i1 } %85, 0, !dbg !15 + br i1 %86, label %88, label %afterSend75.i, !dbg !15 + +88: ; preds = %83 + %89 = ashr i64 %87, 1, !dbg !15 + %90 = xor i64 %89, -9223372036854775808, !dbg !15 + %91 = call i64 @rb_int2big(i64 %90) #11, !dbg !15, !noalias !47 br label %afterSend75.i, !dbg !15 -105: ; preds = %"fastSymCallIntrinsic_Integer_+78.i" - %106 = call i64 @sorbet_rb_int_plus_slowpath(i64 noundef 3, i64 %93) #11, !dbg !15, !noalias !58 +92: ; preds = %"fastSymCallIntrinsic_Integer_+78.i" + %93 = call i64 @sorbet_rb_int_plus_slowpath(i64 noundef 3, i64 %80) #11, !dbg !15, !noalias !47 br label %afterSend75.i, !dbg !15 "alternativeCallIntrinsic_Integer_+103.i": ; preds = %afterSend75.i - %107 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !17 - %108 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %107, i64 0, i32 2, !dbg !16 - %109 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %108, align 8, !dbg !16, !tbaa !19 - %110 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %109, i64 0, i32 1, !dbg !16 - %111 = load i64*, i64** %110, align 8, !dbg !16, !tbaa !44 - %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !16 - store i64 %i.sroa.0.0.i, i64* %111, align 8, !dbg !16, !tbaa !4 - %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !16 - store i64* %113, i64** %110, align 8, !dbg !16, !tbaa !44 - store i64 3, i64* %112, align 8, !dbg !16, !tbaa !4 + %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !16, !tbaa !17 + %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2, !dbg !16 + %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !dbg !16, !tbaa !19 + %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 1, !dbg !16 + %98 = load i64*, i64** %97, align 8, !dbg !16, !tbaa !33 + %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !16 + store i64 %i.sroa.0.0.i, i64* %98, align 8, !dbg !16, !tbaa !4 + %100 = getelementptr inbounds i64, i64* %99, i64 1, !dbg !16 + store i64* %100, i64** %97, align 8, !dbg !16, !tbaa !33 + store i64 3, i64* %99, align 8, !dbg !16, !tbaa !4 %send115.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+.3", i64 0) #11, !dbg !16 br label %BB2.i.backedge, !dbg !16 "fastSymCallIntrinsic_Integer_+104.i": ; preds = %afterSend75.i store i64 3, i64* %callArgs0Addr.i, align 8, !dbg !16 - call void @llvm.experimental.noalias.scope.decl(metadata !61) #11, !dbg !16 - %114 = load i64, i64* %27, align 8, !dbg !16, !tbaa !4, !alias.scope !61 - %115 = and i64 %114, %32, !dbg !16 - %116 = icmp eq i64 %115, 0, !dbg !16 - br i1 %116, label %126, label %117, !dbg !16, !prof !48 - -117: ; preds = %"fastSymCallIntrinsic_Integer_+104.i" - %118 = add nsw i64 %114, -1, !dbg !16 - %119 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 %118) #12, !dbg !16 - %120 = extractvalue { i64, i1 } %119, 1, !dbg !16 - %121 = extractvalue { i64, i1 } %119, 0, !dbg !16 - br i1 %120, label %122, label %BB2.i.backedge, !dbg !16 - -122: ; preds = %117 - %123 = ashr i64 %121, 1, !dbg !16 - %124 = xor i64 %123, -9223372036854775808, !dbg !16 - %125 = call i64 @rb_int2big(i64 %124) #11, !dbg !16, !noalias !61 + call void @llvm.experimental.noalias.scope.decl(metadata !50) #11, !dbg !16 + %101 = load i64, i64* %18, align 8, !dbg !16, !tbaa !4, !alias.scope !50 + %102 = and i64 %101, %19, !dbg !16 + %103 = icmp eq i64 %102, 0, !dbg !16 + br i1 %103, label %113, label %104, !dbg !16, !prof !37 + +104: ; preds = %"fastSymCallIntrinsic_Integer_+104.i" + %105 = add nsw i64 %101, -1, !dbg !16 + %106 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 %105) #12, !dbg !16 + %107 = extractvalue { i64, i1 } %106, 1, !dbg !16 + %108 = extractvalue { i64, i1 } %106, 0, !dbg !16 + br i1 %107, label %109, label %BB2.i.backedge, !dbg !16 + +109: ; preds = %104 + %110 = ashr i64 %108, 1, !dbg !16 + %111 = xor i64 %110, -9223372036854775808, !dbg !16 + %112 = call i64 @rb_int2big(i64 %111) #11, !dbg !16, !noalias !50 br label %BB2.i.backedge, !dbg !16 -126: ; preds = %"fastSymCallIntrinsic_Integer_+104.i" - %127 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 %114) #11, !dbg !16, !noalias !61 +113: ; preds = %"fastSymCallIntrinsic_Integer_+104.i" + %114 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 %101) #11, !dbg !16, !noalias !50 br label %BB2.i.backedge, !dbg !16 -BB2.i.backedge: ; preds = %126, %122, %117, %"alternativeCallIntrinsic_Integer_+103.i" - %i.sroa.0.0.i.be = phi i64 [ %send115.i, %"alternativeCallIntrinsic_Integer_+103.i" ], [ %127, %126 ], [ %125, %122 ], [ %121, %117 ] +BB2.i.backedge: ; preds = %113, %109, %104, %"alternativeCallIntrinsic_Integer_+103.i" + %i.sroa.0.0.i.be = phi i64 [ %send115.i, %"alternativeCallIntrinsic_Integer_+103.i" ], [ %114, %113 ], [ %112, %109 ], [ %108, %104 ] br label %BB2.i "func_.$152.exit": ; preds = %afterSend.i - %128 = getelementptr inbounds i64, i64* %22, i64 7 - %129 = getelementptr inbounds i64, i64* %128, i64 1 - store i64* %129, i64** %17, align 8, !tbaa !17 + store i64* getelementptr inbounds ([9 x i64], [9 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %17, align 8, !tbaa !17 call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %8) ret void } @@ -482,41 +477,30 @@ attributes #12 = { nounwind willreturn } !23 = !{!24, !18, i64 16} !24 = !{!"rb_control_frame_struct", !18, i64 0, !18, i64 8, !18, i64 16, !5, i64 24, !18, i64 32, !18, i64 40, !18, i64 48} !25 = !{!24, !18, i64 32} -!26 = !{!27, !18, i64 16} -!27 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !18, i64 16, !6, i64 24} -!28 = !{!29, !18, i64 8} -!29 = !{!"rb_iseq_constant_body", !6, i64 0, !21, i64 4, !18, i64 8, !30, i64 16, !32, i64 64, !35, i64 120, !18, i64 152, !18, i64 160, !18, i64 168, !18, i64 176, !18, i64 184, !18, i64 192, !36, i64 200, !21, i64 232, !21, i64 236, !21, i64 240, !21, i64 244, !21, i64 248, !6, i64 252, !5, i64 256} -!30 = !{!"", !31, i64 0, !21, i64 4, !21, i64 8, !21, i64 12, !21, i64 16, !21, i64 20, !21, i64 24, !21, i64 28, !18, i64 32, !18, i64 40} -!31 = !{!"", !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 0, !21, i64 1, !21, i64 1} -!32 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !21, i64 32, !33, i64 36} -!33 = !{!"rb_code_location_struct", !34, i64 0, !34, i64 8} -!34 = !{!"rb_code_position_struct", !21, i64 0, !21, i64 4} -!35 = !{!"iseq_insn_info", !18, i64 0, !18, i64 8, !21, i64 16, !18, i64 24} -!36 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !18, i64 24} -!37 = !DILocation(line: 0, scope: !9) -!38 = !DILocation(line: 4, column: 5, scope: !9) -!39 = !{!"branch_weights", i32 1, i32 2000} -!40 = !{!"branch_weights", i32 1073205, i32 2146410443} -!41 = !{!42, !5, i64 0} -!42 = !{!"RBasic", !5, i64 0, !5, i64 8} -!43 = !{!"branch_weights", i32 2000, i32 1} -!44 = !{!24, !18, i64 8} -!45 = !{!46} -!46 = distinct !{!46, !47, !"sorbet_rb_int_lt: argument 0"} -!47 = distinct !{!47, !"sorbet_rb_int_lt"} -!48 = !{!"branch_weights", i32 4001, i32 4000000} -!49 = !{!50} -!50 = distinct !{!50, !51, !"sorbet_rb_int_plus: argument 0"} -!51 = distinct !{!51, !"sorbet_rb_int_plus"} -!52 = !DILocation(line: 6, column: 10, scope: !9) -!53 = !{!54} -!54 = distinct !{!54, !55, !"sorbet_rb_int_plus: argument 0"} -!55 = distinct !{!55, !"sorbet_rb_int_plus"} -!56 = !DILocation(line: 6, column: 3, scope: !9) -!57 = !DILocation(line: 6, column: 17, scope: !9) -!58 = !{!59} -!59 = distinct !{!59, !60, !"sorbet_rb_int_plus: argument 0"} -!60 = distinct !{!60, !"sorbet_rb_int_plus"} -!61 = !{!62} -!62 = distinct !{!62, !63, !"sorbet_rb_int_plus: argument 0"} -!63 = distinct !{!63, !"sorbet_rb_int_plus"} +!26 = !DILocation(line: 0, scope: !9) +!27 = !DILocation(line: 4, column: 5, scope: !9) +!28 = !{!"branch_weights", i32 1, i32 2000} +!29 = !{!"branch_weights", i32 1073205, i32 2146410443} +!30 = !{!31, !5, i64 0} +!31 = !{!"RBasic", !5, i64 0, !5, i64 8} +!32 = !{!"branch_weights", i32 2000, i32 1} +!33 = !{!24, !18, i64 8} +!34 = !{!35} +!35 = distinct !{!35, !36, !"sorbet_rb_int_lt: argument 0"} +!36 = distinct !{!36, !"sorbet_rb_int_lt"} +!37 = !{!"branch_weights", i32 4001, i32 4000000} +!38 = !{!39} +!39 = distinct !{!39, !40, !"sorbet_rb_int_plus: argument 0"} +!40 = distinct !{!40, !"sorbet_rb_int_plus"} +!41 = !DILocation(line: 6, column: 10, scope: !9) +!42 = !{!43} +!43 = distinct !{!43, !44, !"sorbet_rb_int_plus: argument 0"} +!44 = distinct !{!44, !"sorbet_rb_int_plus"} +!45 = !DILocation(line: 6, column: 3, scope: !9) +!46 = !DILocation(line: 6, column: 17, scope: !9) +!47 = !{!48} +!48 = distinct !{!48, !49, !"sorbet_rb_int_plus: argument 0"} +!49 = distinct !{!49, !"sorbet_rb_int_plus"} +!50 = !{!51} +!51 = distinct !{!51, !52, !"sorbet_rb_int_plus: argument 0"} +!52 = distinct !{!52, !"sorbet_rb_int_plus"} diff --git a/test/testdata/ruby_benchmark/match_gt4.llo.exp b/test/testdata/ruby_benchmark/match_gt4.llo.exp index 9f06ae9b335..2c2fea76411 100644 --- a/test/testdata/ruby_benchmark/match_gt4.llo.exp +++ b/test/testdata/ruby_benchmark/match_gt4.llo.exp @@ -2,10 +2,10 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -21,27 +21,28 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_fiber_struct = type opaque -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.anon.3 = type { [65 x i64] } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -49,32 +50,33 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_objspace = type opaque %struct.rb_at_exit_list = type { void (%struct.rb_vm_struct*)*, %struct.rb_at_exit_list* } %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %union.pthread_mutex_t = type { %struct.__pthread_mutex_s } %struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list } %struct.__pthread_internal_list = type { %struct.__pthread_internal_list*, %struct.__pthread_internal_list* } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.st_table = type { i8, i8, i8, i32, %struct.st_hash_type*, i64, i64*, i64, i64, %struct.st_table_entry* } %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } -%struct.rb_captured_block = type { i64, i64*, %union.anon.17 } -%union.anon.17 = type { %struct.rb_iseq_struct* } +%struct.rb_captured_block = type { i64, i64*, %union.anon.20 } +%union.anon.20 = type { %struct.rb_iseq_struct* } %struct.iseq_inline_iv_cache_entry = type { i64, i64 } %struct.sorbet_inlineIntrinsicEnv = type { i64, i64, i32, i64*, i64 } @@ -90,6 +92,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/ruby_benchmark/match_gt4.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/ruby_benchmark/match_gt4.rb" = private unnamed_addr constant [42 x i8] c"test/testdata/ruby_benchmark/match_gt4.rb\00", align 1 +@iseqEncodedArray = internal global [5 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @"stackFramePrecomputed_func_.$152$block_1" = internal unnamed_addr global %struct.rb_iseq_struct* null, align 8 @"rubyIdPrecomputed_block for" = internal unnamed_addr global i64 0, align 8 @"str_block for" = private unnamed_addr constant [10 x i8] c"block for\00", align 1 @@ -110,7 +114,9 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 ; Function Attrs: noreturn declare void @rb_error_arity(i32, i32, i32) local_unnamed_addr #0 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #1 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #1 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #1 declare i64 @sorbet_readRealpath() local_unnamed_addr #1 @@ -185,56 +191,50 @@ functionEntryInitializers: %7 = and i64 %6, -129 store i64 %7, i64* %5, align 8, !tbaa !4 %8 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %9 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame, i64 0, i32 2 - %10 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %9, align 8, !tbaa !22 - %11 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %10, i64 0, i32 2 - %12 = load i64*, i64** %11, align 8, !tbaa !24 - %13 = getelementptr inbounds i64, i64* %12, i64 3 - %14 = getelementptr inbounds i64, i64* %13, i64 1 - store i64* %14, i64** %8, align 8, !tbaa !13 - %"rubyRegexp_(.)(.)(\\d+)(\\d)" = load i64, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8, !dbg !33 - %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !34 - br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %afterSend, !dbg !34 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !tbaa !13 + %"rubyRegexp_(.)(.)(\\d+)(\\d)" = load i64, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8, !dbg !22 + %arrayExpansionSizeGuard = icmp eq i32 %argc, 1, !dbg !23 + br i1 %arrayExpansionSizeGuard, label %argArrayExpandArrayTest, label %afterSend, !dbg !23 argArrayExpandArrayTest: ; preds = %functionEntryInitializers - %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !34 - %15 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !34 - %16 = icmp ne i64 %15, 0, !dbg !34 - %17 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !34 - %18 = icmp eq i64 %17, 0, !dbg !34 - %19 = or i1 %16, %18, !dbg !34 - br i1 %19, label %afterSend, label %sorbet_isa_Array.exit, !dbg !34 + %arg1_maybeExpandToFullArgs = load i64, i64* %argArray, align 8, !dbg !23 + %9 = and i64 %arg1_maybeExpandToFullArgs, 7, !dbg !23 + %10 = icmp ne i64 %9, 0, !dbg !23 + %11 = and i64 %arg1_maybeExpandToFullArgs, -9, !dbg !23 + %12 = icmp eq i64 %11, 0, !dbg !23 + %13 = or i1 %10, %12, !dbg !23 + br i1 %13, label %afterSend, label %sorbet_isa_Array.exit, !dbg !23 sorbet_isa_Array.exit: ; preds = %argArrayExpandArrayTest - %20 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !34 - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0, !dbg !34 - %22 = load i64, i64* %21, align 8, !dbg !34, !tbaa !35 - %23 = and i64 %22, 31, !dbg !34 - %24 = icmp ne i64 %23, 7, !dbg !34 - %25 = and i64 %22, 33554432, !dbg !34 - %26 = icmp eq i64 %25, 0, !dbg !34 - %or.cond = or i1 %24, %26, !dbg !34 - br i1 %or.cond, label %afterSend, label %27, !dbg !34 - -27: ; preds = %sorbet_isa_Array.exit - tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #13, !dbg !34 - br label %afterSend, !dbg !34 - -afterSend: ; preds = %sorbet_isa_Array.exit, %functionEntryInitializers, %27, %argArrayExpandArrayTest - store i64* %14, i64** %8, align 8, !tbaa !13 - %rubyStr_THX1138. = load i64, i64* @rubyStrFrozen_THX1138., align 8, !dbg !37 - %28 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !33, !tbaa !13 - %29 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %28, i64 0, i32 2, !dbg !33 - %30 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %29, align 8, !dbg !33, !tbaa !15 - %31 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %30, i64 0, i32 1, !dbg !33 - %32 = load i64*, i64** %31, align 8, !dbg !33, !tbaa !38 - %33 = getelementptr inbounds i64, i64* %32, i64 1, !dbg !33 - store i64 %"rubyRegexp_(.)(.)(\\d+)(\\d)", i64* %32, align 8, !dbg !33, !tbaa !4 - %34 = getelementptr inbounds i64, i64* %33, i64 1, !dbg !33 - store i64* %34, i64** %31, align 8, !dbg !33, !tbaa !38 - store i64 %rubyStr_THX1138., i64* %33, align 8, !dbg !33, !tbaa !4 - %send18 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_match, i64 0), !dbg !33 - ret i64 %send18, !dbg !34 + %14 = inttoptr i64 %arg1_maybeExpandToFullArgs to %struct.iseq_inline_iv_cache_entry*, !dbg !23 + %15 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %14, i64 0, i32 0, !dbg !23 + %16 = load i64, i64* %15, align 8, !dbg !23, !tbaa !24 + %17 = and i64 %16, 31, !dbg !23 + %18 = icmp ne i64 %17, 7, !dbg !23 + %19 = and i64 %16, 33554432, !dbg !23 + %20 = icmp eq i64 %19, 0, !dbg !23 + %or.cond = or i1 %18, %20, !dbg !23 + br i1 %or.cond, label %afterSend, label %21, !dbg !23 + +21: ; preds = %sorbet_isa_Array.exit + tail call void @rb_ary_detransient(i64 %arg1_maybeExpandToFullArgs) #13, !dbg !23 + br label %afterSend, !dbg !23 + +afterSend: ; preds = %sorbet_isa_Array.exit, %functionEntryInitializers, %21, %argArrayExpandArrayTest + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %8, align 8, !tbaa !13 + %rubyStr_THX1138. = load i64, i64* @rubyStrFrozen_THX1138., align 8, !dbg !26 + %22 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !13 + %23 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %22, i64 0, i32 2, !dbg !22 + %24 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %23, align 8, !dbg !22, !tbaa !15 + %25 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %24, i64 0, i32 1, !dbg !22 + %26 = load i64*, i64** %25, align 8, !dbg !22, !tbaa !27 + %27 = getelementptr inbounds i64, i64* %26, i64 1, !dbg !22 + store i64 %"rubyRegexp_(.)(.)(\\d+)(\\d)", i64* %26, align 8, !dbg !22, !tbaa !4 + %28 = getelementptr inbounds i64, i64* %27, i64 1, !dbg !22 + store i64* %28, i64** %25, align 8, !dbg !22, !tbaa !27 + store i64 %rubyStr_THX1138., i64* %27, align 8, !dbg !22, !tbaa !4 + %send18 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_match, i64 0), !dbg !22 + ret i64 %send18, !dbg !23 } ; Function Attrs: nounwind ssp @@ -242,147 +242,135 @@ define internal i64 @forward_sorbet_rb_int_dotimes(i64 %0) #7 { entry: %1 = alloca [1 x i64], align 8 %2 = alloca [1 x i64], align 8 - %3 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !39, !tbaa !13 - %4 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %3, i64 0, i32 17, !dbg !39 - %5 = load i64, i64* %4, align 8, !dbg !39, !tbaa !40 - %6 = and i64 %5, -4, !dbg !39 - %7 = inttoptr i64 %6 to %struct.rb_captured_block*, !dbg !39 - store i64 0, i64* %4, align 8, !dbg !39, !tbaa !40 - %8 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !39 - %9 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %8, i64 0, i32 0, !dbg !39 - %10 = load i64, i64* %9, align 8, !dbg !39, !tbaa !41 - %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %8, i64 0, i32 2, !dbg !39 - %12 = load i32, i32* %11, align 8, !dbg !39, !tbaa !43 - %13 = icmp slt i32 %12, 0, !dbg !39 - %14 = icmp sgt i32 %12, 0, !dbg !39 - %or.cond.i1 = or i1 %13, %14, !dbg !39 - br i1 %or.cond.i1, label %15, label %rb_check_arity.1.exit, !dbg !39 + %3 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !28, !tbaa !13 + %4 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %3, i64 0, i32 17, !dbg !28 + %5 = load i64, i64* %4, align 8, !dbg !28, !tbaa !29 + %6 = and i64 %5, -4, !dbg !28 + %7 = inttoptr i64 %6 to %struct.rb_captured_block*, !dbg !28 + store i64 0, i64* %4, align 8, !dbg !28, !tbaa !29 + %8 = inttoptr i64 %0 to %struct.sorbet_inlineIntrinsicEnv*, !dbg !28 + %9 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %8, i64 0, i32 0, !dbg !28 + %10 = load i64, i64* %9, align 8, !dbg !28, !tbaa !30 + %11 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %8, i64 0, i32 2, !dbg !28 + %12 = load i32, i32* %11, align 8, !dbg !28, !tbaa !32 + %13 = icmp slt i32 %12, 0, !dbg !28 + %14 = icmp sgt i32 %12, 0, !dbg !28 + %or.cond.i1 = or i1 %13, %14, !dbg !28 + br i1 %or.cond.i1, label %15, label %rb_check_arity.1.exit, !dbg !28 15: ; preds = %entry - tail call void @rb_error_arity(i32 %12, i32 noundef 0, i32 noundef 0) #12, !dbg !39 - unreachable, !dbg !39 + tail call void @rb_error_arity(i32 %12, i32 noundef 0, i32 noundef 0) #12, !dbg !28 + unreachable, !dbg !28 rb_check_arity.1.exit: ; preds = %entry - tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %7) #13, !dbg !39 - %16 = and i64 %10, 1, !dbg !39 - %17 = icmp eq i64 %16, 0, !dbg !39 - br i1 %17, label %18, label %27, !dbg !39, !prof !44 + tail call void @sorbet_pushBlockFrame(%struct.rb_captured_block* %7) #13, !dbg !28 + %16 = and i64 %10, 1, !dbg !28 + %17 = icmp eq i64 %16, 0, !dbg !28 + br i1 %17, label %18, label %27, !dbg !28, !prof !33 18: ; preds = %rb_check_arity.1.exit - %19 = bitcast [1 x i64]* %1 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !39 - %20 = getelementptr inbounds [1 x i64], [1 x i64]* %1, i64 0, i64 0, !dbg !39 - store i64 %10, i64* %20, align 8, !dbg !39, !tbaa !4 - %21 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %20) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !39 - %22 = and i64 %21, -9, !dbg !39 - %23 = icmp eq i64 %22, 0, !dbg !39 - br i1 %23, label %sorbet_rb_int_dotimes_withBlock.exit, label %24, !dbg !39 + %19 = bitcast [1 x i64]* %1 to i8*, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + %20 = getelementptr inbounds [1 x i64], [1 x i64]* %1, i64 0, i64 0, !dbg !28 + store i64 %10, i64* %20, align 8, !dbg !28, !tbaa !4 + %21 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 noundef 1, i64 noundef 60, i32 noundef 1, i64* noundef nonnull align 8 %20) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + %22 = and i64 %21, -9, !dbg !28 + %23 = icmp eq i64 %22, 0, !dbg !28 + br i1 %23, label %sorbet_rb_int_dotimes_withBlock.exit, label %24, !dbg !28 24: ; preds = %18 - %25 = bitcast [1 x i64]* %2 to i8*, !dbg !39 - %26 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !39 - br label %"func_.$152$block_1.exit", !dbg !39 + %25 = bitcast [1 x i64]* %2 to i8*, !dbg !28 + %26 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !28 + br label %"func_.$152$block_1.exit", !dbg !28 27: ; preds = %rb_check_arity.1.exit - %28 = ashr i64 %10, 1, !dbg !39 - %29 = icmp sgt i64 %10, 1, !dbg !39 - br i1 %29, label %30, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !39 + %28 = ashr i64 %10, 1, !dbg !28 + %29 = icmp sgt i64 %10, 1, !dbg !28 + br i1 %29, label %30, label %sorbet_rb_int_dotimes_withBlock.exit, !dbg !28 30: ; preds = %27 - %31 = icmp sgt i64 %28, 1, !dbg !39 - %32 = select i1 %31, i64 %28, i64 1, !dbg !39 - br label %"func_.$152$block_1.exit9", !dbg !39 + %31 = icmp sgt i64 %28, 1, !dbg !28 + %32 = select i1 %31, i64 %28, i64 1, !dbg !28 + br label %"func_.$152$block_1.exit9", !dbg !28 "func_.$152$block_1.exit9": ; preds = %30, %"func_.$152$block_1.exit9" - %33 = phi i64 [ 0, %30 ], [ %56, %"func_.$152$block_1.exit9" ], !dbg !39 - tail call void @llvm.experimental.noalias.scope.decl(metadata !45), !dbg !39 - %stackFrame.i2 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !45 - %34 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !45 + %33 = phi i64 [ 0, %30 ], [ %50, %"func_.$152$block_1.exit9" ], !dbg !28 + tail call void @llvm.experimental.noalias.scope.decl(metadata !34), !dbg !28 + %stackFrame.i2 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !34 + %34 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !34 %35 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %34, i64 0, i32 2 - %36 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %35, align 8, !tbaa !15, !noalias !45 + %36 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %35, align 8, !tbaa !15, !noalias !34 %37 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i2, %struct.rb_iseq_struct** %37, align 8, !tbaa !19, !noalias !45 + store %struct.rb_iseq_struct* %stackFrame.i2, %struct.rb_iseq_struct** %37, align 8, !tbaa !19, !noalias !34 %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 4 - %39 = load i64*, i64** %38, align 8, !tbaa !21, !noalias !45 - %40 = load i64, i64* %39, align 8, !tbaa !4, !noalias !45 + %39 = load i64*, i64** %38, align 8, !tbaa !21, !noalias !34 + %40 = load i64, i64* %39, align 8, !tbaa !4, !noalias !34 %41 = and i64 %40, -129 - store i64 %41, i64* %39, align 8, !tbaa !4, !noalias !45 + store i64 %41, i64* %39, align 8, !tbaa !4, !noalias !34 %42 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %36, i64 0, i32 0 - %43 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame.i2, i64 0, i32 2 - %44 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %43, align 8, !tbaa !22, !noalias !45 - %45 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %44, i64 0, i32 2 - %46 = load i64*, i64** %45, align 8, !tbaa !24, !noalias !45 - %47 = getelementptr inbounds i64, i64* %46, i64 3 - %48 = getelementptr inbounds i64, i64* %47, i64 1 - store i64* %48, i64** %42, align 8, !tbaa !13, !noalias !45 - %"rubyRegexp_(.)(.)(\\d+)(\\d).i3" = load i64, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8, !dbg !48, !noalias !45 - %rubyStr_THX1138..i7 = load i64, i64* @rubyStrFrozen_THX1138., align 8, !dbg !50, !noalias !45 - %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !48, !tbaa !13, !noalias !45 - %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2, !dbg !48 - %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !dbg !48, !tbaa !15, !noalias !45 - %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 1, !dbg !48 - %53 = load i64*, i64** %52, align 8, !dbg !48, !tbaa !38, !noalias !45 - %54 = getelementptr inbounds i64, i64* %53, i64 1, !dbg !48 - store i64 %"rubyRegexp_(.)(.)(\\d+)(\\d).i3", i64* %53, align 8, !dbg !48, !tbaa !4, !noalias !45 - %55 = getelementptr inbounds i64, i64* %54, i64 1, !dbg !48 - store i64* %55, i64** %52, align 8, !dbg !48, !tbaa !38, !noalias !45 - store i64 %rubyStr_THX1138..i7, i64* %54, align 8, !dbg !48, !tbaa !4, !noalias !45 - %send18.i8 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_match, i64 0) #13, !dbg !48, !noalias !45 - %56 = add nuw nsw i64 %33, 1, !dbg !39 - %57 = icmp eq i64 %56, %32, !dbg !39 - br i1 %57, label %sorbet_rb_int_dotimes_withBlock.exit, label %"func_.$152$block_1.exit9", !dbg !39, !llvm.loop !51 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %42, align 8, !tbaa !13, !noalias !34 + %"rubyRegexp_(.)(.)(\\d+)(\\d).i3" = load i64, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8, !dbg !37, !noalias !34 + %rubyStr_THX1138..i7 = load i64, i64* @rubyStrFrozen_THX1138., align 8, !dbg !39, !noalias !34 + %43 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !37, !tbaa !13, !noalias !34 + %44 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %43, i64 0, i32 2, !dbg !37 + %45 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %44, align 8, !dbg !37, !tbaa !15, !noalias !34 + %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %45, i64 0, i32 1, !dbg !37 + %47 = load i64*, i64** %46, align 8, !dbg !37, !tbaa !27, !noalias !34 + %48 = getelementptr inbounds i64, i64* %47, i64 1, !dbg !37 + store i64 %"rubyRegexp_(.)(.)(\\d+)(\\d).i3", i64* %47, align 8, !dbg !37, !tbaa !4, !noalias !34 + %49 = getelementptr inbounds i64, i64* %48, i64 1, !dbg !37 + store i64* %49, i64** %46, align 8, !dbg !37, !tbaa !27, !noalias !34 + store i64 %rubyStr_THX1138..i7, i64* %48, align 8, !dbg !37, !tbaa !4, !noalias !34 + %send18.i8 = tail call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_match, i64 0) #13, !dbg !37, !noalias !34 + %50 = add nuw nsw i64 %33, 1, !dbg !28 + %51 = icmp eq i64 %50, %32, !dbg !28 + br i1 %51, label %sorbet_rb_int_dotimes_withBlock.exit, label %"func_.$152$block_1.exit9", !dbg !28, !llvm.loop !40 "func_.$152$block_1.exit": ; preds = %24, %"func_.$152$block_1.exit" - %58 = phi i64 [ 1, %24 ], [ %81, %"func_.$152$block_1.exit" ], !dbg !39 - call void @llvm.experimental.noalias.scope.decl(metadata !53), !dbg !39 - %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !53 - %59 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !53 - %60 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %59, i64 0, i32 2 - %61 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %60, align 8, !tbaa !15, !noalias !53 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %62, align 8, !tbaa !19, !noalias !53 - %63 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 4 - %64 = load i64*, i64** %63, align 8, !tbaa !21, !noalias !53 - %65 = load i64, i64* %64, align 8, !tbaa !4, !noalias !53 - %66 = and i64 %65, -129 - store i64 %66, i64* %64, align 8, !tbaa !4, !noalias !53 - %67 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %61, i64 0, i32 0 - %68 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %stackFrame.i, i64 0, i32 2 - %69 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %68, align 8, !tbaa !22, !noalias !53 - %70 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %69, i64 0, i32 2 - %71 = load i64*, i64** %70, align 8, !tbaa !24, !noalias !53 - %72 = getelementptr inbounds i64, i64* %71, i64 3 - %73 = getelementptr inbounds i64, i64* %72, i64 1 - store i64* %73, i64** %67, align 8, !tbaa !13, !noalias !53 - %"rubyRegexp_(.)(.)(\\d+)(\\d).i" = load i64, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8, !dbg !56, !noalias !53 - %rubyStr_THX1138..i = load i64, i64* @rubyStrFrozen_THX1138., align 8, !dbg !58, !noalias !53 - %74 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !56, !tbaa !13, !noalias !53 - %75 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %74, i64 0, i32 2, !dbg !56 - %76 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %75, align 8, !dbg !56, !tbaa !15, !noalias !53 - %77 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %76, i64 0, i32 1, !dbg !56 - %78 = load i64*, i64** %77, align 8, !dbg !56, !tbaa !38, !noalias !53 - %79 = getelementptr inbounds i64, i64* %78, i64 1, !dbg !56 - store i64 %"rubyRegexp_(.)(.)(\\d+)(\\d).i", i64* %78, align 8, !dbg !56, !tbaa !4, !noalias !53 - %80 = getelementptr inbounds i64, i64* %79, i64 1, !dbg !56 - store i64* %80, i64** %77, align 8, !dbg !56, !tbaa !38, !noalias !53 - store i64 %rubyStr_THX1138..i, i64* %79, align 8, !dbg !56, !tbaa !4, !noalias !53 - %send18.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_match, i64 0) #13, !dbg !56, !noalias !53 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %25) #13, !dbg !39 - store i64 3, i64* %26, align 8, !dbg !39 - %81 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %58, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %26) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %25) #13, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !39 - store i64 %10, i64* %20, align 8, !dbg !39, !tbaa !4 - %82 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %81, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %20) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !39 - %83 = and i64 %82, -9, !dbg !39 - %84 = icmp eq i64 %83, 0, !dbg !39 - br i1 %84, label %sorbet_rb_int_dotimes_withBlock.exit, label %"func_.$152$block_1.exit", !dbg !39, !llvm.loop !59 + %52 = phi i64 [ 1, %24 ], [ %69, %"func_.$152$block_1.exit" ], !dbg !28 + call void @llvm.experimental.noalias.scope.decl(metadata !42), !dbg !28 + %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8, !noalias !42 + %53 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13, !noalias !42 + %54 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %53, i64 0, i32 2 + %55 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %54, align 8, !tbaa !15, !noalias !42 + %56 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %55, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i, %struct.rb_iseq_struct** %56, align 8, !tbaa !19, !noalias !42 + %57 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %55, i64 0, i32 4 + %58 = load i64*, i64** %57, align 8, !tbaa !21, !noalias !42 + %59 = load i64, i64* %58, align 8, !tbaa !4, !noalias !42 + %60 = and i64 %59, -129 + store i64 %60, i64* %58, align 8, !tbaa !4, !noalias !42 + %61 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %55, i64 0, i32 0 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %61, align 8, !tbaa !13, !noalias !42 + %"rubyRegexp_(.)(.)(\\d+)(\\d).i" = load i64, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8, !dbg !45, !noalias !42 + %rubyStr_THX1138..i = load i64, i64* @rubyStrFrozen_THX1138., align 8, !dbg !47, !noalias !42 + %62 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !45, !tbaa !13, !noalias !42 + %63 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %62, i64 0, i32 2, !dbg !45 + %64 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %63, align 8, !dbg !45, !tbaa !15, !noalias !42 + %65 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %64, i64 0, i32 1, !dbg !45 + %66 = load i64*, i64** %65, align 8, !dbg !45, !tbaa !27, !noalias !42 + %67 = getelementptr inbounds i64, i64* %66, i64 1, !dbg !45 + store i64 %"rubyRegexp_(.)(.)(\\d+)(\\d).i", i64* %66, align 8, !dbg !45, !tbaa !4, !noalias !42 + %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !45 + store i64* %68, i64** %65, align 8, !dbg !45, !tbaa !27, !noalias !42 + store i64 %rubyStr_THX1138..i, i64* %67, align 8, !dbg !45, !tbaa !4, !noalias !42 + %send18.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_match, i64 0) #13, !dbg !45, !noalias !42 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %25) #13, !dbg !28 + store i64 3, i64* %26, align 8, !dbg !28 + %69 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data.3, i64 %52, i64 noundef 43, i32 noundef 1, i64* noundef nonnull %26) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %25) #13, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + store i64 %10, i64* %20, align 8, !dbg !28, !tbaa !4 + %70 = call i64 @rb_funcallv_with_cc(%struct.rb_call_data* noundef nonnull @sorbet_rb_int_dotimes_withBlock.rb_funcallv_data, i64 %69, i64 noundef 60, i32 noundef 1, i64* noundef nonnull %20) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %19) #13, !dbg !28 + %71 = and i64 %70, -9, !dbg !28 + %72 = icmp eq i64 %71, 0, !dbg !28 + br i1 %72, label %sorbet_rb_int_dotimes_withBlock.exit, label %"func_.$152$block_1.exit", !dbg !28, !llvm.loop !48 sorbet_rb_int_dotimes_withBlock.exit: ; preds = %"func_.$152$block_1.exit9", %"func_.$152$block_1.exit", %18, %27 - call void @sorbet_popRubyStack() #13, !dbg !39 - ret i64 %10, !dbg !39 + call void @sorbet_popRubyStack() #13, !dbg !28 + ret i64 %10, !dbg !28 } ; Function Attrs: sspreq @@ -407,31 +395,33 @@ entry: %7 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @"str_test/testdata/ruby_benchmark/match_gt4.rb", i64 0, i64 0), i64 noundef 41) #13 tail call void @rb_gc_register_mark_object(i64 %7) #13 store i64 %7, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/match_gt4.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 5) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %7, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 4, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 3) + %"rubyStr_test/testdata/ruby_benchmark/match_gt4.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/match_gt4.rb", align 8 + %8 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/match_gt4.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %8, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %9 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #13 call void @rb_gc_register_mark_object(i64 %9) #13 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/match_gt4.rb.i3.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/match_gt4.rb", align 8 - %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/match_gt4.rb.i3.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 1, i32 noundef 4, i64* noundef null, i32 noundef 0, i32 noundef 3) + %10 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %9, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/match_gt4.rb.i3.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 3) store %struct.rb_iseq_struct* %10, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152$block_1", align 8 - %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !39 + %rubyId_times.i = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !28 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_times, i64 %rubyId_times.i, i32 noundef 16, i32 noundef 0, i32 noundef 0, i64* noundef null), !dbg !28 %11 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([16 x i8], [16 x i8]* @"str_(.)(.)(\\d+)(\\d)", i64 0, i64 0), i64 noundef 15) #13 call void @rb_gc_register_mark_object(i64 %11) #13 %12 = call i64 @rb_reg_new(i8* noundef getelementptr inbounds ([16 x i8], [16 x i8]* @"str_(.)(.)(\\d+)(\\d)", i64 0, i64 0), i64 noundef 15, i32 noundef 0) #13 call void @rb_gc_register_mark_object(i64 %12) #13 store i64 %12, i64* @"rubyRegexpFrozen_(.)(.)(\\d+)(\\d)", align 8 - %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !33 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !33 + %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !22 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 2, i32 noundef 0, i64* noundef null), !dbg !22 %13 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_THX1138., i64 0, i64 0), i64 noundef 8) #13 call void @rb_gc_register_mark_object(i64 %13) #13 store i64 %13, i64* @rubyStrFrozen_THX1138., align 8 - %rubyId_match.i = load i64, i64* @rubyIdPrecomputed_match, align 8, !dbg !33 - call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_match, i64 %rubyId_match.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !33 + %rubyId_match.i = load i64, i64* @rubyIdPrecomputed_match, align 8, !dbg !22 + call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_match, i64 %rubyId_match.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !22 %stackFrame.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %14 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !13 %15 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %14, i64 0, i32 2 @@ -445,30 +435,23 @@ entry: store i64 %21, i64* %19, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %14, %struct.rb_control_frame_struct* align 8 %16, %struct.rb_iseq_struct* %stackFrame.i) #13 %22 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %16, i64 0, i32 0 - %23 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %17, align 8, !tbaa !19 - %24 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %23, i64 0, i32 2 - %25 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %24, align 8, !tbaa !22 - %26 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %25, i64 0, i32 2 - %27 = load i64*, i64** %26, align 8, !tbaa !24 - %28 = getelementptr inbounds i64, i64* %27, i64 3 - %29 = getelementptr inbounds i64, i64* %28, i64 1 - store i64* %29, i64** %22, align 8, !dbg !60, !tbaa !13 - %rubyId_times.i1 = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !39 - %30 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !39 - call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %30) #13, !dbg !39 - %31 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !39 - store i64 2000001, i64* %31, align 8, !dbg !39, !tbaa !41 - %32 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !39 - store i64 %rubyId_times.i1, i64* %32, align 8, !dbg !39, !tbaa !61 - %33 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !39 - store i32 0, i32* %33, align 8, !dbg !39, !tbaa !43 - %34 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !39 - %35 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !39 - %36 = bitcast i64** %34 to i8*, !dbg !39 - call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %36, i8 0, i64 16, i1 false) #13, !dbg !39 - %37 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %35, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #13, !dbg !39 - call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %30) #13, !dbg !39 - store i64* %29, i64** %22, align 8, !tbaa !13 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %22, align 8, !dbg !49, !tbaa !13 + %rubyId_times.i1 = load i64, i64* @rubyIdPrecomputed_times, align 8, !dbg !28 + %23 = bitcast %struct.sorbet_inlineIntrinsicEnv* %0 to i8*, !dbg !28 + call void @llvm.lifetime.start.p0i8(i64 noundef 40, i8* noundef nonnull %23) #13, !dbg !28 + %24 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 0, !dbg !28 + store i64 2000001, i64* %24, align 8, !dbg !28, !tbaa !30 + %25 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 1, !dbg !28 + store i64 %rubyId_times.i1, i64* %25, align 8, !dbg !28, !tbaa !50 + %26 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 2, !dbg !28 + store i32 0, i32* %26, align 8, !dbg !28, !tbaa !32 + %27 = getelementptr inbounds %struct.sorbet_inlineIntrinsicEnv, %struct.sorbet_inlineIntrinsicEnv* %0, i64 0, i32 3, !dbg !28 + %28 = ptrtoint %struct.sorbet_inlineIntrinsicEnv* %0 to i64, !dbg !28 + %29 = bitcast i64** %27 to i8*, !dbg !28 + call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %29, i8 0, i64 16, i1 false) #13, !dbg !28 + %30 = call i64 @rb_iterate(i64 (i64)* noundef @forward_sorbet_rb_int_dotimes, i64 noundef %28, i64 (i64, i64, i32, i64*, i64)* noundef @"func_.$152$block_1", i64 noundef 0) #13, !dbg !28 + call void @llvm.lifetime.end.p0i8(i64 noundef 40, i8* noundef nonnull %23) #13, !dbg !28 + store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @iseqEncodedArray, i64 0, i64 4), i64** %22, align 8, !tbaa !13 ret void } @@ -518,43 +501,32 @@ attributes #13 = { nounwind } !19 = !{!20, !14, i64 16} !20 = !{!"rb_control_frame_struct", !14, i64 0, !14, i64 8, !14, i64 16, !5, i64 24, !14, i64 32, !14, i64 40, !14, i64 48} !21 = !{!20, !14, i64 32} -!22 = !{!23, !14, i64 16} -!23 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !14, i64 16, !6, i64 24} -!24 = !{!25, !14, i64 8} -!25 = !{!"rb_iseq_constant_body", !6, i64 0, !17, i64 4, !14, i64 8, !26, i64 16, !28, i64 64, !31, i64 120, !14, i64 152, !14, i64 160, !14, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !32, i64 200, !17, i64 232, !17, i64 236, !17, i64 240, !17, i64 244, !17, i64 248, !6, i64 252, !5, i64 256} -!26 = !{!"", !27, i64 0, !17, i64 4, !17, i64 8, !17, i64 12, !17, i64 16, !17, i64 20, !17, i64 24, !17, i64 28, !14, i64 32, !14, i64 40} -!27 = !{!"", !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 0, !17, i64 1, !17, i64 1} -!28 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !17, i64 32, !29, i64 36} -!29 = !{!"rb_code_location_struct", !30, i64 0, !30, i64 8} -!30 = !{!"rb_code_position_struct", !17, i64 0, !17, i64 4} -!31 = !{!"iseq_insn_info", !14, i64 0, !14, i64 8, !17, i64 16, !14, i64 24} -!32 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !14, i64 24} -!33 = !DILocation(line: 4, column: 17, scope: !8) -!34 = !DILocation(line: 4, column: 1, scope: !8) -!35 = !{!36, !5, i64 0} -!36 = !{!"RBasic", !5, i64 0, !5, i64 8} -!37 = !DILocation(line: 4, column: 41, scope: !8) -!38 = !{!20, !14, i64 8} -!39 = !DILocation(line: 4, column: 1, scope: !9) -!40 = !{!16, !5, i64 128} -!41 = !{!42, !5, i64 0} -!42 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !17, i64 16, !14, i64 24, !5, i64 32} -!43 = !{!42, !17, i64 16} -!44 = !{!"branch_weights", i32 1, i32 2000} -!45 = !{!46} -!46 = distinct !{!46, !47, !"func_.$152$block_1: %argArray"} -!47 = distinct !{!47, !"func_.$152$block_1"} -!48 = !DILocation(line: 4, column: 17, scope: !8, inlinedAt: !49) -!49 = distinct !DILocation(line: 4, column: 1, scope: !9) -!50 = !DILocation(line: 4, column: 41, scope: !8, inlinedAt: !49) -!51 = distinct !{!51, !52} -!52 = !{!"llvm.loop.unroll.disable"} -!53 = !{!54} -!54 = distinct !{!54, !55, !"func_.$152$block_1: %argArray"} -!55 = distinct !{!55, !"func_.$152$block_1"} -!56 = !DILocation(line: 4, column: 17, scope: !8, inlinedAt: !57) -!57 = distinct !DILocation(line: 4, column: 1, scope: !9) -!58 = !DILocation(line: 4, column: 41, scope: !8, inlinedAt: !57) -!59 = distinct !{!59, !52} -!60 = !DILocation(line: 0, scope: !9) -!61 = !{!42, !5, i64 8} +!22 = !DILocation(line: 4, column: 17, scope: !8) +!23 = !DILocation(line: 4, column: 1, scope: !8) +!24 = !{!25, !5, i64 0} +!25 = !{!"RBasic", !5, i64 0, !5, i64 8} +!26 = !DILocation(line: 4, column: 41, scope: !8) +!27 = !{!20, !14, i64 8} +!28 = !DILocation(line: 4, column: 1, scope: !9) +!29 = !{!16, !5, i64 128} +!30 = !{!31, !5, i64 0} +!31 = !{!"sorbet_inlineIntrinsicEnv", !5, i64 0, !5, i64 8, !17, i64 16, !14, i64 24, !5, i64 32} +!32 = !{!31, !17, i64 16} +!33 = !{!"branch_weights", i32 1, i32 2000} +!34 = !{!35} +!35 = distinct !{!35, !36, !"func_.$152$block_1: %argArray"} +!36 = distinct !{!36, !"func_.$152$block_1"} +!37 = !DILocation(line: 4, column: 17, scope: !8, inlinedAt: !38) +!38 = distinct !DILocation(line: 4, column: 1, scope: !9) +!39 = !DILocation(line: 4, column: 41, scope: !8, inlinedAt: !38) +!40 = distinct !{!40, !41} +!41 = !{!"llvm.loop.unroll.disable"} +!42 = !{!43} +!43 = distinct !{!43, !44, !"func_.$152$block_1: %argArray"} +!44 = distinct !{!44, !"func_.$152$block_1"} +!45 = !DILocation(line: 4, column: 17, scope: !8, inlinedAt: !46) +!46 = distinct !DILocation(line: 4, column: 1, scope: !9) +!47 = !DILocation(line: 4, column: 41, scope: !8, inlinedAt: !46) +!48 = distinct !{!48, !41} +!49 = !DILocation(line: 0, scope: !9) +!50 = !{!31, !5, i64 8} diff --git a/test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.llo.exp b/test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.llo.exp index ae41aa5e93b..a5efdb9d632 100644 --- a/test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.llo.exp +++ b/test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -90,6 +92,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb" = private unnamed_addr constant [58 x i8] c"test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb\00", align 1 +@iseqEncodedArray = internal global [28 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_AttrReaderNoSig = private unnamed_addr constant [16 x i8] c"AttrReaderNoSig\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_new = internal unnamed_addr global i64 0, align 8 @@ -154,7 +158,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -286,9 +292,11 @@ entry: %18 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([58 x i8], [58 x i8]* @"str_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb", i64 0, i64 0), i64 noundef 57) #17 tail call void @rb_gc_register_mark_object(i64 %18) #17 store i64 %18, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 28) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %18, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 27, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb", align 8 + %19 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %19, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !17 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !17 @@ -308,21 +316,21 @@ entry: call void @rb_gc_register_mark_object(i64 %20) #17 %rubyId_initialize.i.i = load i64, i64* @rubyIdPrecomputed_initialize, align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i20.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb", align 8 - %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %20, i64 %rubyId_initialize.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 10, i64* noundef nonnull %locals.i21.i, i32 noundef 0, i32 noundef 0) + %21 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %20, i64 %rubyId_initialize.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i20.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i21.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %21, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderNoSig#initialize", align 8 %22 = call i64 @sorbet_getConstant(i8* noundef getelementptr inbounds ([30 x i8], [30 x i8]* @sorbet_getVoidSingleton.name, i64 0, i64 0), i64 noundef 30) #17 store i64 %22, i64* @"", align 8 %"rubyId_.i22.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i23.i" = load i64, i64* @"rubyStrFrozen_", align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i24.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb", align 8 - %23 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i23.i", i64 %"rubyId_.i22.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i24.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull %locals.i25.i, i32 noundef 0, i32 noundef 4) + %23 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i23.i", i64 %"rubyId_.i22.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i24.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i25.i, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %23, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderNoSig.", align 8 %24 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #17 call void @rb_gc_register_mark_object(i64 %24) #17 %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderNoSig.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i26.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb", align 8 - %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %24, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %24, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/no_sig.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %25, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderNoSig.$block_1", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !24 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 @@ -356,362 +364,322 @@ entry: store i64 %37, i64* %35, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %30, %struct.rb_control_frame_struct* align 8 %32, %struct.rb_iseq_struct* %stackFrame.i) #17 %38 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %32, i64 0, i32 0 - %39 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %33, align 8, !tbaa !43 - %40 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %39, i64 0, i32 2 - %41 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %40, align 8, !tbaa !46 - %42 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %41, i64 0, i32 2 - %43 = load i64*, i64** %42, align 8, !tbaa !48 - %44 = getelementptr inbounds i64, i64* %43, i64 4 - %45 = getelementptr inbounds i64, i64* %44, i64 1 - store i64* %45, i64** %38, align 8, !dbg !57, !tbaa !28 - %46 = load i64, i64* @rb_cObject, align 8, !dbg !58 - %47 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([16 x i8], [16 x i8]* @str_AttrReaderNoSig, i64 0, i64 0), i64 %46) #17, !dbg !58 - call void @sorbet_pushStaticInitFrame(i64 %47) #17, !dbg !58 - %48 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %48) #17 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %38, align 8, !dbg !46, !tbaa !28 + %39 = load i64, i64* @rb_cObject, align 8, !dbg !47 + %40 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([16 x i8], [16 x i8]* @str_AttrReaderNoSig, i64 0, i64 0), i64 %39) #17, !dbg !47 + call void @sorbet_pushStaticInitFrame(i64 %40) #17, !dbg !47 + %41 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %41) #17 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderNoSig.", align 8 - %49 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !28 - %50 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %49, i64 0, i32 2 - %51 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %50, align 8, !tbaa !40 - %52 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %52, align 8, !tbaa !43 - %53 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 4 - %54 = load i64*, i64** %53, align 8, !tbaa !45 - %55 = load i64, i64* %54, align 8, !tbaa !4 - %56 = and i64 %55, -33 - store i64 %56, i64* %54, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %49, %struct.rb_control_frame_struct* align 8 %51, %struct.rb_iseq_struct* %stackFrame.i.i1) #17 - %57 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %51, i64 0, i32 0 - %58 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %52, align 8, !tbaa !43 - %59 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %58, i64 0, i32 2 - %60 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %59, align 8, !tbaa !46 - %61 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %60, i64 0, i32 2 - %62 = load i64*, i64** %61, align 8, !tbaa !48 - %63 = getelementptr inbounds i64, i64* %62, i64 1 - %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !59 - store i64* %64, i64** %57, align 8, !dbg !59, !tbaa !28 - %65 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !60 - %66 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !60, !tbaa !61 - %needTakeSlowPath = icmp ne i64 %65, %66, !dbg !60 - br i1 %needTakeSlowPath, label %67, label %68, !dbg !60, !prof !62 - -67: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !60 - br label %68, !dbg !60 - -68: ; preds = %entry, %67 - %69 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !60 - %70 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !60 - %71 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !60, !tbaa !61 - %guardUpdated = icmp eq i64 %70, %71, !dbg !60 - call void @llvm.assume(i1 %guardUpdated), !dbg !60 - %72 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !60, !tbaa !28 - %73 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %72, i64 0, i32 2, !dbg !60 - %74 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %73, align 8, !dbg !60, !tbaa !40 - %75 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %74, i64 0, i32 1, !dbg !60 - %76 = load i64*, i64** %75, align 8, !dbg !60, !tbaa !63 - %77 = getelementptr inbounds i64, i64* %76, i64 1, !dbg !60 - store i64 %47, i64* %76, align 8, !dbg !60, !tbaa !4 - %78 = getelementptr inbounds i64, i64* %77, i64 1, !dbg !60 - store i64* %78, i64** %75, align 8, !dbg !60, !tbaa !63 - store i64 %69, i64* %77, align 8, !dbg !60, !tbaa !4 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #17, !dbg !60 - %79 = getelementptr inbounds i64, i64* %62, i64 3, !dbg !60 - %80 = getelementptr inbounds i64, i64* %79, i64 1, !dbg !60 - store i64* %80, i64** %57, align 8, !dbg !60, !tbaa !28 + %42 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !28 + %43 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %42, i64 0, i32 2 + %44 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %43, align 8, !tbaa !40 + %45 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %45, align 8, !tbaa !43 + %46 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 4 + %47 = load i64*, i64** %46, align 8, !tbaa !45 + %48 = load i64, i64* %47, align 8, !tbaa !4 + %49 = and i64 %48, -33 + store i64 %49, i64* %47, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %42, %struct.rb_control_frame_struct* align 8 %44, %struct.rb_iseq_struct* %stackFrame.i.i1) #17 + %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %44, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %50, align 8, !dbg !48, !tbaa !28 + %51 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !49 + %52 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !49, !tbaa !50 + %needTakeSlowPath = icmp ne i64 %51, %52, !dbg !49 + br i1 %needTakeSlowPath, label %53, label %54, !dbg !49, !prof !51 + +53: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !49 + br label %54, !dbg !49 + +54: ; preds = %entry, %53 + %55 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !49 + %56 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !49 + %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !49, !tbaa !50 + %guardUpdated = icmp eq i64 %56, %57, !dbg !49 + call void @llvm.assume(i1 %guardUpdated), !dbg !49 + %58 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !49, !tbaa !28 + %59 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %58, i64 0, i32 2, !dbg !49 + %60 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %59, align 8, !dbg !49, !tbaa !40 + %61 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %60, i64 0, i32 1, !dbg !49 + %62 = load i64*, i64** %61, align 8, !dbg !49, !tbaa !52 + %63 = getelementptr inbounds i64, i64* %62, i64 1, !dbg !49 + store i64 %40, i64* %62, align 8, !dbg !49, !tbaa !4 + %64 = getelementptr inbounds i64, i64* %63, i64 1, !dbg !49 + store i64* %64, i64** %61, align 8, !dbg !49, !tbaa !52 + store i64 %55, i64* %63, align 8, !dbg !49, !tbaa !4 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #17, !dbg !49 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %50, align 8, !dbg !49, !tbaa !28 %rubyId_initialize.i.i2 = load i64, i64* @rubyIdPrecomputed_initialize, align 8, !dbg !8 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_initialize.i.i2) #17, !dbg !8 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym37.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #17, !dbg !8 - %81 = load i64, i64* @guard_epoch_AttrReaderNoSig, align 8, !dbg !8 - %82 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !61 - %needTakeSlowPath3 = icmp ne i64 %81, %82, !dbg !8 - br i1 %needTakeSlowPath3, label %83, label %84, !dbg !8, !prof !62 + %65 = load i64, i64* @guard_epoch_AttrReaderNoSig, align 8, !dbg !8 + %66 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !50 + %needTakeSlowPath3 = icmp ne i64 %65, %66, !dbg !8 + br i1 %needTakeSlowPath3, label %67, label %68, !dbg !8, !prof !51 -83: ; preds = %68 +67: ; preds = %54 call void @const_recompute_AttrReaderNoSig(), !dbg !8 - br label %84, !dbg !8 + br label %68, !dbg !8 -84: ; preds = %68, %83 - %85 = load i64, i64* @guarded_const_AttrReaderNoSig, align 8, !dbg !8 - %86 = load i64, i64* @guard_epoch_AttrReaderNoSig, align 8, !dbg !8 - %87 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !61 - %guardUpdated4 = icmp eq i64 %86, %87, !dbg !8 +68: ; preds = %54, %67 + %69 = load i64, i64* @guarded_const_AttrReaderNoSig, align 8, !dbg !8 + %70 = load i64, i64* @guard_epoch_AttrReaderNoSig, align 8, !dbg !8 + %71 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !50 + %guardUpdated4 = icmp eq i64 %70, %71, !dbg !8 call void @llvm.assume(i1 %guardUpdated4), !dbg !8 %stackFrame39.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderNoSig#initialize", align 8, !dbg !8 - %88 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !8 - %89 = bitcast i8* %88 to i16*, !dbg !8 - %90 = load i16, i16* %89, align 8, !dbg !8 - %91 = and i16 %90, -384, !dbg !8 - %92 = or i16 %91, 1, !dbg !8 - store i16 %92, i16* %89, align 8, !dbg !8 - %93 = getelementptr inbounds i8, i8* %88, i64 8, !dbg !8 - %94 = bitcast i8* %93 to i32*, !dbg !8 - store i32 1, i32* %94, align 8, !dbg !8, !tbaa !64 - %95 = getelementptr inbounds i8, i8* %88, i64 12, !dbg !8 - %96 = getelementptr inbounds i8, i8* %88, i64 4, !dbg !8 - %97 = bitcast i8* %96 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %95, i8 0, i64 20, i1 false) #17, !dbg !8 - store i32 1, i32* %97, align 4, !dbg !8, !tbaa !66 + %72 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !8 + %73 = bitcast i8* %72 to i16*, !dbg !8 + %74 = load i16, i16* %73, align 8, !dbg !8 + %75 = and i16 %74, -384, !dbg !8 + %76 = or i16 %75, 1, !dbg !8 + store i16 %76, i16* %73, align 8, !dbg !8 + %77 = getelementptr inbounds i8, i8* %72, i64 8, !dbg !8 + %78 = bitcast i8* %77 to i32*, !dbg !8 + store i32 1, i32* %78, align 8, !dbg !8, !tbaa !53 + %79 = getelementptr inbounds i8, i8* %72, i64 12, !dbg !8 + %80 = getelementptr inbounds i8, i8* %72, i64 4, !dbg !8 + %81 = bitcast i8* %80 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %79, i8 0, i64 20, i1 false) #17, !dbg !8 + store i32 1, i32* %81, align 4, !dbg !8, !tbaa !56 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !8 store i64 %rubyId_foo.i.i, i64* %positional_table.i.i, align 8, !dbg !8 - %98 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %98, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %48, i64 noundef 8, i1 noundef false) #17, !dbg !8 - %99 = getelementptr inbounds i8, i8* %88, i64 32, !dbg !8 - %100 = bitcast i8* %99 to i8**, !dbg !8 - store i8* %98, i8** %100, align 8, !dbg !8, !tbaa !67 - %101 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_initialize, i64 0, i64 0)) #17, !dbg !8 - %102 = bitcast i8* %88 to %struct.rb_sorbet_param_struct*, !dbg !8 - %103 = bitcast %struct.rb_iseq_struct* %stackFrame39.i.i to i8*, !dbg !8 - call void @rb_add_method_sorbet(i64 %85, i64 %101, i64 (i32, i64*, i64)* noundef @"func_AttrReaderNoSig#initialize", %struct.rb_sorbet_param_struct* nonnull %102, i32 noundef 1, i8* %103) #17, !dbg !8 - %104 = getelementptr inbounds i64, i64* %62, i64 8, !dbg !8 - %105 = getelementptr inbounds i64, i64* %104, i64 1, !dbg !8 - store i64* %105, i64** %57, align 8, !dbg !8, !tbaa !28 - %rubyId_foo47.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !68 - %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_foo47.i.i) #17, !dbg !68 - %rubyId_attr_reader.i.i = load i64, i64* @rubyIdPrecomputed_attr_reader, align 8, !dbg !68 - %rawSym49.i.i = call i64 @rb_id2sym(i64 %rubyId_attr_reader.i.i) #17, !dbg !68 - %106 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !68 - %107 = call i64 @rb_id2str(i64 %106) #17, !dbg !68 - %108 = call i64 (i8*, ...) @rb_sprintf(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0), i64 %107) #17, !dbg !68 - %109 = call i64 @rb_intern_str(i64 %108) #17, !dbg !68 - %110 = inttoptr i64 %109 to i8*, !dbg !68 - call void @rb_add_method(i64 %85, i64 %106, i32 noundef 4, i8* %110, i32 noundef 1) #17, !dbg !68 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %48) #17 - call void @sorbet_popRubyStack() #17, !dbg !58 - %111 = getelementptr inbounds i64, i64* %43, i64 15, !dbg !58 - %112 = getelementptr inbounds i64, i64* %111, i64 1, !dbg !58 - store i64* %112, i64** %38, align 8, !dbg !58, !tbaa !28 - %113 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !28 - %114 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %113, i64 0, i32 2, !dbg !17 - %115 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %114, align 8, !dbg !17, !tbaa !40 - %116 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %115, i64 0, i32 1, !dbg !17 - %117 = load i64*, i64** %116, align 8, !dbg !17, !tbaa !63 - %118 = getelementptr inbounds i64, i64* %117, i64 1, !dbg !17 - store i64 %85, i64* %117, align 8, !dbg !17, !tbaa !4 - %119 = getelementptr inbounds i64, i64* %118, i64 1, !dbg !17 - store i64* %119, i64** %116, align 8, !dbg !17, !tbaa !63 - store i64 2497, i64* %118, align 8, !dbg !17, !tbaa !4 + %82 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %82, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %41, i64 noundef 8, i1 noundef false) #17, !dbg !8 + %83 = getelementptr inbounds i8, i8* %72, i64 32, !dbg !8 + %84 = bitcast i8* %83 to i8**, !dbg !8 + store i8* %82, i8** %84, align 8, !dbg !8, !tbaa !57 + %85 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_initialize, i64 0, i64 0)) #17, !dbg !8 + %86 = bitcast i8* %72 to %struct.rb_sorbet_param_struct*, !dbg !8 + %87 = bitcast %struct.rb_iseq_struct* %stackFrame39.i.i to i8*, !dbg !8 + call void @rb_add_method_sorbet(i64 %69, i64 %85, i64 (i32, i64*, i64)* noundef @"func_AttrReaderNoSig#initialize", %struct.rb_sorbet_param_struct* nonnull %86, i32 noundef 1, i8* %87) #17, !dbg !8 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %50, align 8, !dbg !8, !tbaa !28 + %rubyId_foo47.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !58 + %rawSym48.i.i = call i64 @rb_id2sym(i64 %rubyId_foo47.i.i) #17, !dbg !58 + %rubyId_attr_reader.i.i = load i64, i64* @rubyIdPrecomputed_attr_reader, align 8, !dbg !58 + %rawSym49.i.i = call i64 @rb_id2sym(i64 %rubyId_attr_reader.i.i) #17, !dbg !58 + %88 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !58 + %89 = call i64 @rb_id2str(i64 %88) #17, !dbg !58 + %90 = call i64 (i8*, ...) @rb_sprintf(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0), i64 %89) #17, !dbg !58 + %91 = call i64 @rb_intern_str(i64 %90) #17, !dbg !58 + %92 = inttoptr i64 %91 to i8*, !dbg !58 + call void @rb_add_method(i64 %69, i64 %88, i32 noundef 4, i8* %92, i32 noundef 1) #17, !dbg !58 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %41) #17 + call void @sorbet_popRubyStack() #17, !dbg !47 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %38, align 8, !dbg !47, !tbaa !28 + %93 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !28 + %94 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %93, i64 0, i32 2, !dbg !17 + %95 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %94, align 8, !dbg !17, !tbaa !40 + %96 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %95, i64 0, i32 1, !dbg !17 + %97 = load i64*, i64** %96, align 8, !dbg !17, !tbaa !52 + %98 = getelementptr inbounds i64, i64* %97, i64 1, !dbg !17 + store i64 %69, i64* %97, align 8, !dbg !17, !tbaa !4 + %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !17 + store i64* %99, i64** %96, align 8, !dbg !17, !tbaa !52 + store i64 2497, i64* %98, align 8, !dbg !17, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #17, !dbg !17 - %120 = getelementptr inbounds i64, i64* %43, i64 17, !dbg !17 - %121 = getelementptr inbounds i64, i64* %120, i64 1, !dbg !17 - store i64* %121, i64** %38, align 8, !dbg !17, !tbaa !28 - %122 = getelementptr inbounds i64, i64* %43, i64 18 - %123 = getelementptr inbounds i64, i64* %122, i64 1 - %124 = getelementptr inbounds i64, i64* %43, i64 20 - %125 = getelementptr inbounds i64, i64* %124, i64 1 - %126 = getelementptr inbounds i64, i64* %43, i64 22 - %127 = getelementptr inbounds i64, i64* %126, i64 1 - br label %BB2.i, !dbg !69 - -BB2.i: ; preds = %BB2.i.backedge, %84 - %i.sroa.0.0.i = phi i64 [ 1, %84 ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !57 - store i64* %123, i64** %38, align 8, !tbaa !28 - %128 = and i64 %i.sroa.0.0.i, 1, !dbg !18 - %129 = icmp eq i64 %128, 0, !dbg !18 - br i1 %129, label %130, label %157, !dbg !18, !prof !70 - -130: ; preds = %BB2.i - %131 = and i64 %i.sroa.0.0.i, 7, !dbg !18 - %132 = icmp ne i64 %131, 0, !dbg !18 - %133 = and i64 %i.sroa.0.0.i, -9, !dbg !18 - %134 = icmp eq i64 %133, 0, !dbg !18 - %135 = or i1 %132, %134, !dbg !18 - br i1 %135, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !18, !prof !71 - -sorbet_isa_Integer.exit.i: ; preds = %130 - %136 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !18 - %137 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %136, i64 0, i32 0, !dbg !18 - %138 = load i64, i64* %137, align 8, !dbg !18, !tbaa !72 - %139 = and i64 %138, 31, !dbg !18 - %140 = icmp eq i64 %139, 10, !dbg !18 - br i1 %140, label %161, label %"alternativeCallIntrinsic_Integer_<.i", !dbg !18, !prof !74 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %38, align 8, !dbg !17, !tbaa !28 + br label %BB2.i, !dbg !59 + +BB2.i: ; preds = %BB2.i.backedge, %68 + %i.sroa.0.0.i = phi i64 [ 1, %68 ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !46 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %38, align 8, !tbaa !28 + %100 = and i64 %i.sroa.0.0.i, 1, !dbg !18 + %101 = icmp eq i64 %100, 0, !dbg !18 + br i1 %101, label %102, label %129, !dbg !18, !prof !60 + +102: ; preds = %BB2.i + %103 = and i64 %i.sroa.0.0.i, 7, !dbg !18 + %104 = icmp ne i64 %103, 0, !dbg !18 + %105 = and i64 %i.sroa.0.0.i, -9, !dbg !18 + %106 = icmp eq i64 %105, 0, !dbg !18 + %107 = or i1 %104, %106, !dbg !18 + br i1 %107, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !18, !prof !61 + +sorbet_isa_Integer.exit.i: ; preds = %102 + %108 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !18 + %109 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %108, i64 0, i32 0, !dbg !18 + %110 = load i64, i64* %109, align 8, !dbg !18, !tbaa !62 + %111 = and i64 %110, 31, !dbg !18 + %112 = icmp eq i64 %111, 10, !dbg !18 + br i1 %112, label %133, label %"alternativeCallIntrinsic_Integer_<.i", !dbg !18, !prof !64 BB5.i: ; preds = %afterSend33.i - store i64* %125, i64** %38, align 8, !tbaa !28 - %141 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !28 - %142 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %141, i64 0, i32 2, !dbg !19 - %143 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %142, align 8, !dbg !19, !tbaa !40 - %144 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %143, i64 0, i32 1, !dbg !19 - %145 = load i64*, i64** %144, align 8, !dbg !19, !tbaa !63 - %146 = getelementptr inbounds i64, i64* %145, i64 1, !dbg !19 - store i64* %146, i64** %144, align 8, !dbg !19, !tbaa !63 - store i64 %send.i, i64* %145, align 8, !dbg !19, !tbaa !4 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 21), i64** %38, align 8, !tbaa !28 + %113 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !28 + %114 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %113, i64 0, i32 2, !dbg !19 + %115 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %114, align 8, !dbg !19, !tbaa !40 + %116 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %115, i64 0, i32 1, !dbg !19 + %117 = load i64*, i64** %116, align 8, !dbg !19, !tbaa !52 + %118 = getelementptr inbounds i64, i64* %117, i64 1, !dbg !19 + store i64* %118, i64** %116, align 8, !dbg !19, !tbaa !52 + store i64 %send.i, i64* %117, align 8, !dbg !19, !tbaa !4 %send47.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #17, !dbg !19 - store i64* %127, i64** %38, align 8, !dbg !19, !tbaa !28 - br i1 %147, label %"fastSymCallIntrinsic_Integer_+.i", label %"alternativeCallIntrinsic_Integer_+.i", !dbg !20 - -afterSend33.i: ; preds = %161, %157, %"alternativeCallIntrinsic_Integer_<.i" - %147 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %157 ], [ true, %161 ] - %"symIntrinsicRawPhi_<.i" = phi i64 [ %send41.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %160, %157 ], [ %162, %161 ], !dbg !18 - %148 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !18 - %149 = icmp ne i64 %148, 0, !dbg !18 - br i1 %149, label %BB5.i, label %"func_.$152.exit", !dbg !18 - -"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %130 - %150 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !28 - %151 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %150, i64 0, i32 2, !dbg !18 - %152 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %151, align 8, !dbg !18, !tbaa !40 - %153 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %152, i64 0, i32 1, !dbg !18 - %154 = load i64*, i64** %153, align 8, !dbg !18, !tbaa !63 - %155 = getelementptr inbounds i64, i64* %154, i64 1, !dbg !18 - store i64 %i.sroa.0.0.i, i64* %154, align 8, !dbg !18, !tbaa !4 - %156 = getelementptr inbounds i64, i64* %155, i64 1, !dbg !18 - store i64* %156, i64** %153, align 8, !dbg !18, !tbaa !63 - store i64 20000001, i64* %155, align 8, !dbg !18, !tbaa !4 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 23), i64** %38, align 8, !dbg !19, !tbaa !28 + br i1 %119, label %"fastSymCallIntrinsic_Integer_+.i", label %"alternativeCallIntrinsic_Integer_+.i", !dbg !20 + +afterSend33.i: ; preds = %133, %129, %"alternativeCallIntrinsic_Integer_<.i" + %119 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %129 ], [ true, %133 ] + %"symIntrinsicRawPhi_<.i" = phi i64 [ %send41.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %132, %129 ], [ %134, %133 ], !dbg !18 + %120 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !18 + %121 = icmp ne i64 %120, 0, !dbg !18 + br i1 %121, label %BB5.i, label %"func_.$152.exit", !dbg !18 + +"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %102 + %122 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !28 + %123 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %122, i64 0, i32 2, !dbg !18 + %124 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %123, align 8, !dbg !18, !tbaa !40 + %125 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %124, i64 0, i32 1, !dbg !18 + %126 = load i64*, i64** %125, align 8, !dbg !18, !tbaa !52 + %127 = getelementptr inbounds i64, i64* %126, i64 1, !dbg !18 + store i64 %i.sroa.0.0.i, i64* %126, align 8, !dbg !18, !tbaa !4 + %128 = getelementptr inbounds i64, i64* %127, i64 1, !dbg !18 + store i64* %128, i64** %125, align 8, !dbg !18, !tbaa !52 + store i64 20000001, i64* %127, align 8, !dbg !18, !tbaa !4 %send41.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 0) #17, !dbg !18 br label %afterSend33.i, !dbg !18 -157: ; preds = %BB2.i - call void @llvm.experimental.noalias.scope.decl(metadata !75) #17, !dbg !18 - %158 = ashr i64 %i.sroa.0.0.i, 1, !dbg !18 - %159 = icmp slt i64 %158, 10000000, !dbg !18 - %160 = select i1 %159, i64 20, i64 0, !dbg !18 +129: ; preds = %BB2.i + call void @llvm.experimental.noalias.scope.decl(metadata !65) #17, !dbg !18 + %130 = ashr i64 %i.sroa.0.0.i, 1, !dbg !18 + %131 = icmp slt i64 %130, 10000000, !dbg !18 + %132 = select i1 %131, i64 20, i64 0, !dbg !18 br label %afterSend33.i, !dbg !18 -161: ; preds = %sorbet_isa_Integer.exit.i - call void @llvm.experimental.noalias.scope.decl(metadata !78) #17, !dbg !18 - %162 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 noundef 20000001) #17, !dbg !18, !noalias !75 +133: ; preds = %sorbet_isa_Integer.exit.i + call void @llvm.experimental.noalias.scope.decl(metadata !68) #17, !dbg !18 + %134 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 noundef 20000001) #17, !dbg !18, !noalias !65 br label %afterSend33.i, !dbg !18 "alternativeCallIntrinsic_Integer_+.i": ; preds = %BB5.i - %163 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !28 - %164 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %163, i64 0, i32 2, !dbg !20 - %165 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %164, align 8, !dbg !20, !tbaa !40 - %166 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %165, i64 0, i32 1, !dbg !20 - %167 = load i64*, i64** %166, align 8, !dbg !20, !tbaa !63 - %168 = getelementptr inbounds i64, i64* %167, i64 1, !dbg !20 - store i64 %i.sroa.0.0.i, i64* %167, align 8, !dbg !20, !tbaa !4 - %169 = getelementptr inbounds i64, i64* %168, i64 1, !dbg !20 - store i64* %169, i64** %166, align 8, !dbg !20, !tbaa !63 - store i64 3, i64* %168, align 8, !dbg !20, !tbaa !4 + %135 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !28 + %136 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %135, i64 0, i32 2, !dbg !20 + %137 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %136, align 8, !dbg !20, !tbaa !40 + %138 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %137, i64 0, i32 1, !dbg !20 + %139 = load i64*, i64** %138, align 8, !dbg !20, !tbaa !52 + %140 = getelementptr inbounds i64, i64* %139, i64 1, !dbg !20 + store i64 %i.sroa.0.0.i, i64* %139, align 8, !dbg !20, !tbaa !4 + %141 = getelementptr inbounds i64, i64* %140, i64 1, !dbg !20 + store i64* %141, i64** %138, align 8, !dbg !20, !tbaa !52 + store i64 3, i64* %140, align 8, !dbg !20, !tbaa !4 %send60.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0) #17, !dbg !20 br label %BB2.i.backedge, !dbg !20 "fastSymCallIntrinsic_Integer_+.i": ; preds = %BB5.i - call void @llvm.experimental.noalias.scope.decl(metadata !80) #17, !dbg !20 - br i1 %129, label %178, label %170, !dbg !20, !prof !83 - -170: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %171 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 noundef 2) #18, !dbg !20 - %172 = extractvalue { i64, i1 } %171, 1, !dbg !20 - %173 = extractvalue { i64, i1 } %171, 0, !dbg !20 - br i1 %172, label %174, label %BB2.i.backedge, !dbg !20 - -174: ; preds = %170 - %175 = ashr i64 %173, 1, !dbg !20 - %176 = xor i64 %175, -9223372036854775808, !dbg !20 - %177 = call i64 @rb_int2big(i64 %176) #17, !dbg !20 + call void @llvm.experimental.noalias.scope.decl(metadata !70) #17, !dbg !20 + br i1 %101, label %150, label %142, !dbg !20, !prof !73 + +142: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %143 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 noundef 2) #18, !dbg !20 + %144 = extractvalue { i64, i1 } %143, 1, !dbg !20 + %145 = extractvalue { i64, i1 } %143, 0, !dbg !20 + br i1 %144, label %146, label %BB2.i.backedge, !dbg !20 + +146: ; preds = %142 + %147 = ashr i64 %145, 1, !dbg !20 + %148 = xor i64 %147, -9223372036854775808, !dbg !20 + %149 = call i64 @rb_int2big(i64 %148) #17, !dbg !20 br label %BB2.i.backedge, !dbg !20 -178: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %179 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 noundef 3) #17, !dbg !20, !noalias !80 +150: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %151 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 noundef 3) #17, !dbg !20, !noalias !70 br label %BB2.i.backedge, !dbg !20 -BB2.i.backedge: ; preds = %178, %174, %170, %"alternativeCallIntrinsic_Integer_+.i" - %i.sroa.0.0.i.be = phi i64 [ %send60.i, %"alternativeCallIntrinsic_Integer_+.i" ], [ %179, %178 ], [ %177, %174 ], [ %173, %170 ] +BB2.i.backedge: ; preds = %150, %146, %142, %"alternativeCallIntrinsic_Integer_+.i" + %i.sroa.0.0.i.be = phi i64 [ %send60.i, %"alternativeCallIntrinsic_Integer_+.i" ], [ %151, %150 ], [ %149, %146 ], [ %145, %142 ] br label %BB2.i "func_.$152.exit": ; preds = %afterSend33.i - %i.sroa.0.0.i.lcssa = phi i64 [ %i.sroa.0.0.i, %afterSend33.i ], !dbg !57 - %180 = getelementptr inbounds i64, i64* %43, i64 25 - %181 = getelementptr inbounds i64, i64* %180, i64 1 - store i64* %181, i64** %38, align 8, !tbaa !28 - %182 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !28 - %183 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %182, i64 0, i32 2, !dbg !21 - %184 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %183, align 8, !dbg !21, !tbaa !40 - %185 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %184, i64 0, i32 1, !dbg !21 - %186 = load i64*, i64** %185, align 8, !dbg !21, !tbaa !63 - %187 = getelementptr inbounds i64, i64* %186, i64 1, !dbg !21 - store i64 %29, i64* %186, align 8, !dbg !21, !tbaa !4 - %188 = getelementptr inbounds i64, i64* %187, i64 1, !dbg !21 - store i64* %188, i64** %185, align 8, !dbg !21, !tbaa !63 - store i64 %i.sroa.0.0.i.lcssa, i64* %187, align 8, !dbg !21, !tbaa !4 + %i.sroa.0.0.i.lcssa = phi i64 [ %i.sroa.0.0.i, %afterSend33.i ], !dbg !46 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 26), i64** %38, align 8, !tbaa !28 + %152 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !28 + %153 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %152, i64 0, i32 2, !dbg !21 + %154 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %153, align 8, !dbg !21, !tbaa !40 + %155 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %154, i64 0, i32 1, !dbg !21 + %156 = load i64*, i64** %155, align 8, !dbg !21, !tbaa !52 + %157 = getelementptr inbounds i64, i64* %156, i64 1, !dbg !21 + store i64 %29, i64* %156, align 8, !dbg !21, !tbaa !4 + %158 = getelementptr inbounds i64, i64* %157, i64 1, !dbg !21 + store i64* %158, i64** %155, align 8, !dbg !21, !tbaa !52 + store i64 %i.sroa.0.0.i.lcssa, i64* %157, align 8, !dbg !21, !tbaa !4 %send66.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #17, !dbg !21 - %189 = getelementptr inbounds i64, i64* %43, i64 26, !dbg !21 - %190 = getelementptr inbounds i64, i64* %189, i64 1, !dbg !21 - store i64* %190, i64** %38, align 8, !dbg !21, !tbaa !28 - %191 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !28 - %192 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %191, i64 0, i32 2, !dbg !22 - %193 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %192, align 8, !dbg !22, !tbaa !40 - %194 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %193, i64 0, i32 1, !dbg !22 - %195 = load i64*, i64** %194, align 8, !dbg !22, !tbaa !63 - %196 = getelementptr inbounds i64, i64* %195, i64 1, !dbg !22 - store i64* %196, i64** %194, align 8, !dbg !22, !tbaa !63 - store i64 %send.i, i64* %195, align 8, !dbg !22, !tbaa !4 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %38, align 8, !dbg !21, !tbaa !28 + %159 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !28 + %160 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %159, i64 0, i32 2, !dbg !22 + %161 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %160, align 8, !dbg !22, !tbaa !40 + %162 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %161, i64 0, i32 1, !dbg !22 + %163 = load i64*, i64** %162, align 8, !dbg !22, !tbaa !52 + %164 = getelementptr inbounds i64, i64* %163, i64 1, !dbg !22 + store i64* %164, i64** %162, align 8, !dbg !22, !tbaa !52 + store i64 %send.i, i64* %163, align 8, !dbg !22, !tbaa !4 %send72.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 0) #17, !dbg !22 - %197 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !28 - %198 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %197, i64 0, i32 2, !dbg !23 - %199 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %198, align 8, !dbg !23, !tbaa !40 - %200 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %199, i64 0, i32 1, !dbg !23 - %201 = load i64*, i64** %200, align 8, !dbg !23, !tbaa !63 - %202 = getelementptr inbounds i64, i64* %201, i64 1, !dbg !23 - store i64 %29, i64* %201, align 8, !dbg !23, !tbaa !4 - %203 = getelementptr inbounds i64, i64* %202, i64 1, !dbg !23 - store i64* %203, i64** %200, align 8, !dbg !23, !tbaa !63 - store i64 %send72.i, i64* %202, align 8, !dbg !23, !tbaa !4 + %165 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !28 + %166 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %165, i64 0, i32 2, !dbg !23 + %167 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %166, align 8, !dbg !23, !tbaa !40 + %168 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %167, i64 0, i32 1, !dbg !23 + %169 = load i64*, i64** %168, align 8, !dbg !23, !tbaa !52 + %170 = getelementptr inbounds i64, i64* %169, i64 1, !dbg !23 + store i64 %29, i64* %169, align 8, !dbg !23, !tbaa !4 + %171 = getelementptr inbounds i64, i64* %170, i64 1, !dbg !23 + store i64* %171, i64** %168, align 8, !dbg !23, !tbaa !52 + store i64 %send72.i, i64* %170, align 8, !dbg !23, !tbaa !4 %send79.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0) #17, !dbg !23 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_AttrReaderNoSig#initialize"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !84 { +define i64 @"func_AttrReaderNoSig#initialize"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !74 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !28 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !40 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !43 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !46 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !48 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !28 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !85 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !85 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !85 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !85, !prof !83 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !tbaa !28 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !75 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !75 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !75 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !75, !prof !73 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !85 - unreachable, !dbg !85 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !75 + unreachable, !dbg !75 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_foo = load i64, i64* %argArray, align 8, !dbg !85 - %11 = and i64 %rawArg_foo, 1, !dbg !86 - %12 = icmp eq i64 %11, 0, !dbg !86 - br i1 %12, label %13, label %typeTestSuccess, !dbg !86, !prof !70 - -13: ; preds = %fillRequiredArgs - %14 = and i64 %rawArg_foo, 7, !dbg !86 - %15 = icmp ne i64 %14, 0, !dbg !86 - %16 = and i64 %rawArg_foo, -9, !dbg !86 - %17 = icmp eq i64 %16, 0, !dbg !86 - %18 = or i1 %15, %17, !dbg !86 - br i1 %18, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !86, !prof !71 - -sorbet_isa_Integer.exit: ; preds = %13 - %19 = inttoptr i64 %rawArg_foo to %struct.iseq_inline_iv_cache_entry*, !dbg !86 - %20 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %19, i64 0, i32 0, !dbg !86 - %21 = load i64, i64* %20, align 8, !dbg !86, !tbaa !72 - %22 = and i64 %21, 31, !dbg !86 - %23 = icmp eq i64 %22, 10, !dbg !86 - br i1 %23, label %typeTestSuccess, label %codeRepl, !dbg !86, !prof !74 + %rawArg_foo = load i64, i64* %argArray, align 8, !dbg !75 + %4 = and i64 %rawArg_foo, 1, !dbg !76 + %5 = icmp eq i64 %4, 0, !dbg !76 + br i1 %5, label %6, label %typeTestSuccess, !dbg !76, !prof !60 + +6: ; preds = %fillRequiredArgs + %7 = and i64 %rawArg_foo, 7, !dbg !76 + %8 = icmp ne i64 %7, 0, !dbg !76 + %9 = and i64 %rawArg_foo, -9, !dbg !76 + %10 = icmp eq i64 %9, 0, !dbg !76 + %11 = or i1 %8, %10, !dbg !76 + br i1 %11, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !76, !prof !61 + +sorbet_isa_Integer.exit: ; preds = %6 + %12 = inttoptr i64 %rawArg_foo to %struct.iseq_inline_iv_cache_entry*, !dbg !76 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !76 + %14 = load i64, i64* %13, align 8, !dbg !76, !tbaa !62 + %15 = and i64 %14, 31, !dbg !76 + %16 = icmp eq i64 %15, 10, !dbg !76 + br i1 %16, label %typeTestSuccess, label %codeRepl, !dbg !76, !prof !64 typeTestSuccess: ; preds = %fillRequiredArgs, %sorbet_isa_Integer.exit - %24 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !86 - store i64* %24, i64** %3, align 8, !dbg !86, !tbaa !28 - %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !87 - tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@foo", i64 %rawArg_foo, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo") #17, !dbg !87 - %"rubyId_@foo13" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !88 - %25 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@foo13", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo.3") #17, !dbg !88 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !76, !tbaa !28 + %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !77 + tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@foo", i64 %rawArg_foo, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo") #17, !dbg !77 + %"rubyId_@foo13" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !78 + %17 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@foo13", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo.3") #17, !dbg !78 %"" = load i64, i64* @"", align 8 ret i64 %"" -codeRepl: ; preds = %sorbet_isa_Integer.exit, %13 - tail call fastcc void @"func_AttrReaderNoSig#initialize.cold.1"(i64 %rawArg_foo) #19, !dbg !86 +codeRepl: ; preds = %sorbet_isa_Integer.exit, %6 + tail call fastcc void @"func_AttrReaderNoSig#initialize.cold.1"(i64 %rawArg_foo) #19, !dbg !76 unreachable } @@ -728,10 +696,10 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #6 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #6 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_AttrReaderNoSig#initialize.cold.1"(i64 %rawArg_foo) unnamed_addr #12 !dbg !89 { +define internal fastcc void @"func_AttrReaderNoSig#initialize.cold.1"(i64 %rawArg_foo) unnamed_addr #12 !dbg !79 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_foo, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !91 - unreachable, !dbg !91 + tail call void @sorbet_cast_failure(i64 %rawArg_foo, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !81 + unreachable, !dbg !81 } ; Function Attrs: nofree nosync nounwind willreturn @@ -741,7 +709,7 @@ declare void @llvm.assume(i1 noundef) #13 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #14 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !61 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !50 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -750,7 +718,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #14 { define linkonce void @const_recompute_AttrReaderNoSig() local_unnamed_addr #14 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @str_AttrReaderNoSig, i64 0, i64 0), i64 15) store i64 %1, i64* @guarded_const_AttrReaderNoSig, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !61 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !50 store i64 %2, i64* @guard_epoch_AttrReaderNoSig, align 8 ret void } @@ -825,49 +793,39 @@ attributes #19 = { noinline } !43 = !{!44, !29, i64 16} !44 = !{!"rb_control_frame_struct", !29, i64 0, !29, i64 8, !29, i64 16, !5, i64 24, !29, i64 32, !29, i64 40, !29, i64 48} !45 = !{!44, !29, i64 32} -!46 = !{!47, !29, i64 16} -!47 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !29, i64 16, !6, i64 24} -!48 = !{!49, !29, i64 8} -!49 = !{!"rb_iseq_constant_body", !6, i64 0, !35, i64 4, !29, i64 8, !50, i64 16, !52, i64 64, !55, i64 120, !29, i64 152, !29, i64 160, !29, i64 168, !29, i64 176, !29, i64 184, !29, i64 192, !56, i64 200, !35, i64 232, !35, i64 236, !35, i64 240, !35, i64 244, !35, i64 248, !6, i64 252, !5, i64 256} -!50 = !{!"", !51, i64 0, !35, i64 4, !35, i64 8, !35, i64 12, !35, i64 16, !35, i64 20, !35, i64 24, !35, i64 28, !29, i64 32, !29, i64 40} -!51 = !{!"", !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 1, !35, i64 1} -!52 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !35, i64 32, !53, i64 36} -!53 = !{!"rb_code_location_struct", !54, i64 0, !54, i64 8} -!54 = !{!"rb_code_position_struct", !35, i64 0, !35, i64 4} -!55 = !{!"iseq_insn_info", !29, i64 0, !29, i64 8, !35, i64 16, !29, i64 24} -!56 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !29, i64 24} -!57 = !DILocation(line: 0, scope: !14) -!58 = !DILocation(line: 5, column: 1, scope: !14) -!59 = !DILocation(line: 7, column: 3, scope: !9, inlinedAt: !13) -!60 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) -!61 = !{!36, !36, i64 0} -!62 = !{!"branch_weights", i32 1, i32 10000} -!63 = !{!44, !29, i64 8} -!64 = !{!65, !35, i64 8} -!65 = !{!"rb_sorbet_param_struct", !51, i64 0, !35, i64 4, !35, i64 8, !35, i64 12, !35, i64 16, !35, i64 20, !35, i64 24, !35, i64 28, !29, i64 32, !35, i64 40, !35, i64 44, !35, i64 48, !35, i64 52, !29, i64 56} -!66 = !{!65, !35, i64 4} -!67 = !{!65, !29, i64 32} -!68 = !DILocation(line: 13, column: 3, scope: !9, inlinedAt: !13) -!69 = !DILocation(line: 18, column: 5, scope: !14) -!70 = !{!"branch_weights", i32 1, i32 2000} -!71 = !{!"branch_weights", i32 1073205, i32 2146410443} -!72 = !{!73, !5, i64 0} -!73 = !{!"RBasic", !5, i64 0, !5, i64 8} -!74 = !{!"branch_weights", i32 2000, i32 1} -!75 = !{!76} -!76 = distinct !{!76, !77, !"sorbet_rb_int_lt: argument 0"} -!77 = distinct !{!77, !"sorbet_rb_int_lt"} -!78 = !{!79} -!79 = distinct !{!79, !77, !"sorbet_rb_int_lt: argument 0:thread"} -!80 = !{!81} -!81 = distinct !{!81, !82, !"sorbet_rb_int_plus: argument 0"} -!82 = distinct !{!82, !"sorbet_rb_int_plus"} -!83 = !{!"branch_weights", i32 4001, i32 4000000} -!84 = distinct !DISubprogram(name: "AttrReaderNoSig#initialize", linkageName: "func_AttrReaderNoSig#initialize", scope: null, file: !2, line: 8, type: !10, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!85 = !DILocation(line: 8, column: 3, scope: !84) -!86 = !DILocation(line: 8, column: 18, scope: !84) -!87 = !DILocation(line: 9, column: 12, scope: !84) -!88 = !DILocation(line: 9, column: 5, scope: !84) -!89 = distinct !DISubprogram(name: "func_AttrReaderNoSig#initialize.cold.1", linkageName: "func_AttrReaderNoSig#initialize.cold.1", scope: null, file: !2, type: !90, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!90 = !DISubroutineType(types: !3) -!91 = !DILocation(line: 8, column: 18, scope: !89) +!46 = !DILocation(line: 0, scope: !14) +!47 = !DILocation(line: 5, column: 1, scope: !14) +!48 = !DILocation(line: 7, column: 3, scope: !9, inlinedAt: !13) +!49 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) +!50 = !{!36, !36, i64 0} +!51 = !{!"branch_weights", i32 1, i32 10000} +!52 = !{!44, !29, i64 8} +!53 = !{!54, !35, i64 8} +!54 = !{!"rb_sorbet_param_struct", !55, i64 0, !35, i64 4, !35, i64 8, !35, i64 12, !35, i64 16, !35, i64 20, !35, i64 24, !35, i64 28, !29, i64 32, !35, i64 40, !35, i64 44, !35, i64 48, !35, i64 52, !29, i64 56} +!55 = !{!"", !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 1, !35, i64 1} +!56 = !{!54, !35, i64 4} +!57 = !{!54, !29, i64 32} +!58 = !DILocation(line: 13, column: 3, scope: !9, inlinedAt: !13) +!59 = !DILocation(line: 18, column: 5, scope: !14) +!60 = !{!"branch_weights", i32 1, i32 2000} +!61 = !{!"branch_weights", i32 1073205, i32 2146410443} +!62 = !{!63, !5, i64 0} +!63 = !{!"RBasic", !5, i64 0, !5, i64 8} +!64 = !{!"branch_weights", i32 2000, i32 1} +!65 = !{!66} +!66 = distinct !{!66, !67, !"sorbet_rb_int_lt: argument 0"} +!67 = distinct !{!67, !"sorbet_rb_int_lt"} +!68 = !{!69} +!69 = distinct !{!69, !67, !"sorbet_rb_int_lt: argument 0:thread"} +!70 = !{!71} +!71 = distinct !{!71, !72, !"sorbet_rb_int_plus: argument 0"} +!72 = distinct !{!72, !"sorbet_rb_int_plus"} +!73 = !{!"branch_weights", i32 4001, i32 4000000} +!74 = distinct !DISubprogram(name: "AttrReaderNoSig#initialize", linkageName: "func_AttrReaderNoSig#initialize", scope: null, file: !2, line: 8, type: !10, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!75 = !DILocation(line: 8, column: 3, scope: !74) +!76 = !DILocation(line: 8, column: 18, scope: !74) +!77 = !DILocation(line: 9, column: 12, scope: !74) +!78 = !DILocation(line: 9, column: 5, scope: !74) +!79 = distinct !DISubprogram(name: "func_AttrReaderNoSig#initialize.cold.1", linkageName: "func_AttrReaderNoSig#initialize.cold.1", scope: null, file: !2, type: !80, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!80 = !DISubroutineType(types: !3) +!81 = !DILocation(line: 8, column: 18, scope: !79) diff --git a/test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.llo.exp b/test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.llo.exp index bacadf1dc55..2911a38994d 100644 --- a/test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.llo.exp +++ b/test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,7 +69,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } @@ -89,6 +91,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb" = private unnamed_addr constant [63 x i8] c"test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb\00", align 1 +@iseqEncodedArray = internal global [28 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_AttrReaderSigChecked = private unnamed_addr constant [21 x i8] c"AttrReaderSigChecked\00", align 1 @ic_new = internal global %struct.FunctionInlineCache zeroinitializer @rubyIdPrecomputed_new = internal unnamed_addr global i64 0, align 8 @@ -162,7 +166,9 @@ declare void @sorbet_cast_failure(i64, i8*, i8*) local_unnamed_addr #0 ; Function Attrs: noreturn declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -289,9 +295,11 @@ entry: %19 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([63 x i8], [63 x i8]* @"str_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", i64 0, i64 0), i64 noundef 62) #17 tail call void @rb_gc_register_mark_object(i64 %19) #17 store i64 %19, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 28) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %19, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 27, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 + %20 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %20, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !17 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_new, i64 %rubyId_new.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !17 @@ -311,7 +319,7 @@ entry: call void @rb_gc_register_mark_object(i64 %21) #17 %rubyId_initialize.i.i = load i64, i64* @rubyIdPrecomputed_initialize, align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i25.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 - %22 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %21, i64 %rubyId_initialize.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 8, i32 noundef 10, i64* noundef nonnull %locals.i26.i, i32 noundef 0, i32 noundef 0) + %22 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %21, i64 %rubyId_initialize.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i25.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i26.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %22, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked#initialize", align 8 %23 = call i64 @sorbet_getConstant(i8* noundef getelementptr inbounds ([30 x i8], [30 x i8]* @sorbet_getVoidSingleton.name, i64 0, i64 0), i64 noundef 30) #17 store i64 %23, i64* @"", align 8 @@ -319,7 +327,7 @@ entry: call void @rb_gc_register_mark_object(i64 %24) #17 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i27.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 - %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %24, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i27.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 13, i32 noundef 13, i64* noundef nonnull %locals.i28.i, i32 noundef 0, i32 noundef 0) + %25 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %24, i64 %rubyId_foo.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i27.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i28.i, i32 noundef 0, i32 noundef 0) store %struct.rb_iseq_struct* %25, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked#foo", align 8 %26 = bitcast i64* %locals.i32.i to i8* call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %26) @@ -328,7 +336,7 @@ entry: %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i31.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 store i64 %"rubyId_.i.i", i64* %locals.i32.i, align 8 - %27 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i30.i", i64 %"rubyId_.i29.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i31.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull align 8 %locals.i32.i, i32 noundef 1, i32 noundef 4) + %27 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i30.i", i64 %"rubyId_.i29.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i31.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i32.i, i32 noundef 1, i32 noundef 4) store %struct.rb_iseq_struct* %27, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked.", align 8 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %26) %28 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #17 @@ -337,13 +345,13 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i33.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 - %29 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %28, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i33.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %29 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %28, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i33.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %29, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked.$block_1", align 8 %stackFrame.i34.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked.", align 8 %"rubyId_block for.i35.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i36.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i37.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb", align 8 - %30 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i36.i", i64 %"rubyId_block for.i35.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i37.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i34.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %30 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i36.i", i64 %"rubyId_block for.i35.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/attr_reader/sig_checked.rb.i37.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i34.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %30, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked.$block_2", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !24 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 20, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !24 @@ -381,421 +389,374 @@ entry: store i64 %42, i64* %40, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %35, %struct.rb_control_frame_struct* align 8 %37, %struct.rb_iseq_struct* %stackFrame.i) #17 %43 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %37, i64 0, i32 0 - %44 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %38, align 8, !tbaa !46 - %45 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %44, i64 0, i32 2 - %46 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %45, align 8, !tbaa !49 - %47 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %46, i64 0, i32 2 - %48 = load i64*, i64** %47, align 8, !tbaa !51 - %49 = getelementptr inbounds i64, i64* %48, i64 4 - %50 = getelementptr inbounds i64, i64* %49, i64 1 - store i64* %50, i64** %43, align 8, !dbg !60, !tbaa !31 - %51 = load i64, i64* @rb_cObject, align 8, !dbg !61 - %52 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([21 x i8], [21 x i8]* @str_AttrReaderSigChecked, i64 0, i64 0), i64 %51) #17, !dbg !61 - call void @sorbet_pushStaticInitFrame(i64 %52) #17, !dbg !61 - %53 = bitcast i64* %positional_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %53) #17 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %43, align 8, !dbg !49, !tbaa !31 + %44 = load i64, i64* @rb_cObject, align 8, !dbg !50 + %45 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([21 x i8], [21 x i8]* @str_AttrReaderSigChecked, i64 0, i64 0), i64 %44) #17, !dbg !50 + call void @sorbet_pushStaticInitFrame(i64 %45) #17, !dbg !50 + %46 = bitcast i64* %positional_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %46) #17 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked.", align 8 - %54 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !31 - %55 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %54, i64 0, i32 2 - %56 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %55, align 8, !tbaa !43 - %57 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %56, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %57, align 8, !tbaa !46 - %58 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %56, i64 0, i32 4 - %59 = load i64*, i64** %58, align 8, !tbaa !48 - %60 = load i64, i64* %59, align 8, !tbaa !4 - %61 = and i64 %60, -33 - store i64 %61, i64* %59, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %54, %struct.rb_control_frame_struct* align 8 %56, %struct.rb_iseq_struct* %stackFrame.i.i1) #17 - %62 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %56, i64 0, i32 0 - %63 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %57, align 8, !tbaa !46 - %64 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %63, i64 0, i32 2 - %65 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %64, align 8, !tbaa !49 - %66 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %65, i64 0, i32 2 - %67 = load i64*, i64** %66, align 8, !tbaa !51 - %68 = getelementptr inbounds i64, i64* %67, i64 1 - %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !62 - store i64* %69, i64** %62, align 8, !dbg !62, !tbaa !31 - %70 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !63 - %71 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !63, !tbaa !64 - %needTakeSlowPath = icmp ne i64 %70, %71, !dbg !63 - br i1 %needTakeSlowPath, label %72, label %73, !dbg !63, !prof !65 - -72: ; preds = %entry - call void @"const_recompute_T::Sig"(), !dbg !63 - br label %73, !dbg !63 - -73: ; preds = %entry, %72 - %74 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !63 - %75 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !63 - %76 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !63, !tbaa !64 - %guardUpdated = icmp eq i64 %75, %76, !dbg !63 - call void @llvm.assume(i1 %guardUpdated), !dbg !63 - %77 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !63, !tbaa !31 - %78 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %77, i64 0, i32 2, !dbg !63 - %79 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %78, align 8, !dbg !63, !tbaa !43 - %80 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %79, i64 0, i32 1, !dbg !63 - %81 = load i64*, i64** %80, align 8, !dbg !63, !tbaa !66 - %82 = getelementptr inbounds i64, i64* %81, i64 1, !dbg !63 - store i64 %52, i64* %81, align 8, !dbg !63, !tbaa !4 - %83 = getelementptr inbounds i64, i64* %82, i64 1, !dbg !63 - store i64* %83, i64** %80, align 8, !dbg !63, !tbaa !66 - store i64 %74, i64* %82, align 8, !dbg !63, !tbaa !4 - %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #17, !dbg !63 - %84 = getelementptr inbounds i64, i64* %67, i64 3, !dbg !63 - %85 = getelementptr inbounds i64, i64* %84, i64 1, !dbg !63 - store i64* %85, i64** %62, align 8, !dbg !63, !tbaa !31 + %47 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !31 + %48 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %47, i64 0, i32 2 + %49 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %48, align 8, !tbaa !43 + %50 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %49, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %50, align 8, !tbaa !46 + %51 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %49, i64 0, i32 4 + %52 = load i64*, i64** %51, align 8, !tbaa !48 + %53 = load i64, i64* %52, align 8, !tbaa !4 + %54 = and i64 %53, -33 + store i64 %54, i64* %52, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %47, %struct.rb_control_frame_struct* align 8 %49, %struct.rb_iseq_struct* %stackFrame.i.i1) #17 + %55 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %49, i64 0, i32 0 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %55, align 8, !dbg !51, !tbaa !31 + %56 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !52 + %57 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !52, !tbaa !53 + %needTakeSlowPath = icmp ne i64 %56, %57, !dbg !52 + br i1 %needTakeSlowPath, label %58, label %59, !dbg !52, !prof !54 + +58: ; preds = %entry + call void @"const_recompute_T::Sig"(), !dbg !52 + br label %59, !dbg !52 + +59: ; preds = %entry, %58 + %60 = load i64, i64* @"guarded_const_T::Sig", align 8, !dbg !52 + %61 = load i64, i64* @"guard_epoch_T::Sig", align 8, !dbg !52 + %62 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !52, !tbaa !53 + %guardUpdated = icmp eq i64 %61, %62, !dbg !52 + call void @llvm.assume(i1 %guardUpdated), !dbg !52 + %63 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !52, !tbaa !31 + %64 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %63, i64 0, i32 2, !dbg !52 + %65 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %64, align 8, !dbg !52, !tbaa !43 + %66 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %65, i64 0, i32 1, !dbg !52 + %67 = load i64*, i64** %66, align 8, !dbg !52, !tbaa !55 + %68 = getelementptr inbounds i64, i64* %67, i64 1, !dbg !52 + store i64 %45, i64* %67, align 8, !dbg !52, !tbaa !4 + %69 = getelementptr inbounds i64, i64* %68, i64 1, !dbg !52 + store i64* %69, i64** %66, align 8, !dbg !52, !tbaa !55 + store i64 %60, i64* %68, align 8, !dbg !52, !tbaa !4 + %send.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_extend, i64 0) #17, !dbg !52 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %55, align 8, !dbg !52, !tbaa !31 %rubyId_initialize.i.i2 = load i64, i64* @rubyIdPrecomputed_initialize, align 8, !dbg !8 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_initialize.i.i2) #17, !dbg !8 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym56.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #17, !dbg !8 - %86 = load i64, i64* @guard_epoch_AttrReaderSigChecked, align 8, !dbg !8 - %87 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !64 - %needTakeSlowPath4 = icmp ne i64 %86, %87, !dbg !8 - br i1 %needTakeSlowPath4, label %88, label %89, !dbg !8, !prof !65 + %70 = load i64, i64* @guard_epoch_AttrReaderSigChecked, align 8, !dbg !8 + %71 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !53 + %needTakeSlowPath4 = icmp ne i64 %70, %71, !dbg !8 + br i1 %needTakeSlowPath4, label %72, label %73, !dbg !8, !prof !54 -88: ; preds = %73 +72: ; preds = %59 call void @const_recompute_AttrReaderSigChecked(), !dbg !8 - br label %89, !dbg !8 + br label %73, !dbg !8 -89: ; preds = %73, %88 - %90 = load i64, i64* @guarded_const_AttrReaderSigChecked, align 8, !dbg !8 - %91 = load i64, i64* @guard_epoch_AttrReaderSigChecked, align 8, !dbg !8 - %92 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !64 - %guardUpdated5 = icmp eq i64 %91, %92, !dbg !8 +73: ; preds = %59, %72 + %74 = load i64, i64* @guarded_const_AttrReaderSigChecked, align 8, !dbg !8 + %75 = load i64, i64* @guard_epoch_AttrReaderSigChecked, align 8, !dbg !8 + %76 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !53 + %guardUpdated5 = icmp eq i64 %75, %76, !dbg !8 call void @llvm.assume(i1 %guardUpdated5), !dbg !8 %stackFrame58.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked#initialize", align 8, !dbg !8 - %93 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !8 - %94 = bitcast i8* %93 to i16*, !dbg !8 - %95 = load i16, i16* %94, align 8, !dbg !8 - %96 = and i16 %95, -384, !dbg !8 - %97 = or i16 %96, 1, !dbg !8 - store i16 %97, i16* %94, align 8, !dbg !8 - %98 = getelementptr inbounds i8, i8* %93, i64 8, !dbg !8 - %99 = bitcast i8* %98 to i32*, !dbg !8 - store i32 1, i32* %99, align 8, !dbg !8, !tbaa !67 - %100 = getelementptr inbounds i8, i8* %93, i64 12, !dbg !8 - %101 = getelementptr inbounds i8, i8* %93, i64 4, !dbg !8 - %102 = bitcast i8* %101 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %100, i8 0, i64 20, i1 false) #17, !dbg !8 - store i32 1, i32* %102, align 4, !dbg !8, !tbaa !69 + %77 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !8 + %78 = bitcast i8* %77 to i16*, !dbg !8 + %79 = load i16, i16* %78, align 8, !dbg !8 + %80 = and i16 %79, -384, !dbg !8 + %81 = or i16 %80, 1, !dbg !8 + store i16 %81, i16* %78, align 8, !dbg !8 + %82 = getelementptr inbounds i8, i8* %77, i64 8, !dbg !8 + %83 = bitcast i8* %82 to i32*, !dbg !8 + store i32 1, i32* %83, align 8, !dbg !8, !tbaa !56 + %84 = getelementptr inbounds i8, i8* %77, i64 12, !dbg !8 + %85 = getelementptr inbounds i8, i8* %77, i64 4, !dbg !8 + %86 = bitcast i8* %85 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %84, i8 0, i64 20, i1 false) #17, !dbg !8 + store i32 1, i32* %86, align 4, !dbg !8, !tbaa !59 %rubyId_foo.i.i3 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !8 store i64 %rubyId_foo.i.i3, i64* %positional_table.i.i, align 8, !dbg !8 - %103 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %103, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %53, i64 noundef 8, i1 noundef false) #17, !dbg !8 - %104 = getelementptr inbounds i8, i8* %93, i64 32, !dbg !8 - %105 = bitcast i8* %104 to i8**, !dbg !8 - store i8* %103, i8** %105, align 8, !dbg !8, !tbaa !70 - %106 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_initialize, i64 0, i64 0)) #17, !dbg !8 - %107 = bitcast i8* %93 to %struct.rb_sorbet_param_struct*, !dbg !8 - %108 = bitcast %struct.rb_iseq_struct* %stackFrame58.i.i to i8*, !dbg !8 - call void @rb_add_method_sorbet(i64 %90, i64 %106, i64 (i32, i64*, i64)* noundef @"func_AttrReaderSigChecked#initialize", %struct.rb_sorbet_param_struct* nonnull %107, i32 noundef 1, i8* %108) #17, !dbg !8 - %109 = getelementptr inbounds i64, i64* %67, i64 8, !dbg !8 - %110 = getelementptr inbounds i64, i64* %109, i64 1, !dbg !8 - store i64* %110, i64** %62, align 8, !dbg !8, !tbaa !31 - %rubyId_foo66.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !71 - %rawSym67.i.i = call i64 @rb_id2sym(i64 %rubyId_foo66.i.i) #17, !dbg !71 - %rubyId_normal68.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !71 - %rawSym69.i.i = call i64 @rb_id2sym(i64 %rubyId_normal68.i.i) #17, !dbg !71 - %stackFrame74.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked#foo", align 8, !dbg !71 - %111 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !71 - %112 = bitcast i8* %111 to i16*, !dbg !71 - %113 = load i16, i16* %112, align 8, !dbg !71 - %114 = and i16 %113, -384, !dbg !71 - store i16 %114, i16* %112, align 8, !dbg !71 - %115 = getelementptr inbounds i8, i8* %111, i64 4, !dbg !71 - call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %115, i8 0, i64 28, i1 false) #17, !dbg !71 - %116 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !71 - %117 = bitcast i8* %111 to %struct.rb_sorbet_param_struct*, !dbg !71 - %118 = bitcast %struct.rb_iseq_struct* %stackFrame74.i.i to i8*, !dbg !71 - call void @rb_add_method_sorbet(i64 %90, i64 %116, i64 (i32, i64*, i64)* noundef @"func_AttrReaderSigChecked#foo", %struct.rb_sorbet_param_struct* nonnull %117, i32 noundef 1, i8* %118) #17, !dbg !71 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %53) #17 - call void @sorbet_popRubyStack() #17, !dbg !61 - %119 = getelementptr inbounds i64, i64* %48, i64 15, !dbg !61 - %120 = getelementptr inbounds i64, i64* %119, i64 1, !dbg !61 - store i64* %120, i64** %43, align 8, !dbg !61, !tbaa !31 - %121 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !31 - %122 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %121, i64 0, i32 2, !dbg !17 - %123 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %122, align 8, !dbg !17, !tbaa !43 - %124 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %123, i64 0, i32 1, !dbg !17 - %125 = load i64*, i64** %124, align 8, !dbg !17, !tbaa !66 - %126 = getelementptr inbounds i64, i64* %125, i64 1, !dbg !17 - store i64 %90, i64* %125, align 8, !dbg !17, !tbaa !4 - %127 = getelementptr inbounds i64, i64* %126, i64 1, !dbg !17 - store i64* %127, i64** %124, align 8, !dbg !17, !tbaa !66 - store i64 2497, i64* %126, align 8, !dbg !17, !tbaa !4 + %87 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %87, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %46, i64 noundef 8, i1 noundef false) #17, !dbg !8 + %88 = getelementptr inbounds i8, i8* %77, i64 32, !dbg !8 + %89 = bitcast i8* %88 to i8**, !dbg !8 + store i8* %87, i8** %89, align 8, !dbg !8, !tbaa !60 + %90 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_initialize, i64 0, i64 0)) #17, !dbg !8 + %91 = bitcast i8* %77 to %struct.rb_sorbet_param_struct*, !dbg !8 + %92 = bitcast %struct.rb_iseq_struct* %stackFrame58.i.i to i8*, !dbg !8 + call void @rb_add_method_sorbet(i64 %74, i64 %90, i64 (i32, i64*, i64)* noundef @"func_AttrReaderSigChecked#initialize", %struct.rb_sorbet_param_struct* nonnull %91, i32 noundef 1, i8* %92) #17, !dbg !8 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %55, align 8, !dbg !8, !tbaa !31 + %rubyId_foo66.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !61 + %rawSym67.i.i = call i64 @rb_id2sym(i64 %rubyId_foo66.i.i) #17, !dbg !61 + %rubyId_normal68.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !61 + %rawSym69.i.i = call i64 @rb_id2sym(i64 %rubyId_normal68.i.i) #17, !dbg !61 + %stackFrame74.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_AttrReaderSigChecked#foo", align 8, !dbg !61 + %93 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !61 + %94 = bitcast i8* %93 to i16*, !dbg !61 + %95 = load i16, i16* %94, align 8, !dbg !61 + %96 = and i16 %95, -384, !dbg !61 + store i16 %96, i16* %94, align 8, !dbg !61 + %97 = getelementptr inbounds i8, i8* %93, i64 4, !dbg !61 + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %97, i8 0, i64 28, i1 false) #17, !dbg !61 + %98 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !61 + %99 = bitcast i8* %93 to %struct.rb_sorbet_param_struct*, !dbg !61 + %100 = bitcast %struct.rb_iseq_struct* %stackFrame74.i.i to i8*, !dbg !61 + call void @rb_add_method_sorbet(i64 %74, i64 %98, i64 (i32, i64*, i64)* noundef @"func_AttrReaderSigChecked#foo", %struct.rb_sorbet_param_struct* nonnull %99, i32 noundef 1, i8* %100) #17, !dbg !61 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %46) #17 + call void @sorbet_popRubyStack() #17, !dbg !50 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %43, align 8, !dbg !50, !tbaa !31 + %101 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !17, !tbaa !31 + %102 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %101, i64 0, i32 2, !dbg !17 + %103 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %102, align 8, !dbg !17, !tbaa !43 + %104 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %103, i64 0, i32 1, !dbg !17 + %105 = load i64*, i64** %104, align 8, !dbg !17, !tbaa !55 + %106 = getelementptr inbounds i64, i64* %105, i64 1, !dbg !17 + store i64 %74, i64* %105, align 8, !dbg !17, !tbaa !4 + %107 = getelementptr inbounds i64, i64* %106, i64 1, !dbg !17 + store i64* %107, i64** %104, align 8, !dbg !17, !tbaa !55 + store i64 2497, i64* %106, align 8, !dbg !17, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #17, !dbg !17 - %128 = getelementptr inbounds i64, i64* %48, i64 17, !dbg !17 - %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !17 - store i64* %129, i64** %43, align 8, !dbg !17, !tbaa !31 - %130 = getelementptr inbounds i64, i64* %48, i64 18 - %131 = getelementptr inbounds i64, i64* %130, i64 1 - %132 = getelementptr inbounds i64, i64* %48, i64 20 - %133 = getelementptr inbounds i64, i64* %132, i64 1 - %134 = getelementptr inbounds i64, i64* %48, i64 22 - %135 = getelementptr inbounds i64, i64* %134, i64 1 - br label %BB2.i, !dbg !72 - -BB2.i: ; preds = %BB2.i.backedge, %89 - %i.sroa.0.0.i = phi i64 [ 1, %89 ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !60 - store i64* %131, i64** %43, align 8, !tbaa !31 - %136 = and i64 %i.sroa.0.0.i, 1, !dbg !18 - %137 = icmp eq i64 %136, 0, !dbg !18 - br i1 %137, label %138, label %165, !dbg !18, !prof !73 - -138: ; preds = %BB2.i - %139 = and i64 %i.sroa.0.0.i, 7, !dbg !18 - %140 = icmp ne i64 %139, 0, !dbg !18 - %141 = and i64 %i.sroa.0.0.i, -9, !dbg !18 - %142 = icmp eq i64 %141, 0, !dbg !18 - %143 = or i1 %140, %142, !dbg !18 - br i1 %143, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !18, !prof !74 - -sorbet_isa_Integer.exit.i: ; preds = %138 - %144 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !18 - %145 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %144, i64 0, i32 0, !dbg !18 - %146 = load i64, i64* %145, align 8, !dbg !18, !tbaa !75 - %147 = and i64 %146, 31, !dbg !18 - %148 = icmp eq i64 %147, 10, !dbg !18 - br i1 %148, label %169, label %"alternativeCallIntrinsic_Integer_<.i", !dbg !18, !prof !77 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 18), i64** %43, align 8, !dbg !17, !tbaa !31 + br label %BB2.i, !dbg !62 + +BB2.i: ; preds = %BB2.i.backedge, %73 + %i.sroa.0.0.i = phi i64 [ 1, %73 ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !49 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %43, align 8, !tbaa !31 + %108 = and i64 %i.sroa.0.0.i, 1, !dbg !18 + %109 = icmp eq i64 %108, 0, !dbg !18 + br i1 %109, label %110, label %137, !dbg !18, !prof !63 + +110: ; preds = %BB2.i + %111 = and i64 %i.sroa.0.0.i, 7, !dbg !18 + %112 = icmp ne i64 %111, 0, !dbg !18 + %113 = and i64 %i.sroa.0.0.i, -9, !dbg !18 + %114 = icmp eq i64 %113, 0, !dbg !18 + %115 = or i1 %112, %114, !dbg !18 + br i1 %115, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !18, !prof !64 + +sorbet_isa_Integer.exit.i: ; preds = %110 + %116 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !18 + %117 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %116, i64 0, i32 0, !dbg !18 + %118 = load i64, i64* %117, align 8, !dbg !18, !tbaa !65 + %119 = and i64 %118, 31, !dbg !18 + %120 = icmp eq i64 %119, 10, !dbg !18 + br i1 %120, label %141, label %"alternativeCallIntrinsic_Integer_<.i", !dbg !18, !prof !67 BB5.i: ; preds = %afterSend33.i - store i64* %133, i64** %43, align 8, !tbaa !31 - %149 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !31 - %150 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %149, i64 0, i32 2, !dbg !19 - %151 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %150, align 8, !dbg !19, !tbaa !43 - %152 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %151, i64 0, i32 1, !dbg !19 - %153 = load i64*, i64** %152, align 8, !dbg !19, !tbaa !66 - %154 = getelementptr inbounds i64, i64* %153, i64 1, !dbg !19 - store i64* %154, i64** %152, align 8, !dbg !19, !tbaa !66 - store i64 %send.i, i64* %153, align 8, !dbg !19, !tbaa !4 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 21), i64** %43, align 8, !tbaa !31 + %121 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !31 + %122 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %121, i64 0, i32 2, !dbg !19 + %123 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %122, align 8, !dbg !19, !tbaa !43 + %124 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %123, i64 0, i32 1, !dbg !19 + %125 = load i64*, i64** %124, align 8, !dbg !19, !tbaa !55 + %126 = getelementptr inbounds i64, i64* %125, i64 1, !dbg !19 + store i64* %126, i64** %124, align 8, !dbg !19, !tbaa !55 + store i64 %send.i, i64* %125, align 8, !dbg !19, !tbaa !4 %send47.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #17, !dbg !19 - store i64* %135, i64** %43, align 8, !dbg !19, !tbaa !31 - br i1 %155, label %"fastSymCallIntrinsic_Integer_+.i", label %"alternativeCallIntrinsic_Integer_+.i", !dbg !20 - -afterSend33.i: ; preds = %169, %165, %"alternativeCallIntrinsic_Integer_<.i" - %155 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %165 ], [ true, %169 ] - %"symIntrinsicRawPhi_<.i" = phi i64 [ %send41.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %168, %165 ], [ %170, %169 ], !dbg !18 - %156 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !18 - %157 = icmp ne i64 %156, 0, !dbg !18 - br i1 %157, label %BB5.i, label %"func_.$152.exit", !dbg !18 - -"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %138 - %158 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !31 - %159 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %158, i64 0, i32 2, !dbg !18 - %160 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %159, align 8, !dbg !18, !tbaa !43 - %161 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %160, i64 0, i32 1, !dbg !18 - %162 = load i64*, i64** %161, align 8, !dbg !18, !tbaa !66 - %163 = getelementptr inbounds i64, i64* %162, i64 1, !dbg !18 - store i64 %i.sroa.0.0.i, i64* %162, align 8, !dbg !18, !tbaa !4 - %164 = getelementptr inbounds i64, i64* %163, i64 1, !dbg !18 - store i64* %164, i64** %161, align 8, !dbg !18, !tbaa !66 - store i64 20000001, i64* %163, align 8, !dbg !18, !tbaa !4 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 23), i64** %43, align 8, !dbg !19, !tbaa !31 + br i1 %127, label %"fastSymCallIntrinsic_Integer_+.i", label %"alternativeCallIntrinsic_Integer_+.i", !dbg !20 + +afterSend33.i: ; preds = %141, %137, %"alternativeCallIntrinsic_Integer_<.i" + %127 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %137 ], [ true, %141 ] + %"symIntrinsicRawPhi_<.i" = phi i64 [ %send41.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %140, %137 ], [ %142, %141 ], !dbg !18 + %128 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !18 + %129 = icmp ne i64 %128, 0, !dbg !18 + br i1 %129, label %BB5.i, label %"func_.$152.exit", !dbg !18 + +"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %110 + %130 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !18, !tbaa !31 + %131 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %130, i64 0, i32 2, !dbg !18 + %132 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %131, align 8, !dbg !18, !tbaa !43 + %133 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %132, i64 0, i32 1, !dbg !18 + %134 = load i64*, i64** %133, align 8, !dbg !18, !tbaa !55 + %135 = getelementptr inbounds i64, i64* %134, i64 1, !dbg !18 + store i64 %i.sroa.0.0.i, i64* %134, align 8, !dbg !18, !tbaa !4 + %136 = getelementptr inbounds i64, i64* %135, i64 1, !dbg !18 + store i64* %136, i64** %133, align 8, !dbg !18, !tbaa !55 + store i64 20000001, i64* %135, align 8, !dbg !18, !tbaa !4 %send41.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 0) #17, !dbg !18 br label %afterSend33.i, !dbg !18 -165: ; preds = %BB2.i - call void @llvm.experimental.noalias.scope.decl(metadata !78) #17, !dbg !18 - %166 = ashr i64 %i.sroa.0.0.i, 1, !dbg !18 - %167 = icmp slt i64 %166, 10000000, !dbg !18 - %168 = select i1 %167, i64 20, i64 0, !dbg !18 +137: ; preds = %BB2.i + call void @llvm.experimental.noalias.scope.decl(metadata !68) #17, !dbg !18 + %138 = ashr i64 %i.sroa.0.0.i, 1, !dbg !18 + %139 = icmp slt i64 %138, 10000000, !dbg !18 + %140 = select i1 %139, i64 20, i64 0, !dbg !18 br label %afterSend33.i, !dbg !18 -169: ; preds = %sorbet_isa_Integer.exit.i - call void @llvm.experimental.noalias.scope.decl(metadata !81) #17, !dbg !18 - %170 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 noundef 20000001) #17, !dbg !18, !noalias !78 +141: ; preds = %sorbet_isa_Integer.exit.i + call void @llvm.experimental.noalias.scope.decl(metadata !71) #17, !dbg !18 + %142 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 noundef 20000001) #17, !dbg !18, !noalias !68 br label %afterSend33.i, !dbg !18 "alternativeCallIntrinsic_Integer_+.i": ; preds = %BB5.i - %171 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !31 - %172 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %171, i64 0, i32 2, !dbg !20 - %173 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %172, align 8, !dbg !20, !tbaa !43 - %174 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %173, i64 0, i32 1, !dbg !20 - %175 = load i64*, i64** %174, align 8, !dbg !20, !tbaa !66 - %176 = getelementptr inbounds i64, i64* %175, i64 1, !dbg !20 - store i64 %i.sroa.0.0.i, i64* %175, align 8, !dbg !20, !tbaa !4 - %177 = getelementptr inbounds i64, i64* %176, i64 1, !dbg !20 - store i64* %177, i64** %174, align 8, !dbg !20, !tbaa !66 - store i64 3, i64* %176, align 8, !dbg !20, !tbaa !4 + %143 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !31 + %144 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %143, i64 0, i32 2, !dbg !20 + %145 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %144, align 8, !dbg !20, !tbaa !43 + %146 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %145, i64 0, i32 1, !dbg !20 + %147 = load i64*, i64** %146, align 8, !dbg !20, !tbaa !55 + %148 = getelementptr inbounds i64, i64* %147, i64 1, !dbg !20 + store i64 %i.sroa.0.0.i, i64* %147, align 8, !dbg !20, !tbaa !4 + %149 = getelementptr inbounds i64, i64* %148, i64 1, !dbg !20 + store i64* %149, i64** %146, align 8, !dbg !20, !tbaa !55 + store i64 3, i64* %148, align 8, !dbg !20, !tbaa !4 %send60.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0) #17, !dbg !20 br label %BB2.i.backedge, !dbg !20 "fastSymCallIntrinsic_Integer_+.i": ; preds = %BB5.i - call void @llvm.experimental.noalias.scope.decl(metadata !83) #17, !dbg !20 - br i1 %137, label %186, label %178, !dbg !20, !prof !86 - -178: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %179 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 noundef 2) #18, !dbg !20 - %180 = extractvalue { i64, i1 } %179, 1, !dbg !20 - %181 = extractvalue { i64, i1 } %179, 0, !dbg !20 - br i1 %180, label %182, label %BB2.i.backedge, !dbg !20 - -182: ; preds = %178 - %183 = ashr i64 %181, 1, !dbg !20 - %184 = xor i64 %183, -9223372036854775808, !dbg !20 - %185 = call i64 @rb_int2big(i64 %184) #17, !dbg !20 + call void @llvm.experimental.noalias.scope.decl(metadata !73) #17, !dbg !20 + br i1 %109, label %158, label %150, !dbg !20, !prof !76 + +150: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %151 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 noundef 2) #18, !dbg !20 + %152 = extractvalue { i64, i1 } %151, 1, !dbg !20 + %153 = extractvalue { i64, i1 } %151, 0, !dbg !20 + br i1 %152, label %154, label %BB2.i.backedge, !dbg !20 + +154: ; preds = %150 + %155 = ashr i64 %153, 1, !dbg !20 + %156 = xor i64 %155, -9223372036854775808, !dbg !20 + %157 = call i64 @rb_int2big(i64 %156) #17, !dbg !20 br label %BB2.i.backedge, !dbg !20 -186: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %187 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 noundef 3) #17, !dbg !20, !noalias !83 +158: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %159 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 noundef 3) #17, !dbg !20, !noalias !73 br label %BB2.i.backedge, !dbg !20 -BB2.i.backedge: ; preds = %186, %182, %178, %"alternativeCallIntrinsic_Integer_+.i" - %i.sroa.0.0.i.be = phi i64 [ %send60.i, %"alternativeCallIntrinsic_Integer_+.i" ], [ %187, %186 ], [ %185, %182 ], [ %181, %178 ] +BB2.i.backedge: ; preds = %158, %154, %150, %"alternativeCallIntrinsic_Integer_+.i" + %i.sroa.0.0.i.be = phi i64 [ %send60.i, %"alternativeCallIntrinsic_Integer_+.i" ], [ %159, %158 ], [ %157, %154 ], [ %153, %150 ] br label %BB2.i "func_.$152.exit": ; preds = %afterSend33.i - %i.sroa.0.0.i.lcssa = phi i64 [ %i.sroa.0.0.i, %afterSend33.i ], !dbg !60 - %188 = getelementptr inbounds i64, i64* %48, i64 25 - %189 = getelementptr inbounds i64, i64* %188, i64 1 - store i64* %189, i64** %43, align 8, !tbaa !31 - %190 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !31 - %191 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %190, i64 0, i32 2, !dbg !21 - %192 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %191, align 8, !dbg !21, !tbaa !43 - %193 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %192, i64 0, i32 1, !dbg !21 - %194 = load i64*, i64** %193, align 8, !dbg !21, !tbaa !66 - %195 = getelementptr inbounds i64, i64* %194, i64 1, !dbg !21 - store i64 %34, i64* %194, align 8, !dbg !21, !tbaa !4 - %196 = getelementptr inbounds i64, i64* %195, i64 1, !dbg !21 - store i64* %196, i64** %193, align 8, !dbg !21, !tbaa !66 - store i64 %i.sroa.0.0.i.lcssa, i64* %195, align 8, !dbg !21, !tbaa !4 + %i.sroa.0.0.i.lcssa = phi i64 [ %i.sroa.0.0.i, %afterSend33.i ], !dbg !49 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 26), i64** %43, align 8, !tbaa !31 + %160 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !31 + %161 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %160, i64 0, i32 2, !dbg !21 + %162 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %161, align 8, !dbg !21, !tbaa !43 + %163 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %162, i64 0, i32 1, !dbg !21 + %164 = load i64*, i64** %163, align 8, !dbg !21, !tbaa !55 + %165 = getelementptr inbounds i64, i64* %164, i64 1, !dbg !21 + store i64 %34, i64* %164, align 8, !dbg !21, !tbaa !4 + %166 = getelementptr inbounds i64, i64* %165, i64 1, !dbg !21 + store i64* %166, i64** %163, align 8, !dbg !21, !tbaa !55 + store i64 %i.sroa.0.0.i.lcssa, i64* %165, align 8, !dbg !21, !tbaa !4 %send66.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #17, !dbg !21 - %197 = getelementptr inbounds i64, i64* %48, i64 26, !dbg !21 - %198 = getelementptr inbounds i64, i64* %197, i64 1, !dbg !21 - store i64* %198, i64** %43, align 8, !dbg !21, !tbaa !31 - %199 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !31 - %200 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %199, i64 0, i32 2, !dbg !22 - %201 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %200, align 8, !dbg !22, !tbaa !43 - %202 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %201, i64 0, i32 1, !dbg !22 - %203 = load i64*, i64** %202, align 8, !dbg !22, !tbaa !66 - %204 = getelementptr inbounds i64, i64* %203, i64 1, !dbg !22 - store i64* %204, i64** %202, align 8, !dbg !22, !tbaa !66 - store i64 %send.i, i64* %203, align 8, !dbg !22, !tbaa !4 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 27), i64** %43, align 8, !dbg !21, !tbaa !31 + %167 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !31 + %168 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %167, i64 0, i32 2, !dbg !22 + %169 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %168, align 8, !dbg !22, !tbaa !43 + %170 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %169, i64 0, i32 1, !dbg !22 + %171 = load i64*, i64** %170, align 8, !dbg !22, !tbaa !55 + %172 = getelementptr inbounds i64, i64* %171, i64 1, !dbg !22 + store i64* %172, i64** %170, align 8, !dbg !22, !tbaa !55 + store i64 %send.i, i64* %171, align 8, !dbg !22, !tbaa !4 %send72.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 0) #17, !dbg !22 - %205 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !31 - %206 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %205, i64 0, i32 2, !dbg !23 - %207 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %206, align 8, !dbg !23, !tbaa !43 - %208 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %207, i64 0, i32 1, !dbg !23 - %209 = load i64*, i64** %208, align 8, !dbg !23, !tbaa !66 - %210 = getelementptr inbounds i64, i64* %209, i64 1, !dbg !23 - store i64 %34, i64* %209, align 8, !dbg !23, !tbaa !4 - %211 = getelementptr inbounds i64, i64* %210, i64 1, !dbg !23 - store i64* %211, i64** %208, align 8, !dbg !23, !tbaa !66 - store i64 %send72.i, i64* %210, align 8, !dbg !23, !tbaa !4 + %173 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !31 + %174 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %173, i64 0, i32 2, !dbg !23 + %175 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %174, align 8, !dbg !23, !tbaa !43 + %176 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %175, i64 0, i32 1, !dbg !23 + %177 = load i64*, i64** %176, align 8, !dbg !23, !tbaa !55 + %178 = getelementptr inbounds i64, i64* %177, i64 1, !dbg !23 + store i64 %34, i64* %177, align 8, !dbg !23, !tbaa !4 + %179 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !23 + store i64* %179, i64** %176, align 8, !dbg !23, !tbaa !55 + store i64 %send72.i, i64* %178, align 8, !dbg !23, !tbaa !4 %send79.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0) #17, !dbg !23 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_AttrReaderSigChecked#initialize"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !87 { +define i64 @"func_AttrReaderSigChecked#initialize"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !77 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !31 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !43 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !46 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !49 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !51 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !31 - %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !88 - %tooFewArgs = icmp ult i32 %argc, 1, !dbg !88 - %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !88 - br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !88, !prof !86 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 8), i64** %3, align 8, !tbaa !31 + %tooManyArgs = icmp ugt i32 %argc, 1, !dbg !78 + %tooFewArgs = icmp ult i32 %argc, 1, !dbg !78 + %or.cond = or i1 %tooManyArgs, %tooFewArgs, !dbg !78 + br i1 %or.cond, label %argCountFailBlock, label %fillRequiredArgs, !dbg !78, !prof !76 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !88 - unreachable, !dbg !88 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 1, i32 noundef 1) #1, !dbg !78 + unreachable, !dbg !78 fillRequiredArgs: ; preds = %functionEntryInitializers - %rawArg_foo = load i64, i64* %argArray, align 8, !dbg !88 - %11 = and i64 %rawArg_foo, 1, !dbg !89 - %12 = icmp eq i64 %11, 0, !dbg !89 - br i1 %12, label %13, label %typeTestSuccess, !dbg !89, !prof !73 - -13: ; preds = %fillRequiredArgs - %14 = and i64 %rawArg_foo, 7, !dbg !89 - %15 = icmp ne i64 %14, 0, !dbg !89 - %16 = and i64 %rawArg_foo, -9, !dbg !89 - %17 = icmp eq i64 %16, 0, !dbg !89 - %18 = or i1 %15, %17, !dbg !89 - br i1 %18, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !89, !prof !74 - -sorbet_isa_Integer.exit: ; preds = %13 - %19 = inttoptr i64 %rawArg_foo to %struct.iseq_inline_iv_cache_entry*, !dbg !89 - %20 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %19, i64 0, i32 0, !dbg !89 - %21 = load i64, i64* %20, align 8, !dbg !89, !tbaa !75 - %22 = and i64 %21, 31, !dbg !89 - %23 = icmp eq i64 %22, 10, !dbg !89 - br i1 %23, label %typeTestSuccess, label %codeRepl, !dbg !89, !prof !77 + %rawArg_foo = load i64, i64* %argArray, align 8, !dbg !78 + %4 = and i64 %rawArg_foo, 1, !dbg !79 + %5 = icmp eq i64 %4, 0, !dbg !79 + br i1 %5, label %6, label %typeTestSuccess, !dbg !79, !prof !63 + +6: ; preds = %fillRequiredArgs + %7 = and i64 %rawArg_foo, 7, !dbg !79 + %8 = icmp ne i64 %7, 0, !dbg !79 + %9 = and i64 %rawArg_foo, -9, !dbg !79 + %10 = icmp eq i64 %9, 0, !dbg !79 + %11 = or i1 %8, %10, !dbg !79 + br i1 %11, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !79, !prof !64 + +sorbet_isa_Integer.exit: ; preds = %6 + %12 = inttoptr i64 %rawArg_foo to %struct.iseq_inline_iv_cache_entry*, !dbg !79 + %13 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %12, i64 0, i32 0, !dbg !79 + %14 = load i64, i64* %13, align 8, !dbg !79, !tbaa !65 + %15 = and i64 %14, 31, !dbg !79 + %16 = icmp eq i64 %15, 10, !dbg !79 + br i1 %16, label %typeTestSuccess, label %codeRepl, !dbg !79, !prof !67 typeTestSuccess: ; preds = %fillRequiredArgs, %sorbet_isa_Integer.exit - %24 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !89 - store i64* %24, i64** %3, align 8, !dbg !89, !tbaa !31 - %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !90 - tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@foo", i64 %rawArg_foo, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo") #17, !dbg !90 - %"rubyId_@foo13" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !91 - %25 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@foo13", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo.3") #17, !dbg !91 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %3, align 8, !dbg !79, !tbaa !31 + %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !80 + tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@foo", i64 %rawArg_foo, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo") #17, !dbg !80 + %"rubyId_@foo13" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !81 + %17 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@foo13", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo.3") #17, !dbg !81 %"" = load i64, i64* @"", align 8 ret i64 %"" -codeRepl: ; preds = %sorbet_isa_Integer.exit, %13 - tail call fastcc void @"func_AttrReaderSigChecked#initialize.cold.1"(i64 %rawArg_foo) #19, !dbg !89 +codeRepl: ; preds = %sorbet_isa_Integer.exit, %6 + tail call fastcc void @"func_AttrReaderSigChecked#initialize.cold.1"(i64 %rawArg_foo) #19, !dbg !79 unreachable } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_AttrReaderSigChecked#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #9 !dbg !92 { +define i64 @"func_AttrReaderSigChecked#foo"(i32 %argc, i64* nocapture nofree readnone %argArray, i64 %selfRaw) #9 !dbg !82 { functionEntryInitializers: %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !31 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !43 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !46 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !49 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !51 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !31 - %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !93 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !93, !prof !73 + store i64* getelementptr inbounds ([28 x i64], [28 x i64]* @iseqEncodedArray, i64 0, i64 13), i64** %3, align 8, !tbaa !31 + %tooManyArgs = icmp ugt i32 %argc, 0, !dbg !83 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !83, !prof !63 argCountFailBlock: ; preds = %functionEntryInitializers - tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #1, !dbg !93 - unreachable, !dbg !93 + tail call void @sorbet_raiseArity(i32 %argc, i32 noundef 0, i32 noundef 0) #1, !dbg !83 + unreachable, !dbg !83 fillRequiredArgs: ; preds = %functionEntryInitializers - %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !94 - %11 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@foo", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo.4") #17, !dbg !94 - %12 = and i64 %11, 1 - %13 = icmp eq i64 %12, 0 - br i1 %13, label %14, label %typeTestSuccess, !prof !73 - -14: ; preds = %fillRequiredArgs - %15 = and i64 %11, 7 - %16 = icmp ne i64 %15, 0 - %17 = and i64 %11, -9 - %18 = icmp eq i64 %17, 0 - %19 = or i1 %16, %18 - br i1 %19, label %codeRepl, label %sorbet_isa_Integer.exit, !prof !74 - -sorbet_isa_Integer.exit: ; preds = %14 - %20 = inttoptr i64 %11 to %struct.iseq_inline_iv_cache_entry* - %21 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %20, i64 0, i32 0 - %22 = load i64, i64* %21, align 8, !tbaa !75 - %23 = and i64 %22, 31 - %24 = icmp eq i64 %23, 10 - br i1 %24, label %typeTestSuccess, label %codeRepl, !prof !77 + %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !84 + %4 = tail call i64 @sorbet_vm_getivar(i64 %selfRaw, i64 %"rubyId_@foo", %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo.4") #17, !dbg !84 + %5 = and i64 %4, 1 + %6 = icmp eq i64 %5, 0 + br i1 %6, label %7, label %typeTestSuccess, !prof !63 + +7: ; preds = %fillRequiredArgs + %8 = and i64 %4, 7 + %9 = icmp ne i64 %8, 0 + %10 = and i64 %4, -9 + %11 = icmp eq i64 %10, 0 + %12 = or i1 %9, %11 + br i1 %12, label %codeRepl, label %sorbet_isa_Integer.exit, !prof !64 + +sorbet_isa_Integer.exit: ; preds = %7 + %13 = inttoptr i64 %4 to %struct.iseq_inline_iv_cache_entry* + %14 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %13, i64 0, i32 0 + %15 = load i64, i64* %14, align 8, !tbaa !65 + %16 = and i64 %15, 31 + %17 = icmp eq i64 %16, 10 + br i1 %17, label %typeTestSuccess, label %codeRepl, !prof !67 typeTestSuccess: ; preds = %fillRequiredArgs, %sorbet_isa_Integer.exit - ret i64 %11 + ret i64 %4 -codeRepl: ; preds = %sorbet_isa_Integer.exit, %14 - tail call fastcc void @"func_AttrReaderSigChecked#foo.cold.1"(i64 %11) #19, !dbg !95 +codeRepl: ; preds = %sorbet_isa_Integer.exit, %7 + tail call fastcc void @"func_AttrReaderSigChecked#foo.cold.1"(i64 %4) #19, !dbg !85 unreachable } @@ -812,14 +773,14 @@ declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #6 declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #11 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_AttrReaderSigChecked#initialize.cold.1"(i64 %rawArg_foo) unnamed_addr #12 !dbg !96 { +define internal fastcc void @"func_AttrReaderSigChecked#initialize.cold.1"(i64 %rawArg_foo) unnamed_addr #12 !dbg !86 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %rawArg_foo, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !98 - unreachable, !dbg !98 + tail call void @sorbet_cast_failure(i64 %rawArg_foo, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !88 + unreachable, !dbg !88 } ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_AttrReaderSigChecked#foo.cold.1"(i64 %0) unnamed_addr #12 !dbg !99 { +define internal fastcc void @"func_AttrReaderSigChecked#foo.cold.1"(i64 %0) unnamed_addr #12 !dbg !89 { newFuncRoot: tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @"str_Return value", i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1 unreachable @@ -832,7 +793,7 @@ declare void @llvm.assume(i1 noundef) #13 define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #14 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"str_T::Sig", i64 0, i64 0), i64 6) store i64 %1, i64* @"guarded_const_T::Sig", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !64 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !53 store i64 %2, i64* @"guard_epoch_T::Sig", align 8 ret void } @@ -841,7 +802,7 @@ define linkonce void @"const_recompute_T::Sig"() local_unnamed_addr #14 { define linkonce void @const_recompute_AttrReaderSigChecked() local_unnamed_addr #14 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @str_AttrReaderSigChecked, i64 0, i64 0), i64 20) store i64 %1, i64* @guarded_const_AttrReaderSigChecked, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !64 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !53 store i64 %2, i64* @guard_epoch_AttrReaderSigChecked, align 8 ret void } @@ -919,54 +880,44 @@ attributes #19 = { noinline } !46 = !{!47, !32, i64 16} !47 = !{!"rb_control_frame_struct", !32, i64 0, !32, i64 8, !32, i64 16, !5, i64 24, !32, i64 32, !32, i64 40, !32, i64 48} !48 = !{!47, !32, i64 32} -!49 = !{!50, !32, i64 16} -!50 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !32, i64 16, !6, i64 24} -!51 = !{!52, !32, i64 8} -!52 = !{!"rb_iseq_constant_body", !6, i64 0, !38, i64 4, !32, i64 8, !53, i64 16, !55, i64 64, !58, i64 120, !32, i64 152, !32, i64 160, !32, i64 168, !32, i64 176, !32, i64 184, !32, i64 192, !59, i64 200, !38, i64 232, !38, i64 236, !38, i64 240, !38, i64 244, !38, i64 248, !6, i64 252, !5, i64 256} -!53 = !{!"", !54, i64 0, !38, i64 4, !38, i64 8, !38, i64 12, !38, i64 16, !38, i64 20, !38, i64 24, !38, i64 28, !32, i64 32, !32, i64 40} -!54 = !{!"", !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 1, !38, i64 1} -!55 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !38, i64 32, !56, i64 36} -!56 = !{!"rb_code_location_struct", !57, i64 0, !57, i64 8} -!57 = !{!"rb_code_position_struct", !38, i64 0, !38, i64 4} -!58 = !{!"iseq_insn_info", !32, i64 0, !32, i64 8, !38, i64 16, !32, i64 24} -!59 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !32, i64 24} -!60 = !DILocation(line: 0, scope: !14) -!61 = !DILocation(line: 5, column: 1, scope: !14) -!62 = !DILocation(line: 12, column: 3, scope: !9, inlinedAt: !13) -!63 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) -!64 = !{!39, !39, i64 0} -!65 = !{!"branch_weights", i32 1, i32 10000} -!66 = !{!47, !32, i64 8} -!67 = !{!68, !38, i64 8} -!68 = !{!"rb_sorbet_param_struct", !54, i64 0, !38, i64 4, !38, i64 8, !38, i64 12, !38, i64 16, !38, i64 20, !38, i64 24, !38, i64 28, !32, i64 32, !38, i64 40, !38, i64 44, !38, i64 48, !38, i64 52, !32, i64 56} -!69 = !{!68, !38, i64 4} -!70 = !{!68, !32, i64 32} -!71 = !DILocation(line: 13, column: 3, scope: !9, inlinedAt: !13) -!72 = !DILocation(line: 18, column: 5, scope: !14) -!73 = !{!"branch_weights", i32 1, i32 2000} -!74 = !{!"branch_weights", i32 1073205, i32 2146410443} -!75 = !{!76, !5, i64 0} -!76 = !{!"RBasic", !5, i64 0, !5, i64 8} -!77 = !{!"branch_weights", i32 2000, i32 1} -!78 = !{!79} -!79 = distinct !{!79, !80, !"sorbet_rb_int_lt: argument 0"} -!80 = distinct !{!80, !"sorbet_rb_int_lt"} -!81 = !{!82} -!82 = distinct !{!82, !80, !"sorbet_rb_int_lt: argument 0:thread"} -!83 = !{!84} -!84 = distinct !{!84, !85, !"sorbet_rb_int_plus: argument 0"} -!85 = distinct !{!85, !"sorbet_rb_int_plus"} -!86 = !{!"branch_weights", i32 4001, i32 4000000} -!87 = distinct !DISubprogram(name: "AttrReaderSigChecked#initialize", linkageName: "func_AttrReaderSigChecked#initialize", scope: null, file: !2, line: 8, type: !10, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!88 = !DILocation(line: 8, column: 3, scope: !87) -!89 = !DILocation(line: 8, column: 18, scope: !87) -!90 = !DILocation(line: 9, column: 12, scope: !87) -!91 = !DILocation(line: 9, column: 5, scope: !87) -!92 = distinct !DISubprogram(name: "AttrReaderSigChecked#foo", linkageName: "func_AttrReaderSigChecked#foo", scope: null, file: !2, line: 13, type: !10, scopeLine: 13, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!93 = !DILocation(line: 13, column: 3, scope: !92) -!94 = !DILocation(line: 13, column: 16, scope: !92) -!95 = !DILocation(line: 0, scope: !92) -!96 = distinct !DISubprogram(name: "func_AttrReaderSigChecked#initialize.cold.1", linkageName: "func_AttrReaderSigChecked#initialize.cold.1", scope: null, file: !2, type: !97, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!97 = !DISubroutineType(types: !3) -!98 = !DILocation(line: 8, column: 18, scope: !96) -!99 = distinct !DISubprogram(name: "func_AttrReaderSigChecked#foo.cold.1", linkageName: "func_AttrReaderSigChecked#foo.cold.1", scope: null, file: !2, type: !97, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!49 = !DILocation(line: 0, scope: !14) +!50 = !DILocation(line: 5, column: 1, scope: !14) +!51 = !DILocation(line: 12, column: 3, scope: !9, inlinedAt: !13) +!52 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) +!53 = !{!39, !39, i64 0} +!54 = !{!"branch_weights", i32 1, i32 10000} +!55 = !{!47, !32, i64 8} +!56 = !{!57, !38, i64 8} +!57 = !{!"rb_sorbet_param_struct", !58, i64 0, !38, i64 4, !38, i64 8, !38, i64 12, !38, i64 16, !38, i64 20, !38, i64 24, !38, i64 28, !32, i64 32, !38, i64 40, !38, i64 44, !38, i64 48, !38, i64 52, !32, i64 56} +!58 = !{!"", !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 0, !38, i64 1, !38, i64 1} +!59 = !{!57, !38, i64 4} +!60 = !{!57, !32, i64 32} +!61 = !DILocation(line: 13, column: 3, scope: !9, inlinedAt: !13) +!62 = !DILocation(line: 18, column: 5, scope: !14) +!63 = !{!"branch_weights", i32 1, i32 2000} +!64 = !{!"branch_weights", i32 1073205, i32 2146410443} +!65 = !{!66, !5, i64 0} +!66 = !{!"RBasic", !5, i64 0, !5, i64 8} +!67 = !{!"branch_weights", i32 2000, i32 1} +!68 = !{!69} +!69 = distinct !{!69, !70, !"sorbet_rb_int_lt: argument 0"} +!70 = distinct !{!70, !"sorbet_rb_int_lt"} +!71 = !{!72} +!72 = distinct !{!72, !70, !"sorbet_rb_int_lt: argument 0:thread"} +!73 = !{!74} +!74 = distinct !{!74, !75, !"sorbet_rb_int_plus: argument 0"} +!75 = distinct !{!75, !"sorbet_rb_int_plus"} +!76 = !{!"branch_weights", i32 4001, i32 4000000} +!77 = distinct !DISubprogram(name: "AttrReaderSigChecked#initialize", linkageName: "func_AttrReaderSigChecked#initialize", scope: null, file: !2, line: 8, type: !10, scopeLine: 8, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!78 = !DILocation(line: 8, column: 3, scope: !77) +!79 = !DILocation(line: 8, column: 18, scope: !77) +!80 = !DILocation(line: 9, column: 12, scope: !77) +!81 = !DILocation(line: 9, column: 5, scope: !77) +!82 = distinct !DISubprogram(name: "AttrReaderSigChecked#foo", linkageName: "func_AttrReaderSigChecked#foo", scope: null, file: !2, line: 13, type: !10, scopeLine: 13, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!83 = !DILocation(line: 13, column: 3, scope: !82) +!84 = !DILocation(line: 13, column: 16, scope: !82) +!85 = !DILocation(line: 0, scope: !82) +!86 = distinct !DISubprogram(name: "func_AttrReaderSigChecked#initialize.cold.1", linkageName: "func_AttrReaderSigChecked#initialize.cold.1", scope: null, file: !2, type: !87, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!87 = !DISubroutineType(types: !3) +!88 = !DILocation(line: 8, column: 18, scope: !86) +!89 = distinct !DISubprogram(name: "func_AttrReaderSigChecked#foo.cold.1", linkageName: "func_AttrReaderSigChecked#foo.cold.1", scope: null, file: !2, type: !87, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) diff --git a/test/testdata/ruby_benchmark/stripe/prop_const_getter.llo.exp b/test/testdata/ruby_benchmark/stripe/prop_const_getter.llo.exp index 66c5677593f..91b365fc3ef 100644 --- a/test/testdata/ruby_benchmark/stripe/prop_const_getter.llo.exp +++ b/test/testdata/ruby_benchmark/stripe/prop_const_getter.llo.exp @@ -2,16 +2,17 @@ source_filename = "llvm-link" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.3, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.4, [29 x i16] } +%struct.rb_vm_struct = type { i64, %struct.rb_global_vm_lock_struct, %struct.rb_thread_struct*, %struct.rb_thread_struct*, i8*, i64, %union.pthread_mutex_t, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, i64, i32, i32, i8, i32, i64, [5 x i64], i64, i64, i64, i64, i64, i64, i64, %struct.st_table*, %struct.st_table*, %struct.anon.5, %struct.rb_hook_list_struct, %struct.st_table*, %struct.rb_postponed_job_struct*, i32, i32, %struct.list_head, %union.pthread_mutex_t, i64, i64, i64, i64, i64, i32, %struct.st_table*, %struct.rb_objspace*, %struct.rb_at_exit_list*, i64*, %struct.st_table*, %struct.rb_builtin_function*, i32, %struct.anon.6, [29 x i16] } %struct.rb_global_vm_lock_struct = type { %struct.rb_thread_struct*, %union.pthread_mutex_t, %struct.list_head, %struct.rb_thread_struct*, i32, %union.pthread_cond_t, %union.pthread_cond_t, i32, i32 } -%union.pthread_cond_t = type { %struct.anon.2 } -%struct.anon.2 = type { i32, i32, i64, i64, i64, i8*, i32, i32 } -%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.7, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } +%union.pthread_cond_t = type { %struct.__pthread_cond_s } +%struct.__pthread_cond_s = type { %union.anon, %union.anon, [2 x i32], [2 x i32], i32, i32, [2 x i32] } +%union.anon = type { i64 } +%struct.rb_thread_struct = type { %struct.list_node, i64, %struct.rb_vm_struct*, %struct.rb_execution_context_struct*, i64, %struct.rb_calling_info*, i64, i64, i64, i8, i8, i32, %struct.native_thread_data_struct, i8*, i64, i64, i64, i64, %union.pthread_mutex_t, %struct.rb_unblock_callback, i64, %struct.rb_mutex_struct*, %struct.rb_thread_list_struct*, %union.anon.10, i32, i64, %struct.rb_fiber_struct*, [5 x i8*], i64 } %struct.list_node = type { %struct.list_node*, %struct.list_node* } -%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.5 } +%struct.rb_execution_context_struct = type { i64*, i64, %struct.rb_control_frame_struct*, %struct.rb_vm_tag*, %struct.rb_vm_protect_tag*, i32, i32, %struct.rb_fiber_struct*, %struct.rb_thread_struct*, %struct.st_table*, i64, i64, i64*, i64, %struct.rb_ensure_list*, %struct.rb_trace_arg_struct*, i64, i64, i8, i8, i64, %struct.anon.7 } %struct.rb_control_frame_struct = type { i64*, i64*, %struct.rb_iseq_struct*, i64, i64*, i8*, i64* } -%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.14 } -%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.13, i32, i32, i32, i32, i32, i8, i64 } +%struct.rb_iseq_struct = type { i64, i64, %struct.rb_iseq_constant_body*, %union.anon.17 } +%struct.rb_iseq_constant_body = type { i32, i32, i64*, %struct.anon, %struct.rb_iseq_location_struct, %struct.iseq_insn_info, i64*, %struct.iseq_catch_table*, %struct.rb_iseq_struct*, %struct.rb_iseq_struct*, %union.iseq_inline_storage_entry*, %struct.rb_call_data*, %struct.anon.16, i32, i32, i32, i32, i32, i8, i64 } %struct.anon = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, %struct.rb_iseq_param_keyword* } %struct.anon.0 = type { i16, [2 x i8] } %struct.rb_iseq_param_keyword = type { i32, i32, i32, i32, i64*, i64* } @@ -27,34 +28,34 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.rb_cref_struct = type { i64, i64, i64, %struct.rb_cref_struct*, %struct.rb_scope_visi_struct } %struct.rb_scope_visi_struct = type { i8, [3 x i8] } %struct.rb_call_data = type { %struct.rb_call_cache, %struct.rb_call_info } -%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.12 } +%struct.rb_call_cache = type { i64, [3 x i64], %struct.rb_callable_method_entry_struct*, i64, i64 (%struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, %struct.rb_calling_info*, %struct.rb_call_data*)*, %union.anon.15 } %struct.rb_callable_method_entry_struct = type { i64, i64, %struct.rb_method_definition_struct*, i64, i64 } -%struct.rb_method_definition_struct = type { i64, %union.anon.10, i64, i64 } -%union.anon.10 = type { %struct.rb_method_cfunc_struct } +%struct.rb_method_definition_struct = type { i64, %union.anon.13, i64, i64 } +%union.anon.13 = type { %struct.rb_method_cfunc_struct } %struct.rb_method_cfunc_struct = type { i64 (...)*, i64 (i64, i32, i64*, i64 (...)*)*, i32 } -%union.anon.12 = type { i32 } +%union.anon.15 = type { i32 } %struct.rb_call_info = type { i64, i32, i32 } -%struct.anon.13 = type { i64, i64, i64, i64* } -%union.anon.14 = type { %struct.anon.15 } -%struct.anon.15 = type { i64, i32 } +%struct.anon.16 = type { i64, i64, i64, i64* } +%union.anon.17 = type { %struct.anon.18 } +%struct.anon.18 = type { i64, i32 } %struct.rb_vm_tag = type { i64, i64, [5 x i8*], %struct.rb_vm_tag*, i32 } %struct.rb_vm_protect_tag = type { %struct.rb_vm_protect_tag* } %struct.rb_ensure_list = type { %struct.rb_ensure_list*, %struct.rb_ensure_entry } %struct.rb_ensure_entry = type { i64, i64 (i64)*, i64 } %struct.rb_trace_arg_struct = type { i32, %struct.rb_execution_context_struct*, %struct.rb_control_frame_struct*, i64, i64, i64, i64, i64, i32, i32, i64 } -%struct.anon.5 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } +%struct.anon.7 = type { i64*, i64*, i64, [1 x %struct.__jmp_buf_tag] } %struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t } %struct.__sigset_t = type { [16 x i64] } %struct.rb_calling_info = type { i64, i64, i32, i32 } -%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.6 } -%union.anon.6 = type { %union.pthread_cond_t } +%struct.native_thread_data_struct = type { %struct.list_head, %union.anon.9 } +%union.anon.9 = type { %union.pthread_cond_t } %struct.rb_unblock_callback = type { void (i8*)*, i8* } %struct.rb_mutex_struct = type opaque %struct.rb_thread_list_struct = type { %struct.rb_thread_list_struct*, %struct.rb_thread_struct* } -%union.anon.7 = type { %struct.anon.8 } -%struct.anon.8 = type { i64, i64, i32 } +%union.anon.10 = type { %struct.anon.11 } +%struct.anon.11 = type { i64, i64, i32 } %struct.rb_fiber_struct = type opaque -%struct.anon.3 = type { [65 x i64] } +%struct.anon.5 = type { [65 x i64] } %struct.rb_hook_list_struct = type { %struct.rb_event_hook_struct*, i32, i32, i32 } %struct.rb_event_hook_struct = type opaque %struct.rb_postponed_job_struct = type opaque @@ -68,16 +69,16 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 %struct.st_hash_type = type { i32 (i64, i64)*, i64 (i64)* } %struct.st_table_entry = type opaque %struct.rb_builtin_function = type opaque -%struct.anon.4 = type { i64, i64, i64, i64 } +%struct.anon.6 = type { i64, i64, i64, i64 } +%struct.SorbetLineNumberInfo = type { i32, %struct.iseq_insn_info_entry*, i64* } %struct.FunctionInlineCache = type { %struct.rb_kwarg_call_data } %struct.rb_kwarg_call_data = type { %struct.rb_call_cache, %struct.rb_call_info_with_kwarg } %struct.rb_call_info_with_kwarg = type { %struct.rb_call_info, %struct.rb_call_info_kw_arg* } %struct.rb_call_info_kw_arg = type { i32, [1 x i64] } %struct.iseq_inline_iv_cache_entry = type { i64, i64 } %struct.rb_sorbet_param_struct = type { %struct.anon.0, i32, i32, i32, i32, i32, i32, i32, i64*, i32, i32, i32, i32, i64* } -%struct.RHash = type { %struct.iseq_inline_iv_cache_entry, %union.anon.21, i64, %union.anon.27 } -%union.anon.21 = type { %struct.st_table* } -%union.anon.27 = type { i64 } +%struct.RHash = type { %struct.iseq_inline_iv_cache_entry, %union.anon.24, i64, %union.anon } +%union.anon.24 = type { %struct.st_table* } %struct.RClass = type { %struct.iseq_inline_iv_cache_entry, i64, %struct.rb_classext_struct*, i64 } %struct.rb_classext_struct = type { %struct.st_table*, %struct.st_table*, %struct.rb_id_table*, %struct.rb_id_table*, %struct.rb_id_table*, %struct.rb_subclass_entry*, %struct.rb_subclass_entry**, %struct.rb_subclass_entry**, i64, i64, i64 (i64)*, i64 } %struct.rb_id_table = type opaque @@ -98,6 +99,8 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16 @"rubyStrFrozen_" = internal unnamed_addr global i64 0, align 8 @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb" = internal unnamed_addr global i64 0, align 8 @"str_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb" = private unnamed_addr constant [57 x i8] c"test/testdata/ruby_benchmark/stripe/prop_const_getter.rb\00", align 1 +@iseqEncodedArray = internal global [21 x i64] zeroinitializer +@fileLineNumberInfo = internal global %struct.SorbetLineNumberInfo zeroinitializer @str_MyStruct = private unnamed_addr constant [9 x i8] c"MyStruct\00", align 1 @"str_T::Struct" = private unnamed_addr constant [10 x i8] c"T::Struct\00", align 1 @rubyIdPrecomputed_foo = internal unnamed_addr global i64 0, align 8 @@ -174,7 +177,9 @@ declare void @sorbet_raiseArity(i32, i32, i32) local_unnamed_addr #1 ; Function Attrs: noreturn declare void @sorbet_raiseExtraKeywords(i64) local_unnamed_addr #1 -declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, i32, i32, i64*, i32, i32) local_unnamed_addr #2 +declare %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64, i64, i64, i64, %struct.rb_iseq_struct*, i32, %struct.SorbetLineNumberInfo*, i64*, i32, i32) local_unnamed_addr #2 + +declare void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo*, i64*, i32) local_unnamed_addr #2 declare i64 @sorbet_getConstant(i8*, i64) local_unnamed_addr #2 @@ -328,9 +333,11 @@ entry: %23 = tail call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([57 x i8], [57 x i8]* @"str_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", i64 0, i64 0), i64 noundef 56) #17 tail call void @rb_gc_register_mark_object(i64 %23) #17 store i64 %23, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", align 8 + tail call void @sorbet_initLineNumberInfo(%struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i32 0, i32 0), i32 noundef 21) %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 %"rubyStr_.i.i" = load i64, i64* @"rubyStrFrozen_", align 8 - %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %23, i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 1, i32 noundef 20, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) + %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", align 8 + %24 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i.i", i64 %"rubyId_.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %24, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_.$152", align 8 %rubyId_new.i = load i64, i64* @rubyIdPrecomputed_new, align 8, !dbg !15 %rubyId_foo.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !15 @@ -353,7 +360,7 @@ entry: call void @rb_gc_register_mark_object(i64 %26) #17 %rubyId_initialize.i.i = load i64, i64* @rubyIdPrecomputed_initialize, align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i26.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", align 8 - %27 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %26, i64 %rubyId_initialize.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 7, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 2) + %27 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %26, i64 %rubyId_initialize.i.i, i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i26.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull %locals.i27.i, i32 noundef 0, i32 noundef 2) store %struct.rb_iseq_struct* %27, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct#initialize", align 8 %28 = call i64 @sorbet_getConstant(i8* noundef getelementptr inbounds ([30 x i8], [30 x i8]* @sorbet_getVoidSingleton.name, i64 0, i64 0), i64 noundef 30) #17 store i64 %28, i64* @"", align 8 @@ -364,7 +371,7 @@ entry: %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i30.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", align 8 %"rubyId_.i.i" = load i64, i64* @"rubyIdPrecomputed_", align 8 store i64 %"rubyId_.i.i", i64* %locals.i31.i, align 8 - %30 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i29.i", i64 %"rubyId_.i28.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, i32 noundef 5, i32 noundef 5, i64* noundef nonnull align 8 %locals.i31.i, i32 noundef 1, i32 noundef 4) + %30 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_.i29.i", i64 %"rubyId_.i28.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i30.i", i64 %realpath, %struct.rb_iseq_struct* noundef null, i32 noundef 1, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef nonnull align 8 %locals.i31.i, i32 noundef 1, i32 noundef 4) store %struct.rb_iseq_struct* %30, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct.", align 8 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %29) %31 = call i64 @rb_fstring_new(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @"str_block for", i64 0, i64 0), i64 noundef 9) #17 @@ -373,13 +380,13 @@ entry: %stackFrame.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct.", align 8 %"rubyId_block for.i.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i32.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", align 8 - %32 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %31, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i32.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %32 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %31, i64 %"rubyId_block for.i.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i32.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %32, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct.$block_1", align 8 %stackFrame.i33.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct.", align 8 %"rubyId_block for.i34.i" = load i64, i64* @"rubyIdPrecomputed_block for", align 8 %"rubyStr_block for.i35.i" = load i64, i64* @"rubyStrFrozen_block for", align 8 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i36.i" = load i64, i64* @"rubyStrFrozen_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb", align 8 - %33 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i35.i", i64 %"rubyId_block for.i34.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i36.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i33.i, i32 noundef 2, i32 noundef 5, i32 noundef 5, i64* noundef null, i32 noundef 0, i32 noundef 4) + %33 = call %struct.rb_iseq_struct* @sorbet_allocateRubyStackFrame(i64 %"rubyStr_block for.i35.i", i64 %"rubyId_block for.i34.i", i64 %"rubyStr_test/testdata/ruby_benchmark/stripe/prop_const_getter.rb.i36.i", i64 %realpath, %struct.rb_iseq_struct* %stackFrame.i33.i, i32 noundef 2, %struct.SorbetLineNumberInfo* noundef @fileLineNumberInfo, i64* noundef null, i32 noundef 0, i32 noundef 4) store %struct.rb_iseq_struct* %33, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct.$block_2", align 8 %rubyId_sig.i = load i64, i64* @rubyIdPrecomputed_sig, align 8, !dbg !25 call void @sorbet_setupFunctionInlineCache(%struct.FunctionInlineCache* noundef @ic_sig, i64 %rubyId_sig.i, i32 noundef 16, i32 noundef 1, i32 noundef 0, i64* noundef null), !dbg !25 @@ -422,484 +429,447 @@ entry: store i64 %46, i64* %44, align 8, !tbaa !4 call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %39, %struct.rb_control_frame_struct* align 8 %41, %struct.rb_iseq_struct* %stackFrame.i) #17 %47 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %41, i64 0, i32 0 - %48 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %42, align 8, !tbaa !43 - %49 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %48, i64 0, i32 2 - %50 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %49, align 8, !tbaa !46 - %51 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %50, i64 0, i32 2 - %52 = load i64*, i64** %51, align 8, !tbaa !48 - %53 = getelementptr inbounds i64, i64* %52, i64 4 - %54 = getelementptr inbounds i64, i64* %53, i64 1 - store i64* %54, i64** %47, align 8, !dbg !57, !tbaa !28 - %55 = load i64, i64* @"guard_epoch_T::Struct", align 8, !dbg !58 - %56 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !58, !tbaa !59 - %needTakeSlowPath = icmp ne i64 %55, %56, !dbg !58 - br i1 %needTakeSlowPath, label %57, label %58, !dbg !58, !prof !60 - -57: ; preds = %entry - call void @"const_recompute_T::Struct"(), !dbg !58 - br label %58, !dbg !58 - -58: ; preds = %entry, %57 - %59 = load i64, i64* @"guarded_const_T::Struct", align 8, !dbg !58 - %60 = load i64, i64* @"guard_epoch_T::Struct", align 8, !dbg !58 - %61 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !58, !tbaa !59 - %guardUpdated = icmp eq i64 %60, %61, !dbg !58 - call void @llvm.assume(i1 %guardUpdated), !dbg !58 - %62 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_MyStruct, i64 0, i64 0), i64 %59) #17, !dbg !58 - call void @sorbet_pushStaticInitFrame(i64 %62) #17, !dbg !58 - %63 = bitcast i64* %keyword_table.i.i to i8* - call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %63) #17 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %47, align 8, !dbg !46, !tbaa !28 + %48 = load i64, i64* @"guard_epoch_T::Struct", align 8, !dbg !47 + %49 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !47, !tbaa !48 + %needTakeSlowPath = icmp ne i64 %48, %49, !dbg !47 + br i1 %needTakeSlowPath, label %50, label %51, !dbg !47, !prof !49 + +50: ; preds = %entry + call void @"const_recompute_T::Struct"(), !dbg !47 + br label %51, !dbg !47 + +51: ; preds = %entry, %50 + %52 = load i64, i64* @"guarded_const_T::Struct", align 8, !dbg !47 + %53 = load i64, i64* @"guard_epoch_T::Struct", align 8, !dbg !47 + %54 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !47, !tbaa !48 + %guardUpdated = icmp eq i64 %53, %54, !dbg !47 + call void @llvm.assume(i1 %guardUpdated), !dbg !47 + %55 = call i64 @rb_define_class(i8* noundef getelementptr inbounds ([9 x i8], [9 x i8]* @str_MyStruct, i64 0, i64 0), i64 %52) #17, !dbg !47 + call void @sorbet_pushStaticInitFrame(i64 %55) #17, !dbg !47 + %56 = bitcast i64* %keyword_table.i.i to i8* + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %56) #17 %stackFrame.i.i1 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct.", align 8 - %64 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !28 - %65 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %64, i64 0, i32 2 - %66 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %65, align 8, !tbaa !40 - %67 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %66, i64 0, i32 2 - store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %67, align 8, !tbaa !43 - %68 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %66, i64 0, i32 4 - %69 = load i64*, i64** %68, align 8, !tbaa !45 - %70 = load i64, i64* %69, align 8, !tbaa !4 - %71 = and i64 %70, -33 - store i64 %71, i64* %69, align 8, !tbaa !4 - call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %64, %struct.rb_control_frame_struct* align 8 %66, %struct.rb_iseq_struct* %stackFrame.i.i1) #17 - %72 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %66, i64 0, i32 0 - %73 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %67, align 8, !tbaa !43 - %74 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %73, i64 0, i32 2 - %75 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %74, align 8, !tbaa !46 - %76 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %75, i64 0, i32 2 - %77 = load i64*, i64** %76, align 8, !tbaa !48 - %78 = getelementptr inbounds i64, i64* %77, i64 1 - %79 = getelementptr inbounds i64, i64* %78, i64 1, !dbg !8 - store i64* %78, i64** %72, align 8, !dbg !61, !tbaa !28 + %57 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !28 + %58 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %57, i64 0, i32 2 + %59 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %58, align 8, !tbaa !40 + %60 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %59, i64 0, i32 2 + store %struct.rb_iseq_struct* %stackFrame.i.i1, %struct.rb_iseq_struct** %60, align 8, !tbaa !43 + %61 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %59, i64 0, i32 4 + %62 = load i64*, i64** %61, align 8, !tbaa !45 + %63 = load i64, i64* %62, align 8, !tbaa !4 + %64 = and i64 %63, -33 + store i64 %64, i64* %62, align 8, !tbaa !4 + call void @sorbet_setMethodStackFrame(%struct.rb_execution_context_struct* %57, %struct.rb_control_frame_struct* align 8 %59, %struct.rb_iseq_struct* %stackFrame.i.i1) #17 + %65 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %59, i64 0, i32 0 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %65, align 8, !dbg !50, !tbaa !28 %rubyId_initialize.i.i2 = load i64, i64* @rubyIdPrecomputed_initialize, align 8, !dbg !8 %rawSym.i.i = call i64 @rb_id2sym(i64 %rubyId_initialize.i.i2) #17, !dbg !8 %rubyId_normal.i.i = load i64, i64* @rubyIdPrecomputed_normal, align 8, !dbg !8 %rawSym58.i.i = call i64 @rb_id2sym(i64 %rubyId_normal.i.i) #17, !dbg !8 - %80 = load i64, i64* @guard_epoch_MyStruct, align 8, !dbg !8 - %81 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !59 - %needTakeSlowPath4 = icmp ne i64 %80, %81, !dbg !8 - br i1 %needTakeSlowPath4, label %82, label %83, !dbg !8, !prof !60 + %66 = load i64, i64* @guard_epoch_MyStruct, align 8, !dbg !8 + %67 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !48 + %needTakeSlowPath4 = icmp ne i64 %66, %67, !dbg !8 + br i1 %needTakeSlowPath4, label %68, label %69, !dbg !8, !prof !49 -82: ; preds = %58 +68: ; preds = %51 call void @const_recompute_MyStruct(), !dbg !8 - br label %83, !dbg !8 + br label %69, !dbg !8 -83: ; preds = %58, %82 - %84 = load i64, i64* @guarded_const_MyStruct, align 8, !dbg !8 - %85 = load i64, i64* @guard_epoch_MyStruct, align 8, !dbg !8 - %86 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !59 - %guardUpdated5 = icmp eq i64 %85, %86, !dbg !8 +69: ; preds = %51, %68 + %70 = load i64, i64* @guarded_const_MyStruct, align 8, !dbg !8 + %71 = load i64, i64* @guard_epoch_MyStruct, align 8, !dbg !8 + %72 = load i64, i64* @ruby_vm_global_constant_state, align 8, !dbg !8, !tbaa !48 + %guardUpdated5 = icmp eq i64 %71, %72, !dbg !8 call void @llvm.assume(i1 %guardUpdated5), !dbg !8 %stackFrame60.i.i = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** @"stackFramePrecomputed_func_MyStruct#initialize", align 8, !dbg !8 - %87 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !8 - %88 = bitcast i8* %87 to i16*, !dbg !8 - %89 = load i16, i16* %88, align 8, !dbg !8 - %90 = and i16 %89, -384, !dbg !8 - %91 = or i16 %90, 16, !dbg !8 - store i16 %91, i16* %88, align 8, !dbg !8 - %92 = getelementptr inbounds i8, i8* %87, i64 8, !dbg !8 - %93 = getelementptr inbounds i8, i8* %87, i64 4, !dbg !8 - %94 = bitcast i8* %93 to i32*, !dbg !8 - call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %92, i8 0, i64 24, i1 false) #17, !dbg !8 - store i32 1, i32* %94, align 4, !dbg !8, !tbaa !62 + %73 = call noalias nonnull i8* @ruby_xcalloc(i64 noundef 1, i64 noundef 64) #15, !dbg !8 + %74 = bitcast i8* %73 to i16*, !dbg !8 + %75 = load i16, i16* %74, align 8, !dbg !8 + %76 = and i16 %75, -384, !dbg !8 + %77 = or i16 %76, 16, !dbg !8 + store i16 %77, i16* %74, align 8, !dbg !8 + %78 = getelementptr inbounds i8, i8* %73, i64 8, !dbg !8 + %79 = getelementptr inbounds i8, i8* %73, i64 4, !dbg !8 + %80 = bitcast i8* %79 to i32*, !dbg !8 + call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %78, i8 0, i64 24, i1 false) #17, !dbg !8 + store i32 1, i32* %80, align 4, !dbg !8, !tbaa !51 %rubyId_foo.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !8 store i64 %rubyId_foo.i.i, i64* %keyword_table.i.i, align 8, !dbg !8 - %95 = getelementptr inbounds i8, i8* %87, i64 40, !dbg !8 - %96 = bitcast i8* %95 to i32*, !dbg !8 - store i32 1, i32* %96, align 8, !dbg !8, !tbaa !64 - %97 = getelementptr inbounds i8, i8* %87, i64 44, !dbg !8 - %98 = bitcast i8* %97 to i32*, !dbg !8 - store i32 1, i32* %98, align 4, !dbg !8, !tbaa !65 - %99 = getelementptr inbounds i8, i8* %87, i64 48, !dbg !8 - %100 = bitcast i8* %99 to i32*, !dbg !8 - store i32 1, i32* %100, align 8, !dbg !8, !tbaa !66 - %101 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !8 - call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %101, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %63, i64 noundef 8, i1 noundef false) #17, !dbg !8 - %102 = getelementptr inbounds i8, i8* %87, i64 56, !dbg !8 - %103 = bitcast i8* %102 to i8**, !dbg !8 - store i8* %101, i8** %103, align 8, !dbg !8, !tbaa !67 - %104 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_initialize, i64 0, i64 0)) #17, !dbg !8 - %105 = bitcast i8* %87 to %struct.rb_sorbet_param_struct*, !dbg !8 - %106 = bitcast %struct.rb_iseq_struct* %stackFrame60.i.i to i8*, !dbg !8 - call void @rb_add_method_sorbet(i64 %84, i64 %104, i64 (i32, i64*, i64)* noundef @"func_MyStruct#initialize", %struct.rb_sorbet_param_struct* nonnull %105, i32 noundef 1, i8* %106) #17, !dbg !8 - store i64* %79, i64** %72, align 8, !dbg !8, !tbaa !28 - %rubyId_foo66.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !68 - %rawSym67.i.i = call i64 @rb_id2sym(i64 %rubyId_foo66.i.i) #17, !dbg !68 - %rubyId_without_accessors.i.i = load i64, i64* @rubyIdPrecomputed_without_accessors, align 8, !dbg !61 - %rawSym68.i.i = call i64 @rb_id2sym(i64 %rubyId_without_accessors.i.i) #17, !dbg !61 - %107 = load i64, i64* @rb_cInteger, align 8, !dbg !61 - %108 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !61, !tbaa !28 - %109 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %108, i64 0, i32 2, !dbg !61 - %110 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %109, align 8, !dbg !61, !tbaa !40 - %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 1, !dbg !61 - %112 = load i64*, i64** %111, align 8, !dbg !61, !tbaa !69 - %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !61 - store i64 %62, i64* %112, align 8, !dbg !61, !tbaa !4 - %114 = getelementptr inbounds i64, i64* %113, i64 1, !dbg !61 - store i64 %rawSym67.i.i, i64* %113, align 8, !dbg !61, !tbaa !4 - %115 = getelementptr inbounds i64, i64* %114, i64 1, !dbg !61 - store i64 %107, i64* %114, align 8, !dbg !61, !tbaa !4 - %116 = getelementptr inbounds i64, i64* %115, i64 1, !dbg !61 - store i64* %116, i64** %111, align 8, !dbg !61, !tbaa !69 - store i64 20, i64* %115, align 8, !dbg !61, !tbaa !4 - %send75.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_const, i64 0) #17, !dbg !61 - %rubyId_foo76.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !61 - %rawSym77.i.i = call i64 @rb_id2sym(i64 %rubyId_foo76.i.i) #17, !dbg !61 - %rubyId_attr_reader.i.i = load i64, i64* @rubyIdPrecomputed_attr_reader, align 8, !dbg !61 - %rawSym78.i.i = call i64 @rb_id2sym(i64 %rubyId_attr_reader.i.i) #17, !dbg !61 - %117 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !61 - %118 = call i64 @rb_id2str(i64 %117) #17, !dbg !61 - %119 = call i64 (i8*, ...) @rb_sprintf(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0), i64 %118) #17, !dbg !61 - %120 = call i64 @rb_intern_str(i64 %119) #17, !dbg !61 - %121 = inttoptr i64 %120 to i8*, !dbg !61 - call void @rb_add_method(i64 %84, i64 %117, i32 noundef 4, i8* %121, i32 noundef 1) #17, !dbg !61 - call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %63) #17 - call void @sorbet_popRubyStack() #17, !dbg !58 - %122 = getelementptr inbounds i64, i64* %52, i64 8, !dbg !70 - %123 = getelementptr inbounds i64, i64* %122, i64 1, !dbg !70 - store i64* %123, i64** %47, align 8, !dbg !70, !tbaa !28 - %rubyId_foo.i3 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !71 - %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i3) #17, !dbg !71 - %124 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !28 - %125 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %124, i64 0, i32 2, !dbg !15 - %126 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %125, align 8, !dbg !15, !tbaa !40 - %127 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %126, i64 0, i32 1, !dbg !15 - %128 = load i64*, i64** %127, align 8, !dbg !15, !tbaa !69 - %129 = getelementptr inbounds i64, i64* %128, i64 1, !dbg !15 - store i64 %84, i64* %128, align 8, !dbg !15, !tbaa !4 - %130 = getelementptr inbounds i64, i64* %129, i64 1, !dbg !15 - store i64* %130, i64** %127, align 8, !dbg !15, !tbaa !69 - store i64 861, i64* %129, align 8, !dbg !15, !tbaa !4 + %81 = getelementptr inbounds i8, i8* %73, i64 40, !dbg !8 + %82 = bitcast i8* %81 to i32*, !dbg !8 + store i32 1, i32* %82, align 8, !dbg !8, !tbaa !54 + %83 = getelementptr inbounds i8, i8* %73, i64 44, !dbg !8 + %84 = bitcast i8* %83 to i32*, !dbg !8 + store i32 1, i32* %84, align 4, !dbg !8, !tbaa !55 + %85 = getelementptr inbounds i8, i8* %73, i64 48, !dbg !8 + %86 = bitcast i8* %85 to i32*, !dbg !8 + store i32 1, i32* %86, align 8, !dbg !8, !tbaa !56 + %87 = call noalias nonnull i8* @ruby_xmalloc2(i64 noundef 1, i64 noundef 8) #15, !dbg !8 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture nonnull writeonly align 1 %87, i8* nocapture noundef nonnull readonly align 8 dereferenceable(8) %56, i64 noundef 8, i1 noundef false) #17, !dbg !8 + %88 = getelementptr inbounds i8, i8* %73, i64 56, !dbg !8 + %89 = bitcast i8* %88 to i8**, !dbg !8 + store i8* %87, i8** %89, align 8, !dbg !8, !tbaa !57 + %90 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @str_initialize, i64 0, i64 0)) #17, !dbg !8 + %91 = bitcast i8* %73 to %struct.rb_sorbet_param_struct*, !dbg !8 + %92 = bitcast %struct.rb_iseq_struct* %stackFrame60.i.i to i8*, !dbg !8 + call void @rb_add_method_sorbet(i64 %70, i64 %90, i64 (i32, i64*, i64)* noundef @"func_MyStruct#initialize", %struct.rb_sorbet_param_struct* nonnull %91, i32 noundef 1, i8* %92) #17, !dbg !8 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %65, align 8, !dbg !8, !tbaa !28 + %rubyId_foo66.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !58 + %rawSym67.i.i = call i64 @rb_id2sym(i64 %rubyId_foo66.i.i) #17, !dbg !58 + %rubyId_without_accessors.i.i = load i64, i64* @rubyIdPrecomputed_without_accessors, align 8, !dbg !50 + %rawSym68.i.i = call i64 @rb_id2sym(i64 %rubyId_without_accessors.i.i) #17, !dbg !50 + %93 = load i64, i64* @rb_cInteger, align 8, !dbg !50 + %94 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !50, !tbaa !28 + %95 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %94, i64 0, i32 2, !dbg !50 + %96 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %95, align 8, !dbg !50, !tbaa !40 + %97 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %96, i64 0, i32 1, !dbg !50 + %98 = load i64*, i64** %97, align 8, !dbg !50, !tbaa !59 + %99 = getelementptr inbounds i64, i64* %98, i64 1, !dbg !50 + store i64 %55, i64* %98, align 8, !dbg !50, !tbaa !4 + %100 = getelementptr inbounds i64, i64* %99, i64 1, !dbg !50 + store i64 %rawSym67.i.i, i64* %99, align 8, !dbg !50, !tbaa !4 + %101 = getelementptr inbounds i64, i64* %100, i64 1, !dbg !50 + store i64 %93, i64* %100, align 8, !dbg !50, !tbaa !4 + %102 = getelementptr inbounds i64, i64* %101, i64 1, !dbg !50 + store i64* %102, i64** %97, align 8, !dbg !50, !tbaa !59 + store i64 20, i64* %101, align 8, !dbg !50, !tbaa !4 + %send75.i.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_const, i64 0) #17, !dbg !50 + %rubyId_foo76.i.i = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !50 + %rawSym77.i.i = call i64 @rb_id2sym(i64 %rubyId_foo76.i.i) #17, !dbg !50 + %rubyId_attr_reader.i.i = load i64, i64* @rubyIdPrecomputed_attr_reader, align 8, !dbg !50 + %rawSym78.i.i = call i64 @rb_id2sym(i64 %rubyId_attr_reader.i.i) #17, !dbg !50 + %103 = call i64 @rb_intern(i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_foo, i64 0, i64 0)) #17, !dbg !50 + %104 = call i64 @rb_id2str(i64 %103) #17, !dbg !50 + %105 = call i64 (i8*, ...) @rb_sprintf(i8* noundef getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0), i64 %104) #17, !dbg !50 + %106 = call i64 @rb_intern_str(i64 %105) #17, !dbg !50 + %107 = inttoptr i64 %106 to i8*, !dbg !50 + call void @rb_add_method(i64 %70, i64 %103, i32 noundef 4, i8* %107, i32 noundef 1) #17, !dbg !50 + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %56) #17 + call void @sorbet_popRubyStack() #17, !dbg !47 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 9), i64** %47, align 8, !dbg !60, !tbaa !28 + %rubyId_foo.i3 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !61 + %rawSym.i = call i64 @rb_id2sym(i64 %rubyId_foo.i3) #17, !dbg !61 + %108 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !15, !tbaa !28 + %109 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %108, i64 0, i32 2, !dbg !15 + %110 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %109, align 8, !dbg !15, !tbaa !40 + %111 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %110, i64 0, i32 1, !dbg !15 + %112 = load i64*, i64** %111, align 8, !dbg !15, !tbaa !59 + %113 = getelementptr inbounds i64, i64* %112, i64 1, !dbg !15 + store i64 %70, i64* %112, align 8, !dbg !15, !tbaa !4 + %114 = getelementptr inbounds i64, i64* %113, i64 1, !dbg !15 + store i64* %114, i64** %111, align 8, !dbg !15, !tbaa !59 + store i64 861, i64* %113, align 8, !dbg !15, !tbaa !4 %send.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_new, i64 0) #17, !dbg !15 - %131 = getelementptr inbounds i64, i64* %52, i64 10, !dbg !15 - %132 = getelementptr inbounds i64, i64* %131, i64 1, !dbg !15 - store i64* %132, i64** %47, align 8, !dbg !15, !tbaa !28 - %133 = getelementptr inbounds i64, i64* %52, i64 11 - %134 = getelementptr inbounds i64, i64* %133, i64 1 - %135 = getelementptr inbounds i64, i64* %52, i64 13 - %136 = getelementptr inbounds i64, i64* %135, i64 1 - %137 = getelementptr inbounds i64, i64* %52, i64 15 - %138 = getelementptr inbounds i64, i64* %137, i64 1 - br label %BB2.i, !dbg !72 - -BB2.i: ; preds = %BB2.i.backedge, %83 - %i.sroa.0.0.i = phi i64 [ 1, %83 ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !57 - store i64* %134, i64** %47, align 8, !tbaa !28 - %139 = and i64 %i.sroa.0.0.i, 1, !dbg !19 - %140 = icmp eq i64 %139, 0, !dbg !19 - br i1 %140, label %141, label %168, !dbg !19, !prof !73 - -141: ; preds = %BB2.i - %142 = and i64 %i.sroa.0.0.i, 7, !dbg !19 - %143 = icmp ne i64 %142, 0, !dbg !19 - %144 = and i64 %i.sroa.0.0.i, -9, !dbg !19 - %145 = icmp eq i64 %144, 0, !dbg !19 - %146 = or i1 %143, %145, !dbg !19 - br i1 %146, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !19, !prof !74 - -sorbet_isa_Integer.exit.i: ; preds = %141 - %147 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !19 - %148 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %147, i64 0, i32 0, !dbg !19 - %149 = load i64, i64* %148, align 8, !dbg !19, !tbaa !75 - %150 = and i64 %149, 31, !dbg !19 - %151 = icmp eq i64 %150, 10, !dbg !19 - br i1 %151, label %172, label %"alternativeCallIntrinsic_Integer_<.i", !dbg !19, !prof !77 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 11), i64** %47, align 8, !dbg !15, !tbaa !28 + br label %BB2.i, !dbg !62 + +BB2.i: ; preds = %BB2.i.backedge, %69 + %i.sroa.0.0.i = phi i64 [ 1, %69 ], [ %i.sroa.0.0.i.be, %BB2.i.backedge ], !dbg !46 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 12), i64** %47, align 8, !tbaa !28 + %115 = and i64 %i.sroa.0.0.i, 1, !dbg !19 + %116 = icmp eq i64 %115, 0, !dbg !19 + br i1 %116, label %117, label %144, !dbg !19, !prof !63 + +117: ; preds = %BB2.i + %118 = and i64 %i.sroa.0.0.i, 7, !dbg !19 + %119 = icmp ne i64 %118, 0, !dbg !19 + %120 = and i64 %i.sroa.0.0.i, -9, !dbg !19 + %121 = icmp eq i64 %120, 0, !dbg !19 + %122 = or i1 %119, %121, !dbg !19 + br i1 %122, label %"alternativeCallIntrinsic_Integer_<.i", label %sorbet_isa_Integer.exit.i, !dbg !19, !prof !64 + +sorbet_isa_Integer.exit.i: ; preds = %117 + %123 = inttoptr i64 %i.sroa.0.0.i to %struct.iseq_inline_iv_cache_entry*, !dbg !19 + %124 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %123, i64 0, i32 0, !dbg !19 + %125 = load i64, i64* %124, align 8, !dbg !19, !tbaa !65 + %126 = and i64 %125, 31, !dbg !19 + %127 = icmp eq i64 %126, 10, !dbg !19 + br i1 %127, label %148, label %"alternativeCallIntrinsic_Integer_<.i", !dbg !19, !prof !67 BB5.i: ; preds = %afterSend36.i - store i64* %136, i64** %47, align 8, !tbaa !28 - %152 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !28 - %153 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %152, i64 0, i32 2, !dbg !20 - %154 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %153, align 8, !dbg !20, !tbaa !40 - %155 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %154, i64 0, i32 1, !dbg !20 - %156 = load i64*, i64** %155, align 8, !dbg !20, !tbaa !69 - %157 = getelementptr inbounds i64, i64* %156, i64 1, !dbg !20 - store i64* %157, i64** %155, align 8, !dbg !20, !tbaa !69 - store i64 %send.i, i64* %156, align 8, !dbg !20, !tbaa !4 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 14), i64** %47, align 8, !tbaa !28 + %128 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !20, !tbaa !28 + %129 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %128, i64 0, i32 2, !dbg !20 + %130 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %129, align 8, !dbg !20, !tbaa !40 + %131 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %130, i64 0, i32 1, !dbg !20 + %132 = load i64*, i64** %131, align 8, !dbg !20, !tbaa !59 + %133 = getelementptr inbounds i64, i64* %132, i64 1, !dbg !20 + store i64* %133, i64** %131, align 8, !dbg !20, !tbaa !59 + store i64 %send.i, i64* %132, align 8, !dbg !20, !tbaa !4 %send50.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo, i64 0) #17, !dbg !20 - store i64* %138, i64** %47, align 8, !dbg !20, !tbaa !28 - br i1 %158, label %"fastSymCallIntrinsic_Integer_+.i", label %"alternativeCallIntrinsic_Integer_+.i", !dbg !21 - -afterSend36.i: ; preds = %172, %168, %"alternativeCallIntrinsic_Integer_<.i" - %158 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %168 ], [ true, %172 ] - %"symIntrinsicRawPhi_<.i" = phi i64 [ %send44.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %171, %168 ], [ %173, %172 ], !dbg !19 - %159 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !19 - %160 = icmp ne i64 %159, 0, !dbg !19 - br i1 %160, label %BB5.i, label %"func_.$152.exit", !dbg !19 - -"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %141 - %161 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !28 - %162 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %161, i64 0, i32 2, !dbg !19 - %163 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %162, align 8, !dbg !19, !tbaa !40 - %164 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %163, i64 0, i32 1, !dbg !19 - %165 = load i64*, i64** %164, align 8, !dbg !19, !tbaa !69 - %166 = getelementptr inbounds i64, i64* %165, i64 1, !dbg !19 - store i64 %i.sroa.0.0.i, i64* %165, align 8, !dbg !19, !tbaa !4 - %167 = getelementptr inbounds i64, i64* %166, i64 1, !dbg !19 - store i64* %167, i64** %164, align 8, !dbg !19, !tbaa !69 - store i64 20000001, i64* %166, align 8, !dbg !19, !tbaa !4 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 16), i64** %47, align 8, !dbg !20, !tbaa !28 + br i1 %134, label %"fastSymCallIntrinsic_Integer_+.i", label %"alternativeCallIntrinsic_Integer_+.i", !dbg !21 + +afterSend36.i: ; preds = %148, %144, %"alternativeCallIntrinsic_Integer_<.i" + %134 = phi i1 [ false, %"alternativeCallIntrinsic_Integer_<.i" ], [ true, %144 ], [ true, %148 ] + %"symIntrinsicRawPhi_<.i" = phi i64 [ %send44.i, %"alternativeCallIntrinsic_Integer_<.i" ], [ %147, %144 ], [ %149, %148 ], !dbg !19 + %135 = and i64 %"symIntrinsicRawPhi_<.i", -9, !dbg !19 + %136 = icmp ne i64 %135, 0, !dbg !19 + br i1 %136, label %BB5.i, label %"func_.$152.exit", !dbg !19 + +"alternativeCallIntrinsic_Integer_<.i": ; preds = %sorbet_isa_Integer.exit.i, %117 + %137 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !19, !tbaa !28 + %138 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %137, i64 0, i32 2, !dbg !19 + %139 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %138, align 8, !dbg !19, !tbaa !40 + %140 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %139, i64 0, i32 1, !dbg !19 + %141 = load i64*, i64** %140, align 8, !dbg !19, !tbaa !59 + %142 = getelementptr inbounds i64, i64* %141, i64 1, !dbg !19 + store i64 %i.sroa.0.0.i, i64* %141, align 8, !dbg !19, !tbaa !4 + %143 = getelementptr inbounds i64, i64* %142, i64 1, !dbg !19 + store i64* %143, i64** %140, align 8, !dbg !19, !tbaa !59 + store i64 20000001, i64* %142, align 8, !dbg !19, !tbaa !4 %send44.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_<", i64 0) #17, !dbg !19 br label %afterSend36.i, !dbg !19 -168: ; preds = %BB2.i - call void @llvm.experimental.noalias.scope.decl(metadata !78) #17, !dbg !19 - %169 = ashr i64 %i.sroa.0.0.i, 1, !dbg !19 - %170 = icmp slt i64 %169, 10000000, !dbg !19 - %171 = select i1 %170, i64 20, i64 0, !dbg !19 +144: ; preds = %BB2.i + call void @llvm.experimental.noalias.scope.decl(metadata !68) #17, !dbg !19 + %145 = ashr i64 %i.sroa.0.0.i, 1, !dbg !19 + %146 = icmp slt i64 %145, 10000000, !dbg !19 + %147 = select i1 %146, i64 20, i64 0, !dbg !19 br label %afterSend36.i, !dbg !19 -172: ; preds = %sorbet_isa_Integer.exit.i - call void @llvm.experimental.noalias.scope.decl(metadata !81) #17, !dbg !19 - %173 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 noundef 20000001) #17, !dbg !19, !noalias !78 +148: ; preds = %sorbet_isa_Integer.exit.i + call void @llvm.experimental.noalias.scope.decl(metadata !71) #17, !dbg !19 + %149 = call i64 @sorbet_rb_int_lt_slowpath(i64 %i.sroa.0.0.i, i64 noundef 20000001) #17, !dbg !19, !noalias !68 br label %afterSend36.i, !dbg !19 "alternativeCallIntrinsic_Integer_+.i": ; preds = %BB5.i - %174 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !28 - %175 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %174, i64 0, i32 2, !dbg !21 - %176 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %175, align 8, !dbg !21, !tbaa !40 - %177 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %176, i64 0, i32 1, !dbg !21 - %178 = load i64*, i64** %177, align 8, !dbg !21, !tbaa !69 - %179 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !21 - store i64 %i.sroa.0.0.i, i64* %178, align 8, !dbg !21, !tbaa !4 - %180 = getelementptr inbounds i64, i64* %179, i64 1, !dbg !21 - store i64* %180, i64** %177, align 8, !dbg !21, !tbaa !69 - store i64 3, i64* %179, align 8, !dbg !21, !tbaa !4 + %150 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !21, !tbaa !28 + %151 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %150, i64 0, i32 2, !dbg !21 + %152 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %151, align 8, !dbg !21, !tbaa !40 + %153 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %152, i64 0, i32 1, !dbg !21 + %154 = load i64*, i64** %153, align 8, !dbg !21, !tbaa !59 + %155 = getelementptr inbounds i64, i64* %154, i64 1, !dbg !21 + store i64 %i.sroa.0.0.i, i64* %154, align 8, !dbg !21, !tbaa !4 + %156 = getelementptr inbounds i64, i64* %155, i64 1, !dbg !21 + store i64* %156, i64** %153, align 8, !dbg !21, !tbaa !59 + store i64 3, i64* %155, align 8, !dbg !21, !tbaa !4 %send63.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @"ic_+", i64 0) #17, !dbg !21 br label %BB2.i.backedge, !dbg !21 "fastSymCallIntrinsic_Integer_+.i": ; preds = %BB5.i - call void @llvm.experimental.noalias.scope.decl(metadata !83) #17, !dbg !21 - br i1 %140, label %189, label %181, !dbg !21, !prof !86 - -181: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %182 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 noundef 2) #18, !dbg !21 - %183 = extractvalue { i64, i1 } %182, 1, !dbg !21 - %184 = extractvalue { i64, i1 } %182, 0, !dbg !21 - br i1 %183, label %185, label %BB2.i.backedge, !dbg !21 - -185: ; preds = %181 - %186 = ashr i64 %184, 1, !dbg !21 - %187 = xor i64 %186, -9223372036854775808, !dbg !21 - %188 = call i64 @rb_int2big(i64 %187) #17, !dbg !21 + call void @llvm.experimental.noalias.scope.decl(metadata !73) #17, !dbg !21 + br i1 %116, label %165, label %157, !dbg !21, !prof !76 + +157: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %158 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %i.sroa.0.0.i, i64 noundef 2) #18, !dbg !21 + %159 = extractvalue { i64, i1 } %158, 1, !dbg !21 + %160 = extractvalue { i64, i1 } %158, 0, !dbg !21 + br i1 %159, label %161, label %BB2.i.backedge, !dbg !21 + +161: ; preds = %157 + %162 = ashr i64 %160, 1, !dbg !21 + %163 = xor i64 %162, -9223372036854775808, !dbg !21 + %164 = call i64 @rb_int2big(i64 %163) #17, !dbg !21 br label %BB2.i.backedge, !dbg !21 -189: ; preds = %"fastSymCallIntrinsic_Integer_+.i" - %190 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 noundef 3) #17, !dbg !21, !noalias !83 +165: ; preds = %"fastSymCallIntrinsic_Integer_+.i" + %166 = call i64 @sorbet_rb_int_plus_slowpath(i64 %i.sroa.0.0.i, i64 noundef 3) #17, !dbg !21, !noalias !73 br label %BB2.i.backedge, !dbg !21 -BB2.i.backedge: ; preds = %189, %185, %181, %"alternativeCallIntrinsic_Integer_+.i" - %i.sroa.0.0.i.be = phi i64 [ %send63.i, %"alternativeCallIntrinsic_Integer_+.i" ], [ %190, %189 ], [ %188, %185 ], [ %184, %181 ] +BB2.i.backedge: ; preds = %165, %161, %157, %"alternativeCallIntrinsic_Integer_+.i" + %i.sroa.0.0.i.be = phi i64 [ %send63.i, %"alternativeCallIntrinsic_Integer_+.i" ], [ %166, %165 ], [ %164, %161 ], [ %160, %157 ] br label %BB2.i "func_.$152.exit": ; preds = %afterSend36.i - %i.sroa.0.0.i.lcssa = phi i64 [ %i.sroa.0.0.i, %afterSend36.i ], !dbg !57 - %191 = getelementptr inbounds i64, i64* %52, i64 18 - %192 = getelementptr inbounds i64, i64* %191, i64 1 - store i64* %192, i64** %47, align 8, !tbaa !28 - %193 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !28 - %194 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %193, i64 0, i32 2, !dbg !22 - %195 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %194, align 8, !dbg !22, !tbaa !40 - %196 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %195, i64 0, i32 1, !dbg !22 - %197 = load i64*, i64** %196, align 8, !dbg !22, !tbaa !69 - %198 = getelementptr inbounds i64, i64* %197, i64 1, !dbg !22 - store i64 %38, i64* %197, align 8, !dbg !22, !tbaa !4 - %199 = getelementptr inbounds i64, i64* %198, i64 1, !dbg !22 - store i64* %199, i64** %196, align 8, !dbg !22, !tbaa !69 - store i64 %i.sroa.0.0.i.lcssa, i64* %198, align 8, !dbg !22, !tbaa !4 + %i.sroa.0.0.i.lcssa = phi i64 [ %i.sroa.0.0.i, %afterSend36.i ], !dbg !46 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 19), i64** %47, align 8, !tbaa !28 + %167 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !22, !tbaa !28 + %168 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %167, i64 0, i32 2, !dbg !22 + %169 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %168, align 8, !dbg !22, !tbaa !40 + %170 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %169, i64 0, i32 1, !dbg !22 + %171 = load i64*, i64** %170, align 8, !dbg !22, !tbaa !59 + %172 = getelementptr inbounds i64, i64* %171, i64 1, !dbg !22 + store i64 %38, i64* %171, align 8, !dbg !22, !tbaa !4 + %173 = getelementptr inbounds i64, i64* %172, i64 1, !dbg !22 + store i64* %173, i64** %170, align 8, !dbg !22, !tbaa !59 + store i64 %i.sroa.0.0.i.lcssa, i64* %172, align 8, !dbg !22, !tbaa !4 %send69.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts, i64 0) #17, !dbg !22 - %200 = getelementptr inbounds i64, i64* %52, i64 19, !dbg !22 - %201 = getelementptr inbounds i64, i64* %200, i64 1, !dbg !22 - store i64* %201, i64** %47, align 8, !dbg !22, !tbaa !28 - %202 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !28 - %203 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %202, i64 0, i32 2, !dbg !23 - %204 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %203, align 8, !dbg !23, !tbaa !40 - %205 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %204, i64 0, i32 1, !dbg !23 - %206 = load i64*, i64** %205, align 8, !dbg !23, !tbaa !69 - %207 = getelementptr inbounds i64, i64* %206, i64 1, !dbg !23 - store i64* %207, i64** %205, align 8, !dbg !23, !tbaa !69 - store i64 %send.i, i64* %206, align 8, !dbg !23, !tbaa !4 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 20), i64** %47, align 8, !dbg !22, !tbaa !28 + %174 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !23, !tbaa !28 + %175 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %174, i64 0, i32 2, !dbg !23 + %176 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %175, align 8, !dbg !23, !tbaa !40 + %177 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %176, i64 0, i32 1, !dbg !23 + %178 = load i64*, i64** %177, align 8, !dbg !23, !tbaa !59 + %179 = getelementptr inbounds i64, i64* %178, i64 1, !dbg !23 + store i64* %179, i64** %177, align 8, !dbg !23, !tbaa !59 + store i64 %send.i, i64* %178, align 8, !dbg !23, !tbaa !4 %send75.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_foo.1, i64 0) #17, !dbg !23 - %208 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !28 - %209 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %208, i64 0, i32 2, !dbg !24 - %210 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %209, align 8, !dbg !24, !tbaa !40 - %211 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %210, i64 0, i32 1, !dbg !24 - %212 = load i64*, i64** %211, align 8, !dbg !24, !tbaa !69 - %213 = getelementptr inbounds i64, i64* %212, i64 1, !dbg !24 - store i64 %38, i64* %212, align 8, !dbg !24, !tbaa !4 - %214 = getelementptr inbounds i64, i64* %213, i64 1, !dbg !24 - store i64* %214, i64** %211, align 8, !dbg !24, !tbaa !69 - store i64 %send75.i, i64* %213, align 8, !dbg !24, !tbaa !4 + %180 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !24, !tbaa !28 + %181 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %180, i64 0, i32 2, !dbg !24 + %182 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %181, align 8, !dbg !24, !tbaa !40 + %183 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %182, i64 0, i32 1, !dbg !24 + %184 = load i64*, i64** %183, align 8, !dbg !24, !tbaa !59 + %185 = getelementptr inbounds i64, i64* %184, i64 1, !dbg !24 + store i64 %38, i64* %184, align 8, !dbg !24, !tbaa !4 + %186 = getelementptr inbounds i64, i64* %185, i64 1, !dbg !24 + store i64* %186, i64** %183, align 8, !dbg !24, !tbaa !59 + store i64 %send75.i, i64* %185, align 8, !dbg !24, !tbaa !4 %send82.i = call i64 @sorbet_callFuncWithCache(%struct.FunctionInlineCache* noundef @ic_puts.2, i64 0) #17, !dbg !24 ret void } ; Function Attrs: nounwind sspreq uwtable -define i64 @"func_MyStruct#initialize"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !87 { +define i64 @"func_MyStruct#initialize"(i32 %argc, i64* nocapture readonly %argArray, i64 %selfRaw) #9 !dbg !77 { functionEntryInitializers: %callArgs = alloca [2 x i64], align 8 %0 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !tbaa !28 %1 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %0, i64 0, i32 2 %2 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %1, align 8, !tbaa !40 %3 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 0 - %4 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %2, i64 0, i32 2 - %5 = load %struct.rb_iseq_struct*, %struct.rb_iseq_struct** %4, align 8, !tbaa !43 - %6 = getelementptr inbounds %struct.rb_iseq_struct, %struct.rb_iseq_struct* %5, i64 0, i32 2 - %7 = load %struct.rb_iseq_constant_body*, %struct.rb_iseq_constant_body** %6, align 8, !tbaa !46 - %8 = getelementptr inbounds %struct.rb_iseq_constant_body, %struct.rb_iseq_constant_body* %7, i64 0, i32 2 - %9 = load i64*, i64** %8, align 8, !tbaa !48 - %10 = getelementptr inbounds i64, i64* %9, i64 1 - store i64* %10, i64** %3, align 8, !tbaa !28 - %hashAttemptReadGuard = icmp ult i32 0, %argc, !dbg !88 - br i1 %hashAttemptReadGuard, label %readKWHashArgCountSuccess, label %fillRequiredArgs.thread, !dbg !88 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !tbaa !28 + %hashAttemptReadGuard = icmp ult i32 0, %argc, !dbg !78 + br i1 %hashAttemptReadGuard, label %readKWHashArgCountSuccess, label %fillRequiredArgs.thread, !dbg !78 fillRequiredArgs.thread: ; preds = %functionEntryInitializers - %rubyId_foo41 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !88 - %rawSym42 = tail call i64 @rb_id2sym(i64 %rubyId_foo41), !dbg !88 - br label %sorbet_assertNoExtraKWArg.exit.thread, !dbg !88 + %rubyId_foo39 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !78 + %rawSym40 = tail call i64 @rb_id2sym(i64 %rubyId_foo39), !dbg !78 + br label %sorbet_assertNoExtraKWArg.exit.thread, !dbg !78 readKWHashArgCountSuccess: ; preds = %functionEntryInitializers - %argsWithoutHashCount = sub nuw i32 %argc, 1, !dbg !88 - %11 = getelementptr i64, i64* %argArray, i32 %argsWithoutHashCount, !dbg !88 - %KWArgHash = load i64, i64* %11, align 8, !dbg !88 - %12 = and i64 %KWArgHash, 7, !dbg !88 - %13 = icmp ne i64 %12, 0, !dbg !88 - %14 = and i64 %KWArgHash, -9, !dbg !88 - %15 = icmp eq i64 %14, 0, !dbg !88 - %16 = or i1 %13, %15, !dbg !88 - br i1 %16, label %argCountFailBlock, label %sorbet_isa_Hash.exit, !dbg !88 + %argsWithoutHashCount = sub nuw i32 %argc, 1, !dbg !78 + %4 = getelementptr i64, i64* %argArray, i32 %argsWithoutHashCount, !dbg !78 + %KWArgHash = load i64, i64* %4, align 8, !dbg !78 + %5 = and i64 %KWArgHash, 7, !dbg !78 + %6 = icmp ne i64 %5, 0, !dbg !78 + %7 = and i64 %KWArgHash, -9, !dbg !78 + %8 = icmp eq i64 %7, 0, !dbg !78 + %9 = or i1 %6, %8, !dbg !78 + br i1 %9, label %argCountFailBlock, label %sorbet_isa_Hash.exit, !dbg !78 sorbet_isa_Hash.exit: ; preds = %readKWHashArgCountSuccess - %17 = inttoptr i64 %KWArgHash to %struct.iseq_inline_iv_cache_entry*, !dbg !88 - %18 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %17, i64 0, i32 0, !dbg !88 - %19 = load i64, i64* %18, align 8, !dbg !88, !tbaa !75 - %20 = and i64 %19, 31, !dbg !88 - %21 = icmp eq i64 %20, 8, !dbg !88 - br i1 %21, label %afterKWHash, label %argCountFailBlock, !dbg !88 + %10 = inttoptr i64 %KWArgHash to %struct.iseq_inline_iv_cache_entry*, !dbg !78 + %11 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %10, i64 0, i32 0, !dbg !78 + %12 = load i64, i64* %11, align 8, !dbg !78, !tbaa !65 + %13 = and i64 %12, 31, !dbg !78 + %14 = icmp eq i64 %13, 8, !dbg !78 + br i1 %14, label %afterKWHash, label %argCountFailBlock, !dbg !78 afterKWHash: ; preds = %sorbet_isa_Hash.exit - %tooManyArgs = icmp ugt i32 %argsWithoutHashCount, 0, !dbg !88 - br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !88, !prof !73 + %tooManyArgs = icmp ugt i32 %argsWithoutHashCount, 0, !dbg !78 + br i1 %tooManyArgs, label %argCountFailBlock, label %fillRequiredArgs, !dbg !78, !prof !63 argCountFailBlock: ; preds = %sorbet_isa_Hash.exit, %readKWHashArgCountSuccess, %afterKWHash - %argcPhi34 = phi i32 [ %argsWithoutHashCount, %afterKWHash ], [ %argc, %readKWHashArgCountSuccess ], [ %argc, %sorbet_isa_Hash.exit ] - tail call void @sorbet_raiseArity(i32 %argcPhi34, i32 noundef 0, i32 noundef 0) #1, !dbg !88 - unreachable, !dbg !88 + %argcPhi32 = phi i32 [ %argsWithoutHashCount, %afterKWHash ], [ %argc, %readKWHashArgCountSuccess ], [ %argc, %sorbet_isa_Hash.exit ] + tail call void @sorbet_raiseArity(i32 %argcPhi32, i32 noundef 0, i32 noundef 0) #1, !dbg !78 + unreachable, !dbg !78 fillRequiredArgs: ; preds = %afterKWHash - %rubyId_foo = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !88 - %rawSym = tail call i64 @rb_id2sym(i64 %rubyId_foo), !dbg !88 - %22 = icmp eq i64 %KWArgHash, 52, !dbg !88 - br i1 %22, label %sorbet_assertNoExtraKWArg.exit.thread, label %sorbet_getKWArg.exit, !dbg !88 + %rubyId_foo = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !78 + %rawSym = tail call i64 @rb_id2sym(i64 %rubyId_foo), !dbg !78 + %15 = icmp eq i64 %KWArgHash, 52, !dbg !78 + br i1 %15, label %sorbet_assertNoExtraKWArg.exit.thread, label %sorbet_getKWArg.exit, !dbg !78 sorbet_assertNoExtraKWArg.exit.thread: ; preds = %fillRequiredArgs, %fillRequiredArgs.thread - %23 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !89 - store i64* %23, i64** %3, align 8, !dbg !89, !tbaa !28 - br label %45, !dbg !90 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !dbg !79, !tbaa !28 + br label %36, !dbg !80 sorbet_getKWArg.exit: ; preds = %fillRequiredArgs - %24 = tail call i64 @rb_hash_delete_entry(i64 %KWArgHash, i64 %rawSym) #17, !dbg !88 - %25 = icmp eq i64 %24, 52, !dbg !88 - %spec.select = select i1 %25, i64 8, i64 %24, !dbg !88 - %26 = load i64, i64* %18, align 8, !dbg !88, !tbaa !75 - %27 = trunc i64 %26 to i16, !dbg !88 - %28 = icmp sgt i16 %27, -1, !dbg !88 - br i1 %28, label %29, label %32, !dbg !88 - -29: ; preds = %sorbet_getKWArg.exit - %30 = lshr i64 %26, 16, !dbg !88 - %31 = and i64 %30, 15, !dbg !88 - br label %38, !dbg !88 - -32: ; preds = %sorbet_getKWArg.exit - %33 = inttoptr i64 %KWArgHash to %struct.RHash*, !dbg !88 - %34 = getelementptr inbounds %struct.RHash, %struct.RHash* %33, i64 0, i32 1, i32 0, !dbg !88 - %35 = load %struct.st_table*, %struct.st_table** %34, align 8, !dbg !88, !tbaa !91 - %36 = getelementptr inbounds %struct.st_table, %struct.st_table* %35, i64 0, i32 5, !dbg !88 - %37 = load i64, i64* %36, align 8, !dbg !88, !tbaa !92 - br label %38, !dbg !88 - -38: ; preds = %32, %29 - %39 = phi i64 [ %31, %29 ], [ %37, %32 ], !dbg !88 - %40 = icmp eq i64 %39, 0, !dbg !88 - br i1 %40, label %sorbet_assertNoExtraKWArg.exit, label %41, !dbg !88 - -41: ; preds = %38 - tail call void @sorbet_raiseExtraKeywords(i64 %KWArgHash) #16, !dbg !88 - unreachable, !dbg !88 - -sorbet_assertNoExtraKWArg.exit: ; preds = %38 - %42 = getelementptr inbounds i64, i64* %10, i64 1, !dbg !89 - store i64* %42, i64** %3, align 8, !dbg !89, !tbaa !28 - %43 = and i64 %spec.select, 1, !dbg !90 - %44 = icmp eq i64 %43, 0, !dbg !90 - br i1 %44, label %45, label %typeTestSuccess10, !dbg !90, !prof !73 - -45: ; preds = %sorbet_assertNoExtraKWArg.exit.thread, %sorbet_assertNoExtraKWArg.exit - %46 = phi i64 [ 8, %sorbet_assertNoExtraKWArg.exit.thread ], [ %spec.select, %sorbet_assertNoExtraKWArg.exit ] - %47 = and i64 %46, 7, !dbg !90 - %48 = icmp ne i64 %47, 0, !dbg !90 - %49 = and i64 %46, -9, !dbg !90 - %50 = icmp eq i64 %49, 0, !dbg !90 - %51 = or i1 %48, %50, !dbg !90 - br i1 %51, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !90, !prof !74 - -sorbet_isa_Integer.exit: ; preds = %45 - %52 = inttoptr i64 %46 to %struct.iseq_inline_iv_cache_entry*, !dbg !90 - %53 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %52, i64 0, i32 0, !dbg !90 - %54 = load i64, i64* %53, align 8, !dbg !90, !tbaa !75 - %55 = and i64 %54, 31, !dbg !90 - %56 = icmp eq i64 %55, 10, !dbg !90 - br i1 %56, label %typeTestSuccess10, label %codeRepl, !dbg !90, !prof !77 - -codeRepl: ; preds = %sorbet_isa_Integer.exit, %45 - tail call fastcc void @"func_MyStruct#initialize.cold.1"(i64 %46) #19, !dbg !90 + %16 = tail call i64 @rb_hash_delete_entry(i64 %KWArgHash, i64 %rawSym) #17, !dbg !78 + %17 = icmp eq i64 %16, 52, !dbg !78 + %spec.select = select i1 %17, i64 8, i64 %16, !dbg !78 + %18 = load i64, i64* %11, align 8, !dbg !78, !tbaa !65 + %19 = trunc i64 %18 to i16, !dbg !78 + %20 = icmp sgt i16 %19, -1, !dbg !78 + br i1 %20, label %21, label %24, !dbg !78 + +21: ; preds = %sorbet_getKWArg.exit + %22 = lshr i64 %18, 16, !dbg !78 + %23 = and i64 %22, 15, !dbg !78 + br label %30, !dbg !78 + +24: ; preds = %sorbet_getKWArg.exit + %25 = inttoptr i64 %KWArgHash to %struct.RHash*, !dbg !78 + %26 = getelementptr inbounds %struct.RHash, %struct.RHash* %25, i64 0, i32 1, i32 0, !dbg !78 + %27 = load %struct.st_table*, %struct.st_table** %26, align 8, !dbg !78, !tbaa !81 + %28 = getelementptr inbounds %struct.st_table, %struct.st_table* %27, i64 0, i32 5, !dbg !78 + %29 = load i64, i64* %28, align 8, !dbg !78, !tbaa !82 + br label %30, !dbg !78 + +30: ; preds = %24, %21 + %31 = phi i64 [ %23, %21 ], [ %29, %24 ], !dbg !78 + %32 = icmp eq i64 %31, 0, !dbg !78 + br i1 %32, label %sorbet_assertNoExtraKWArg.exit, label %33, !dbg !78 + +33: ; preds = %30 + tail call void @sorbet_raiseExtraKeywords(i64 %KWArgHash) #16, !dbg !78 + unreachable, !dbg !78 + +sorbet_assertNoExtraKWArg.exit: ; preds = %30 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 6), i64** %3, align 8, !dbg !79, !tbaa !28 + %34 = and i64 %spec.select, 1, !dbg !80 + %35 = icmp eq i64 %34, 0, !dbg !80 + br i1 %35, label %36, label %typeTestSuccess10, !dbg !80, !prof !63 + +36: ; preds = %sorbet_assertNoExtraKWArg.exit.thread, %sorbet_assertNoExtraKWArg.exit + %37 = phi i64 [ 8, %sorbet_assertNoExtraKWArg.exit.thread ], [ %spec.select, %sorbet_assertNoExtraKWArg.exit ] + %38 = and i64 %37, 7, !dbg !80 + %39 = icmp ne i64 %38, 0, !dbg !80 + %40 = and i64 %37, -9, !dbg !80 + %41 = icmp eq i64 %40, 0, !dbg !80 + %42 = or i1 %39, %41, !dbg !80 + br i1 %42, label %codeRepl, label %sorbet_isa_Integer.exit, !dbg !80, !prof !64 + +sorbet_isa_Integer.exit: ; preds = %36 + %43 = inttoptr i64 %37 to %struct.iseq_inline_iv_cache_entry*, !dbg !80 + %44 = getelementptr inbounds %struct.iseq_inline_iv_cache_entry, %struct.iseq_inline_iv_cache_entry* %43, i64 0, i32 0, !dbg !80 + %45 = load i64, i64* %44, align 8, !dbg !80, !tbaa !65 + %46 = and i64 %45, 31, !dbg !80 + %47 = icmp eq i64 %46, 10, !dbg !80 + br i1 %47, label %typeTestSuccess10, label %codeRepl, !dbg !80, !prof !67 + +codeRepl: ; preds = %sorbet_isa_Integer.exit, %36 + tail call fastcc void @"func_MyStruct#initialize.cold.1"(i64 %37) #19, !dbg !80 unreachable typeTestSuccess10: ; preds = %sorbet_assertNoExtraKWArg.exit, %sorbet_isa_Integer.exit - %57 = phi i64 [ %46, %sorbet_isa_Integer.exit ], [ %spec.select, %sorbet_assertNoExtraKWArg.exit ] - %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !94 - tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@foo", i64 %57, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo") #17, !dbg !94 - store i64* %10, i64** %3, align 8, !dbg !94, !tbaa !28 - %rubyId_foo13 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !88 - %rawSym14 = tail call i64 @rb_id2sym(i64 %rubyId_foo13), !dbg !88 - %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !88 - store i64 %rawSym14, i64* %callArgs0Addr, align 8, !dbg !88 - %callArgs1Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 1, !dbg !88 - store i64 %57, i64* %callArgs1Addr, align 8, !dbg !88 - %58 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !88 - %59 = tail call i64 @rb_hash_new_with_size(i64 noundef 1) #17, !dbg !88 - call void @rb_hash_bulk_insert(i64 noundef 2, i64* noundef nonnull %58, i64 %59) #17, !dbg !88 - store i64 %59, i64* %callArgs0Addr, align 8, !dbg !88 - call void @llvm.experimental.noalias.scope.decl(metadata !95), !dbg !88 - %60 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !88, !tbaa !28, !noalias !95 - %61 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %60, i64 0, i32 2, !dbg !88 - %62 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %61, align 8, !dbg !88, !tbaa !40, !noalias !95 - %63 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %62, i64 0, i32 3, !dbg !88 - %64 = load i64, i64* %63, align 8, !dbg !88, !tbaa !98, !noalias !95 - %65 = call %struct.rb_callable_method_entry_struct* @rb_vm_frame_method_entry(%struct.rb_control_frame_struct* %62) #17, !dbg !88, !noalias !95 - %66 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %65, i64 0, i32 1, !dbg !88 - %67 = load i64, i64* %66, align 8, !dbg !88, !tbaa !99, !noalias !95 - %68 = inttoptr i64 %67 to %struct.RClass*, !dbg !88 - %69 = getelementptr inbounds %struct.RClass, %struct.RClass* %68, i64 0, i32 2, !dbg !88 - %70 = load %struct.rb_classext_struct*, %struct.rb_classext_struct** %69, align 8, !dbg !88, !tbaa !101, !noalias !95 - %71 = getelementptr inbounds %struct.rb_classext_struct, %struct.rb_classext_struct* %70, i64 0, i32 8, !dbg !88 - %72 = load i64, i64* %71, align 8, !dbg !88, !tbaa !103, !noalias !95 - %73 = inttoptr i64 %72 to %struct.RClass*, !dbg !88 - %74 = getelementptr inbounds %struct.RClass, %struct.RClass* %73, i64 0, i32 1, !dbg !88 - %75 = load i64, i64* %74, align 8, !dbg !88, !tbaa !105, !noalias !95 - %76 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %65, i64 0, i32 2, !dbg !88 - %77 = load %struct.rb_method_definition_struct*, %struct.rb_method_definition_struct** %76, align 8, !dbg !88, !tbaa !106, !noalias !95 - %78 = getelementptr inbounds %struct.rb_method_definition_struct, %struct.rb_method_definition_struct* %77, i64 0, i32 2, !dbg !88 - %79 = load i64, i64* %78, align 8, !dbg !88, !tbaa !107, !noalias !95 - %80 = call %struct.rb_callable_method_entry_struct* @rb_callable_method_entry(i64 %75, i64 %79) #17, !dbg !88, !noalias !95 - %81 = icmp eq %struct.rb_callable_method_entry_struct* %80, null, !dbg !88 - br i1 %81, label %82, label %sorbet_callSuper.exit, !dbg !88 - -82: ; preds = %typeTestSuccess10 - %83 = load i64, i64* @rb_eRuntimeError, align 8, !dbg !88, !tbaa !4 - call void (i64, i8*, ...) @rb_raise(i64 %83, i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @.str.6, i64 0, i64 0)) #16, !dbg !88 - unreachable, !dbg !88 + %48 = phi i64 [ %37, %sorbet_isa_Integer.exit ], [ %spec.select, %sorbet_assertNoExtraKWArg.exit ] + %"rubyId_@foo" = load i64, i64* @"rubyIdPrecomputed_@foo", align 8, !dbg !84 + tail call void @sorbet_vm_setivar(i64 %selfRaw, i64 %"rubyId_@foo", i64 %48, %struct.iseq_inline_iv_cache_entry* noundef @"ivc_@foo") #17, !dbg !84 + store i64* getelementptr inbounds ([21 x i64], [21 x i64]* @iseqEncodedArray, i64 0, i64 5), i64** %3, align 8, !dbg !84, !tbaa !28 + %rubyId_foo13 = load i64, i64* @rubyIdPrecomputed_foo, align 8, !dbg !78 + %rawSym14 = tail call i64 @rb_id2sym(i64 %rubyId_foo13), !dbg !78 + %callArgs0Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 0, !dbg !78 + store i64 %rawSym14, i64* %callArgs0Addr, align 8, !dbg !78 + %callArgs1Addr = getelementptr [2 x i64], [2 x i64]* %callArgs, i32 0, i64 1, !dbg !78 + store i64 %48, i64* %callArgs1Addr, align 8, !dbg !78 + %49 = getelementptr [2 x i64], [2 x i64]* %callArgs, i64 0, i64 0, !dbg !78 + %50 = tail call i64 @rb_hash_new_with_size(i64 noundef 1) #17, !dbg !78 + call void @rb_hash_bulk_insert(i64 noundef 2, i64* noundef nonnull %49, i64 %50) #17, !dbg !78 + store i64 %50, i64* %callArgs0Addr, align 8, !dbg !78 + call void @llvm.experimental.noalias.scope.decl(metadata !85), !dbg !78 + %51 = load %struct.rb_execution_context_struct*, %struct.rb_execution_context_struct** @ruby_current_execution_context_ptr, align 8, !dbg !78, !tbaa !28, !noalias !85 + %52 = getelementptr inbounds %struct.rb_execution_context_struct, %struct.rb_execution_context_struct* %51, i64 0, i32 2, !dbg !78 + %53 = load %struct.rb_control_frame_struct*, %struct.rb_control_frame_struct** %52, align 8, !dbg !78, !tbaa !40, !noalias !85 + %54 = getelementptr inbounds %struct.rb_control_frame_struct, %struct.rb_control_frame_struct* %53, i64 0, i32 3, !dbg !78 + %55 = load i64, i64* %54, align 8, !dbg !78, !tbaa !88, !noalias !85 + %56 = call %struct.rb_callable_method_entry_struct* @rb_vm_frame_method_entry(%struct.rb_control_frame_struct* %53) #17, !dbg !78, !noalias !85 + %57 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %56, i64 0, i32 1, !dbg !78 + %58 = load i64, i64* %57, align 8, !dbg !78, !tbaa !89, !noalias !85 + %59 = inttoptr i64 %58 to %struct.RClass*, !dbg !78 + %60 = getelementptr inbounds %struct.RClass, %struct.RClass* %59, i64 0, i32 2, !dbg !78 + %61 = load %struct.rb_classext_struct*, %struct.rb_classext_struct** %60, align 8, !dbg !78, !tbaa !91, !noalias !85 + %62 = getelementptr inbounds %struct.rb_classext_struct, %struct.rb_classext_struct* %61, i64 0, i32 8, !dbg !78 + %63 = load i64, i64* %62, align 8, !dbg !78, !tbaa !93, !noalias !85 + %64 = inttoptr i64 %63 to %struct.RClass*, !dbg !78 + %65 = getelementptr inbounds %struct.RClass, %struct.RClass* %64, i64 0, i32 1, !dbg !78 + %66 = load i64, i64* %65, align 8, !dbg !78, !tbaa !95, !noalias !85 + %67 = getelementptr inbounds %struct.rb_callable_method_entry_struct, %struct.rb_callable_method_entry_struct* %56, i64 0, i32 2, !dbg !78 + %68 = load %struct.rb_method_definition_struct*, %struct.rb_method_definition_struct** %67, align 8, !dbg !78, !tbaa !96, !noalias !85 + %69 = getelementptr inbounds %struct.rb_method_definition_struct, %struct.rb_method_definition_struct* %68, i64 0, i32 2, !dbg !78 + %70 = load i64, i64* %69, align 8, !dbg !78, !tbaa !97, !noalias !85 + %71 = call %struct.rb_callable_method_entry_struct* @rb_callable_method_entry(i64 %66, i64 %70) #17, !dbg !78, !noalias !85 + %72 = icmp eq %struct.rb_callable_method_entry_struct* %71, null, !dbg !78 + br i1 %72, label %73, label %sorbet_callSuper.exit, !dbg !78 + +73: ; preds = %typeTestSuccess10 + %74 = load i64, i64* @rb_eRuntimeError, align 8, !dbg !78, !tbaa !4 + call void (i64, i8*, ...) @rb_raise(i64 %74, i8* noundef getelementptr inbounds ([42 x i8], [42 x i8]* @.str.6, i64 0, i64 0)) #16, !dbg !78 + unreachable, !dbg !78 sorbet_callSuper.exit: ; preds = %typeTestSuccess10 - %84 = call i64 @rb_vm_call_kw(%struct.rb_execution_context_struct* nonnull %60, i64 %64, i64 %79, i32 noundef 1, i64* noundef nonnull %58, %struct.rb_callable_method_entry_struct* nonnull %80, i32 noundef 1) #17, !dbg !88 + %75 = call i64 @rb_vm_call_kw(%struct.rb_execution_context_struct* nonnull %51, i64 %55, i64 %70, i32 noundef 1, i64* noundef nonnull %49, %struct.rb_callable_method_entry_struct* nonnull %71, i32 noundef 1) #17, !dbg !78 %"" = load i64, i64* @"", align 8 ret i64 %"" } @@ -917,10 +887,10 @@ declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #6 declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #11 ; Function Attrs: cold minsize noreturn nounwind sspreq uwtable -define internal fastcc void @"func_MyStruct#initialize.cold.1"(i64 %0) unnamed_addr #12 !dbg !109 { +define internal fastcc void @"func_MyStruct#initialize.cold.1"(i64 %0) unnamed_addr #12 !dbg !99 { newFuncRoot: - tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !111 - unreachable, !dbg !111 + tail call void @sorbet_cast_failure(i64 %0, i8* noundef getelementptr inbounds ([4 x i8], [4 x i8]* @str_sig, i64 0, i64 0), i8* noundef getelementptr inbounds ([8 x i8], [8 x i8]* @str_Integer, i64 0, i64 0)) #1, !dbg !101 + unreachable, !dbg !101 } ; Function Attrs: nofree nosync nounwind willreturn @@ -930,7 +900,7 @@ declare void @llvm.assume(i1 noundef) #13 define linkonce void @"const_recompute_T::Struct"() local_unnamed_addr #14 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"str_T::Struct", i64 0, i64 0), i64 9) store i64 %1, i64* @"guarded_const_T::Struct", align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !59 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !48 store i64 %2, i64* @"guard_epoch_T::Struct", align 8 ret void } @@ -939,7 +909,7 @@ define linkonce void @"const_recompute_T::Struct"() local_unnamed_addr #14 { define linkonce void @const_recompute_MyStruct() local_unnamed_addr #14 { %1 = tail call i64 @sorbet_getConstant(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @str_MyStruct, i64 0, i64 0), i64 8) store i64 %1, i64* @guarded_const_MyStruct, align 8 - %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !59 + %2 = load i64, i64* @ruby_vm_global_constant_state, align 8, !tbaa !48 store i64 %2, i64* @guard_epoch_MyStruct, align 8 ret void } @@ -1014,69 +984,59 @@ attributes #19 = { noinline } !43 = !{!44, !29, i64 16} !44 = !{!"rb_control_frame_struct", !29, i64 0, !29, i64 8, !29, i64 16, !5, i64 24, !29, i64 32, !29, i64 40, !29, i64 48} !45 = !{!44, !29, i64 32} -!46 = !{!47, !29, i64 16} -!47 = !{!"rb_iseq_struct", !5, i64 0, !5, i64 8, !29, i64 16, !6, i64 24} -!48 = !{!49, !29, i64 8} -!49 = !{!"rb_iseq_constant_body", !6, i64 0, !35, i64 4, !29, i64 8, !50, i64 16, !52, i64 64, !55, i64 120, !29, i64 152, !29, i64 160, !29, i64 168, !29, i64 176, !29, i64 184, !29, i64 192, !56, i64 200, !35, i64 232, !35, i64 236, !35, i64 240, !35, i64 244, !35, i64 248, !6, i64 252, !5, i64 256} -!50 = !{!"", !51, i64 0, !35, i64 4, !35, i64 8, !35, i64 12, !35, i64 16, !35, i64 20, !35, i64 24, !35, i64 28, !29, i64 32, !29, i64 40} -!51 = !{!"", !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 1, !35, i64 1} -!52 = !{!"rb_iseq_location_struct", !5, i64 0, !5, i64 8, !5, i64 16, !5, i64 24, !35, i64 32, !53, i64 36} -!53 = !{!"rb_code_location_struct", !54, i64 0, !54, i64 8} -!54 = !{!"rb_code_position_struct", !35, i64 0, !35, i64 4} -!55 = !{!"iseq_insn_info", !29, i64 0, !29, i64 8, !35, i64 16, !29, i64 24} -!56 = !{!"", !5, i64 0, !5, i64 8, !5, i64 16, !29, i64 24} -!57 = !DILocation(line: 0, scope: !14) -!58 = !DILocation(line: 5, column: 1, scope: !14) -!59 = !{!36, !36, i64 0} -!60 = !{!"branch_weights", i32 1, i32 10000} -!61 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) -!62 = !{!63, !35, i64 4} -!63 = !{!"rb_sorbet_param_struct", !51, i64 0, !35, i64 4, !35, i64 8, !35, i64 12, !35, i64 16, !35, i64 20, !35, i64 24, !35, i64 28, !29, i64 32, !35, i64 40, !35, i64 44, !35, i64 48, !35, i64 52, !29, i64 56} -!64 = !{!63, !35, i64 40} -!65 = !{!63, !35, i64 44} -!66 = !{!63, !35, i64 48} -!67 = !{!63, !29, i64 56} -!68 = !DILocation(line: 6, column: 9, scope: !9, inlinedAt: !13) -!69 = !{!44, !29, i64 8} -!70 = !DILocation(line: 5, column: 18, scope: !14) -!71 = !DILocation(line: 9, column: 26, scope: !14) -!72 = !DILocation(line: 11, column: 5, scope: !14) -!73 = !{!"branch_weights", i32 1, i32 2000} -!74 = !{!"branch_weights", i32 1073205, i32 2146410443} -!75 = !{!76, !5, i64 0} -!76 = !{!"RBasic", !5, i64 0, !5, i64 8} -!77 = !{!"branch_weights", i32 2000, i32 1} -!78 = !{!79} -!79 = distinct !{!79, !80, !"sorbet_rb_int_lt: argument 0"} -!80 = distinct !{!80, !"sorbet_rb_int_lt"} -!81 = !{!82} -!82 = distinct !{!82, !80, !"sorbet_rb_int_lt: argument 0:thread"} -!83 = !{!84} -!84 = distinct !{!84, !85, !"sorbet_rb_int_plus: argument 0"} -!85 = distinct !{!85, !"sorbet_rb_int_plus"} -!86 = !{!"branch_weights", i32 4001, i32 4000000} -!87 = distinct !DISubprogram(name: "MyStruct#initialize", linkageName: "func_MyStruct#initialize", scope: null, file: !2, line: 5, type: !10, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) -!88 = !DILocation(line: 5, column: 1, scope: !87) -!89 = !DILocation(line: 0, scope: !87) -!90 = !DILocation(line: 6, column: 3, scope: !87) -!91 = !{!6, !6, i64 0} -!92 = !{!93, !5, i64 16} -!93 = !{!"st_table", !6, i64 0, !6, i64 1, !6, i64 2, !35, i64 4, !29, i64 8, !5, i64 16, !29, i64 24, !5, i64 32, !5, i64 40, !29, i64 48} -!94 = !DILocation(line: 6, column: 10, scope: !87) -!95 = !{!96} -!96 = distinct !{!96, !97, !"sorbet_callSuper: argument 0"} -!97 = distinct !{!97, !"sorbet_callSuper"} -!98 = !{!44, !5, i64 24} -!99 = !{!100, !5, i64 8} -!100 = !{!"rb_callable_method_entry_struct", !5, i64 0, !5, i64 8, !29, i64 16, !5, i64 24, !5, i64 32} -!101 = !{!102, !29, i64 24} -!102 = !{!"RClass", !76, i64 0, !5, i64 16, !29, i64 24, !36, i64 32} -!103 = !{!104, !5, i64 64} -!104 = !{!"rb_classext_struct", !29, i64 0, !29, i64 8, !29, i64 16, !29, i64 24, !29, i64 32, !29, i64 40, !29, i64 48, !29, i64 56, !5, i64 64, !5, i64 72, !29, i64 80, !5, i64 88} -!105 = !{!102, !5, i64 16} -!106 = !{!100, !29, i64 16} -!107 = !{!108, !5, i64 32} -!108 = !{!"rb_method_definition_struct", !6, i64 0, !35, i64 0, !35, i64 4, !6, i64 8, !5, i64 32, !5, i64 40} -!109 = distinct !DISubprogram(name: "func_MyStruct#initialize.cold.1", linkageName: "func_MyStruct#initialize.cold.1", scope: null, file: !2, type: !110, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) -!110 = !DISubroutineType(types: !3) -!111 = !DILocation(line: 6, column: 3, scope: !109) +!46 = !DILocation(line: 0, scope: !14) +!47 = !DILocation(line: 5, column: 1, scope: !14) +!48 = !{!36, !36, i64 0} +!49 = !{!"branch_weights", i32 1, i32 10000} +!50 = !DILocation(line: 6, column: 3, scope: !9, inlinedAt: !13) +!51 = !{!52, !35, i64 4} +!52 = !{!"rb_sorbet_param_struct", !53, i64 0, !35, i64 4, !35, i64 8, !35, i64 12, !35, i64 16, !35, i64 20, !35, i64 24, !35, i64 28, !29, i64 32, !35, i64 40, !35, i64 44, !35, i64 48, !35, i64 52, !29, i64 56} +!53 = !{!"", !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 0, !35, i64 1, !35, i64 1} +!54 = !{!52, !35, i64 40} +!55 = !{!52, !35, i64 44} +!56 = !{!52, !35, i64 48} +!57 = !{!52, !29, i64 56} +!58 = !DILocation(line: 6, column: 9, scope: !9, inlinedAt: !13) +!59 = !{!44, !29, i64 8} +!60 = !DILocation(line: 5, column: 18, scope: !14) +!61 = !DILocation(line: 9, column: 26, scope: !14) +!62 = !DILocation(line: 11, column: 5, scope: !14) +!63 = !{!"branch_weights", i32 1, i32 2000} +!64 = !{!"branch_weights", i32 1073205, i32 2146410443} +!65 = !{!66, !5, i64 0} +!66 = !{!"RBasic", !5, i64 0, !5, i64 8} +!67 = !{!"branch_weights", i32 2000, i32 1} +!68 = !{!69} +!69 = distinct !{!69, !70, !"sorbet_rb_int_lt: argument 0"} +!70 = distinct !{!70, !"sorbet_rb_int_lt"} +!71 = !{!72} +!72 = distinct !{!72, !70, !"sorbet_rb_int_lt: argument 0:thread"} +!73 = !{!74} +!74 = distinct !{!74, !75, !"sorbet_rb_int_plus: argument 0"} +!75 = distinct !{!75, !"sorbet_rb_int_plus"} +!76 = !{!"branch_weights", i32 4001, i32 4000000} +!77 = distinct !DISubprogram(name: "MyStruct#initialize", linkageName: "func_MyStruct#initialize", scope: null, file: !2, line: 5, type: !10, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3) +!78 = !DILocation(line: 5, column: 1, scope: !77) +!79 = !DILocation(line: 0, scope: !77) +!80 = !DILocation(line: 6, column: 3, scope: !77) +!81 = !{!6, !6, i64 0} +!82 = !{!83, !5, i64 16} +!83 = !{!"st_table", !6, i64 0, !6, i64 1, !6, i64 2, !35, i64 4, !29, i64 8, !5, i64 16, !29, i64 24, !5, i64 32, !5, i64 40, !29, i64 48} +!84 = !DILocation(line: 6, column: 10, scope: !77) +!85 = !{!86} +!86 = distinct !{!86, !87, !"sorbet_callSuper: argument 0"} +!87 = distinct !{!87, !"sorbet_callSuper"} +!88 = !{!44, !5, i64 24} +!89 = !{!90, !5, i64 8} +!90 = !{!"rb_callable_method_entry_struct", !5, i64 0, !5, i64 8, !29, i64 16, !5, i64 24, !5, i64 32} +!91 = !{!92, !29, i64 24} +!92 = !{!"RClass", !66, i64 0, !5, i64 16, !29, i64 24, !36, i64 32} +!93 = !{!94, !5, i64 64} +!94 = !{!"rb_classext_struct", !29, i64 0, !29, i64 8, !29, i64 16, !29, i64 24, !29, i64 32, !29, i64 40, !29, i64 48, !29, i64 56, !5, i64 64, !5, i64 72, !29, i64 80, !5, i64 88} +!95 = !{!92, !5, i64 16} +!96 = !{!90, !29, i64 16} +!97 = !{!98, !5, i64 32} +!98 = !{!"rb_method_definition_struct", !6, i64 0, !35, i64 0, !35, i64 4, !6, i64 8, !5, i64 32, !5, i64 40} +!99 = distinct !DISubprogram(name: "func_MyStruct#initialize.cold.1", linkageName: "func_MyStruct#initialize.cold.1", scope: null, file: !2, type: !100, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !3) +!100 = !DISubroutineType(types: !3) +!101 = !DILocation(line: 6, column: 3, scope: !99)