MergeFunctions Pass, introduced total ordering among function attributes.
authorStepan Dyatkovskiy <stpworld@narod.ru>
Fri, 16 May 2014 08:55:34 +0000 (08:55 +0000)
committerStepan Dyatkovskiy <stpworld@narod.ru>
Fri, 16 May 2014 08:55:34 +0000 (08:55 +0000)
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

lib/Transforms/IPO/MergeFunctions.cpp

index 3a287e0f21852b7c09cfeed6df3a4ec75089ecf5..55d199ee7bae409803febe435658d50b742ebb37 100644 (file)
@@ -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.