Skip to content

Commit 49e8ffb

Browse files
committed
IRGen: Outline by-address SIL enum instructions
Use a heuristic to decide when to outline indirect enum operations.
1 parent a48dc87 commit 49e8ffb

12 files changed

+373
-25
lines changed

docs/ABI/Mangling.rst

+3
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,9 @@ with a differentiable function used for differentiable programming.
331331
global ::= generic-signature? type 'WOd' // Outlined assignWithTake
332332
global ::= generic-signature? type 'WOf' // Outlined assignWithCopy
333333
global ::= generic-signature? type 'WOh' // Outlined destroy
334+
global ::= generic-signature? type 'WOi` // Outlined store enum tag
335+
global ::= generic-signature? type 'WOj` // Outlined enum destructive project
336+
global ::= generic-signature? type 'WOg` // Outlined enum get tag
334337

335338
Entities
336339
~~~~~~~~

include/swift/Demangling/DemangleNodes.def

+4
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ NODE(HasSymbolQuery)
371371
NODE(OpaqueReturnTypeIndex)
372372
NODE(OpaqueReturnTypeParent)
373373

374+
// Addedn in Swift 5.11
375+
NODE(OutlinedEnumTagStore)
376+
NODE(OutlinedEnumProjectDataForLoad)
377+
NODE(OutlinedEnumGetTag)
374378
// Added in Swift 5.9 + 1
375379
NODE(AsyncRemoved)
376380

lib/Demangling/Demangler.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -3472,6 +3472,33 @@ NodePointer Demangler::demangleWitness() {
34723472
return createWithChild(Node::Kind::OutlinedDestroy,
34733473
popNode(Node::Kind::Type));
34743474
}
3475+
case 'g': {
3476+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
3477+
return createWithChildren(Node::Kind::OutlinedEnumGetTag,
3478+
popNode(Node::Kind::Type), sig);
3479+
return createWithChild(Node::Kind::OutlinedEnumGetTag,
3480+
popNode(Node::Kind::Type));
3481+
}
3482+
3483+
case 'i': {
3484+
auto enumCaseIdx = demangleIndexAsNode();
3485+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
3486+
return createWithChildren(Node::Kind::OutlinedEnumTagStore,
3487+
popNode(Node::Kind::Type), sig,
3488+
enumCaseIdx);
3489+
return createWithChildren(Node::Kind::OutlinedEnumTagStore,
3490+
popNode(Node::Kind::Type), enumCaseIdx);
3491+
}
3492+
case 'j': {
3493+
auto enumCaseIdx = demangleIndexAsNode();
3494+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
3495+
return createWithChildren(Node::Kind::OutlinedEnumProjectDataForLoad,
3496+
popNode(Node::Kind::Type), sig,
3497+
enumCaseIdx);
3498+
return createWithChildren(Node::Kind::OutlinedEnumProjectDataForLoad,
3499+
popNode(Node::Kind::Type), enumCaseIdx);
3500+
}
3501+
34753502
default:
34763503
return nullptr;
34773504
}

