diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index bd7b44e413355c3548fb8d7f73e7d568ac65e33a..d19d0ed886eadf7af83d39ea8cbeb39f10cc806c 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1425,7 +1425,7 @@ namespace { return false; } unsigned BuiltinID = FD->getBuiltinID(); - if (!BuiltinID) + if (!BuiltinID || !BI.isLibFunction(BuiltinID)) return true; StringRef BuiltinName = BI.GetName(BuiltinID); if (BuiltinName.startswith("__builtin_") && @@ -1454,7 +1454,12 @@ CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) { Name = FD->getName(); } - FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo); + auto &BI = Context.BuiltinInfo; + unsigned BuiltinID = Context.Idents.get(Name).getBuiltinID(); + if (!BuiltinID || !BI.isPredefinedLibFunction(BuiltinID)) + return false; + + FunctionIsDirectlyRecursive Walker(Name, BI); Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD)); return Walker.Result; } diff --git a/test/CodeGen/pr9614.c b/test/CodeGen/pr9614.c index 53abef1801d9c6ec425e42527fffbdfff35b95d7..de21dbbb23fec7e77dc7c94c5e2c27905eaaf823 100644 --- a/test/CodeGen/pr9614.c +++ b/test/CodeGen/pr9614.c @@ -4,26 +4,35 @@ extern void foo_alias (void) __asm ("foo"); inline void foo (void) { return foo_alias (); } -extern void bar_alias (void) __asm ("bar"); -inline __attribute__ ((__always_inline__)) void bar (void) { - return bar_alias (); +extern int abs_alias (int) __asm ("abs"); +inline __attribute__ ((__always_inline__)) int abs (int x) { + return abs_alias(x); } extern char *strrchr_foo (const char *__s, int __c) __asm ("strrchr"); extern inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) char * strrchr_foo (const char *__s, int __c) { return __builtin_strrchr (__s, __c); } + +extern inline void __attribute__((always_inline, __gnu_inline__)) +prefetch(void) { + __builtin_prefetch(0, 0, 1); +} + void f(void) { foo(); - bar(); + abs(0); strrchr_foo("", '.'); + prefetch(); } // CHECK-LABEL: define void @f() // CHECK: call void @foo() -// CHECK-NEXT: call void @bar() -// CHECK-NEXT: call i8* @strrchr( -// CHECK-NEXT: ret void +// CHECK: call i32 @abs(i32 0) +// CHECK: call i8* @strrchr( +// CHECK: call void @llvm.prefetch( +// CHECK: ret void // CHECK: declare void @foo() -// CHECK: declare void @bar() +// CHECK: declare i32 @abs(i32 // CHECK: declare i8* @strrchr(i8*, i32) +// CHECK: declare void @llvm.prefetch(