https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78879
--- Comment #11 from Yuan Pengfei <coolypf at qq dot com> --- It seems that if a variable has two or more constant values, gcc does not treat it as a constant and b_c_p returns 0. Is that correct? If so, I might have figured out where the problem is. With unordered_remove, the case is: sector_size {256, 512, 1024, 2048, 4096} | +-----------+-----------+ ... | {256} | {512} b_c_p b_c_p | | +-----------+ | b_c_p == 1 "calculations for constant sector_size" In "calculations for constant sector_size", sector_size has two or more constant values, making gcc not treat it as a constant. Therefore, the call to ilog2_NaN is not optimized away. With ordered_remove, the case is: sector_size {256, 512, 1024, 2048, 4096} | +-----------------------+ ... | {256, 512} b_c_p | b_c_p == 0 "calculations for non-constant sector_size" The call to ilog2_NaN is optimized away with "calculations for constant sector_size".