Move FN_NOTE_AlwaysInline and other out of ParamAttrs namespace.

Do not check isDeclaration() in hasNote(). It is clients' responsibility.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56524 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel 2008-09-23 23:52:03 +00:00
parent 06117b6598
commit dd4924c564
13 changed files with 41 additions and 42 deletions

View File

@ -46,13 +46,6 @@ const Attributes ReadOnly = 1<<10; ///< Function only reads from memory
const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits) const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits)
// 0 = unknown, else in clear (not log) // 0 = unknown, else in clear (not log)
/// Function notes are implemented as attributes stored at index ~0 in
/// parameter attribute list.
const Attributes FN_NOTE_None = 0;
const Attributes FN_NOTE_NoInline = 1<<0; // inline=never
const Attributes FN_NOTE_AlwaysInline = 1<<1; // inline=always
const Attributes FN_NOTE_OptimizeForSize = 1<<2; // opt_size
/// @brief Attributes that only apply to function parameters. /// @brief Attributes that only apply to function parameters.
const Attributes ParameterOnly = ByVal | Nest | StructRet; const Attributes ParameterOnly = ByVal | Nest | StructRet;
@ -85,6 +78,12 @@ inline Attributes constructAlignmentFromInt(unsigned i) {
std::string getAsString(Attributes Attrs); std::string getAsString(Attributes Attrs);
} // end namespace ParamAttr } // end namespace ParamAttr
/// Function notes are implemented as attributes stored at index ~0 in
/// parameter attribute list.
const Attributes FN_NOTE_None = 0;
const Attributes FN_NOTE_NoInline = 1<<0; // inline=never
const Attributes FN_NOTE_AlwaysInline = 1<<1; // inline=always
const Attributes FN_NOTE_OptimizeForSize = 1<<2; // opt_size
/// This is just a pair of values to associate a set of parameter attributes /// This is just a pair of values to associate a set of parameter attributes
/// with a parameter index. /// with a parameter index.

View File

@ -152,7 +152,7 @@ public:
/// hasNote - Return true if this function has given note. /// hasNote - Return true if this function has given note.
bool hasNote(Attributes N) const { bool hasNote(Attributes N) const {
// Notes are stored at ~0 index in parameter attribute list // Notes are stored at ~0 index in parameter attribute list
return (!isDeclaration() && paramHasAttr(~0, N)); return (paramHasAttr(~0, N));
} }
/// setNotes - Set notes for this function /// setNotes - Set notes for this function

View File

