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:
parent
9867b44c59
commit
b486212f5a
@ -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,
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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:
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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
12
test/Feature/optnone.ll
Normal 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 }
|
||||||
|
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user