From: Devang Patel Date: Tue, 23 Sep 2008 23:52:03 +0000 (+0000) Subject: Move FN_NOTE_AlwaysInline and other out of ParamAttrs namespace. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=dd4924c564c7a661b78b604ebf16dfef7aa62b35 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 --- diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index fbedb723811..a503354567c 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -46,13 +46,6 @@ const Attributes ReadOnly = 1<<10; ///< Function only reads from memory const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits) // 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. const Attributes ParameterOnly = ByVal | Nest | StructRet; @@ -85,6 +78,12 @@ inline Attributes constructAlignmentFromInt(unsigned i) { std::string getAsString(Attributes Attrs); } // 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 /// with a parameter index. diff --git a/include/llvm/Function.h b/include/llvm/Function.h index b8009094230..7a39f922823 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -152,7 +152,7 @@ public: /// hasNote - Return true if this function has given note. bool hasNote(Attributes N) const { // 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 diff --git a/lib/AsmParser/llvmAsmParser.cpp.cvs b/lib/AsmParser/llvmAsmParser.cpp.cvs index 5e536f8717d..4d8ab7445ca 100644 --- a/lib/AsmParser/llvmAsmParser.cpp.cvs +++ b/lib/AsmParser/llvmAsmParser.cpp.cvs @@ -4125,11 +4125,11 @@ yyreduce: #line 1298 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" { unsigned tmp = (yyvsp[(1) - (3)].ParamAttrs) | (yyvsp[(3) - (3)].ParamAttrs); - if ((yyvsp[(3) - (3)].ParamAttrs) == ParamAttr::FN_NOTE_NoInline - && ((yyvsp[(1) - (3)].ParamAttrs) & ParamAttr::FN_NOTE_AlwaysInline)) + if ((yyvsp[(3) - (3)].ParamAttrs) == FN_NOTE_NoInline + && ((yyvsp[(1) - (3)].ParamAttrs) & FN_NOTE_AlwaysInline)) GEN_ERROR("Function Notes may include only one inline notes!") - if ((yyvsp[(3) - (3)].ParamAttrs) == ParamAttr::FN_NOTE_AlwaysInline - && ((yyvsp[(1) - (3)].ParamAttrs) & ParamAttr::FN_NOTE_NoInline)) + if ((yyvsp[(3) - (3)].ParamAttrs) == FN_NOTE_AlwaysInline + && ((yyvsp[(1) - (3)].ParamAttrs) & FN_NOTE_NoInline)) GEN_ERROR("Function Notes may include only one inline notes!") (yyval.ParamAttrs) = tmp; CHECK_FOR_ERROR @@ -4138,22 +4138,22 @@ yyreduce: case 131: #line 1311 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.ParamAttrs) = ParamAttr::FN_NOTE_NoInline; ;} + { (yyval.ParamAttrs) = FN_NOTE_NoInline; ;} break; case 132: #line 1312 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.ParamAttrs) = ParamAttr::FN_NOTE_AlwaysInline; ;} + { (yyval.ParamAttrs) = FN_NOTE_AlwaysInline; ;} break; case 133: #line 1313 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.ParamAttrs) = ParamAttr::FN_NOTE_OptimizeForSize; ;} + { (yyval.ParamAttrs) = FN_NOTE_OptimizeForSize; ;} break; case 134: #line 1316 "/Volumes/Nanpura/mainline/llvm/lib/AsmParser/llvmAsmParser.y" - { (yyval.ParamAttrs) = ParamAttr::FN_NOTE_None; ;} + { (yyval.ParamAttrs) = FN_NOTE_None; ;} break; case 135: diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index e2671232fee..5de34a722c7 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -1297,23 +1297,23 @@ OptFuncAttrs : /* empty */ { $$ = ParamAttr::None; } FuncNoteList : FuncNote { $$ = $1; } | FuncNoteList ',' FuncNote { unsigned tmp = $1 | $3; - if ($3 == ParamAttr::FN_NOTE_NoInline - && ($1 & ParamAttr::FN_NOTE_AlwaysInline)) + if ($3 == FN_NOTE_NoInline + && ($1 & FN_NOTE_AlwaysInline)) GEN_ERROR("Function Notes may include only one inline notes!") - if ($3 == ParamAttr::FN_NOTE_AlwaysInline - && ($1 & ParamAttr::FN_NOTE_NoInline)) + if ($3 == FN_NOTE_AlwaysInline + && ($1 & FN_NOTE_NoInline)) GEN_ERROR("Function Notes may include only one inline notes!") $$ = tmp; CHECK_FOR_ERROR } ; -FuncNote : INLINE '=' NEVER { $$ = ParamAttr::FN_NOTE_NoInline; } - | INLINE '=' ALWAYS { $$ = ParamAttr::FN_NOTE_AlwaysInline; } - | OPTIMIZEFORSIZE { $$ = ParamAttr::FN_NOTE_OptimizeForSize; } +FuncNote : INLINE '=' NEVER { $$ = FN_NOTE_NoInline; } + | INLINE '=' ALWAYS { $$ = FN_NOTE_AlwaysInline; } + | OPTIMIZEFORSIZE { $$ = FN_NOTE_OptimizeForSize; } ; -OptFuncNotes : /* empty */ { $$ = ParamAttr::FN_NOTE_None; } +OptFuncNotes : /* empty */ { $$ = FN_NOTE_None; } | FNNOTE '(' FuncNoteList ')' { $$ = $3; } diff --git a/lib/AsmParser/llvmAsmParser.y.cvs b/lib/AsmParser/llvmAsmParser.y.cvs index e2671232fee..5de34a722c7 100644 --- a/lib/AsmParser/llvmAsmParser.y.cvs +++ b/lib/AsmParser/llvmAsmParser.y.cvs @@ -1297,23 +1297,23 @@ OptFuncAttrs : /* empty */ { $$ = ParamAttr::None; } FuncNoteList : FuncNote { $$ = $1; } | FuncNoteList ',' FuncNote { unsigned tmp = $1 | $3; - if ($3 == ParamAttr::FN_NOTE_NoInline - && ($1 & ParamAttr::FN_NOTE_AlwaysInline)) + if ($3 == FN_NOTE_NoInline + && ($1 & FN_NOTE_AlwaysInline)) GEN_ERROR("Function Notes may include only one inline notes!") - if ($3 == ParamAttr::FN_NOTE_AlwaysInline - && ($1 & ParamAttr::FN_NOTE_NoInline)) + if ($3 == FN_NOTE_AlwaysInline + && ($1 & FN_NOTE_NoInline)) GEN_ERROR("Function Notes may include only one inline notes!") $$ = tmp; CHECK_FOR_ERROR } ; -FuncNote : INLINE '=' NEVER { $$ = ParamAttr::FN_NOTE_NoInline; } - | INLINE '=' ALWAYS { $$ = ParamAttr::FN_NOTE_AlwaysInline; } - | OPTIMIZEFORSIZE { $$ = ParamAttr::FN_NOTE_OptimizeForSize; } +FuncNote : INLINE '=' NEVER { $$ = FN_NOTE_NoInline; } + | INLINE '=' ALWAYS { $$ = FN_NOTE_AlwaysInline; } + | OPTIMIZEFORSIZE { $$ = FN_NOTE_OptimizeForSize; } ; -OptFuncNotes : /* empty */ { $$ = ParamAttr::FN_NOTE_None; } +OptFuncNotes : /* empty */ { $$ = FN_NOTE_None; } | FNNOTE '(' FuncNoteList ')' { $$ = $3; } diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index a783bd279aa..2c9975eb73b 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -160,7 +160,7 @@ void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) { SwitchToTextSection(SectionName.c_str()); unsigned FnAlign = OptimizeForSize ? 1 : 4; - if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) + if (!F->isDeclaration() && F->hasNote(FN_NOTE_OptimizeForSize)) FnAlign = 1; switch (F->getLinkage()) { default: assert(0 && "Unknown linkage type!"); diff --git a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp index 559e9ebd5b3..7c2713cf116 100644 --- a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp @@ -147,7 +147,7 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { SwitchToTextSection(getSectionForFunction(*F).c_str(), F); unsigned FnAlign = OptimizeForSize ? 1 : 4; - if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) + if (!F->isDeclaration() && F->hasNote(FN_NOTE_OptimizeForSize)) FnAlign = 1; switch (F->getLinkage()) { default: assert(0 && "Unsupported linkage type!"); diff --git a/lib/Transforms/IPO/InlineAlways.cpp b/lib/Transforms/IPO/InlineAlways.cpp index 4793a17b842..ddcc79cf59b 100644 --- a/lib/Transforms/IPO/InlineAlways.cpp +++ b/lib/Transforms/IPO/InlineAlways.cpp @@ -63,7 +63,7 @@ bool AlwaysInliner::doInitialization(CallGraph &CG) { for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (!I->isDeclaration() && !I->hasNote(ParamAttr::FN_NOTE_AlwaysInline)) + if (!I->isDeclaration() && !I->hasNote(FN_NOTE_AlwaysInline)) NeverInline.insert(I); return false; diff --git a/lib/Transforms/IPO/InlineSimple.cpp b/lib/Transforms/IPO/InlineSimple.cpp index 6db4c908b77..42897676418 100644 --- a/lib/Transforms/IPO/InlineSimple.cpp +++ b/lib/Transforms/IPO/InlineSimple.cpp @@ -65,7 +65,7 @@ bool SimpleInliner::doInitialization(CallGraph &CG) { for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (I->hasNote(ParamAttr::FN_NOTE_NoInline)) + if (!I->isDeclaration() && I->hasNote(FN_NOTE_NoInline)) NeverInline.insert(I); // Get llvm.noinline diff --git a/lib/Transforms/IPO/Inliner.cpp b/lib/Transforms/IPO/Inliner.cpp index 2af5a7264df..7922d6e7a94 100644 --- a/lib/Transforms/IPO/Inliner.cpp +++ b/lib/Transforms/IPO/Inliner.cpp @@ -141,7 +141,7 @@ bool Inliner::runOnSCC(const std::vector &SCC) { int CurrentThreshold = InlineThreshold; Function *Fn = CS.getCaller(); - if (Fn && Fn->hasNote(ParamAttr::FN_NOTE_OptimizeForSize) + if (Fn && !Fn->isDeclaration() && Fn->hasNote(FN_NOTE_OptimizeForSize) && InlineThreshold != 50) { CurrentThreshold = 50; } diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index 178bf783971..4fd3d031a1a 100644 --- a/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -430,7 +430,7 @@ bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val){ Function *F = loopHeader->getParent(); // 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; // Check to see if it would be profitable to unswitch current loop. diff --git a/lib/Transforms/Utils/InlineCost.cpp b/lib/Transforms/Utils/InlineCost.cpp index eb825287be6..6ecd0609912 100644 --- a/lib/Transforms/Utils/InlineCost.cpp +++ b/lib/Transforms/Utils/InlineCost.cpp @@ -222,7 +222,7 @@ int InlineCostAnalyzer::getInlineCost(CallSite CS, if (CalleeFI.NeverInline) return 2000000000; - if (Callee->hasNote(ParamAttr::FN_NOTE_AlwaysInline)) + if (!Callee->isDeclaration() && Callee->hasNote(FN_NOTE_AlwaysInline)) return -2000000000; // Add to the inline quality for properties that make the call valuable to diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 68335974d45..3b9b6690fe9 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -1412,12 +1412,12 @@ void AssemblyWriter::printFunction(const Function *F) { } else { bool insideNotes = false; - if (F->hasNote(ParamAttr::FN_NOTE_AlwaysInline)) { + if (F->hasNote(FN_NOTE_AlwaysInline)) { Out << "notes("; insideNotes = true; Out << "inline=always"; } - if (F->hasNote(ParamAttr::FN_NOTE_NoInline)) { + if (F->hasNote(FN_NOTE_NoInline)) { if (insideNotes) Out << ","; else { @@ -1426,7 +1426,7 @@ void AssemblyWriter::printFunction(const Function *F) { } Out << "inline=never"; } - if (F->hasNote(ParamAttr::FN_NOTE_OptimizeForSize)) { + if (F->hasNote(FN_NOTE_OptimizeForSize)) { if (insideNotes) Out << ","; else {