Skip to content

Commit 09767c0

Browse files
author
Joe Shajrawi
authored
Merge pull request #9399 from apple/arg_param_mismatch_cherrypick
Merge pull request #9393 from shajrawi/arg_param_mismatch
2 parents 6fc36e5 + f401e53 commit 09767c0

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

lib/IRGen/LoadableByAddress.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,9 @@ static SILType getNewOptionalFunctionType(GenericEnvironment *GenericEnv,
249249
auto newType = OptionalType::get(optKind, currCanType);
250250
CanType newCanType = newType->getCanonicalType();
251251
newSILType = SILType::getPrimitiveObjectType(newCanType);
252+
if (storageType.isAddress()) {
253+
newSILType = newSILType.getAddressType();
254+
}
252255
}
253256
}
254257
}
@@ -276,6 +279,9 @@ getNewArgTys(GenericEnvironment *GenericEnv, ArrayRef<SILParameterInfo> params,
276279
currSILFunctionType->getParameters(), Mod)) {
277280
SILType newSILType =
278281
getNewSILFunctionType(GenericEnv, currSILFunctionType, Mod);
282+
if (storageType.isAddress()) {
283+
newSILType = newSILType.getAddressType();
284+
}
279285
auto newParam = SILParameterInfo(newSILType.getSwiftRValueType(),
280286
param.getConvention());
281287
newArgTys.push_back(newParam);
@@ -311,6 +317,9 @@ static SILType getNewSILType(GenericEnvironment *GenericEnv,
311317
if (containsLargeLoadable(GenericEnv, currSILFunctionType->getParameters(),
312318
Mod)) {
313319
newSILType = getNewSILFunctionType(GenericEnv, currSILFunctionType, Mod);
320+
if (storageType.isAddress()) {
321+
newSILType = newSILType.getAddressType();
322+
}
314323
}
315324
} else if (isLargeLoadableType(GenericEnv, storageType, Mod)) {
316325
newSILType = storageType.getAddressType();
@@ -427,6 +436,7 @@ void LargeValueVisitor::mapValueStorage() {
427436
case ValueKind::StructElementAddrInst:
428437
case ValueKind::RefTailAddrInst:
429438
case ValueKind::RefElementAddrInst:
439+
case ValueKind::BeginAccessInst:
430440
case ValueKind::EnumInst: {
431441
// TODO Any more instructions to add here?
432442
visitResultTyInst(currIns);
@@ -1315,6 +1325,9 @@ static void castTupleInstr(SILInstruction *instr, IRGenModule &Mod) {
13151325
genEnv = getGenericEnvironment(instr->getModule(), canFuncType);
13161326
}
13171327
SILType newSILType = getNewSILFunctionType(genEnv, funcType, Mod);
1328+
if (currSILType.isAddress()) {
1329+
newSILType = newSILType.getAddressType();
1330+
}
13181331
auto II = instr->getIterator();
13191332
++II;
13201333
SILBuilder castBuilder(II);
@@ -1594,6 +1607,13 @@ static void rewriteFunction(StructLoweringState &pass,
15941607
newSILType.getAddressType());
15951608
break;
15961609
}
1610+
case ValueKind::BeginAccessInst: {
1611+
auto *convInstr = dyn_cast<BeginAccessInst>(instr);
1612+
newInstr = resultTyBuilder.createBeginAccess(Loc, convInstr->getOperand(),
1613+
convInstr->getAccessKind(),
1614+
convInstr->getEnforcement());
1615+
break;
1616+
}
15971617
case ValueKind::EnumInst: {
15981618
EnumInst *convInstr = dyn_cast<EnumInst>(instr);
15991619
SILValue operand =

test/IRGen/big_types_corner_cases.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,32 @@ public struct BigStruct {
1212
var i8 : Int32 = 8
1313
}
1414

15+
func takeClosure(execute block: () -> Void) {
16+
}
17+
18+
class OptionalInoutFuncType {
19+
private var lp : BigStruct?
20+
private var _handler : ((BigStruct?, Error?) -> ())?
21+
22+
func execute(_ error: Error?) {
23+
var p : BigStruct?
24+
var handler: ((BigStruct?, Error?) -> ())?
25+
26+
takeClosure {
27+
p = self.lp
28+
handler = self._handler
29+
self._handler = nil
30+
}
31+
32+
handler?(p, error)
33+
}
34+
}
35+
36+
// CHECK-LABEL: define{{( protected)?}} internal swiftcc void @_T022big_types_corner_cases21OptionalInoutFuncTypeC7executeys5Error_pSgFyycfU_(%T22big_types_corner_cases9BigStructVSg* nocapture dereferenceable({{.*}}), %T22big_types_corner_cases21OptionalInoutFuncTypeC*, %T22big_types_corner_cases9BigStructVSgs5Error_pSgIxcx_Sg* nocapture dereferenceable({{.*}})
37+
// CHECK: call void @_T0SqWy
38+
// CHECK: call void @_T0SqWe
39+
// CHECK: ret void
40+
1541
public func f1_returns_BigType(_ x: BigStruct) -> BigStruct {
1642
return x
1743
}
@@ -84,4 +110,4 @@ class Foo {
84110
// CHECK: getelementptr inbounds %T22big_types_corner_cases3FooC, %T22big_types_corner_cases3FooC*
85111
// CHECK: getelementptr inbounds void (i8*, %swift.refcounted*, %T22big_types_corner_cases3FooC*)*, void (i8*, %swift.refcounted*, %T22big_types_corner_cases3FooC*)**
86112
// CHECK: call noalias %swift.refcounted* @swift_rt_swift_allocObject(%swift.type* getelementptr inbounds (%swift.full_boxmetadata, %swift.full_boxmetadata*
87-
// CHECK: ret { i8*, %swift.refcounted* }
113+
// CHECK: ret { i8*, %swift.refcounted* }

0 commit comments

Comments
 (0)