[PATCH] Optimize memcmp(x, y, n)==0 for small n and suitably aligned x/y.

Eelis eelis at eelis.net
Wed Jan 14 07:11:32 PST 2015


Addressed all review comments except the "Len <= 8" check, because I don't know what should be used instead.


http://reviews.llvm.org/D6952

Files:
  Transforms/Utils/SimplifyLibCalls.cpp

Index: Transforms/Utils/SimplifyLibCalls.cpp
===================================================================
--- Transforms/Utils/SimplifyLibCalls.cpp
+++ Transforms/Utils/SimplifyLibCalls.cpp
@@ -32,6 +32,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Target/TargetLibraryInfo.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include "llvm/Transforms/Utils/Local.h"
 
 using namespace llvm;
 using namespace PatternMatch;
@@ -949,6 +950,26 @@
     return B.CreateSub(LHSV, RHSV, "chardiff");
   }
 
+  // memcmp(S1,S2,8)==0 -> (*(int64_t*)S1 != *(int64_t*)S2)==0
+  // (And same for 16/32 bit.)
+  if (Len <= 8 && isPowerOf2_64(Len) &&
+      isOnlyUsedInZeroEqualityComparison(CI) &&
+      getKnownAlignment(LHS, DL, nullptr, CI) >= Len &&
+      getKnownAlignment(RHS, DL, nullptr, CI) >= Len) {
+
+    IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8);
+
+    Type *LHSPtrTy =
+        IntType->getPointerTo(LHS->getType()->getPointerAddressSpace());
+    Type *RHSPtrTy =
+        IntType->getPointerTo(RHS->getType()->getPointerAddressSpace());
+
+    Value *LHSV = B.CreateLoad(B.CreateBitCast(LHS, LHSPtrTy, "lhsc"), "lhsv");
+    Value *RHSV = B.CreateLoad(B.CreateBitCast(RHS, RHSPtrTy, "rhsc"), "rhsv");
+
+    return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp");
+  }
+
   // Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant)
   StringRef LHSStr, RHSStr;
   if (getConstantStringInfo(LHS, LHSStr) &&

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6952.18151.patch
Type: text/x-patch
Size: 1495 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150114/484733a9/attachment.bin>


More information about the llvm-commits mailing list