nickdesaulniers added a comment.

In D74094#4643577 <https://reviews.llvm.org/D74094#4643577>, @rjmccall wrote:

> In D74094#4643558 <https://reviews.llvm.org/D74094#4643558>, @nickdesaulniers 
> wrote:
>
>> In D74094#4643495 <https://reviews.llvm.org/D74094#4643495>, @rjmccall wrote:
>>
>>> I can't easily tell you because the "standalone example" involves a million 
>>> templates that I don't know anything about, and nobody seems to have done 
>>> the analysis to identify the specific source of the miscompile.
>>
>> Sure; @alexfh @vitalybuka can you both please help produce a further reduced 
>> test case from https://reviews.llvm.org/D74094#4633799 ? Otherwise I'm 
>> beginning to think this patch may have been reverted prematurely; before an 
>> understood + reduced test case was reduced.
>
> Well, it's good to be conservative about adding new optimizations if they're 
> causing apparent miscompiles.  Even if the optimization is just exposing 
> existing UB in some new one, that's something we should understand as a 
> project.  I have no problem with the eager revert.
>
> It would be great if Alex and Vitaly could help track down the exact problem. 
>  However, if they can't, I think it's ultimately your responsibility as the 
> person hoping to land the optimization to understand why the miscompile is 
> not in fact your fault.

I've cloned:

1. abseil @ f3eae68bd1d17df708f2b59a43ad7e837a616e6a
2. eigen @ 8f858a4ea8106b52f3cf475ffc5e0e9c6a91baa2
3. googletest @ eab0e7e289db13eabfc246809b0284dac02a369d

I had to build googletest.  Then I built a.out via:

  $ clang++ foo.cpp -I eigen/ -I googletest/googletest/include/ \
    -I googletest/googlemock/include/ -I abseil-cpp 
googletest/build/lib/libgtest.a \
    -std=c++17 -O3 -fsanitize=address -march=haswell

With this change re-applied (`b7f4915644844fb9f32e8763922a070f5fe4fd29` 
reverted), a.out runs without issue.   So yes, I need something other than a 
godbolt link which uses clang-trunk which isn't stable after a revert to 
understand what they are talking about.

>>> What I can tell you is that there is an enormous semantic difference 
>>> between passing a pr-value argument to a parameter that's passed by 
>>> reference and to a parameter that's passed by value.  In the former case, 
>>> the reference is bound to a temporary with full-expression lifetime, and it 
>>> is totally reasonable to return its address.  In the latter case, the 
>>> parameter object will often have a lifetime bound by the current function, 
>>> and you cannot return its address without it being UB.
>>
>> I'm trying to come up with an example of "the former."
>>
>>   struct foo {
>>     int x;
>>   };
>>   
>>   // Returns a reference to the minimum foo.
>>   foo &min(foo &a, foo &b);
>>   
>>   void consume (foo&);
>>   
>>   void bar () {
>>     consume(min(foo{0}, foo{1}));
>>   }
>>
>> doesn't compile:
>>
>>   foo.cpp:11:11: error: no matching function for call to 'min'
>>      11 |   consume(min(foo{0}, foo{1}));
>>         |           ^~~
>>   foo.cpp:6:6: note: candidate function not viable: expects an lvalue for 
>> 1st argument
>>       6 | foo &min(foo &a, foo &b);
>>         |      ^   ~~~~~~
>>
>> Have I misinterpreted what you meant by "passing a pr-value argument to a 
>> parameter that's passed by reference?"
>
> Okay, to be frank, this is a bit of a red flag for me.  Optimizations like 
> this are ultimately rooted in language rules, and I'm not sure you can 
> effectively do this work if you don't understand the basics of C++ parameter 
> passing.

Fuck me for trying to help, right?  If x-values are part of the "basics" of 
parameter passing, I'm afraid to ask about the more complicated cases.

> In C++, you cannot bind a non-const l-value reference to a temporary, but you 
> can bind either a const l-value reference or an x-value reference to one.  So 
> you could declare `min` as either `const foo &min(const foo &a, const foo 
> &b);` or `foo &&min(foo &&a, foo &&b);`.

Thanks, that's //all// I needed.

With `b7f4915644844fb9f32e8763922a070f5fe4fd29` reverted, neither of those 
cases look fishy to me:
https://gist.github.com/nickdesaulniers/1c7b962222639e54c3339b63b572b166


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74094/new/

https://reviews.llvm.org/D74094

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to