Skip to content

Commit

Permalink
[C++20] [Modules] Don't emit function bodies which is noinline and av… (
Browse files Browse the repository at this point in the history
#68501)

…ailabl externally

A workaround for #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 got approved.
  • Loading branch information
ChuanqiXu9 committed Oct 10, 2023
1 parent 057ec76 commit b5dffd4
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
3 changes: 3 additions & 0 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3849,6 +3849,9 @@ bool CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
return false;

if (F->hasAttr<NoInlineAttr>())
return false;

if (F->hasAttr<DLLImportAttr>() && !F->hasAttr<AlwaysInlineAttr>()) {
// Check whether it would be safe to inline this dllimport function.
DLLImportFunctionVisitor Visitor;
Expand Down
45 changes: 45 additions & 0 deletions clang/test/Modules/no-import-func-body.cppm
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit b5dffd4

Please sign in to comment.