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

Philip Reames listmail at philipreames.com
Mon Mar 2 15:10:51 PST 2015


Ignore this.  Fixed in a later commit.

On 03/02/2015 03:10 PM, Philip Reames wrote:
> If both array refs are zero length, it looks like we return them as 
> non-equal with this change.  That seems incorrect.
>
> Philip
>
> On 03/01/2015 03:35 PM, Benjamin Kramer wrote:
>> 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.
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list