Skip to content

Commit f490dbd

Browse files
authored
[TableGen] Reduce stack usage of setTargetRuntimeLibcallSets (#162194)
This change resolves a stack usage issue seen in the TableGen'd function `setTargetRuntimeLibcallSets` when compiled with MSVC. This change reduces the frame size from 47720 bytes to 48 bytes.
1 parent 4e71976 commit f490dbd

File tree

4 files changed

+52
-104
lines changed

4 files changed

+52
-104
lines changed

llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,47 +48,39 @@ def MSP430LibraryWithCondCC : SystemRuntimeLibrary<isMSP430,
4848
// CHECK-NEXT: Entry = DefaultCC;
4949
// CHECK-NEXT: }
5050
// CHECK-EMPTY:
51-
// CHECK-NEXT: setLibcallsImpl({
52-
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::impl_malloc}, // malloc
53-
// CHECK-NEXT: });
51+
// CHECK-NEXT: setLibcallImpl(RTLIB::MALLOC, RTLIB::impl_malloc); // malloc
5452
// CHECK-EMPTY:
55-
// CHECK-NEXT: setLibcallsImpl({
56-
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4}, // __divmodqi4
57-
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4}, // __udivmodhi4
58-
// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
53+
// CHECK-NEXT: setLibcallImpl(RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4); // __divmodqi4
54+
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___divmodqi4, CallingConv::AVR_BUILTIN);
55+
// CHECK-NEXT: setLibcallImpl(RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4); // __udivmodhi4
56+
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___udivmodhi4, CallingConv::AVR_BUILTIN);
5957
// CHECK-EMPTY:
6058
// CHECK-NEXT: return;
6159
// CHECK-NEXT: }
6260
// CHECK-EMPTY:
6361
// CHECK-NEXT: if (TT.getArch() == Triple::avr) {
64-
// CHECK-NEXT: setLibcallsImpl({
65-
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::impl_malloc}, // malloc
66-
// CHECK-NEXT: });
62+
// CHECK-NEXT: setLibcallImpl(RTLIB::MALLOC, RTLIB::impl_malloc); // malloc
6763
// CHECK-EMPTY:
68-
// CHECK-NEXT: setLibcallsImpl({
69-
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4}, // __divmodqi4
70-
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4}, // __udivmodhi4
71-
// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
64+
// CHECK-NEXT: setLibcallImpl(RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4); // __divmodqi4
65+
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___divmodqi4, CallingConv::AVR_BUILTIN);
66+
// CHECK-NEXT: setLibcallImpl(RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4); // __udivmodhi4
67+
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___udivmodhi4, CallingConv::AVR_BUILTIN);
7268
// CHECK-EMPTY:
7369
// CHECK-NEXT: return;
7470
// CHECK-NEXT: }
7571
// CHECK-EMPTY:
7672
// CHECK-NEXT: if (TT.getArch() == Triple::msp430) {
77-
// CHECK-NEXT: setLibcallsImpl({
78-
// CHECK-NEXT: {RTLIB::MALLOC, RTLIB::impl_malloc}, // malloc
79-
// CHECK-NEXT: });
73+
// CHECK-NEXT: setLibcallImpl(RTLIB::MALLOC, RTLIB::impl_malloc); // malloc
8074
// CHECK-EMPTY:
8175
// CHECK-NEXT: if ( isFoo() ) {
82-
// CHECK-NEXT: setLibcallsImpl({
83-
// CHECK-NEXT: {RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4}, // __divmodqi4
84-
// CHECK-NEXT: }, CallingConv::AVR_BUILTIN);
76+
// CHECK-NEXT: setLibcallImpl(RTLIB::SDIVREM_I8, RTLIB::impl___divmodqi4); // __divmodqi4
77+
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___divmodqi4, CallingConv::AVR_BUILTIN);
8578
// CHECK-EMPTY:
8679
// CHECK-NEXT: }
8780
// CHECK-EMPTY:
8881
// CHECK-NEXT: if ( isBar() ) {
89-
// CHECK-NEXT: setLibcallsImpl({
90-
// CHECK-NEXT: {RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4}, // __udivmodhi4
91-
// CHECK-NEXT: }, CallingConv::MSP430_BUILTIN);
82+
// CHECK-NEXT: setLibcallImpl(RTLIB::UDIVREM_I16, RTLIB::impl___udivmodhi4); // __udivmodhi4
83+
// CHECK-NEXT: setLibcallImplCallingConv(RTLIB::impl___udivmodhi4, CallingConv::MSP430_BUILTIN);
9284
// CHECK-EMPTY:
9385
// CHECK-NEXT: }
9486
// CHECK-EMPTY:

