https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121692
--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> --- IPA function summary for __flogr/1 inlinable builtin_constant_p_parms 0 global time: 12.651610 self size: 29 global size: 0 min size: 0 self stack: 0 global stack: 0 size:0.000000, time:0.000000 size:3.000000, time:2.000000, executed if:(not inlined) size:4.000000, time:3.320000, nonconst if:(op0 changed) size:2.000000, time:0.858000, executed if:(op0 != 0), nonconst if:(op0 changed) && (op0 != 0) size:1.000000, time:0.214500, executed if:(op0 <= 4294967295) && (op0 != 0), nonconst if:(op0 changed) && (op0 <= 4294967295) && (op0 != 0) size:19.000000, time:6.259110, executed if:(op0 != 0) calls: __builtin_constant_p/12 function body not available freq:1.00 loop depth: 0 size: 0 time: 0 Estimating body: __flogr/1 Known to be false: not inlined size:26 time:10.651610 nonspec time:12.651610 loops with known iterations:0.000000 known strides:0.000000 a.c:66:15: missed: not inlinable: __order_base_2.part.0/16 -> __flogr/1, call is unlikely and code size would grow Inliner does not track argument as a constant and predicates does not have condition "op is not constant". So we end up accounting __builtin_constant_p path as well as !builting_constant_p path. This is kind of necessary, since inliner does not have enough info to tell that __builtin_constant_p will be false after inlinng.