@ -4125,11 +4125,11 @@ yyreduce:
#line 1298 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" #line 1298 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y"
{ {
unsigned tmp = (yyvsp[(1) - (3)].ParamAttrs) | (yyvsp[(3) - (3)].ParamAttrs); unsigned tmp = (yyvsp[(1) - (3)].ParamAttrs) | (yyvsp[(3) - (3)].ParamAttrs);
if ((yyvsp[(3) - (3)].ParamAttrs) == ParamAttr::FN_NOTE_NoInline if ((yyvsp[(3) - (3)].ParamAttrs) == FN_NOTE_NoInline
&& ((yyvsp[(1) - (3)].ParamAttrs) & ParamAttr::FN_NOTE_AlwaysInline)) && ((yyvsp[(1) - (3)].ParamAttrs) & FN_NOTE_AlwaysInline))
GEN_ERROR("Function Notes may include only one inline notes!") GEN_ERROR("Function Notes may include only one inline notes!")
if ((yyvsp[(3) - (3)].ParamAttrs) == ParamAttr::FN_NOTE_AlwaysInline if ((yyvsp[(3) - (3)].ParamAttrs) == FN_NOTE_AlwaysInline
&& ((yyvsp[(1) - (3)].ParamAttrs) & ParamAttr::FN_NOTE_NoInline)) && ((yyvsp[(1) - (3)].ParamAttrs) & FN_NOTE_NoInline))
GEN_ERROR("Function Notes may include only one inline notes!") GEN_ERROR("Function Notes may include only one inline notes!")
(yyval.ParamAttrs) = tmp; (yyval.ParamAttrs) = tmp;
CHECK_FOR_ERROR CHECK_FOR_ERROR
@ -4138,22 +4138,22 @@ yyreduce:
case 131: case 131:
#line 1311 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" #line 1311 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.ParamAttrs) = ParamAttr::FN_NOTE_NoInline; ;} { (yyval.ParamAttrs) = FN_NOTE_NoInline; ;}
break; break;
case 132: case 132:
#line 1312 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" #line 1312 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.ParamAttrs) = ParamAttr::FN_NOTE_AlwaysInline; ;} { (yyval.ParamAttrs) = FN_NOTE_AlwaysInline; ;}
break; break;
case 133: case 133:
#line 1313 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" #line 1313 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.ParamAttrs) = ParamAttr::FN_NOTE_OptimizeForSize; ;} { (yyval.ParamAttrs) = FN_NOTE_OptimizeForSize; ;}
break; break;
case 134: case 134:
#line 1316 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" #line 1316 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.ParamAttrs) = ParamAttr::FN_NOTE_None; ;} { (yyval.ParamAttrs) = FN_NOTE_None; ;}
break; break;
case 135: case 135:

View File

@ -1297,23 +1297,23 @@ OptFuncAttrs : /* empty */ { $$ = ParamAttr::None; }
FuncNoteList : FuncNote { $$ = $1; } FuncNoteList : FuncNote { $$ = $1; }
| FuncNoteList ',' FuncNote { | FuncNoteList ',' FuncNote {
unsigned tmp = $1 | $3; unsigned tmp = $1 | $3;
if ($3 == ParamAttr::FN_NOTE_NoInline if ($3 == FN_NOTE_NoInline
&& ($1 & ParamAttr::FN_NOTE_AlwaysInline)) && ($1 & FN_NOTE_AlwaysInline))
GEN_ERROR("Function Notes may include only one inline notes!") GEN_ERROR("Function Notes may include only one inline notes!")
if ($3 == ParamAttr::FN_NOTE_AlwaysInline if ($3 == FN_NOTE_AlwaysInline
&& ($1 & ParamAttr::FN_NOTE_NoInline)) && ($1 & FN_NOTE_NoInline))
GEN_ERROR("Function Notes may include only one inline notes!") GEN_ERROR("Function Notes may include only one inline notes!")
$$ = tmp; $$ = tmp;
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
; ;
FuncNote : INLINE '=' NEVER { $$ = ParamAttr::FN_NOTE_NoInline; } FuncNote : INLINE '=' NEVER { $$ = FN_NOTE_NoInline; }
| INLINE '=' ALWAYS { $$ = ParamAttr::FN_NOTE_AlwaysInline; } | INLINE '=' ALWAYS { $$ = FN_NOTE_AlwaysInline; }
| OPTIMIZEFORSIZE { $$ = ParamAttr::FN_NOTE_OptimizeForSize; } | OPTIMIZEFORSIZE { $$ = FN_NOTE_OptimizeForSize; }
; ;
OptFuncNotes : /* empty */ { $$ = ParamAttr::FN_NOTE_None; } OptFuncNotes : /* empty */ { $$ = FN_NOTE_None; }
| FNNOTE '(' FuncNoteList ')' { | FNNOTE '(' FuncNoteList ')' {
$$ = $3; $$ = $3;
} }

View File

@ -1297,23 +1297,23 @@ OptFuncAttrs : /* empty */ { $$ = ParamAttr::None; }
FuncNoteList : FuncNote { $$ = $1; } FuncNoteList : FuncNote { $$ = $1; }
| FuncNoteList ',' FuncNote { | FuncNoteList ',' FuncNote {
unsigned tmp = $1 | $3; unsigned tmp = $1 | $3;
if ($3 == ParamAttr::FN_NOTE_NoInline if ($3 == FN_NOTE_NoInline
&& ($1 & ParamAttr::FN_NOTE_AlwaysInline)) && ($1 & FN_NOTE_AlwaysInline))
GEN_ERROR("Function Notes may include only one inline notes!") GEN_ERROR("Function Notes may include only one inline notes!")
if ($3 == ParamAttr::FN_NOTE_AlwaysInline if ($3 == FN_NOTE_AlwaysInline
&& ($1 & ParamAttr::FN_NOTE_NoInline)) && ($1 & FN_NOTE_NoInline))
GEN_ERROR("Function Notes may include only one inline notes!") GEN_ERROR("Function Notes may include only one inline notes!")
$$ = tmp; $$ = tmp;
CHECK_FOR_ERROR CHECK_FOR_ERROR
} }
; ;
FuncNote : INLINE '=' NEVER { $$ = ParamAttr::FN_NOTE_NoInline; } FuncNote : INLINE '=' NEVER { $$ = FN_NOTE_NoInline; }
| INLINE '=' ALWAYS { $$ = ParamAttr::FN_NOTE_AlwaysInline; } | INLINE '=' ALWAYS { $$ = FN_NOTE_AlwaysInline; }
| OPTIMIZEFORSIZE { $$ = ParamAttr::FN_NOTE_OptimizeForSize; } | OPTIMIZEFORSIZE { $$ = FN_NOTE_OptimizeForSize; }
; ;
OptFuncNotes : /* empty */ { $$ = ParamAttr::FN_NOTE_None; } OptFuncNotes : /* empty */ { $$ = FN_NOTE_None; }
| FNNOTE '(' FuncNoteList ')' { | FNNOTE '(' FuncNoteList ')' {
$$ = $3; $$ = $3;
} }

View File

@ -160,7 +160,7 @@ void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
SwitchToTextSection(SectionName.c_str()); SwitchToTextSection(SectionName.c_str());
unsigned FnAlign = OptimizeForSize ? 1 : 4; unsigned FnAlign = OptimizeForSize ? 1 : 4;
if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) if (!F->isDeclaration() && F->hasNote(FN_NOTE_OptimizeForSize))
FnAlign = 1; FnAlign = 1;
switch (F->getLinkage()) { switch (F->getLinkage()) {
default: assert(0 && "Unknown linkage type!"); default: assert(0 && "Unknown linkage type!");

View File

@ -147,7 +147,7 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
SwitchToTextSection(getSectionForFunction(*F).c_str(), F); SwitchToTextSection(getSectionForFunction(*F).c_str(), F);
unsigned FnAlign = OptimizeForSize ? 1 : 4; unsigned FnAlign = OptimizeForSize ? 1 : 4;
if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) if (!F->isDeclaration() && F->hasNote(FN_NOTE_OptimizeForSize))
FnAlign = 1; FnAlign = 1;
switch (F->getLinkage()) { switch (F->getLinkage()) {
default: assert(0 && "Unsupported linkage type!"); default: assert(0 && "Unsupported linkage type!");

View File

@ -63,7 +63,7 @@ bool AlwaysInliner::doInitialization(CallGraph &CG) {
for (Module::iterator I = M.begin(), E = M.end(); for (Module::iterator I = M.begin(), E = M.end();
I != E; ++I) I != E; ++I)
if (!I->isDeclaration() && !I->hasNote(ParamAttr::FN_NOTE_AlwaysInline)) if (!I->isDeclaration() && !I->hasNote(FN_NOTE_AlwaysInline))
NeverInline.insert(I); NeverInline.insert(I);
return false; return false;

View File

@ -65,7 +65,7 @@ bool SimpleInliner::doInitialization(CallGraph &CG) {
for (Module::iterator I = M.begin(), E = M.end(); for (Module::iterator I = M.begin(), E = M.end();
I != E; ++I) I != E; ++I)
if (I->hasNote(ParamAttr::FN_NOTE_NoInline)) if (!I->isDeclaration() && I->hasNote(FN_NOTE_NoInline))
NeverInline.insert(I); NeverInline.insert(I);
// Get llvm.noinline // Get llvm.noinline

View File

@ -141,7 +141,7 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
int CurrentThreshold = InlineThreshold; int CurrentThreshold = InlineThreshold;
Function *Fn = CS.getCaller(); Function *Fn = CS.getCaller();
if (Fn && Fn->hasNote(ParamAttr::FN_NOTE_OptimizeForSize) if (Fn && !Fn->isDeclaration() && Fn->hasNote(FN_NOTE_OptimizeForSize)
&& InlineThreshold != 50) { && InlineThreshold != 50) {
CurrentThreshold = 50; CurrentThreshold = 50;
} }

View File

@ -430,7 +430,7 @@ bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val){
Function *F = loopHeader->getParent(); Function *F = loopHeader->getParent();
// Do not unswitch if the function is optimized for size. // Do not unswitch if the function is optimized for size.
if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) if (!F->isDeclaration() && F->hasNote(FN_NOTE_OptimizeForSize))
return false; return false;
// Check to see if it would be profitable to unswitch current loop. // Check to see if it would be profitable to unswitch current loop.

View File

@ -222,7 +222,7 @@ int InlineCostAnalyzer::getInlineCost(CallSite CS,
if (CalleeFI.NeverInline) if (CalleeFI.NeverInline)
return 2000000000; return 2000000000;
if (Callee->hasNote(ParamAttr::FN_NOTE_AlwaysInline)) if (!Callee->isDeclaration() && Callee->hasNote(FN_NOTE_AlwaysInline))
return -2000000000; return -2000000000;
// Add to the inline quality for properties that make the call valuable to // Add to the inline quality for properties that make the call valuable to

View File

@ -1412,12 +1412,12 @@ void AssemblyWriter::printFunction(const Function *F) {
} else { } else {
bool insideNotes = false; bool insideNotes = false;
if (F->hasNote(ParamAttr::FN_NOTE_AlwaysInline)) { if (F->hasNote(FN_NOTE_AlwaysInline)) {
Out << "notes("; Out << "notes(";
insideNotes = true; insideNotes = true;
Out << "inline=always"; Out << "inline=always";
} }
if (F->hasNote(ParamAttr::FN_NOTE_NoInline)) { if (F->hasNote(FN_NOTE_NoInline)) {
if (insideNotes) if (insideNotes)
Out << ","; Out << ",";
else { else {
@ -1426,7 +1426,7 @@ void AssemblyWriter::printFunction(const Function *F) {
} }
Out << "inline=never"; Out << "inline=never";
} }
if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) { if (F->hasNote(FN_NOTE_OptimizeForSize)) {
if (insideNotes) if (insideNotes)
Out << ","; Out << ",";
else { else {