Skip to content

Commit 9692dff

Browse files
authored
[TableGen][NFC] Use early exit to simplify large block in emitAction. (#138220)
Most of the processing in emitAction is in an unneeded else-block-- reduce indentation by exiting after the recursive call. `XXXGenCallingConv.inc` are identical before and after this patch for all targets.
1 parent 339dc95 commit 9692dff

File tree

2 files changed

+114
-115
lines changed

2 files changed

+114
-115
lines changed

llvm/test/TableGen/cc-assign-to-reg-tuple.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// RUN: llvm-tblgen --gen-callingconv -I %p/../../include -I %p/Common %s 2>&1 | FileCheck %s
2-
// RUN: not llvm-tblgen -DERROR1 --gen-callingconv -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR1 %s
3-
// RUN: not llvm-tblgen -DERROR2 --gen-callingconv -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR2 %s
1+
// RUN: llvm-tblgen -gen-callingconv -I %p/../../include -I %p/Common %s | FileCheck %s
2+
// RUN: not llvm-tblgen -gen-callingconv -DERROR1 -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR1 %s
3+
// RUN: not llvm-tblgen -gen-callingconv -DERROR2 -I %p/../../include -I %p/Common %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR2 %s
44

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

llvm/utils/TableGen/CallingConvEmitter.cpp

Lines changed: 111 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -221,120 +221,119 @@ void CallingConvEmitter::emitAction(const Record *Action, indent Indent,
221221
O << ") {\n";
222222
emitAction(Action->getValueAsDef("SubAction"), Indent + 2, O);
223223
O << Indent << "}\n";
224-
} else {
225-
if (Action->isSubClassOf("CCDelegateTo")) {
226-
const Record *CC = Action->getValueAsDef("CC");
227-
O << Indent << "if (!" << CC->getName()
228-
<< "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n"
229-
<< Indent + 2 << "return false;\n";
230-
DelegateToMap[CurrentAction].insert(CC->getName().str());
231-
} else if (Action->isSubClassOf("CCAssignToReg") ||
232-
Action->isSubClassOf("CCAssignToRegTuple") ||
233-
Action->isSubClassOf("CCAssignToRegAndStack")) {
234-
const ListInit *RegList = Action->getValueAsListInit("RegList");
235-
for (unsigned I = 0, E = RegList->size(); I != E; ++I) {
236-
std::string Name = getQualifiedRegisterName(RegList->getElement(I));
237-
if (SwiftAction)
238-
AssignedSwiftRegsMap[CurrentAction].insert(std::move(Name));
239-
else
240-
AssignedRegsMap[CurrentAction].insert(std::move(Name));
241-
}
242-
EmitAllocateReg({RegList}, {"RegList"});
243-
244-
if (Action->isSubClassOf("CCAssignToRegAndStack"))
245-
EmitAllocateStack();
246-
247-
O << Indent << " return false;\n";
248-
O << Indent << "}\n";
249-
} else if (Action->isSubClassOf("CCAssignToRegWithShadow")) {
250-
const ListInit *RegList = Action->getValueAsListInit("RegList");
251-
const ListInit *ShadowRegList =
252-
Action->getValueAsListInit("ShadowRegList");
253-
if (!ShadowRegList->empty() && ShadowRegList->size() != RegList->size())
254-
PrintFatalError(Action->getLoc(),
255-
"Invalid length of list of shadowed registers");
256-
257-
EmitAllocateReg({RegList, ShadowRegList}, {"RegList", "RegList"});
258-
259-
O << Indent << " return false;\n";
260-
O << Indent << "}\n";
261-
} else if (Action->isSubClassOf("CCAssignToStack")) {
262-
EmitAllocateStack(/*EmitOffset=*/true);
263-
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
264-
<< Counter << ", LocVT, LocInfo));\n";
265-
O << Indent << "return false;\n";
266-
} else if (Action->isSubClassOf("CCAssignToStackWithShadow")) {
267-
int Size = Action->getValueAsInt("Size");
268-
int Align = Action->getValueAsInt("Align");
269-
const ListInit *ShadowRegList =
270-
Action->getValueAsListInit("ShadowRegList");
271-
272-
unsigned ShadowRegListNumber = ++Counter;
273-
EmitRegList(ShadowRegList, "ShadowRegList" + utostr(ShadowRegListNumber));
274-
275-
O << Indent << "int64_t Offset" << ++Counter << " = State.AllocateStack("
276-
<< Size << ", Align(" << Align << "), "
277-
<< "ShadowRegList" << ShadowRegListNumber << ");\n";
278-
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
279-
<< Counter << ", LocVT, LocInfo));\n";
280-
O << Indent << "return false;\n";
281-
} else if (Action->isSubClassOf("CCPromoteToType")) {
282-
const Record *DestTy = Action->getValueAsDef("DestTy");
283-
MVT::SimpleValueType DestVT = getValueType(DestTy);
284-
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
285-
if (MVT(DestVT).isFloatingPoint()) {
286-
O << Indent << "LocInfo = CCValAssign::FPExt;\n";
287-
} else {
288-
O << Indent << "if (ArgFlags.isSExt())\n"
289-
<< Indent << " LocInfo = CCValAssign::SExt;\n"
290-
<< Indent << "else if (ArgFlags.isZExt())\n"
291-
<< Indent << " LocInfo = CCValAssign::ZExt;\n"
292-
<< Indent << "else\n"
293-
<< Indent << " LocInfo = CCValAssign::AExt;\n";
294-
}
295-
} else if (Action->isSubClassOf("CCPromoteToUpperBitsInType")) {
296-
const Record *DestTy = Action->getValueAsDef("DestTy");
297-
MVT::SimpleValueType DestVT = getValueType(DestTy);
298-
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
299-
if (MVT(DestVT).isFloatingPoint()) {
300-
PrintFatalError(Action->getLoc(),
301-
"CCPromoteToUpperBitsInType does not handle floating "
302-
"point");
303-
} else {
304-
O << Indent << "if (ArgFlags.isSExt())\n"
305-
<< Indent << " LocInfo = CCValAssign::SExtUpper;\n"
306-
<< Indent << "else if (ArgFlags.isZExt())\n"
307-
<< Indent << " LocInfo = CCValAssign::ZExtUpper;\n"
308-
<< Indent << "else\n"
309-
<< Indent << " LocInfo = CCValAssign::AExtUpper;\n";
310-
}
311-
} else if (Action->isSubClassOf("CCBitConvertToType")) {
312-
const Record *DestTy = Action->getValueAsDef("DestTy");
313-
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
314-
O << Indent << "LocInfo = CCValAssign::BCvt;\n";
315-
} else if (Action->isSubClassOf("CCTruncToType")) {
316-
const Record *DestTy = Action->getValueAsDef("DestTy");
317-
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
318-
O << Indent << "LocInfo = CCValAssign::Trunc;\n";
319-
} else if (Action->isSubClassOf("CCPassIndirect")) {
320-
const Record *DestTy = Action->getValueAsDef("DestTy");
321-
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
322-
O << Indent << "LocInfo = CCValAssign::Indirect;\n";
323-
} else if (Action->isSubClassOf("CCPassByVal")) {
324-
int Size = Action->getValueAsInt("Size");
325-
int Align = Action->getValueAsInt("Align");
326-
O << Indent << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, " << Size
327-
<< ", Align(" << Align << "), ArgFlags);\n";
328-
O << Indent << "return false;\n";
329-
} else if (Action->isSubClassOf("CCCustom")) {
330-
O << Indent << "if (" << Action->getValueAsString("FuncName")
331-
<< "(ValNo, ValVT, "
332-
<< "LocVT, LocInfo, ArgFlags, State))\n";
333-
O << Indent << " return false;\n";
224+
return;
225+
}
226+
227+
if (Action->isSubClassOf("CCDelegateTo")) {
228+
const Record *CC = Action->getValueAsDef("CC");
229+
O << Indent << "if (!" << CC->getName()
230+
<< "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n"
231+
<< Indent + 2 << "return false;\n";
232+
DelegateToMap[CurrentAction].insert(CC->getName().str());
233+
} else if (Action->isSubClassOf("CCAssignToReg") ||
234+
Action->isSubClassOf("CCAssignToRegTuple") ||
235+
Action->isSubClassOf("CCAssignToRegAndStack")) {
236+
const ListInit *RegList = Action->getValueAsListInit("RegList");
237+
for (unsigned I = 0, E = RegList->size(); I != E; ++I) {
238+
std::string Name = getQualifiedRegisterName(RegList->getElement(I));
239+
if (SwiftAction)
240+
AssignedSwiftRegsMap[CurrentAction].insert(std::move(Name));
241+
else
242+
AssignedRegsMap[CurrentAction].insert(std::move(Name));
243+
}
244+
EmitAllocateReg({RegList}, {"RegList"});
245+
246+
if (Action->isSubClassOf("CCAssignToRegAndStack"))
247+
EmitAllocateStack();
248+
249+
O << Indent << " return false;\n";
250+
O << Indent << "}\n";
251+
} else if (Action->isSubClassOf("CCAssignToRegWithShadow")) {
252+
const ListInit *RegList = Action->getValueAsListInit("RegList");
253+
const ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");
254+
if (!ShadowRegList->empty() && ShadowRegList->size() != RegList->size())
255+
PrintFatalError(Action->getLoc(),
256+
"Invalid length of list of shadowed registers");
257+
258+
EmitAllocateReg({RegList, ShadowRegList}, {"RegList", "RegList"});
259+
260+
O << Indent << " return false;\n";
261+
O << Indent << "}\n";
262+
} else if (Action->isSubClassOf("CCAssignToStack")) {
263+
EmitAllocateStack(/*EmitOffset=*/true);
264+
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
265+
<< Counter << ", LocVT, LocInfo));\n";
266+
O << Indent << "return false;\n";
267+
} else if (Action->isSubClassOf("CCAssignToStackWithShadow")) {
268+
int Size = Action->getValueAsInt("Size");
269+
int Align = Action->getValueAsInt("Align");
270+
const ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");
271+
272+
unsigned ShadowRegListNumber = ++Counter;
273+
EmitRegList(ShadowRegList, "ShadowRegList" + utostr(ShadowRegListNumber));
274+
275+
O << Indent << "int64_t Offset" << ++Counter << " = State.AllocateStack("
276+
<< Size << ", Align(" << Align << "), "
277+
<< "ShadowRegList" << ShadowRegListNumber << ");\n";
278+
O << Indent << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
279+
<< Counter << ", LocVT, LocInfo));\n";
280+
O << Indent << "return false;\n";
281+
} else if (Action->isSubClassOf("CCPromoteToType")) {
282+
const Record *DestTy = Action->getValueAsDef("DestTy");
283+
MVT::SimpleValueType DestVT = getValueType(DestTy);
284+
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
285+
if (MVT(DestVT).isFloatingPoint()) {
286+
O << Indent << "LocInfo = CCValAssign::FPExt;\n";
334287
} else {
335-
errs() << *Action;
336-
PrintFatalError(Action->getLoc(), "Unknown CCAction!");
288+
O << Indent << "if (ArgFlags.isSExt())\n"
289+
<< Indent << " LocInfo = CCValAssign::SExt;\n"
290+
<< Indent << "else if (ArgFlags.isZExt())\n"
291+
<< Indent << " LocInfo = CCValAssign::ZExt;\n"
292+
<< Indent << "else\n"
293+
<< Indent << " LocInfo = CCValAssign::AExt;\n";
294+
}
295+
} else if (Action->isSubClassOf("CCPromoteToUpperBitsInType")) {
296+
const Record *DestTy = Action->getValueAsDef("DestTy");
297+
MVT::SimpleValueType DestVT = getValueType(DestTy);
298+
O << Indent << "LocVT = " << getEnumName(DestVT) << ";\n";
299+
if (MVT(DestVT).isFloatingPoint()) {
300+
PrintFatalError(Action->getLoc(),
301+
"CCPromoteToUpperBitsInType does not handle floating "
302+
"point");
303+
} else {
304+
O << Indent << "if (ArgFlags.isSExt())\n"
305+
<< Indent << " LocInfo = CCValAssign::SExtUpper;\n"
306+
<< Indent << "else if (ArgFlags.isZExt())\n"
307+
<< Indent << " LocInfo = CCValAssign::ZExtUpper;\n"
308+
<< Indent << "else\n"
309+
<< Indent << " LocInfo = CCValAssign::AExtUpper;\n";
337310
}
311+
} else if (Action->isSubClassOf("CCBitConvertToType")) {
312+
const Record *DestTy = Action->getValueAsDef("DestTy");
313+
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
314+
O << Indent << "LocInfo = CCValAssign::BCvt;\n";
315+
} else if (Action->isSubClassOf("CCTruncToType")) {
316+
const Record *DestTy = Action->getValueAsDef("DestTy");
317+
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
318+
O << Indent << "LocInfo = CCValAssign::Trunc;\n";
319+
} else if (Action->isSubClassOf("CCPassIndirect")) {
320+
const Record *DestTy = Action->getValueAsDef("DestTy");
321+
O << Indent << "LocVT = " << getEnumName(getValueType(DestTy)) << ";\n";
322+
O << Indent << "LocInfo = CCValAssign::Indirect;\n";
323+
} else if (Action->isSubClassOf("CCPassByVal")) {
324+
int Size = Action->getValueAsInt("Size");
325+
int Align = Action->getValueAsInt("Align");
326+
O << Indent << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, " << Size
327+
<< ", Align(" << Align << "), ArgFlags);\n";
328+
O << Indent << "return false;\n";
329+
} else if (Action->isSubClassOf("CCCustom")) {
330+
O << Indent << "if (" << Action->getValueAsString("FuncName")
331+
<< "(ValNo, ValVT, "
332+
<< "LocVT, LocInfo, ArgFlags, State))\n";
333+
O << Indent << " return false;\n";
334+
} else {
335+
errs() << *Action;
336+
PrintFatalError(Action->getLoc(), "Unknown CCAction!");
338337
}
339338
}
340339

0 commit comments

Comments
 (0)