From: Paul Robinson Date: Thu, 11 Dec 2014 20:14:04 +0000 (+0000) Subject: Instead of having -Os/-Oz add OptimizeForSize/MinSize first, and later X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=161fab8917bbd51cc7ec9a82db93375cb55e95d4;p=clang Instead of having -Os/-Oz add OptimizeForSize/MinSize first, and later having OptimizeNone remove them again, just don't add them in the first place if the function already has OptimizeNone. Note that MinSize can still appear due to attributes on different declarations; a future patch will address that. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224047 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 6db753f168..c052cf245c 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1340,6 +1340,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, bool AttrOnCallSite) { llvm::AttrBuilder FuncAttrs; llvm::AttrBuilder RetAttrs; + bool HasOptnone = false; CallingConv = FI.getEffectiveCallingConvention(); @@ -1380,12 +1381,18 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, RetAttrs.addAttribute(llvm::Attribute::NoAlias); if (TargetDecl->hasAttr()) RetAttrs.addAttribute(llvm::Attribute::NonNull); + + HasOptnone = TargetDecl->hasAttr(); + } + + // OptimizeNoneAttr takes precedence over -Os or -Oz. No warning needed. + if (!HasOptnone) { + if (CodeGenOpts.OptimizeSize) + FuncAttrs.addAttribute(llvm::Attribute::OptimizeForSize); + if (CodeGenOpts.OptimizeSize == 2) + FuncAttrs.addAttribute(llvm::Attribute::MinSize); } - if (CodeGenOpts.OptimizeSize) - FuncAttrs.addAttribute(llvm::Attribute::OptimizeForSize); - if (CodeGenOpts.OptimizeSize == 2) - FuncAttrs.addAttribute(llvm::Attribute::MinSize); if (CodeGenOpts.DisableRedZone) FuncAttrs.addAttribute(llvm::Attribute::NoRedZone); if (CodeGenOpts.NoImplicitFloat) diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 597fd364d7..06467fda6e 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -725,7 +725,8 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, } if (D->hasAttr()) { - B.addAttribute(llvm::Attribute::OptimizeForSize); + if (!D->hasAttr()) + B.addAttribute(llvm::Attribute::OptimizeForSize); B.addAttribute(llvm::Attribute::Cold); } @@ -766,7 +767,9 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, F->addFnAttr(llvm::Attribute::NoInline); // OptimizeNone wins over OptimizeForSize, MinSize, AlwaysInline. - F->removeFnAttr(llvm::Attribute::OptimizeForSize); + assert(!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) && + "OptimizeNone and OptimizeForSize on same function!"); + // FIXME: Change these to asserts. F->removeFnAttr(llvm::Attribute::MinSize); F->removeFnAttr(llvm::Attribute::AlwaysInline); diff --git a/test/CodeGen/attr-optnone.c b/test/CodeGen/attr-optnone.c index 020218a2f4..96493bfe36 100644 --- a/test/CodeGen/attr-optnone.c +++ b/test/CodeGen/attr-optnone.c @@ -4,10 +4,14 @@ // RUN: %clang_cc1 -emit-llvm -Os < %s > %t // RUN: FileCheck %s --check-prefix=PRESENT < %t // RUN: FileCheck %s --check-prefix=OPTSIZE < %t +// RUN: %clang_cc1 -emit-llvm -Oz < %s > %t +// RUN: FileCheck %s --check-prefix=PRESENT < %t +// RUN: FileCheck %s --check-prefix=MINSIZE < %t __attribute__((always_inline)) int test2() { return 0; } // OPTSIZE: @test2{{.*}}[[ATTR2:#[0-9]+]] +// MINSIZE: @test2{{.*}}[[ATTR2:#[0-9]+]] __attribute__((optnone)) int test3() { return 0; } @@ -31,3 +35,8 @@ int test4() { return test2(); } // OPTSIZE-NOT: optsize // OPTSIZE: attributes [[ATTR2]] = { {{.*}}optsize{{.*}} } // OPTSIZE-NOT: optsize + +// With -Oz, check that 'minsize' appears only on test2. +// MINSIZE-NOT: minsize +// MINSIZE: attributes [[ATTR2]] = { {{.*}}minsize{{.*}} } +// MINSIZE-NOT: minsize diff --git a/test/SemaCXX/pragma-optimize.cpp b/test/SemaCXX/pragma-optimize.cpp index b84d232b8a..48a15460fc 100644 --- a/test/SemaCXX/pragma-optimize.cpp +++ b/test/SemaCXX/pragma-optimize.cpp @@ -1,4 +1,6 @@ // RUN: %clang_cc1 -I %S/Inputs -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm -O2 < %s | FileCheck %s +// RUN: %clang_cc1 -I %S/Inputs -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm -Os < %s | FileCheck %s +// RUN: %clang_cc1 -I %S/Inputs -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm -Oz < %s | FileCheck %s #pragma clang optimize off