https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80237
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2017-03-29 Component|c |tree-optimization Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- We have (after inlining g into foo): foo (float x) { float _3; float _4; double iftmp.0_5; double _6; double iftmp.0_7; double iftmp.0_8; <bb 2> [100.00%]: if (x_2(D) > 0.0) goto <bb 3>; [60.23%] else goto <bb 4>; [39.77%] <bb 3> [60.23%]: _3 = f (x_2(D)); iftmp.0_5 = (double) _3; goto <bb 5>; [100.00%] <bb 4> [39.77%]: _6 = (double) x_2(D); iftmp.0_7 = _6 + 1.0e+0; <bb 5> [100.00%]: # iftmp.0_8 = PHI <iftmp.0_5(3), iftmp.0_7(4)> _4 = (float) iftmp.0_8; return _4; thus the tailcall is not exposed at GIMPLE level. For the above we fail to optimize the partial redundancy of the conversion in PRE. During phi translation we do see that _4 is equal to _3 on the 3->5 edge but phi translation fails because _3 is not antic-in in bb 5. Not really relevant, I think the check is somewhat bogus. With that fixed we do detect the tailcall: <bb 2> [100.00%]: if (x_2(D) > 0.0) goto <bb 3>; [60.23%] else goto <bb 4>; [39.77%] <bb 3> [60.23%]: _3 = f (x_2(D)); [tail call] goto <bb 5>; [100.00%] <bb 4> [39.77%]: _6 = (double) x_2(D); iftmp.0_7 = _6 + 1.0e+0; _9 = (float) iftmp.0_7; <bb 5> [100.00%]: # prephitmp_10 = PHI <_3(3), _9(4)> return prephitmp_10; foo: .LFB2: .cfi_startproc ucomiss .LC0(%rip), %xmm0 jbe .L7 jmp f .p2align 4,,10 .p2align 3 .L7: cvtss2sd %xmm0, %xmm0 addsd .LC1(%rip), %xmm0 cvtsd2ss %xmm0, %xmm0 ret Mine.