------- Comment #17 from jakub at gcc dot gnu dot org 2008-10-15 09:47 ------- Testcase where only one constant, not two alternative constants, are on the entry of the threaded bb.
extern int printf (const char *, ...); void __attribute__((noinline)) test (double cn, int *neig) { double tt, al[3]; *neig = 3; if (__builtin_fabs(cn) > 1.) cn = -1.; tt = __builtin_atan2 (__builtin_sqrt (1. - __builtin_pow (cn, 2.)), cn) * 3.333333333333333e-1; al[0] = __builtin_cos (tt); al[1] = __builtin_cos (2.0943951023931944 + tt); al[2] = __builtin_cos (4.1887902047863879 + tt); if ((__builtin_fabs ( al[0] - al[1]) < 1.e-5) || (__builtin_fabs (al[0] - al[2]) < 1.e-5) || (__builtin_fabs (al[1] - al[2]) < 1.e-5)) *neig = 2; } int main () { int neig; test (-1.0, &neig); printf ("neig = %d\n", neig); if (neig != 2) __builtin_abort (); test (1.0, &neig); printf ("neig = %d\n", neig); if (neig != 2) __builtin_abort (); test (-2.0, &neig); printf ("neig = %d\n", neig); if (neig != 2) __builtin_abort (); return 0; } At -O2 -funsafe-math-optimizations, before ccp3 we have: D.1262_38 = __builtin_pow (-1.0e+0, 2.0e+0); D.1263_40 = 1.0e+0 - D.1262_38; D.1264_41 = __builtin_sqrt (D.1263_40); D.1265_43 = __builtin_atan2 (D.1264_41, -1.0e+0); tt_45 = D.1265_43 * 3.33333333333333314829616256247390992939472198486328125e-1; D.1266_46 = __builtin_cos (tt_45); D.1267_47 = tt_45 + 2.094395102393194374457152662216685712337493896484375e+0; D.1268_48 = __builtin_cos (D.1267_47); D.1269_49 = tt_45 + 4.1887902047863878607358856243081390857696533203125e+0; D.1270_50 = __builtin_cos (D.1269_49); and neither ccp3, nor pre is able to optimize it out, only fab optimizes the first call (pow) and then dom2 handles the rest. -- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|4.5.0 |4.4.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37449