Компиляторы уже делают такие оптимизации. Кроме того, не так-то просто сделать такую оптимизацию, потому что:
push reg1
pop reg1
По-прежнему оставляет значение reg1 в ячейке памяти [sp-nn] (где nn = размер reg1 в байтах). Таким образом, хотя sp уже прошел, код после может предполагать, что [sp-nn] содержит значение reg1.
То же самое относится и к другой оптимизации:
push some1
pop some2
И это обычно испускается, только когда нет эквивалентной movl some1, some2
инструкции.
Если вы пытаетесь оптимизировать высокоуровневый код, сгенерированный компилятором, компиляторы обычно принимают во внимание большинство из этих случаев. Если вы пытаетесь оптимизировать написанный на ассемблере собственный код, программист на ассемблере должен написать еще лучший код.
Я бы посоветовал вам оптимизировать компилятор, а не оптимизировать ассемблерный код, он предоставил бы вам лучшую среду для работы с намерениями кода и использования регистра и т. Д.