1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Add function attribute 'optnone'.

This function attribute indicates that the function is not optimized
by any optimization or code generator passes with the 
exception of interprocedural optimization passes.

llvm-svn: 189101
This commit is contained in:
Andrea Di Biagio 2013-08-23 11:53:55 +00:00
parent 9867b44c59
commit b486212f5a
16 changed files with 72 additions and 7 deletions

View File

@ -879,6 +879,17 @@ example:
This function attribute indicates that the function never returns This function attribute indicates that the function never returns
with an unwind or exceptional control flow. If the function does with an unwind or exceptional control flow. If the function does
unwind, its runtime behavior is undefined. unwind, its runtime behavior is undefined.
``optnone``
This function attribute indicates that the function is not optimized
by any optimization or code generator passes with the
exception of interprocedural optimization passes.
This attribute cannot be used together with the ``alwaysinline``
attribute; this attribute is also incompatible
with the ``minsize`` attribute and the ``optsize`` attribute.
The inliner should never inline this function in any situation.
Only functions with the ``alwaysinline`` attribute are valid
candidates for inlining inside the body of this function.
``optsize`` ``optsize``
This attribute suggests that optimization passes and code generator This attribute suggests that optimization passes and code generator
passes make choices that keep the code size of this function low, passes make choices that keep the code size of this function low,

View File

@ -165,8 +165,9 @@ typedef enum {
a temporary measure until the API/ABI impact to the C API is understood a temporary measure until the API/ABI impact to the C API is understood
and the path forward agreed upon. and the path forward agreed upon.
LLVMAddressSafety = 1ULL << 32, LLVMAddressSafety = 1ULL << 32,
LLVMStackProtectStrongAttribute = 1ULL<<33 LLVMStackProtectStrongAttribute = 1ULL<<33,
LLVMCold = 1ULL << 34 LLVMCold = 1ULL << 34,
LLVMOptimizeNone = 1ULL << 35
*/ */
} LLVMAttribute; } LLVMAttribute;

View File

@ -368,7 +368,8 @@ namespace bitc {
ATTR_KIND_UW_TABLE = 33, ATTR_KIND_UW_TABLE = 33,
ATTR_KIND_Z_EXT = 34, ATTR_KIND_Z_EXT = 34,
ATTR_KIND_BUILTIN = 35, ATTR_KIND_BUILTIN = 35,
ATTR_KIND_COLD = 36 ATTR_KIND_COLD = 36,
ATTR_KIND_OPTIMIZE_NONE = 37
}; };
} // End bitc namespace } // End bitc namespace

View File

@ -88,6 +88,7 @@ public:
NoReturn, ///< Mark the function as not returning NoReturn, ///< Mark the function as not returning
NoUnwind, ///< Function doesn't unwind stack NoUnwind, ///< Function doesn't unwind stack
OptimizeForSize, ///< opt_size OptimizeForSize, ///< opt_size
OptimizeNone, ///< Function must not be optimized.
ReadNone, ///< Function does not access memory ReadNone, ///< Function does not access memory
ReadOnly, ///< Function only reads from memory ReadOnly, ///< Function only reads from memory
Returned, ///< Return value is always equal to this argument Returned, ///< Return value is always equal to this argument

View File