llvm/test/TableGen/RuntimeLibcallEmitter-conflict-warning.td

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,26 @@ def dup1 : RuntimeLibcallImpl<ANOTHER_DUP>;
2525
// func_a and func_b both provide SOME_FUNC.
2626

2727
// CHECK: if (isTargetArchA()) {
28-
// CHECK-NEXT: setLibcallsImpl({
29-
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::impl_func_b}, // func_b
30-
// CHECK-NEXT: });
28+
// CHECK-NEXT: setLibcallImpl(RTLIB::SOME_FUNC, RTLIB::impl_func_b); // func_b
3129

3230
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_b, func_a
3331
def TheSystemLibraryA : SystemRuntimeLibrary<isTargetArchA,
3432
(add func_b, func_a)
3533
>;
3634

3735
// CHECK: if (isTargetArchB()) {
38-
// CHECK-NEXT: setLibcallsImpl({
39-
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::impl_other_func}, // other_func
40-
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::impl_func_a}, // func_a
41-
// CHECK-NEXT: });
36+
// CHECK-NEXT: setLibcallImpl(RTLIB::OTHER_FUNC, RTLIB::impl_other_func); // other_func
37+
// CHECK-NEXT: setLibcallImpl(RTLIB::SOME_FUNC, RTLIB::impl_func_a); // func_a
4238

4339
// ERR: :[[@LINE+1]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b
4440
def TheSystemLibraryB : SystemRuntimeLibrary<isTargetArchB,
4541
(add func_a, other_func, func_b)
4642
>;
4743

4844
// CHECK: if (isTargetArchC()) {
49-
// CHECK-NEXT: setLibcallsImpl({
50-
// CHECK-NEXT: {RTLIB::ANOTHER_DUP, RTLIB::impl_dup1}, // dup1
51-
// CHECK-NEXT: {RTLIB::OTHER_FUNC, RTLIB::impl_other_func}, // other_func
52-
// CHECK-NEXT: {RTLIB::SOME_FUNC, RTLIB::impl_func_a}, // func_a
53-
// CHECK-NEXT: });
45+
// CHECK-NEXT: setLibcallImpl(RTLIB::ANOTHER_DUP, RTLIB::impl_dup1); // dup1
46+
// CHECK-NEXT: setLibcallImpl(RTLIB::OTHER_FUNC, RTLIB::impl_other_func); // other_func
47+
// CHECK-NEXT: setLibcallImpl(RTLIB::SOME_FUNC, RTLIB::impl_func_a); // func_a
5448

5549
// ERR: :[[@LINE+3]]:5: warning: conflicting implementations for libcall ANOTHER_DUP: dup1, dup0
5650
// ERR: :[[@LINE+2]]:5: warning: conflicting implementations for libcall SOME_FUNC: func_a, func_b

llvm/test/TableGen/RuntimeLibcallEmitter.td

Lines changed: 16 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -190,79 +190,51 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
190190
// CHECK-NEXT: }
191191

