[llvm] r230920 - ArrayRef: Put back std::equal for operator== with a check for the empty ArrayRefs

Benjamin Kramer benny.kra at googlemail.com
Sun Mar 1 15:35:21 PST 2015


Author: d0k
Date: Sun Mar  1 17:35:20 2015
New Revision: 230920

URL: http://llvm.org/viewvc/llvm-project?rev=230920&view=rev
Log:
ArrayRef: Put back std::equal for operator== with a check for the empty ArrayRefs

This has the nice property of compiling down to memcmp when feasible. An empty
ArrayRef can have a nullptr in its Data field. I didn't find anything in the
standard speaking against std::equal(nullptr, nullptr, nullptr) begin valid but
MSVC asserts. The way libstdc++ lowers std::equal down to memcmp also makes
invoking std::equal with a nullptr undefined behavior so checking is the only
way to be safe.

The extra check doesn't cost us perf either because we're essentially peeling
the loop header away from the rotated loop.

Modified:
    llvm/trunk/include/llvm/ADT/ArrayRef.h

Modified: llvm/trunk/include/llvm/ADT/ArrayRef.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ArrayRef.h?rev=230920&r1=230919&r2=230920&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/ArrayRef.h (original)
+++ llvm/trunk/include/llvm/ADT/ArrayRef.h Sun Mar  1 17:35:20 2015
@@ -135,15 +135,9 @@ namespace llvm {
 
     /// equals - Check for element-wise equality.
     bool equals(ArrayRef RHS) const {
-      if (Length != RHS.Length)
+      if (Length != RHS.Length || Length == 0)
         return false;
-      // Don't use std::equal(), since it asserts in MSVC on nullptr iterators.
-      for (auto L = begin(), LE = end(), R = RHS.begin(); L != LE; ++L, ++R)
-        // Match std::equal() in using == (instead of !=) to minimize API
-        // requirements of ArrayRef'ed types.
-        if (!(*L == *R))
-          return false;
-      return true;
+      return std::equal(begin(), end(), RHS.begin());
     }
 
     /// slice(n) - Chop off the first N elements of the array.





More information about the llvm-commits mailing list