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.