Skip to content

Commit 7100a09

Browse files
committed
IRGen: Properly communicate ownership to IRGen from the LoadableByAddress pass
Communicate to IRGen whether a indirect promoted value was guaranteed or owned rdar://35674625
1 parent cac8375 commit 7100a09

File tree

3 files changed

+13
-11
lines changed

3 files changed

+13
-11
lines changed

lib/IRGen/GenFunc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,12 +1000,12 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
10001000
auto argConvention = conventions[nextCapturedField++];
10011001
switch (argConvention) {
10021002
case ParameterConvention::Indirect_In:
1003+
case ParameterConvention::Indirect_In_Constant:
10031004
case ParameterConvention::Direct_Owned:
10041005
if (!consumesContext) subIGF.emitNativeStrongRetain(rawData, subIGF.getDefaultAtomicity());
10051006
break;
10061007

10071008
case ParameterConvention::Indirect_In_Guaranteed:
1008-
case ParameterConvention::Indirect_In_Constant:
10091009
case ParameterConvention::Direct_Guaranteed:
10101010
dependsOnContextLifetime = true;
10111011
if (outType->getCalleeConvention() ==
@@ -1084,7 +1084,8 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
10841084

10851085
Explosion param;
10861086
switch (fieldConvention) {
1087-
case ParameterConvention::Indirect_In: {
1087+
case ParameterConvention::Indirect_In:
1088+
case ParameterConvention::Indirect_In_Constant: {
10881089
// The +1 argument is passed indirectly, so we need to copy into a
10891090
// temporary.
10901091
needsAllocas = true;
@@ -1101,7 +1102,6 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
11011102
break;
11021103
}
11031104
case ParameterConvention::Indirect_In_Guaranteed:
1104-
case ParameterConvention::Indirect_In_Constant:
11051105
// The argument is +0, so we can use the address of the param in
11061106
// the context directly.
11071107
param.add(fieldAddr.getAddress());

lib/IRGen/LoadableByAddress.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,12 @@ getNewParameter(GenericEnvironment *env, SILParameterInfo param,
283283
return param;
284284
}
285285
} else if (isLargeLoadableType(env, storageType, IGM)) {
286-
return SILParameterInfo(storageType.getSwiftRValueType(),
287-
ParameterConvention::Indirect_In_Constant);
286+
if (param.getConvention() == ParameterConvention::Direct_Guaranteed)
287+
return SILParameterInfo(storageType.getSwiftRValueType(),
288+
ParameterConvention::Indirect_In_Guaranteed);
289+
else
290+
return SILParameterInfo(storageType.getSwiftRValueType(),
291+
ParameterConvention::Indirect_In_Constant);
288292
} else {
289293
return param;
290294
}

test/IRGen/indirect_argument.sil

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,9 @@ entry(%o : $*Huge, %x : $Huge):
6868
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
6969
// CHECK: call swiftcc void @_T024huge_partial_applicationTA(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0, %swift.refcounted* swiftself [[CLOSURE]])
7070
// CHECK: define internal swiftcc void @_T024huge_partial_applicationTA(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}), %swift.refcounted* swiftself)
71-
// CHECK: [[T0:%.*]] = bitcast %swift.refcounted* %1
72-
// CHECK: [[T2:%.*]] = getelementptr inbounds {{.*}}[[T0]], i32 0, i32 1
71+
// CHECK: [[TMP_ARG:%.*]] = alloca
7372
// CHECK-NOT: tail
74-
// CHECK: call swiftcc void @huge_partial_application(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) [[T2]])
73+
// CHECK: call swiftcc void @huge_partial_application(%T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]])
7574
sil @huge_partial_application : $@convention(thin) (Huge, Huge) -> () {
7675
entry(%x : $Huge, %y : $Huge):
7776
%f = function_ref @huge_partial_application : $@convention(thin) (Huge, Huge) -> ()
@@ -86,10 +85,9 @@ entry(%x : $Huge, %y : $Huge):
8685
// CHECK: bitcast %swift.refcounted* [[CLOSURE]] to <{ %swift.refcounted, %T17indirect_argument4HugeV }>*
8786
// CHECK: call swiftcc void @_T030huge_partial_application_stretTA(%T17indirect_argument4HugeV* noalias nocapture sret [[TMP_RET]], %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1, %swift.refcounted* swiftself [[CLOSURE]])
8887
// CHECK: define internal swiftcc void @_T030huge_partial_application_stretTA(%T17indirect_argument4HugeV* noalias nocapture sret, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}), %swift.refcounted* swiftself)
89-
// CHECK: [[T0:%.*]] = bitcast %swift.refcounted* %2
90-
// CHECK: [[T2:%.*]] = getelementptr inbounds {{.*}}[[T0]], i32 0, i32 1
88+
// CHECK: [[TMP_ARG:%.*]] = alloca
9189
// CHECK-NOT: tail
92-
// CHECK: call swiftcc void @huge_partial_application_stret(%T17indirect_argument4HugeV* noalias nocapture sret %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) [[T2]])
90+
// CHECK: call swiftcc void @huge_partial_application_stret(%T17indirect_argument4HugeV* noalias nocapture sret %0, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) %1, %T17indirect_argument4HugeV* noalias nocapture dereferenceable({{.*}}) [[TMP_ARG]])
9391
sil @huge_partial_application_stret : $@convention(thin) (Huge, Huge) -> Huge {
9492
entry(%x : $Huge, %y : $Huge):
9593
%f = function_ref @huge_partial_application_stret : $@convention(thin) (Huge, Huge) -> Huge

0 commit comments

Comments
 (0)