Skip to content

[TableGen][NFC] Use early exit to simplify large block in emitAction. #138220

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions llvm/test/TableGen/cc-assign-to-reg-tuple.td
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// RUN: llvm-tblgen --gen-callingconv -I %p/../../include -I %p/Common %s 2>&1 | FileCheck %s
// RUN: not llvm-tblgen -DERROR1 --gen-callingconv -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR1 %s
// RUN: not llvm-tblgen -DERROR2 --gen-callingconv -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR2 %s
// RUN: llvm-tblgen -gen-callingconv -I %p/../../include -I %p/Common %s | FileCheck %s
// RUN: not llvm-tblgen -gen-callingconv -DERROR1 -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR1 %s
// RUN: not llvm-tblgen -gen-callingconv -DERROR2 -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR2 %s

include "reg-with-subregs-common.td"

Expand Down
223 changes: 111 additions & 112 deletions llvm/utils/TableGen/CallingConvEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,120 +221,119 @@ void CallingConvEmitter::emitAction(const Record *Action, indent Indent,
O << ") {\n";
emitAction(Action->getValueAsDef("SubAction"), Indent + 2, O);
O << Indent << "}\n";
} else {
if (Action->isSubClassOf("CCDelegateTo")) {
const Record *CC = Action->getValueAsDef("CC");
O << Indent << "if (!" << CC->getName()
<< "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n"
<< Indent + 2 << "return false;\n";
DelegateToMap[CurrentAction].insert(CC->getName().str());
} else if (Action->isSubClassOf("CCAssignToReg") ||
Action->isSubClassOf("CCAssignToRegTuple") ||
Action->isSubClassOf("CCAssignToRegAndStack")) {
const ListInit *RegList = Action->getValueAsListInit("RegList");
for (unsigned I = 0, E = RegList->size(); I != E; ++I) {
std::string Name = getQualifiedRegisterName(RegList->getElement(I));
if (SwiftAction)
AssignedSwiftRegsMap[CurrentAction].insert(std::move(Name));
else
AssignedRegsMap[CurrentAction].insert(std::move(Name));
}
EmitAllocateReg({RegList}, {"RegList"});

if (Action->isSubClassOf("CCAssignToRegAndStack"))
EmitAllocateStack();

O << Indent << " return false;\n";
O << Indent << "}\n";
} else if (Action->isSubClassOf("CCAssignToRegWithShadow")) {
const ListInit *RegList = Action->getValueAsListInit("RegList");
const ListInit *ShadowRegList =
Action->getValueAsListInit("ShadowRegList");
if (!ShadowRegList->empty() && ShadowRegList->size() != RegList->size())
PrintFatalError(Action->getLoc(),
"Invalid length of list of shadowed registers");

EmitAllocateReg({RegList, ShadowRegList}, {"RegList", "RegList"});

O << Indent << " return false;\n";
O << Indent << "}\n";
} else if (Action->isSubClassOf("CCAssignToStack")) {
EmitAllocateStack(/*EmitOffset=*/true);
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
<< Counter << ", LocVT, LocInfo));\n";
O << Indent << "return false;\n";
} else if (Action->isSubClassOf("CCAssignToStackWithShadow")) {
int Size = Action->getValueAsInt("Size");
int Align = Action->getValueAsInt("Align");
const ListInit *ShadowRegList =
Action->getValueAsListInit("ShadowRegList");

unsigned ShadowRegListNumber = ++Counter;
EmitRegList(ShadowRegList, "ShadowRegList" + utostr(ShadowRegListNumber));

O << Indent << "int64_t Offset" << ++Counter << " = State.AllocateStack("
<< Size << ", Align(" << Align << "), "
<< "ShadowRegList" << ShadowRegListNumber << ");\n";
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
<< Counter << ", LocVT, LocInfo));\n";
O << Indent << "return false;\n";
} else if (Action->isSubClassOf("CCPromoteToType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
MVT::SimpleValueType DestVT = getValueType(DestTy);
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
if (MVT(DestVT).isFloatingPoint()) {
O << Indent << "LocInfo = CCValAssign::FPExt;\n";
} else {
O << Indent << "if (ArgFlags.isSExt())\n"
<< Indent << " LocInfo = CCValAssign::SExt;\n"
<< Indent << "else if (ArgFlags.isZExt())\n"
<< Indent << " LocInfo = CCValAssign::ZExt;\n"
<< Indent << "else\n"
<< Indent << " LocInfo = CCValAssign::AExt;\n";
}
} else if (Action->isSubClassOf("CCPromoteToUpperBitsInType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
MVT::SimpleValueType DestVT = getValueType(DestTy);
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
if (MVT(DestVT).isFloatingPoint()) {
PrintFatalError(Action->getLoc(),
"CCPromoteToUpperBitsInType does not handle floating "
"point");
} else {
O << Indent << "if (ArgFlags.isSExt())\n"
<< Indent << " LocInfo = CCValAssign::SExtUpper;\n"
<< Indent << "else if (ArgFlags.isZExt())\n"
<< Indent << " LocInfo = CCValAssign::ZExtUpper;\n"
<< Indent << "else\n"
<< Indent << " LocInfo = CCValAssign::AExtUpper;\n";
}
} else if (Action->isSubClassOf("CCBitConvertToType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
O << Indent << "LocInfo = CCValAssign::BCvt;\n";
} else if (Action->isSubClassOf("CCTruncToType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
O << Indent << "LocInfo = CCValAssign::Trunc;\n";
} else if (Action->isSubClassOf("CCPassIndirect")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
O << Indent << "LocInfo = CCValAssign::Indirect;\n";
} else if (Action->isSubClassOf("CCPassByVal")) {
int Size = Action->getValueAsInt("Size");
int Align = Action->getValueAsInt("Align");
O << Indent << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, " << Size
<< ", Align(" << Align << "), ArgFlags);\n";
O << Indent << "return false;\n";
} else if (Action->isSubClassOf("CCCustom")) {
O << Indent << "if (" << Action->getValueAsString("FuncName")
<< "(ValNo, ValVT, "
<< "LocVT, LocInfo, ArgFlags, State))\n";
O << Indent << " return false;\n";
return;
}

if (Action->isSubClassOf("CCDelegateTo")) {
const Record *CC = Action->getValueAsDef("CC");
O << Indent << "if (!" << CC->getName()
<< "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n"
<< Indent + 2 << "return false;\n";
DelegateToMap[CurrentAction].insert(CC->getName().str());
} else if (Action->isSubClassOf("CCAssignToReg") ||
Action->isSubClassOf("CCAssignToRegTuple") ||
Action->isSubClassOf("CCAssignToRegAndStack")) {
const ListInit *RegList = Action->getValueAsListInit("RegList");
for (unsigned I = 0, E = RegList->size(); I != E; ++I) {
std::string Name = getQualifiedRegisterName(RegList->getElement(I));
if (SwiftAction)
AssignedSwiftRegsMap[CurrentAction].insert(std::move(Name));
else
AssignedRegsMap[CurrentAction].insert(std::move(Name));
}
EmitAllocateReg({RegList}, {"RegList"});

if (Action->isSubClassOf("CCAssignToRegAndStack"))
EmitAllocateStack();

O << Indent << " return false;\n";
O << Indent << "}\n";
} else if (Action->isSubClassOf("CCAssignToRegWithShadow")) {
const ListInit *RegList = Action->getValueAsListInit("RegList");
const ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");
if (!ShadowRegList->empty() && ShadowRegList->size() != RegList->size())
PrintFatalError(Action->getLoc(),
"Invalid length of list of shadowed registers");

EmitAllocateReg({RegList, ShadowRegList}, {"RegList", "RegList"});

O << Indent << " return false;\n";
O << Indent << "}\n";
} else if (Action->isSubClassOf("CCAssignToStack")) {
EmitAllocateStack(/*EmitOffset=*/true);
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
<< Counter << ", LocVT, LocInfo));\n";
O << Indent << "return false;\n";
} else if (Action->isSubClassOf("CCAssignToStackWithShadow")) {
int Size = Action->getValueAsInt("Size");
int Align = Action->getValueAsInt("Align");
const ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");

unsigned ShadowRegListNumber = ++Counter;
EmitRegList(ShadowRegList, "ShadowRegList" + utostr(ShadowRegListNumber));

O << Indent << "int64_t Offset" << ++Counter << " = State.AllocateStack("
<< Size << ", Align(" << Align << "), "
<< "ShadowRegList" << ShadowRegListNumber << ");\n";
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
<< Counter << ", LocVT, LocInfo));\n";
O << Indent << "return false;\n";
} else if (Action->isSubClassOf("CCPromoteToType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
MVT::SimpleValueType DestVT = getValueType(DestTy);
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
if (MVT(DestVT).isFloatingPoint()) {
O << Indent << "LocInfo = CCValAssign::FPExt;\n";
} else {
errs() << *Action;
PrintFatalError(Action->getLoc(), "Unknown CCAction!");
O << Indent << "if (ArgFlags.isSExt())\n"
<< Indent << " LocInfo = CCValAssign::SExt;\n"
<< Indent << "else if (ArgFlags.isZExt())\n"
<< Indent << " LocInfo = CCValAssign::ZExt;\n"
<< Indent << "else\n"
<< Indent << " LocInfo = CCValAssign::AExt;\n";
}
} else if (Action->isSubClassOf("CCPromoteToUpperBitsInType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
MVT::SimpleValueType DestVT = getValueType(DestTy);
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
if (MVT(DestVT).isFloatingPoint()) {
PrintFatalError(Action->getLoc(),
"CCPromoteToUpperBitsInType does not handle floating "
"point");
} else {
O << Indent << "if (ArgFlags.isSExt())\n"
<< Indent << " LocInfo = CCValAssign::SExtUpper;\n"
<< Indent << "else if (ArgFlags.isZExt())\n"
<< Indent << " LocInfo = CCValAssign::ZExtUpper;\n"
<< Indent << "else\n"
<< Indent << " LocInfo = CCValAssign::AExtUpper;\n";
}
} else if (Action->isSubClassOf("CCBitConvertToType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
O << Indent << "LocInfo = CCValAssign::BCvt;\n";
} else if (Action->isSubClassOf("CCTruncToType")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
O << Indent << "LocInfo = CCValAssign::Trunc;\n";
} else if (Action->isSubClassOf("CCPassIndirect")) {
const Record *DestTy = Action->getValueAsDef("DestTy");
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
O << Indent << "LocInfo = CCValAssign::Indirect;\n";
} else if (Action->isSubClassOf("CCPassByVal")) {
int Size = Action->getValueAsInt("Size");
int Align = Action->getValueAsInt("Align");
O << Indent << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, " << Size
<< ", Align(" << Align << "), ArgFlags);\n";
O << Indent << "return false;\n";
} else if (Action->isSubClassOf("CCCustom")) {
O << Indent << "if (" << Action->getValueAsString("FuncName")
<< "(ValNo, ValVT, "
<< "LocVT, LocInfo, ArgFlags, State))\n";
O << Indent << " return false;\n";
} else {
errs() << *Action;
PrintFatalError(Action->getLoc(), "Unknown CCAction!");
}
}

Expand Down