lib/Demangling/NodePrinter.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,9 @@ class NodePrinter {
573573
case Node::Kind::OutlinedAssignWithTake:
574574
case Node::Kind::OutlinedAssignWithCopy:
575575
case Node::Kind::OutlinedDestroy:
576+
case Node::Kind::OutlinedEnumTagStore:
577+
case Node::Kind::OutlinedEnumGetTag:
578+
case Node::Kind::OutlinedEnumProjectDataForLoad:
576579
case Node::Kind::OutlinedVariable:
577580
case Node::Kind::OutlinedReadOnlyObject:
578581
case Node::Kind::AssocTypePath:
@@ -1393,6 +1396,18 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
13931396
Printer << "outlined destroy of ";
13941397
print(Node->getChild(0), depth + 1);
13951398
return nullptr;
1399+
case Node::Kind::OutlinedEnumProjectDataForLoad:
1400+
Printer << "outlined enum project data for load of ";
1401+
print(Node->getChild(0), depth + 1);
1402+
return nullptr;
1403+
case Node::Kind::OutlinedEnumTagStore:
1404+
Printer << "outlined enum tag store of ";
1405+
print(Node->getChild(0), depth + 1);
1406+
return nullptr;
1407+
case Node::Kind::OutlinedEnumGetTag:
1408+
Printer << "outlined enum get tag of ";
1409+
print(Node->getChild(0), depth + 1);
1410+
return nullptr;
13961411
case Node::Kind::OutlinedVariable:
13971412
Printer << "outlined variable #" << Node->getIndex() << " of ";
13981413
return nullptr;

lib/Demangling/OldRemangler.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -2549,6 +2549,18 @@ ManglingError Remangler::mangleOutlinedDestroy(Node *node, unsigned depth) {
25492549
Buffer << "Wh";
25502550
return mangleSingleChildNode(node, depth + 1);
25512551
}
2552+
ManglingError Remangler::mangleOutlinedEnumTagStore(Node *node, unsigned depth) {
2553+
Buffer << "Wi";
2554+
return mangleSingleChildNode(node, depth + 1);
2555+
}
2556+
ManglingError Remangler::mangleOutlinedEnumGetTag(Node *node, unsigned depth) {
2557+
Buffer << "Wg";
2558+
return mangleSingleChildNode(node, depth + 1);
2559+
}
2560+
ManglingError Remangler::mangleOutlinedEnumProjectDataForLoad(Node *node, unsigned depth) {
2561+
Buffer << "Wj";
2562+
return mangleSingleChildNode(node, depth + 1);
2563+
}
25522564

25532565
ManglingError Remangler::mangleOutlinedVariable(Node *node, unsigned depth) {
25542566
Buffer << "Tv" << node->getIndex();

lib/Demangling/Remangler.cpp

+39-1
Original file line numberDiff line numberDiff line change
@@ -3309,7 +3309,45 @@ ManglingError Remangler::mangleOutlinedDestroy(Node *node, unsigned depth) {
33093309
Buffer << "WOh";
33103310
return ManglingError::Success;
33113311
}
3312-
3312+
ManglingError Remangler::mangleOutlinedEnumGetTag(Node *node, unsigned depth) {
3313+
RETURN_IF_ERROR(mangleChildNodes(node, depth + 1));
3314+
Buffer << "WOg";
3315+
return ManglingError::Success;
3316+
}
3317+
ManglingError Remangler::mangleOutlinedEnumProjectDataForLoad(Node *node, unsigned depth) {
3318+
if (node->getNumChildren() == 2) {
3319+
auto ty = node->getChild(0);
3320+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3321+
Buffer << "WOj";
3322+
mangleIndex(node->getChild(1)->getIndex());
3323+
return ManglingError::Success;
3324+
} else {
3325+
auto ty = node->getChild(0);
3326+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3327+
auto sig = node->getChild(1);
3328+
RETURN_IF_ERROR(mangle(sig, depth + 1));
3329+
Buffer << "WOj";
3330+
mangleIndex(node->getChild(2)->getIndex());
3331+
return ManglingError::Success;
3332+
}
3333+
}
3334+
ManglingError Remangler::mangleOutlinedEnumTagStore(Node *node, unsigned depth) {
3335+
if (node->getNumChildren() == 2) {
3336+
auto ty = node->getChild(0);
3337+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3338+
Buffer << "WOi";
3339+
mangleIndex(node->getChild(1)->getIndex());
3340+
return ManglingError::Success;
3341+
} else {
3342+
auto ty = node->getChild(0);
3343+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3344+
auto sig = node->getChild(1);
3345+
RETURN_IF_ERROR(mangle(sig, depth + 1));
3346+
Buffer << "WOi";
3347+
mangleIndex(node->getChild(2)->getIndex());
3348+
return ManglingError::Success;
3349+
}
3350+
}
33133351
ManglingError Remangler::mangleOutlinedVariable(Node *node, unsigned depth) {
33143352
Buffer << "Tv";
33153353
mangleIndex(node->getIndex());

0 commit comments

Comments
 (0)