#include <math.h> #include <complex.h> int main() { float complex c,d; foo(&c); d=1.0/c; return creal(d)+cimag(d)<0; } $ gcc -S -O -fdump-tree-optimized recip.c $ tail -25 recip.c.t66.optimized <bb 0>: foo (&c); SR.24 = (double) REALPART_EXPR <c>; SR.23 = (double) IMAGPART_EXPR <c>; if (ABS_EXPR <SR.24> < ABS_EXPR <SR.23>) goto <L1>; else goto <L2>;
<L1>:; D.2387 = SR.24 / SR.23; D.2389 = SR.23 + SR.24 * D.2387; SR.25 = (D.2387 + 0.0) / D.2389; SR.26 = (D.2387 * 0.0 - 1.0e+0) / D.2389; goto <bb 3>; <L2>:; D.2395 = SR.23 / SR.24; D.2397 = SR.24 + SR.23 * D.2395; SR.25 = (D.2395 * 0.0 + 1.0e+0) / D.2397; SR.26 = (0.0 - D.2395) / D.2397; <bb 3>: return (double) (float) SR.25 + (double) (float) SR.26 < 0.0; } $ gcc -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../gcc-4.1/configure --prefix=/home/ig25 --enable-languages=c,f95 Thread model: posix gcc version 4.1.0 20050311 (experimental) I can't see a reason why the +0 and *0 operations should be necessary. Thomas -- Summary: complex reciprocal has too many operations Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: Thomas dot Koenig at online dot de CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20432