@@ -2998,7 +2998,8 @@ namespace {
2998
2998
}
2999
2999
3000
3000
static void runPeepholesAndReg2Mem (SILPassManager *pm, SILModule *silMod,
3001
- IRGenModule *irgenModule);
3001
+ IRGenModule *irgenModule,
3002
+ LargeSILTypeMapper &mapperCache);
3002
3003
3003
3004
// / The entry point to this function transformation.
3004
3005
void LoadableByAddress::run () {
@@ -3010,7 +3011,8 @@ void LoadableByAddress::run() {
3010
3011
runOnFunction (&F);
3011
3012
3012
3013
if (modFuncs.empty () && modApplies.empty ()) {
3013
- runPeepholesAndReg2Mem (getPassManager (), getModule (), getIRGenModule ());
3014
+ runPeepholesAndReg2Mem (getPassManager (), getModule (), getIRGenModule (),
3015
+ MapperCache);
3014
3016
return ;
3015
3017
}
3016
3018
@@ -3248,7 +3250,8 @@ void LoadableByAddress::run() {
3248
3250
storeToBlockStorageInstrs.clear ();
3249
3251
3250
3252
getPassManager ()->invalidateAllAnalysis ();
3251
- runPeepholesAndReg2Mem (getPassManager (), getModule (), getIRGenModule ());
3253
+ runPeepholesAndReg2Mem (getPassManager (), getModule (), getIRGenModule (),
3254
+ MapperCache);
3252
3255
}
3253
3256
3254
3257
namespace {
@@ -3396,11 +3399,13 @@ class AddressAssignment {
3396
3399
GenericEnvironment *genEnv;
3397
3400
IRGenModule *irgenModule;
3398
3401
SILFunction &currFn;
3402
+ LargeSILTypeMapper &mapperCache;
3399
3403
3400
3404
public:
3401
3405
AddressAssignment (IRGenModule *irgenModule, GenericEnvironment *genEnv,
3402
- SILFunction &currFn)
3403
- : genEnv(genEnv), irgenModule(irgenModule), currFn(currFn) {}
3406
+ SILFunction &currFn, LargeSILTypeMapper &mapperCache)
3407
+ : genEnv(genEnv), irgenModule(irgenModule), currFn(currFn),
3408
+ mapperCache (mapperCache) {}
3404
3409
3405
3410
void assign (SILInstruction *inst);
3406
3411
@@ -3456,6 +3461,11 @@ class AddressAssignment {
3456
3461
return false ;
3457
3462
}
3458
3463
3464
+ SILType getNewSILType (CanSILFunctionType fnTy, SILType type) {
3465
+ return mapperCache.getNewSILType (getSubstGenericEnvironment (fnTy), type,
3466
+ *irgenModule);
3467
+ }
3468
+
3459
3469
bool isLargeLoadableType (SILType ty) {
3460
3470
if (ty.isAddress () || ty.isClassOrClassMetatype ()) {
3461
3471
return false ;
@@ -4077,9 +4087,15 @@ class RewriteUser : SILInstructionVisitor<RewriteUser> {
4077
4087
" caseBB has a payload argument" );
4078
4088
4079
4089
SILBuilder caseBuilder = assignment.getBuilder (caseBB->begin ());
4090
+ SILType eltType =
4091
+ opdAddr->getType ().getEnumElementType (caseDecl,
4092
+ caseBuilder.getModule (),
4093
+ caseBuilder.getTypeExpansionContext ());
4094
+ SILType mappedEltType =
4095
+ assignment.getNewSILType (sw->getFunction ()->getLoweredFunctionType (),
4096
+ eltType);
4080
4097
auto *caseAddr =
4081
- caseBuilder.createUncheckedTakeEnumDataAddr (loc, opdAddr, caseDecl);
4082
-
4098
+ caseBuilder.createUncheckedTakeEnumDataAddr (loc, opdAddr, caseDecl, mappedEltType);
4083
4099
if (assignment.isLargeLoadableType (caseArg->getType ())) {
4084
4100
assignment.mapValueToAddress (caseArg, caseAddr);
4085
4101
assignment.markBlockArgumentForDeletion (caseBB);
@@ -4274,7 +4290,8 @@ void AddressAssignment::assign(SILInstruction *inst) {
4274
4290
}
4275
4291
4276
4292
static void runPeepholesAndReg2Mem (SILPassManager *pm, SILModule *silMod,
4277
- IRGenModule *irgenModule) {
4293
+ IRGenModule *irgenModule,
4294
+ LargeSILTypeMapper &mapperCache) {
4278
4295
4279
4296
if (!irgenModule->getOptions ().EnableLargeLoadableTypesReg2Mem )
4280
4297
return ;
@@ -4301,7 +4318,7 @@ static void runPeepholesAndReg2Mem(SILPassManager *pm, SILModule *silMod,
4301
4318
// Delete replaced instructions.
4302
4319
opts.deleteInstructions ();
4303
4320
4304
- AddressAssignment assignment (irgenModule, genEnv, currF);
4321
+ AddressAssignment assignment (irgenModule, genEnv, currF, mapperCache );
4305
4322
4306
4323
// Assign addresses to basic block arguments.
4307
4324
0 commit comments