192192
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT, ExceptionHandling ExceptionModel, FloatABI::ABIType FloatABI, EABI EABIVersion, StringRef ABIName) {
193-
// CHECK-NEXT: struct LibcallImplPair {
194-
// CHECK-NEXT: RTLIB::Libcall Func;
195-
// CHECK-NEXT: RTLIB::LibcallImpl Impl;
196-
// CHECK-NEXT: };
197-
// CHECK-NEXT: auto setLibcallsImpl = [this](
198-
// CHECK-NEXT: ArrayRef<LibcallImplPair> Libcalls,
199-
// CHECK-NEXT: std::optional<llvm::CallingConv::ID> CC = {})
200-
// CHECK-NEXT: {
201-
// CHECK-NEXT: for (const auto [Func, Impl] : Libcalls) {
202-
// CHECK-NEXT: setLibcallImpl(Func, Impl);
203-
// CHECK-NEXT: if (CC)
204-
// CHECK-NEXT: setLibcallImplCallingConv(Impl, *CC);
205-
// CHECK-NEXT: }
206-
// CHECK-NEXT: };
207193
// CHECK-EMPTY:
208194
// CHECK-NEXT: if (TT.getArch() == Triple::blah) {
209-
// CHECK-NEXT: setLibcallsImpl({
210-
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::impl_bzero}, // bzero
211-
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::impl_calloc}, // calloc
212-
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128}, // sqrtl
213-
// CHECK-NEXT: });
195+
// CHECK-NEXT: setLibcallImpl(RTLIB::BZERO, RTLIB::impl_bzero); // bzero
196+
// CHECK-NEXT: setLibcallImpl(RTLIB::CALLOC, RTLIB::impl_calloc); // calloc
197+
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128); // sqrtl
214198
// CHECK-EMPTY:
215199
// CHECK-NEXT: if (TT.hasCompilerRT()) {
216-
// CHECK-NEXT: setLibcallsImpl({
217-
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::impl___ashlsi3}, // __ashlsi3
218-
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::impl___lshrdi3}, // __lshrdi3
219-
// CHECK-NEXT: });
200+
// CHECK-NEXT: setLibcallImpl(RTLIB::SHL_I32, RTLIB::impl___ashlsi3); // __ashlsi3
201+
// CHECK-NEXT: setLibcallImpl(RTLIB::SRL_I64, RTLIB::impl___lshrdi3); // __lshrdi3
220202
// CHECK-EMPTY:
221203
// CHECK-NEXT: }
222204
// CHECK-EMPTY:
223205
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
224-
// CHECK-NEXT: setLibcallsImpl({
225-
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::impl____memset}, // ___memset
226-
// CHECK-NEXT: });
206+
// CHECK-NEXT: setLibcallImpl(RTLIB::MEMSET, RTLIB::impl____memset); // ___memset
227207
// CHECK-EMPTY:
228208
// CHECK-NEXT: }
229209
// CHECK-EMPTY:
230210
// CHECK-NEXT: return;
231211
// CHECK-NEXT: }
232212
// CHECK-EMPTY:
233213
// CHECK-NEXT: if (TT.getArch() == Triple::buzz) {
234-
// CHECK-NEXT: setLibcallsImpl({
235-
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::impl___ashlsi3}, // __ashlsi3
236-
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80}, // sqrtl
237-
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::impl___lshrdi3}, // __lshrdi3
238-
// CHECK-NEXT: });
214+
// CHECK-NEXT: setLibcallImpl(RTLIB::SHL_I32, RTLIB::impl___ashlsi3); // __ashlsi3
215+
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80); // sqrtl
216+
// CHECK-NEXT: setLibcallImpl(RTLIB::SRL_I64, RTLIB::impl___lshrdi3); // __lshrdi3
239217
// CHECK-EMPTY:
240218
// CHECK-NEXT: return;
241219
// CHECK-NEXT: }
242220
// CHECK-EMPTY:
243221
// CHECK-NEXT: if (TT.getArch() == Triple::foo) {
244-
// CHECK-NEXT: setLibcallsImpl({
245-
// CHECK-NEXT: {RTLIB::BZERO, RTLIB::impl_bzero}, // bzero
246-
// CHECK-NEXT: {RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128}, // sqrtl
247-
// CHECK-NEXT: });
222+
// CHECK-NEXT: setLibcallImpl(RTLIB::BZERO, RTLIB::impl_bzero); // bzero
223+
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl_sqrtl_f128); // sqrtl
248224
// CHECK-EMPTY:
249225
// CHECK-NEXT: if (TT.getOS() == Triple::bar) {
250-
// CHECK-NEXT: setLibcallsImpl({
251-
// CHECK-NEXT: {RTLIB::MEMSET, RTLIB::impl____memset}, // ___memset
252-
// CHECK-NEXT: });
226+
// CHECK-NEXT: setLibcallImpl(RTLIB::MEMSET, RTLIB::impl____memset); // ___memset
253227
// CHECK-EMPTY:
254228
// CHECK-NEXT: }
255229
// CHECK-EMPTY:
256230
// CHECK-NEXT: return;
257231
// CHECK-NEXT: }
258232
// CHECK-EMPTY:
259233
// CHECK-NEXT: if (TT.getArch() == Triple::simple) {
260-
// CHECK-NEXT: setLibcallsImpl({
261-
// CHECK-NEXT: {RTLIB::CALLOC, RTLIB::impl_calloc}, // calloc
262-
// CHECK-NEXT: {RTLIB::SHL_I32, RTLIB::impl___ashlsi3}, // __ashlsi3
263-
// CHECK-NEXT: {RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80}, // sqrtl
264-
// CHECK-NEXT: {RTLIB::SRL_I64, RTLIB::impl___lshrdi3}, // __lshrdi3
265-
// CHECK-NEXT: });
234+
// CHECK-NEXT: setLibcallImpl(RTLIB::CALLOC, RTLIB::impl_calloc); // calloc
235+
// CHECK-NEXT: setLibcallImpl(RTLIB::SHL_I32, RTLIB::impl___ashlsi3); // __ashlsi3
236+
// CHECK-NEXT: setLibcallImpl(RTLIB::SQRT_F80, RTLIB::impl_sqrtl_f80); // sqrtl
237+
// CHECK-NEXT: setLibcallImpl(RTLIB::SRL_I64, RTLIB::impl___lshrdi3); // __lshrdi3
266238
// CHECK-EMPTY:
267239
// CHECK-NEXT: return;
268240
// CHECK-NEXT: }

llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -543,21 +543,8 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
543543
OS << "void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets("
544544
"const llvm::Triple &TT, ExceptionHandling ExceptionModel, "
545545
"FloatABI::ABIType FloatABI, EABI EABIVersion, "
546-
"StringRef ABIName) {\n"
547-
" struct LibcallImplPair {\n"
548-
" RTLIB::Libcall Func;\n"
549-
" RTLIB::LibcallImpl Impl;\n"
550-
" };\n"
551-
" auto setLibcallsImpl = [this](\n"
552-
" ArrayRef<LibcallImplPair> Libcalls,\n"
553-
" std::optional<llvm::CallingConv::ID> CC = {})\n"
554-
" {\n"
555-
" for (const auto [Func, Impl] : Libcalls) {\n"
556-
" setLibcallImpl(Func, Impl);\n"
557-
" if (CC)\n"
558-
" setLibcallImplCallingConv(Impl, *CC);\n"
559-
" }\n"
560-
" };\n";
546+
"StringRef ABIName) {\n";
547+
561548
ArrayRef<const Record *> AllLibs =
562549
Records.getAllDerivedDefinitions("SystemRuntimeLibrary");
563550

@@ -682,18 +669,21 @@ void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
682669

683670
Funcs.erase(UniqueI, Funcs.end());
684671

685-
OS << indent(IndentDepth + 2) << "setLibcallsImpl({\n";
672+
StringRef CCEnum;
673+
if (FuncsWithCC.CallingConv)
674+
CCEnum = FuncsWithCC.CallingConv->getValueAsString("CallingConv");
675+
686676
for (const RuntimeLibcallImpl *LibCallImpl : Funcs) {
687-
OS << indent(IndentDepth + 4);
688-
LibCallImpl->emitTableEntry(OS);
689-
}
690-
OS << indent(IndentDepth + 2) << "}";
691-
if (FuncsWithCC.CallingConv) {
692-
StringRef CCEnum =
693-
FuncsWithCC.CallingConv->getValueAsString("CallingConv");
694-
OS << ", " << CCEnum;
677+
OS << indent(IndentDepth + 2);
678+
LibCallImpl->emitSetImplCall(OS);
679+
680+
if (FuncsWithCC.CallingConv) {
681+
OS << indent(IndentDepth + 2) << "setLibcallImplCallingConv(";
682+
LibCallImpl->emitEnumEntry(OS);
683+
OS << ", " << CCEnum << ");\n";
684+
}
695685
}
696-
OS << ");\n\n";
686+
OS << '\n';
697687

698688
if (!SubsetPredicate.isAlwaysAvailable()) {
699689
OS << indent(IndentDepth);

0 commit comments

Comments
 (0)