@@ -842,11 +842,40 @@ SILFunction *SignatureOptimizer::createEmptyFunctionWithOptimizedSig(
842
842
return NewF;
843
843
}
844
844
845
- static void addRetainsForConvertedDirectResults (SILBuilder &Builder,
846
- SILLocation Loc,
847
- SILValue ReturnValue,
848
- SILInstruction *AI,
849
- ArrayRef<ResultDescriptor> DirectResults) {
845
+ static void
846
+ addReleasesForConvertedOwnedParameter (SILBuilder &Builder,
847
+ SILLocation Loc,
848
+ ArrayRef<SILArgument*> Parameters,
849
+ ArrayRef<ArgumentDescriptor> &ArgDescs) {
850
+ // If we have any arguments that were consumed but are now guaranteed,
851
+ // insert a release_value.
852
+ for (auto &ArgDesc : ArgDescs) {
853
+ if (ArgDesc.CalleeRelease .empty ())
854
+ continue ;
855
+ Builder.createReleaseValue (Loc, Parameters[ArgDesc.Index ]);
856
+ }
857
+ }
858
+
859
+ static void
860
+ addReleasesForConvertedOwnedParameter (SILBuilder &Builder,
861
+ SILLocation Loc,
862
+ OperandValueArrayRef Parameters,
863
+ ArrayRef<ArgumentDescriptor> &ArgDescs) {
864
+ // If we have any arguments that were consumed but are now guaranteed,
865
+ // insert a release_value.
866
+ for (auto &ArgDesc : ArgDescs) {
867
+ if (ArgDesc.CalleeRelease .empty ())
868
+ continue ;
869
+ Builder.createReleaseValue (Loc, Parameters[ArgDesc.Index ]);
870
+ }
871
+ }
872
+
873
+ static void
874
+ addRetainsForConvertedDirectResults (SILBuilder &Builder,
875
+ SILLocation Loc,
876
+ SILValue ReturnValue,
877
+ SILInstruction *AI,
878
+ ArrayRef<ResultDescriptor> DirectResults) {
850
879
for (auto I : indices (DirectResults)) {
851
880
auto &RV = DirectResults[I];
852
881
if (RV.CalleeRetain .empty ()) continue ;
@@ -930,13 +959,9 @@ static void rewriteApplyInstToCallNewFunction(SignatureOptimizer &Optimizer,
930
959
TAI->getNormalBB ()->begin ());
931
960
}
932
961
933
- // If we have any arguments that were consumed but are now guaranteed,
934
- // insert a release_value.
935
- for (auto &ArgDesc : ArgDescs) {
936
- if (ArgDesc.CalleeRelease .empty ())
937
- continue ;
938
- Builder.createReleaseValue (Loc, FAS.getArgument (ArgDesc.Index ));
939
- }
962
+ // Add releases for the converted @owned to @guaranteed parameter.
963
+ addReleasesForConvertedOwnedParameter (Builder, Loc, FAS.getArguments (),
964
+ ArgDescs);
940
965
941
966
// If we have converted the return value from @owned to @guaranteed,
942
967
// insert a retain_value at the callsite.
@@ -1008,13 +1033,9 @@ static void createThunkBody(SILBasicBlock *BB, SILFunction *NewF,
1008
1033
ArrayRef<Substitution>(), ThunkArgs, false );
1009
1034
}
1010
1035
1011
- // If we have any arguments that were consumed but are now guaranteed,
1012
- // insert a release_value.
1013
- for (auto &ArgDesc : ArgDescs) {
1014
- if (ArgDesc.CalleeRelease .empty ())
1015
- continue ;
1016
- Builder.createReleaseValue (Loc, BB->getBBArg (ArgDesc.Index ));
1017
- }
1036
+ // Add releases for the converted @owned to @guaranteed parameter.
1037
+ addReleasesForConvertedOwnedParameter (Builder, Loc, BB->getBBArgs (),
1038
+ ArgDescs);
1018
1039
1019
1040
// Handle @owned to @unowned return value conversion.
1020
1041
addRetainsForConvertedDirectResults (Builder, Loc, ReturnValue, nullptr ,
0 commit comments