[Bug middle-end/56309] New: -O3 optimizer generates conditional moves instead of compare and branch resulting in almost 2x slower code
arturomdn at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Feb 13 20:21:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56309
Bug #: 56309
Summary: -O3 optimizer generates conditional moves instead of
compare and branch resulting in almost 2x slower code
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: arturomdn@gmail.com
Created attachment 29442
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29442
Self contained source file with parameter x passed by value (slow)
This bug report reflects the analysis of a question asked in stackoverflow
http://stackoverflow.com/questions/14805641/why-does-changing-const-ull-to-const-ull-in-function-parameter-result-in-pe/14819939#14819939
When an unsigned long long parameter to a function is passed by reference
instead of by value the result is a dramatic almost 2x improvement in speed
when compiled with -O3. Given that the function is inlined this is unexpected.
Upon closer inspection it was found that the code generated is quite
different, as if passing the parameter by value enables an optimization (use of
x86 conditional moves) that backfires, possibly by suffering an unexpected
stall in the processor.
Two files are attached
by-val-O3.ii
by-ref-O3.ii
They differ only in the way the unsigned long long parameter "x" is passed.
./by-ref-O3
Took 11.85 seconds total.
./by-ref-O3
Took 6.67 seconds total.
More information about the Gcc-bugs
mailing list