https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104236
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- On the gimple level we have: if (_2 == 0) goto <bb 4>; [10.00%] else goto <bb 3>; [90.00%] <bb 3> [local count: 966367639]: _6 = MEM[(struct media_request *)media_request_object_complete_obj.0_1].state; if (_6 != 0) goto <bb 5>; [10.00%] else goto <bb 6>; [90.00%] <bb 4> [local count: 107374184]: __asm__ __volatile__(".byte 0x0f, 0x0b"); __asm__ __volatile__(".Lreachable%=: .pushsection .discard.reachable .long .Lreachable%= - . .popsection " : : : "memory"); _raw_spin_unlock_irqrestore (pretmp_46, 0); [tail call] goto <bb 10>; [100.00%] <bb 5> [local count: 96636765]: __asm__ __volatile__(".byte 0x0f, 0x0b" : : "i" 0); __asm__ __volatile__(".Lreachable%=: .pushsection .discard.reachable .long .Lreachable%= - . .popsection " : : : "memory"); _raw_spin_unlock_irqrestore (pretmp_46, 0); [tail call] goto <bb 10>; [100.00%] So what the RTL level is doing looks fine, BB 4 and BB 5 are exactly the same so its combining the two. I don't see why this is a bug. The documentation does have: > (or remove duplicates of) %= is only matters at the end.