https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80197
--- Comment #7 from Alexander Monakov <amonakov at gcc dot gnu.org> --- No, with fixed-up inlining -ftracer sees reasonable edge probabilities. The reason tracer makes things worse here, is that it clones the path leading to a 50%/50% conditional branch (and correctly stops at that branch), making the tiny BB under that branch ineligible(?) for if-conversion. We go from <BB0> if (!cond) goto <BB2> <BBcond> var = VAL; // this can eventually become a cmov <BB2> to <BB0_1> if (!cond) goto <BB2> goto <BBcond> ... <BB0_2> if (!cond) goto <BB2> <BBcond> var = VAL; // this doesn't become a cmov <BB2> I think in principle if-conversion could still do its job here by duplicating the conditional var=VAL assignment under BB0_1. Here's a silly compile-only sample where -O2 -ftracer is worse than -O2 due to this effect: void f(long n, signed char *x) { for (; n; n--) { long a=x[n], b; if (!a) a = 42; b = x[a]; if (b < 0) b += a; x[b] = 0; } }