On Jan 23, 2013, at 4:08 PM, Daniel Dunbar <[email protected]> wrote:
> On Wed, Jan 23, 2013 at 2:17 PM, John McCall <[email protected]> wrote:
> On Jan 23, 2013, at 12:42 PM, Daniel Dunbar <[email protected]> wrote:
>> On Wed, Jan 23, 2013 at 12:08 PM, John McCall <[email protected]> wrote:
>> On Jan 23, 2013, at 11:57 AM, Daniel Dunbar <[email protected]> wrote:
>>> On Wed, Jan 23, 2013 at 11:44 AM, Chandler Carruth <[email protected]> 
>>> wrote:
>>> 
>>> On Wed, Jan 23, 2013 at 11:07 AM, John McCall <[email protected]> wrote:
>>> A significant part of the problem, I believe, is that there's a lot of 
>>> mostly-externally-maintained C code which, at Apple, happens to need to be 
>>> compiled as C++.
>>> 
>>> FWIW, this makes perfect sense, and also makes perfect sense out of a flag 
>>> to essentially get C's return semantics in a C++ compilation in order to 
>>> support such code.
>>> 
>>> This is still the wrong direction of the flag. I just haven't seen good 
>>> justification for changing the compiler in this way to merit the 
>>> possibility of breaking working code.
>> 
>> Every change can break working code.  Warning changes can break working code 
>> if it's compiled with -Werror.  "Show me a whole-percentage speedup or take 
>> the optimization out" is not really a reasonable response to every last 
>> proposal.
>> 
>> Yes, but that doesn't mean such changes should be made without consideration 
>> either. My argument is that I do not think there is sufficient user benefit 
>> to motivate this change.
>> 
>>  In LLVM and clang, we have a lot of places where we use unreachable 
>> annotations;  I think Chandler's argument is quite correct that these 
>> situations come up all the time for many users and that it's ultimately not 
>> reasonable to expect non-compiler people to use those annotations 
>> pervasively.
>> 
>> Our specific internal problem that makes this seem like a non-starter is 
>> that we have a pool of known code that's very awkward to fix.  We do control 
>> the build environment for that code, though.  For purposes of investigation, 
>> we can reasonably assume that any project that turns off -Wreturn-value 
>> should probably also disable the optimization.  Any stragglers can be 
>> tracked down and fixed just like we would with any other compiler change.
>> 
>> You are hijacking my argument. My opinion doesn't have anything to do with 
>> an internal problem, I just happen to think this is the wrong choice for 
>> users.
>> 
>> In my opinion, for *most* users and most code it is more important that the 
>> code work than that it be optimal. I think this is the kind of optimization 
>> that compiler hackers and low-level optimization people might find very 
>> desirable, but anyone writing code that depended on it should still be using 
>> an attribute or other marker.
>> 
>> Again in my opinion, for most users, the compiler is just a tool they use to 
>> get work done. They like it to optimize, and they like it to give nice 
>> warnings, but overall they want it to help them get work done and not force 
>> them to change their code.
> 
> I do not think that this is a reasonable standard by which we can judge 
> optimizations.  The compiler is a tool.  Like most tools, it can do good 
> things but is capable of mischief.  Like most tools, users come to take the 
> good things for granted, but they notice the mischief immediately.  It's 
> wrong to forsake the good just because it's less visible;  you have to 
> actually make a thoughtful decision to balance these things, and that means 
> not immediately throwing out all the good the first time you see the bad.
> 
> By these standards, what is the good that this change is making?
> 
> I stand by what I said before -- I still have not seen justification for 
> changing the compiler in this way to merit the possibility of breaking 
> working code.
> 
> The only justification that has been offered so far is that this change can 
> help the compiler optimize somewhat better ***only in the case of code that 
> would emit a compiler warning***.

A user can audit their code, decide that the end of a function is in practice 
unreachable, and take appropriate measures — they might disable that warning, 
either file-wide or with a #pragma, or they might simply choose to ignore it, 
knowing that it's a false positive.  For example, they might have an 
assert(false) there and just ignore warnings in release mode.  The 
optimal-for-clang solution of adding an explicit call to 
__builtin_unreachable() is not necessarily acceptable to all users; the most 
obvious flaw is that it's not portable (e.g. it was new in GCC 4.5).

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

Reply via email to