Какие x86 32-битные peepholes выполняет GCC?

Я просматривал исходный код GCC, и я был озадачен тем, как их извлекать. Может ли кто-нибудь предоставить список или информацию о том, как извлечь эти глазок (оптимизация перезаписи сборки)?

Код GCC: https://github.com/gcc-mirror/gcc

Изменить. Чтобы уточнить, "глазок" определяется как шаблон поиска и замены с некоторыми связанными с ним побочными условиями для того, чтобы rewrite был действительным (часто только некоторые данные об активности регистра/флажка).

Ответ 1

Посмотрите в различных файлах *.md и найдите define_peephole.

Например: gcc/config/i386/i386.md содержит (среди многих других):

;; For HI, SI and DI modes, or $-1,reg is smaller than mov $-1,reg.
(define_peephole2
  [(set (match_operand:SWI248 0 "register_operand")
    (const_int -1))]
  "(optimize_insn_for_size_p () || TARGET_MOVE_M1_VIA_OR)
   && GENERAL_REGNO_P (REGNO (operands[0]))
   && peep2_regno_dead_p (0, FLAGS_REG)"
  [(parallel [(set (match_dup 0) (const_int -1))
          (clobber (reg:CC FLAGS_REG))])]
{
  if (<MODE_SIZE> < GET_MODE_SIZE (SImode))
    operands[0] = gen_lowpart (SImode, operands[0]);
})

Соответствующая документация приведена в Руководстве внутренних документов GCC

https://gcc.gnu.org/onlinedocs/gccint/Peephole-Definitions.html#Peephole-Definitions

Ответ 2

Это действительно вне темы, поскольку здесь слишком широко.

Вы можете заглянуть в мою страницы MELT; он имеет несколько полезных ссылок (особенно Индийский центр ресурсов GCC), и большинство слайдов, которые я написал, содержат справочный материал и учебный материал...

Большинство оптимизаций GCC происходят в промежуточных средах (целевых и исходных нейтральных), а не в бэкэнде.

И оптимизация peephole не означает многого (точно) в наши дни, и большая часть мощности оптимизации GCC не исходит от нее.