From 6a4327660fd9ce992f454974f33586688f814dcf Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Mon, 21 Sep 2015 18:52:24 +0000 Subject: [PATCH] Remove attributes minsize and optsize, which conflict with optnone. This commit fixes an assert that is triggered when optnone is being added to an IR function that is already marked with minsize and optsize. rdar://problem/22723716 Differential Revision: http://reviews.llvm.org/D13004 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248191 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 6 ++---- test/CodeGen/attr-func-def.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/attr-func-def.c diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 00121072dd..954fdab567 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -827,10 +827,8 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, F->addFnAttr(llvm::Attribute::NoInline); // OptimizeNone wins over OptimizeForSize, MinSize, AlwaysInline. - assert(!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) && - "OptimizeNone and OptimizeForSize on same function!"); - assert(!F->hasFnAttribute(llvm::Attribute::MinSize) && - "OptimizeNone and MinSize on same function!"); + F->removeFnAttr(llvm::Attribute::OptimizeForSize); + F->removeFnAttr(llvm::Attribute::MinSize); assert(!F->hasFnAttribute(llvm::Attribute::AlwaysInline) && "OptimizeNone and AlwaysInline on same function!"); diff --git a/test/CodeGen/attr-func-def.c b/test/CodeGen/attr-func-def.c new file mode 100644 index 0000000000..ceafa1220f --- /dev/null +++ b/test/CodeGen/attr-func-def.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.10.0 -emit-llvm -Oz -o - %s | FileCheck %s + +// CHECK: define i32 @foo2(i32 %a) [[ATTRS2:#[0-9]+]] { +// CHECK: define i32 @foo1(i32 %a) [[ATTRS1:#[0-9]+]] { + +int foo1(int); + +int foo2(int a) { + return foo1(a + 2); +} + +__attribute__((optnone)) +int foo1(int a) { + return a + 1; +} + +// CHECK: attributes [[ATTRS2]] = { {{.*}}optsize{{.*}} } +// CHECK: attributes [[ATTRS1]] = { {{.*}}optnone{{.*}} } -- 2.50.1