forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CodeGen] only add nobuiltin to inline builtins if we'll emit them
There are some inline builtin definitions that we can't emit (isTriviallyRecursive & callers go into why). Marking these nobuiltin is only useful if we actually emit the body, so don't mark these as such unless we _do_ plan on emitting that. This suboptimality was encountered in Linux (see some discussion on D71082, and ClangBuiltLinux/linux#979). Differential Revision: https://reviews.llvm.org/D78162
- Loading branch information
1 parent
f42baaa
commit 2dd17ff
Showing
2 changed files
with
27 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s | ||
// | ||
// Verifies that clang doesn't mark an inline builtin definition as `nobuiltin` | ||
// if the builtin isn't emittable. | ||
|
||
typedef unsigned long size_t; | ||
|
||
// always_inline is used so clang will emit this body. Otherwise, we need >= | ||
// -O1. | ||
#define AVAILABLE_EXTERNALLY extern inline __attribute__((always_inline)) \ | ||
__attribute__((gnu_inline)) | ||
|
||
AVAILABLE_EXTERNALLY void *memcpy(void *a, const void *b, size_t c) { | ||
return __builtin_memcpy(a, b, c); | ||
} | ||
|
||
// CHECK-LABEL: define void @foo | ||
void foo(void *a, const void *b, size_t c) { | ||
// Clang will always _emit_ this as memcpy. LLVM turns it into @llvm.memcpy | ||
// later on if optimizations are enabled. | ||
// CHECK: call i8* @memcpy | ||
memcpy(a, b, c); | ||
} | ||
|
||
// CHECK-NOT: nobuiltin |