Более поздние части этапа межпроцедурной оптимизации используют восходящий обход графа вызовов; это порядок, который вы видите. Есть статья об оригинальном дизайне этой части GCC здесь (некоторое время назад; этот материал впервые появился в GCC 3.4).
Вы можете предотвратить изменение порядка, используя -fno-toplevel-reorder
(или -fno-unit-at-a-time
для менее свежих версий GCC), но это отключает некоторые из связанных оптимизаций.