mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-09 05:11:39 +00:00
MergeFunctions Pass, introduced total ordering among function attributes.
This patch belongs to patch series that improves MergeFunctions performance time from O(N*N) to O(N*log(N)). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208953 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fbe77b1c6a
commit
0288fb012c
@ -367,6 +367,8 @@ private:
|
||||
|
||||
int cmpAPInt(const APInt &L, const APInt &R) const;
|
||||
int cmpAPFloat(const APFloat &L, const APFloat &R) const;
|
||||
int cmpStrings(StringRef L, StringRef R) const;
|
||||
int cmpAttrs(const AttributeSet L, const AttributeSet R) const;
|
||||
|
||||
// The two functions undergoing comparison.
|
||||
const Function *F1, *F2;
|
||||
@ -432,6 +434,40 @@ int FunctionComparator::cmpAPFloat(const APFloat &L, const APFloat &R) const {
|
||||
return cmpAPInt(L.bitcastToAPInt(), R.bitcastToAPInt());
|
||||
}
|
||||
|
||||
int FunctionComparator::cmpStrings(StringRef L, StringRef R) const {
|
||||
// Prevent heavy comparison, compare sizes first.
|
||||
if (int Res = cmpNumbers(L.size(), R.size()))
|
||||
return Res;
|
||||
|
||||
// Compare strings lexicographically only when it is necessary: only when
|
||||
// strings are equal in size.
|
||||
return L.compare(R);
|
||||
}
|
||||
|
||||
int FunctionComparator::cmpAttrs(const AttributeSet L,
|
||||
const AttributeSet R) const {
|
||||
if (int Res = cmpNumbers(L.getNumSlots(), R.getNumSlots()))
|
||||
return Res;
|
||||
|
||||
for (unsigned i = 0, e = L.getNumSlots(); i != e; ++i) {
|
||||
AttributeSet::iterator LI = L.begin(i), LE = L.end(i), RI = R.begin(i),
|
||||
RE = R.end(i);
|
||||
for (; LI != LE && RI != RE; ++LI, ++RI) {
|
||||
Attribute LA = *LI;
|
||||
Attribute RA = *RI;
|
||||
if (LA < RA)
|
||||
return -1;
|
||||
if (RA < LA)
|
||||
return 1;
|
||||
}
|
||||
if (LI != LE)
|
||||
return 1;
|
||||
if (RI != RE)
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Constants comparison:
|
||||
/// 1. Check whether type of L constant could be losslessly bitcasted to R
|
||||
/// type.
|
||||
|
Loading…
x
Reference in New Issue
Block a user