On Feb 15, 2012, at 1:19 AM, Dave Zarzycki wrote:

> On Feb 14, 2012, at 7:41 PM, Howard Hinnant <[email protected]> wrote:
> 
>> void
>> __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, 
>> false_type)
>> {
>> -    while (__begin_ < __new_begin)
>> +    while (__begin_ != __new_begin)
>>        __alloc_traits::destroy(__alloc(), __begin_++);
>> }
> 
> Howard,
> 
> Are there other places in libcxx where we should replace relational pointer 
> comparisons with equality pointer comparisons?

Almost certainly, but I have not found those places yet.

> Also, what does the latest C++ specification say about what compilers may or 
> may not do with relational pointer comparisons? What does clang do? I've been 
> searching the web and I don't feel like I've found a solid answer yet.

I don't believe the C++ standard will say anything.

I believe what is happening here is the loop:

   while (__begin_ != __new_begin)
       __alloc_traits::destroy(__alloc(), __begin_++);

When __alloc_traits::destroy is a no-op, is being transformed into:

     __begin_ = __new_begin;

on the rationale that if the loop is an infinite loop, then we've got undefined 
behavior, and the only way for the loop to exit is when __begin_ == __new_begin.

With

    while (__begin_ < __new_begin)

The loop can exit with __begin_ >= __new_begin, and the compiler can't tell 
that it will always be the case that __begin_ == __new_begin on loop exit.

Disclaimer:  This is all speculation on my part.  I know next to nothing about 
compiler optimizations.

Howard

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to