@@ -3495,6 +3495,7 @@ class LargeLoadableHeuristic {
3495
3495
UseAggressiveHeuristic (UseAggressiveHeuristic) {}
3496
3496
3497
3497
void visit (SILInstruction *i);
3498
+ void visit (SILArgument *arg);
3498
3499
3499
3500
bool isLargeLoadableType (SILType ty);
3500
3501
bool isPotentiallyCArray (SILType ty);
@@ -3539,6 +3540,27 @@ class LargeLoadableHeuristic {
3539
3540
};
3540
3541
}
3541
3542
3543
+ void LargeLoadableHeuristic::visit (SILArgument *arg) {
3544
+ auto objType = arg->getType ().getObjectType ();
3545
+ if (numRegisters (objType) < NumRegistersLargeType)
3546
+ return ;
3547
+
3548
+ auto &entry = largeTypeProperties[objType];
3549
+ for (auto *use : arg->getUses ()) {
3550
+ auto *usr = use->getUser ();
3551
+ switch (usr->getKind ()) {
3552
+ case SILInstructionKind::TupleExtractInst:
3553
+ case SILInstructionKind::StructExtractInst: {
3554
+ auto projectionTy = cast<SingleValueInstruction>(usr)->getType ();
3555
+ if (numRegisters (projectionTy) >= NumRegistersLargeType)
3556
+ entry.addProjection ();
3557
+ break ;
3558
+ }
3559
+ default :
3560
+ continue ;
3561
+ }
3562
+ }
3563
+ }
3542
3564
void LargeLoadableHeuristic::visit (SILInstruction *i) {
3543
3565
if (!UseAggressiveHeuristic)
3544
3566
return ;
@@ -4611,6 +4633,9 @@ static void runPeepholesAndReg2Mem(SILPassManager *pm, SILModule *silMod,
4611
4633
UseAggressiveHeuristic);
4612
4634
Peepholes opts (pm, silMod, irgenModule);
4613
4635
for (SILBasicBlock &BB : currF) {
4636
+ for (auto *arg : BB.getArguments ()) {
4637
+ heuristic.visit (arg);
4638
+ }
4614
4639
for (SILInstruction &I : BB) {
4615
4640
heuristic.visit (&I);
4616
4641
if (opts.ignore (&I))
0 commit comments