void swift:: addRetainsForConvertedDirectResults(SILBuilder &Builder, SILLocation Loc, SILValue ReturnValue, SILInstruction *AI, ArrayRef<ResultDescriptor> DirectResults) { for (auto I : indices(DirectResults)) { auto &RV = DirectResults[I]; if (RV.CalleeRetain.empty()) continue; bool IsSelfRecursionEpilogueRetain = false; for (auto &X : RV.CalleeRetain) { IsSelfRecursionEpilogueRetain |= (AI == X); } // We do not create a retain if this ApplyInst is a self-recursion. if (IsSelfRecursionEpilogueRetain) continue; // Extract the return value if necessary. SILValue SpecificResultValue = ReturnValue; if (DirectResults.size() != 1) SpecificResultValue = Builder.createTupleExtract(Loc, ReturnValue, I); Builder.createRetainValue(Loc, SpecificResultValue); } }
void FunctionSignatureTransform:: OwnedToGuaranteedAddResultRelease(ResultDescriptor &RD, SILBuilder &Builder, SILFunction *F) { // If we have any result that were consumed but are now guaranteed, // insert a release_value. if (!RD.OwnedToGuaranteed) { return; } SILInstruction *Call = findOnlyApply(F); if (isa<ApplyInst>(Call)) { Builder.setInsertionPoint(&*std::next(SILBasicBlock::iterator(Call))); Builder.createRetainValue(RegularLocation(SourceLoc()), Call, Builder.getDefaultAtomicity()); } else { SILBasicBlock *NormalBB = dyn_cast<TryApplyInst>(Call)->getNormalBB(); Builder.setInsertionPoint(&*NormalBB->begin()); Builder.createRetainValue(RegularLocation(SourceLoc()), NormalBB->getArgument(0), Builder.getDefaultAtomicity()); } }
static void addRetainsForConvertedDirectResults(SILBuilder &Builder, SILLocation Loc, SILValue ReturnValue, ArrayRef<ResultDescriptor> DirectResults) { for (auto I : indices(DirectResults)) { auto &RV = DirectResults[I]; if (RV.CalleeRetain.empty()) continue; // Extract the return value if necessary. SILValue SpecificResultValue = ReturnValue; if (DirectResults.size() != 1) SpecificResultValue = Builder.createTupleExtract(Loc, ReturnValue, I); Builder.createRetainValue(Loc, SpecificResultValue); } }