1717// ===----------------------------------------------------------------------===//
1818
1919#define DEBUG_TYPE " loadable-address"
20+ #include " Explosion.h"
2021#include " FixedTypeInfo.h"
2122#include " IRGenMangler.h"
2223#include " IRGenModule.h"
@@ -3431,6 +3432,29 @@ class AddressAssignment {
34313432 toDeleteBlockArg.push_back (std::make_pair (b, argIdx));
34323433 }
34333434
3435+ bool isPotentiallyCArray (SILType ty) {
3436+ if (ty.isAddress () || ty.isClassOrClassMetatype ()) {
3437+ return false ;
3438+ }
3439+
3440+ auto canType = ty.getASTType ();
3441+ if (canType->hasTypeParameter ()) {
3442+ assert (genEnv && " Expected a GenericEnv" );
3443+ canType = genEnv->mapTypeIntoContext (canType)->getCanonicalType ();
3444+ }
3445+
3446+ if (canType.getAnyGeneric () || isa<TupleType>(canType)) {
3447+ assert (ty.isObject () &&
3448+ " Expected only two categories: address and object" );
3449+ assert (!canType->hasTypeParameter ());
3450+ const TypeInfo &TI = irgenModule->getTypeInfoForLowered (canType);
3451+ auto explosionSchema = TI.getSchema ();
3452+ if (explosionSchema.size () > 15 )
3453+ return true ;
3454+ }
3455+ return false ;
3456+ }
3457+
34343458 bool isLargeLoadableType (SILType ty) {
34353459 if (ty.isAddress () || ty.isClassOrClassMetatype ()) {
34363460 return false ;
@@ -3448,7 +3472,11 @@ class AddressAssignment {
34483472 assert (!canType->hasTypeParameter ());
34493473 const TypeInfo &TI = irgenModule->getTypeInfoForLowered (canType);
34503474 auto &nativeSchemaOrigParam = TI.nativeParameterValueSchema (*irgenModule);
3451- return nativeSchemaOrigParam.size () > 15 ;
3475+ if (nativeSchemaOrigParam.size () > 15 )
3476+ return true ;
3477+ auto explosionSchema = TI.getSchema ();
3478+ if (explosionSchema.size () > 15 )
3479+ return true ;
34523480 }
34533481 return false ;
34543482 }
@@ -3764,7 +3792,7 @@ class AssignAddressToDef : SILInstructionVisitor<AssignAddressToDef> {
37643792 builder.createStore (bc->getLoc (), bc->getOperand (), opdAddr,
37653793 StoreOwnershipQualifier::Unqualified);
37663794 assignment.mapValueToAddress (origValue, addr);
3767-
3795+ assignment. markForDeletion (bc);
37683796 return ;
37693797 }
37703798 auto opdAddr = assignment.getAddressForValue (bc->getOperand ());
@@ -3926,7 +3954,9 @@ class RewriteUser : SILInstructionVisitor<RewriteUser> {
39263954 }
39273955
39283956 void visitDebugValueInst (DebugValueInst *dbg) {
3929- if (!dbg->hasAddrVal () && overlapsWithOnStackDebugLoc (dbg->getOperand ())) {
3957+ if (!dbg->hasAddrVal () &&
3958+ (assignment.isPotentiallyCArray (dbg->getOperand ()->getType ()) ||
3959+ overlapsWithOnStackDebugLoc (dbg->getOperand ()))) {
39303960 assignment.markForDeletion (dbg);
39313961 return ;
39323962 }
0 commit comments