From 9ed87a50400d85bffaedc70853cf0ab151ec84fb Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Sun, 8 Oct 2023 11:06:32 +0800 Subject: [PATCH] [C++20] [Modules] Don't emit function bodies which is noinline and availabl externally A workaround for https://github.com/llvm/llvm-project/issues/60996 As the title suggested, we can avoid emitting available externally functions which is marked as noinline already. Such functions should contribute nothing for optimizations. The update for docs will be sent seperately if this god approved. --- clang/lib/CodeGen/CodeGenModule.cpp | 3 ++ clang/test/Modules/no-import-func-body.cppm | 45 +++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 clang/test/Modules/no-import-func-body.cppm diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index cae9dd93bc559..eeb923a29f905 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3847,6 +3847,9 @@ bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) { if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr()) return false; + if (F->hasAttr()) + return false; + if (F->hasAttr() && !F->hasAttr()) { // Check whether it would be safe to inline this dllimport function. DLLImportFunctionVisitor Visitor; diff --git a/clang/test/Modules/no-import-func-body.cppm b/clang/test/Modules/no-import-func-body.cppm new file mode 100644 index 0000000000000..9a111dca9855c --- /dev/null +++ b/clang/test/Modules/no-import-func-body.cppm @@ -0,0 +1,45 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: cd %t +// +// RUN: %clang_cc1 -std=c++20 -O1 -triple %itanium_abi_triple %t/a.cppm \ +// RUN: -emit-module-interface -o %t/a.pcm +// RUN: %clang_cc1 -std=c++20 -O1 -triple %itanium_abi_triple %t/b.cppm \ +// RUN: -emit-module-interface -fprebuilt-module-path=%t -o %t/b.pcm +// RUN: %clang_cc1 -std=c++20 -O1 -triple %itanium_abi_triple %t/c.cppm \ +// RUN: -emit-module-interface -fprebuilt-module-path=%t -o %t/c.pcm +// RUN: %clang_cc1 -std=c++20 -O1 -triple %itanium_abi_triple %t/c.pcm -S \ +// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %t/c.cppm + +//--- a.cppm +export module a; +export int a() { + return 43; +} +export __attribute__((noinline)) int a_noinline() { + return 44; +} + +//--- b.cppm +export module b; +export import a; +export int b() { + return 43 + a(); +} + +export __attribute__((noinline)) int b_noinline() { + return 43 + a(); +} + +//--- c.cppm +export module c; +export import b; +export int c() { + return 43 + b() + a() + b_noinline() + a_noinline(); +} + +// CHECK: define{{.*}}available_externally{{.*}}@_ZW1b1bv( +// CHECK: define{{.*}}available_externally{{.*}}@_ZW1a1av( + +// CHECK: declare{{.*}}@_ZW1b10b_noinlinev() +// CHECK: declare{{.*}}@_ZW1a10a_noinlinev()