From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Daniel Colascione Newsgroups: gmane.emacs.devel Subject: Re: [Emacs-diffs] trunk r114593: * lisp.h (eassert): Don't use 'assume'. Date: Fri, 11 Oct 2013 08:57:59 -0700 Message-ID: <52582007.5080407@dancol.org> References: <52576305.9000703@dancol.org> <52579C68.1040904@cs.ucla.edu> <83iox4pa0w.fsf@gnu.org> <5257AB8C.40309@dancol.org> <83eh7sp6v0.fsf@gnu.org> <5257B489.2050609@dancol.org> <83k3hkrxao.fsf@gnu.org> <5257C27B.9090400@dancol.org> <83hacorvww.fsf@gnu.org> <5257CB20.4030809@dancol.org> <83d2ncrr5x.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1381507100 23480 80.91.229.3 (11 Oct 2013 15:58:20 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 11 Oct 2013 15:58:20 +0000 (UTC) Cc: eggert@cs.ucla.edu, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Oct 11 17:58:24 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1VUf6d-00073K-RF for ged-emacs-devel@m.gmane.org; Fri, 11 Oct 2013 17:58:24 +0200 Original-Received: from localhost ([::1]:55184 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VUf6d-0007pC-BJ for ged-emacs-devel@m.gmane.org; Fri, 11 Oct 2013 11:58:23 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:55928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VUf6V-0007oY-FV for emacs-devel@gnu.org; Fri, 11 Oct 2013 11:58:20 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VUf6R-0004pP-3f for emacs-devel@gnu.org; Fri, 11 Oct 2013 11:58:15 -0400 Original-Received: from dancol.org ([2600:3c01::f03c:91ff:fedf:adf3]:48397) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VUf6L-0004oZ-R9; Fri, 11 Oct 2013 11:58:06 -0400 Original-Received: from c-69-181-250-160.hsd1.ca.comcast.net ([69.181.250.160] helo=dcolascione-mbp.local) by dancol.org with esmtpsa (TLS1.0:DHE_RSA_CAMELLIA_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1VUf6K-000299-Ro; Fri, 11 Oct 2013 08:58:04 -0700 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Thunderbird/24.0 In-Reply-To: <83d2ncrr5x.fsf@gnu.org> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2600:3c01::f03c:91ff:fedf:adf3 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:164099 Archived-At: On 10/11/13 4:19 AM, Eli Zaretskii wrote: >> Date: Fri, 11 Oct 2013 02:55:44 -0700 >> From: Daniel Colascione >> CC: eggert@cs.ucla.edu, emacs-devel@gnu.org >> >>>> While the programmer may have written her C code under the assumption >>>> that an asserted condition holds, the compiler can't know that the >>>> asserted condition holds when generating its machine code. The point of >>>> the assume mechanism is to provide this information to the compiler. >>> >>> The compiler will be unable to take advantage of that information, >>> because there's no source code to apply that information to. >> >> I don't understand this argument. In my example, the assume would inform >> the compiler that it didn't have to emit code to handle division in the >> case that *b is zero. > > I think Stephen explained this already. No, he didn't, and neither did you. >>>>> In most cases, you won't see any code that can be optimized >>>>> out using this assumption, as the programmer already did that -- >>>>> that's why she added the assertion in the first place. >>>> >>>> At the C level, not the code generation level. >>> >>> Code is generated from the C code, not out of thin air. >> >> And we're talking about giving the compiler more information about the C >> code. > > Information about C code that just isn't there will not help the > compiler. We're asserting things about symbols that appear textually in nearby code. That's the information we're providing. Claiming that we're not providing information about real code is nonsense. You can't manually perform all the transformations the compiler itself might. You can perform some, but not all, optimization manually. >> If the programmer really expects an assertion not to hold, he can >> use a variant that doesn't assume the condition holds. But these >> cases should be rare. > > You are wrong: in Emacs, these cases are the vast majority. Just take > a look at the code which uses assertions. No, I don't think those cases are the majority. I can compile Emacs --enable-checking, then run it without seeing it insantly crash and burn. That I can do so means these assertions are asserting things that are actually true. The idea that we're putting into assert conditions that might not be true is very strange. If a condition really might not be true, the right thing is to signal an error or abort Emacs, not write eassert. >>>>> The problem is to make sure an assertion obviously _is_ free of side >>>>> effects. With Emacs's massive use of macros, which call other macros, >>>>> which call other macros, which... -- that is extremely hard. And why >>>>> should a programmer who just wants to assert something go to such >>>>> great lengths? That is just a maintenance burden for which I find no >>>>> good justification. >>>> >>>> What great lengths? Most common macros --- things like EQ --- are >>>> clearly free of side effects. >>> >>> There are a lot of macros much more complex than EQ. >> >> So don't use the assume-and-assert macros for questionable cases. > > People tend to forget subtle and obscure factoids. The risk of any > one of us to forget and just treat this macro as a function call is > real. See bug #15565 as a clear example. Bug 15565 was caused by changing the semantics of existing calls to eassert. This bug forms a poor argument against having a different macro that asserts and assumes. >>>> The more exotic assertions probably aren't worth assuming anyway. >>> >>> Not sure I understand what you are saying here. >> >> I'm speculating that the optimization value to be gained from assuming >> very complex conditions is smaller than the value gained for assuming >> relatively simple conditions. > > But if assume-and-assert macro exists, this abuse is exactly what is > going to happen. I can see changing eassert to eassume being problematic. I don't buy at all the idea that somehow _having_ an assert-and-assume macro is dangerous, especially if you document that this macro might evaluate its argument even in assertion-disabled builds. It has a different name and acts differently. That's what names are for, to distinguish behaviors. But I'm clearly not winning this one. I think that 1) having a different macro with different semantics is actually perfectly safe and maintainable, and that 2) measurable (if minor) improvements in code generation warrant changing some assertions to use this different macro instead of eassert. But if others disagree this strongly, let's take out the feature until we can show a specific case where it makes a bigger difference.