2009-11-17 19 views
3

Suite à cette question: how-do-i-check-if-gcc-is-performing-tail-recursion-optimization, j'ai remarqué que l'utilisation de gcc avec -fPIC semble détruire cette optimisation. Je crée une bibliothèque partagée, mais je ne semble pas avoir besoin de l'option -fPIC. Eh bien, ma question est la suivante: pourquoi -fPIC change-t-il les optimisations gcc? Dois-je conserver -fPIC pour une raison quelconque?gcc -fPIC semble bourrer avec des drapeaux d'optimisation

+0

Pourriez-vous fournir les moyens de reproduire le comportement que vous décrivez? Ça ne sonne pas bien. Cependant, certaines contraintes internes dans l'implémentation de 'gcc' peuvent éventuellement forcer à désactiver une optimisation en mode PIC ... –

+0

Quelle version de GCC? Quelle plateforme? '-fPIC' modifie parfois le code généré pour être 'code indépendant de la position' (donc PIC), ce qui signifie qu'il est différent du 'code dépendant de la position' - peut-être. Quelles options utilisez-vous? –

+0

Ah, sur nos serveurs 64 bits, gcc sais que -fPIC est requis. – user212658

Répondre

4

En l'absence de détails tels que l'architecture cible et la version du compilateur, une explication possible est la suivante:

l'optimisation de la queue-récursion est Dans le code dépendant de la position, essentiellement de réutiliser le cadre de pile en cours, et de remplacer le considéré call par un jump. La syntaxe peut être call function remplacée par jmp <small offset of function>.

En code indépendant de la position, l'appel peut être écrit call [email protected] si l'ensemble d'instructions le permet (cet exemple est amd64). Il pourrait parfaitement être remplacé par jmp <small offset of function>@PLT, mais les deux paramètres interfèrent et peut-être que les développeurs de gcc ne se sont pas mis en place pour mettre en œuvre l'optimisation des appels de queue dans ce dernier mode.

2

Dans ia32 linux, l'utilisation de fpic signifie que vous n'avez pas d'ebx disponible pour un usage général, ce qui aura sûrement un impact sur l'optimisation. Peut-être que le compilateur a décidé contre l'optimisation de la récurrence de la queue en raison de la pression d'ordonnancement du registre.