[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