Это называется оптимизацией "дублирования хвоста". Некоторые компиляторы делают это иногда. например, Сообщение в блоге LLVM об этом
Обычно хорошо, когда эпилоги вашей функции маленькие (всего 1 поп), поэтому они не стоят дорого, особенно на современных x86 с большими кешами и хорошая плотность кода (ret
и pop
являются однобайтовыми). Хотя, если ожидается, что только один путь через функцию будет «горячим», возможно, лучше использовать другой jmp для горячего, чтобы сэкономить небольшое количество пространства UOP-кэша.
Это экономит один занятый jmp
на этом пути из функции. Влияние на производительность зависит от окружающего кода, как всегда для глубоко конвейерного суперскалярного неупорядоченного ЦП!
Если несколько путей через функцию могут быть горячими в зависимости от того, как используется ваша функция, они могут оба / все будут полностью эффективными.
Вы также можете сделать это для циклов, у которых есть ветвь внутри l oop: продублируйте dec/jcc
или что-либо в нижней части l oop вместо того, чтобы прыгать на общий dec/jcc
. (Не забудьте обработать проходной путь в обоих / всех случаях!)