public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/50975] New: Logical operators evaluated in wrong order if no side effects
@ 2011-11-03 7:19 gcc.hall at gmail dot com
2011-11-03 8:26 ` [Bug c/50975] " rguenth at gcc dot gnu.org
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: gcc.hall at gmail dot com @ 2011-11-03 7:19 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50975
Bug #: 50975
Summary: Logical operators evaluated in wrong order if no side
effects
Classification: Unclassified
Product: gcc
Version: 4.6.2
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: gcc.hall@gmail.com
gcc 4.6.2 -Os
If the expressions either side of a logical operator (|| or &&) have no
side effects, gcc sometimes evaluates them in the wrong order. See
the example below. Of course the code works, but the standard is clear,
logical operators GUARANTEE left to right evaluation. In this case
people use the feature as a micro optimization, putting the most likely to
succeed case first with || or vice-versa with &&.
-----------------------------------
#include <stdio.h>
int
main( int argc, char *argv[] )
{
char *last = argv[1];
if( *last == 10 || *last == 13 )
--last;
printf("last = %p\n", last );
return 0;
}
---------------------------------------------
movb (%eax), %dl # *last_3, D.2517
cmpb $13, %dl #, D.2517
je .L4 #,
cmpb $10, %dl #, D.2517
jne .L2 #,
.L4:
decl %eax # last
.L2:
--------------------------------------------
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c/50975] Logical operators evaluated in wrong order if no side effects
2011-11-03 7:19 [Bug c/50975] New: Logical operators evaluated in wrong order if no side effects gcc.hall at gmail dot com
@ 2011-11-03 8:26 ` rguenth at gcc dot gnu.org
2011-11-03 12:38 ` gcc.hall at gmail dot com
2011-11-03 21:09 ` ebotcazou at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-11-03 8:26 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50975
--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-11-03 08:26:33 UTC ---
But ... you can't tell the difference. So this is a valid optimization.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c/50975] Logical operators evaluated in wrong order if no side effects
2011-11-03 7:19 [Bug c/50975] New: Logical operators evaluated in wrong order if no side effects gcc.hall at gmail dot com
2011-11-03 8:26 ` [Bug c/50975] " rguenth at gcc dot gnu.org
@ 2011-11-03 12:38 ` gcc.hall at gmail dot com
2011-11-03 21:09 ` ebotcazou at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: gcc.hall at gmail dot com @ 2011-11-03 12:38 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50975
--- Comment #2 from Jeremy <gcc.hall at gmail dot com> 2011-11-03 12:37:41 UTC ---
(In reply to comment #1)
> But ... you can't tell the difference. So this is a valid optimization.
You can tell the difference in execution time.
And why is this an "optimization"? In this case, I cant see how it can improve
the code other than to lose any input from the programmer, who knows when the
data is biased. I guess it might help in a more complex expression.
I think this is different from the controversy over the handling of signed
integer overflow. There is no undefined behavior here. The language standard
from K&R to the present day explicitly states the evaluation order is
guaranteed left to right with these operators.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c/50975] Logical operators evaluated in wrong order if no side effects
2011-11-03 7:19 [Bug c/50975] New: Logical operators evaluated in wrong order if no side effects gcc.hall at gmail dot com
2011-11-03 8:26 ` [Bug c/50975] " rguenth at gcc dot gnu.org
2011-11-03 12:38 ` gcc.hall at gmail dot com
@ 2011-11-03 21:09 ` ebotcazou at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: ebotcazou at gcc dot gnu.org @ 2011-11-03 21:09 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50975
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
CC| |ebotcazou at gcc dot
| |gnu.org
Resolution| |INVALID
--- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-11-03 21:08:43 UTC ---
> You can tell the difference in execution time.
Execution time isn't a side effect of the abstract machine as defined by the
ISO C standard. 5.1.2.3 reads:
1 The semantic descriptions in this International Standard describe the
behavior
of an abstract machine in which issues of optimization are irrelevant.
As long as the side-effects are preserved ("as if" rule), this is valid.
> I think this is different from the controversy over the handling of signed
> integer overflow. There is no undefined behavior here. The language standard
> from K&R to the present day explicitly states the evaluation order is
> guaranteed left to right with these operators.
Only if there are side-effects, otherwise the "as if" rule can be applied.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-11-03 21:09 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-03 7:19 [Bug c/50975] New: Logical operators evaluated in wrong order if no side effects gcc.hall at gmail dot com
2011-11-03 8:26 ` [Bug c/50975] " rguenth at gcc dot gnu.org
2011-11-03 12:38 ` gcc.hall at gmail dot com
2011-11-03 21:09 ` ebotcazou at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).