@ -583,6 +583,7 @@ lltok::Kind LLLexer::LexIdentifier() {
KEYWORD(noredzone); KEYWORD(noredzone);
KEYWORD(noreturn); KEYWORD(noreturn);
KEYWORD(nounwind); KEYWORD(nounwind);
KEYWORD(optnone);
KEYWORD(optsize); KEYWORD(optsize);
KEYWORD(readnone); KEYWORD(readnone);
KEYWORD(readonly); KEYWORD(readonly);

View File

@ -922,6 +922,7 @@ bool LLParser::ParseFnAttributeValuePairs(AttrBuilder &B,
case lltok::kw_noredzone: B.addAttribute(Attribute::NoRedZone); break; case lltok::kw_noredzone: B.addAttribute(Attribute::NoRedZone); break;
case lltok::kw_noreturn: B.addAttribute(Attribute::NoReturn); break; case lltok::kw_noreturn: B.addAttribute(Attribute::NoReturn); break;
case lltok::kw_nounwind: B.addAttribute(Attribute::NoUnwind); break; case lltok::kw_nounwind: B.addAttribute(Attribute::NoUnwind); break;
case lltok::kw_optnone: B.addAttribute(Attribute::OptimizeNone); break;
case lltok::kw_optsize: B.addAttribute(Attribute::OptimizeForSize); break; case lltok::kw_optsize: B.addAttribute(Attribute::OptimizeForSize); break;
case lltok::kw_readnone: B.addAttribute(Attribute::ReadNone); break; case lltok::kw_readnone: B.addAttribute(Attribute::ReadNone); break;
case lltok::kw_readonly: B.addAttribute(Attribute::ReadOnly); break; case lltok::kw_readonly: B.addAttribute(Attribute::ReadOnly); break;
@ -1180,6 +1181,7 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
case lltok::kw_noredzone: case lltok::kw_noredzone:
case lltok::kw_noreturn: case lltok::kw_noreturn:
case lltok::kw_nounwind: case lltok::kw_nounwind:
case lltok::kw_optnone:
case lltok::kw_optsize: case lltok::kw_optsize:
case lltok::kw_returns_twice: case lltok::kw_returns_twice:
case lltok::kw_sanitize_address: case lltok::kw_sanitize_address:
@ -1238,6 +1240,7 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) {
case lltok::kw_noredzone: case lltok::kw_noredzone:
case lltok::kw_noreturn: case lltok::kw_noreturn:
case lltok::kw_nounwind: case lltok::kw_nounwind:
case lltok::kw_optnone:
case lltok::kw_optsize: case lltok::kw_optsize:
case lltok::kw_returns_twice: case lltok::kw_returns_twice:
case lltok::kw_sanitize_address: case lltok::kw_sanitize_address:

View File

@ -114,6 +114,7 @@ namespace lltok {
kw_noredzone, kw_noredzone,
kw_noreturn, kw_noreturn,
kw_nounwind, kw_nounwind,
kw_optnone,
kw_optsize, kw_optsize,
kw_readnone, kw_readnone,
kw_readonly, kw_readonly,

View File

@ -573,6 +573,9 @@ bool BitcodeReader::ParseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE: case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE:
*Kind = Attribute::OptimizeForSize; *Kind = Attribute::OptimizeForSize;
return false; return false;
case bitc::ATTR_KIND_OPTIMIZE_NONE:
*Kind = Attribute::OptimizeNone;
return false;
case bitc::ATTR_KIND_READ_NONE: case bitc::ATTR_KIND_READ_NONE:
*Kind = Attribute::ReadNone; *Kind = Attribute::ReadNone;
return false; return false;

View File

@ -205,6 +205,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {
return bitc::ATTR_KIND_NO_UNWIND; return bitc::ATTR_KIND_NO_UNWIND;
case Attribute::OptimizeForSize: case Attribute::OptimizeForSize:
return bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE; return bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE;
case Attribute::OptimizeNone:
return bitc::ATTR_KIND_OPTIMIZE_NONE;
case Attribute::ReadNone: case Attribute::ReadNone:
return bitc::ATTR_KIND_READ_NONE; return bitc::ATTR_KIND_READ_NONE;
case Attribute::ReadOnly: case Attribute::ReadOnly:

View File

@ -196,6 +196,8 @@ std::string Attribute::getAsString(bool InAttrGrp) const {
return "noreturn"; return "noreturn";
if (hasAttribute(Attribute::NoUnwind)) if (hasAttribute(Attribute::NoUnwind))
return "nounwind"; return "nounwind";
if (hasAttribute(Attribute::OptimizeNone))
return "optnone";
if (hasAttribute(Attribute::OptimizeForSize)) if (hasAttribute(Attribute::OptimizeForSize))
return "optsize"; return "optsize";
if (hasAttribute(Attribute::ReadNone)) if (hasAttribute(Attribute::ReadNone))
@ -381,6 +383,7 @@ uint64_t AttributeImpl::getAttrMask(Attribute::AttrKind Val) {
case Attribute::Returned: return 1ULL << 39; case Attribute::Returned: return 1ULL << 39;
case Attribute::Cold: return 1ULL << 40; case Attribute::Cold: return 1ULL << 40;
case Attribute::Builtin: return 1ULL << 41; case Attribute::Builtin: return 1ULL << 41;
case Attribute::OptimizeNone: return 1ULL << 42;
} }
llvm_unreachable("Unsupported attribute type"); llvm_unreachable("Unsupported attribute type");
} }

View File

@ -751,7 +751,8 @@ void Verifier::VerifyAttributeTypes(AttributeSet Attrs, unsigned Idx,
I->getKindAsEnum() == Attribute::NoDuplicate || I->getKindAsEnum() == Attribute::NoDuplicate ||
I->getKindAsEnum() == Attribute::Builtin || I->getKindAsEnum() == Attribute::Builtin ||
I->getKindAsEnum() == Attribute::NoBuiltin || I->getKindAsEnum() == Attribute::NoBuiltin ||
I->getKindAsEnum() == Attribute::Cold) { I->getKindAsEnum() == Attribute::Cold ||
I->getKindAsEnum() == Attribute::OptimizeNone) {
if (!isFunction) { if (!isFunction) {
CheckFailed("Attribute '" + I->getAsString() + CheckFailed("Attribute '" + I->getAsString() +
"' only applies to functions!", V); "' only applies to functions!", V);
@ -897,6 +898,21 @@ void Verifier::VerifyFunctionAttrs(FunctionType *FT, AttributeSet Attrs,
Attrs.hasAttribute(AttributeSet::FunctionIndex, Attrs.hasAttribute(AttributeSet::FunctionIndex,
Attribute::AlwaysInline)), Attribute::AlwaysInline)),
"Attributes 'noinline and alwaysinline' are incompatible!", V); "Attributes 'noinline and alwaysinline' are incompatible!", V);
if (Attrs.hasAttribute(AttributeSet::FunctionIndex,
Attribute::OptimizeNone)) {
Assert1(!Attrs.hasAttribute(AttributeSet::FunctionIndex,
Attribute::AlwaysInline),
"Attributes 'alwaysinline and optnone' are incompatible!", V);
Assert1(!Attrs.hasAttribute(AttributeSet::FunctionIndex,
Attribute::OptimizeForSize),
"Attributes 'optsize and optnone' are incompatible!", V);
Assert1(!Attrs.hasAttribute(AttributeSet::FunctionIndex,
Attribute::MinSize),
"Attributes 'minsize and optnone' are incompatible!", V);
}
} }
void Verifier::VerifyBitcastType(const Value *V, Type *DestTy, Type *SrcTy) { void Verifier::VerifyBitcastType(const Value *V, Type *DestTy, Type *SrcTy) {

View File

@ -497,6 +497,7 @@ void CppWriter::printAttributes(const AttributeSet &PAL,
HANDLE_ATTR(ReadOnly); HANDLE_ATTR(ReadOnly);
HANDLE_ATTR(NoInline); HANDLE_ATTR(NoInline);
HANDLE_ATTR(AlwaysInline); HANDLE_ATTR(AlwaysInline);
HANDLE_ATTR(OptimizeNone);
HANDLE_ATTR(OptimizeForSize); HANDLE_ATTR(OptimizeForSize);
HANDLE_ATTR(StackProtect); HANDLE_ATTR(StackProtect);
HANDLE_ATTR(StackProtectReq); HANDLE_ATTR(StackProtectReq);

View File

@ -203,7 +203,13 @@ define void @f34()
; CHECK: define void @f34() ; CHECK: define void @f34()
{ {
call void @nobuiltin() nobuiltin call void @nobuiltin() nobuiltin
; CHECK: call void @nobuiltin() #23 ; CHECK: call void @nobuiltin() #24
ret void;
}
define void @f35() optnone
; CHECK: define void @f35() #23
{
ret void; ret void;
} }
@ -230,4 +236,6 @@ define void @f34()
; CHECK: attributes #20 = { "cpu"="cortex-a8" } ; CHECK: attributes #20 = { "cpu"="cortex-a8" }
; CHECK: attributes #21 = { sspstrong } ; CHECK: attributes #21 = { sspstrong }
; CHECK: attributes #22 = { minsize } ; CHECK: attributes #22 = { minsize }
; CHECK: attributes #23 = { nobuiltin } ; CHECK: attributes #23 = { optnone }
; CHECK: attributes #24 = { nobuiltin }

12
test/Feature/optnone.ll Normal file
View File

@ -0,0 +1,12 @@
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
; Check for the presence of attribute noopt in the disassembly.
; CHECK: @foo() #0
define void @foo() #0 {
ret void
}
; CHECK: attributes #0 = { optnone }
attributes #0 = { optnone }

View File

@ -85,6 +85,7 @@
<item> noredzone </item> <item> noredzone </item>
<item> noreturn </item> <item> noreturn </item>
<item> nounwind </item> <item> nounwind </item>
<item> optnone </item>
<item> optsize </item> <item> optsize </item>
<item> readnone </item> <item> readnone </item>
<item> readonly </item> <item> readonly </item>

View File

@ -48,7 +48,7 @@ syn keyword llvmKeyword linkonce linkonce_odr linkonce_odr_auto_hide
syn keyword llvmKeyword localdynamic localexec minsize module monotonic syn keyword llvmKeyword localdynamic localexec minsize module monotonic
syn keyword llvmKeyword msp430_intrcc naked nest noalias nocapture syn keyword llvmKeyword msp430_intrcc naked nest noalias nocapture
syn keyword llvmKeyword noimplicitfloat noinline nonlazybind noredzone noreturn syn keyword llvmKeyword noimplicitfloat noinline nonlazybind noredzone noreturn
syn keyword llvmKeyword nounwind optsize personality private protected syn keyword llvmKeyword nounwind optnone optsize personality private protected
syn keyword llvmKeyword ptx_device ptx_kernel readnone readonly release syn keyword llvmKeyword ptx_device ptx_kernel readnone readonly release
syn keyword llvmKeyword returns_twice sanitize_thread sanitize_memory syn keyword llvmKeyword returns_twice sanitize_thread sanitize_memory
syn keyword llvmKeyword section seq_cst sideeffect signext singlethread syn keyword llvmKeyword section seq_cst sideeffect signext singlethread