mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
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:
parent
06117b6598
commit
dd4924c564
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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!");
|
||||||
|
@ -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!");
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user