void DtoFinalizeScopeClass(Loc &loc, LLValue *inst, bool hasDtor) { if (!isOptimizationEnabled() || hasDtor) { DtoFinalizeClass(loc, inst); return; } // no dtors => only finalize (via druntime call) if monitor is set, // see https://github.com/ldc-developers/ldc/issues/2515 llvm::BasicBlock *ifbb = gIR->insertBB("if"); llvm::BasicBlock *endbb = gIR->insertBBAfter(ifbb, "endif"); const auto monitor = DtoLoad(DtoGEPi(inst, 0, 1), ".monitor"); const auto hasMonitor = gIR->ir->CreateICmp(llvm::CmpInst::ICMP_NE, monitor, getNullValue(monitor->getType()), ".hasMonitor"); llvm::BranchInst::Create(ifbb, endbb, hasMonitor, gIR->scopebb()); gIR->scope() = IRScope(ifbb); DtoFinalizeClass(loc, inst); gIR->ir->CreateBr(endbb); gIR->scope() = IRScope(endbb); }
DRValue *DLValue::getRVal() { if (DtoIsInMemoryOnly(type)) { llvm_unreachable("getRVal() for memory-only type"); return nullptr; } LLValue *rval = DtoLoad(val); if (type->toBasetype()->ty == Tbool) { assert(rval->getType() == llvm::Type::getInt8Ty(gIR->context())); if (isOptimizationEnabled()) { // attach range metadata for i8 being loaded: [0, 2) llvm::MDBuilder mdBuilder(gIR->context()); llvm::cast<llvm::LoadInst>(rval)->setMetadata( llvm::LLVMContext::MD_range, mdBuilder.createRange(llvm::APInt(8, 0), llvm::APInt(8, 2))); } // truncate to i1 rval = gIR->ir->CreateTrunc(rval, llvm::Type::getInt1Ty(gIR->context())); } return new DImValue(type, rval); }