Options de compilation gcc

Fermé
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009 - 2 sept. 2009 à 16:09
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009 - 9 sept. 2009 à 16:19
Bonjour,

Mon objectif est de connaître l'effet de certaines options de compilation sur le code assembleur résultant.

Je commence avec les options d'optimisation de gcc, par exemple -O1

L'option O1 déclenche les options suivantes[-fdefer-pop/-fmerge-constants/-fthread-jumps/-floop-optimize/-fcrossjumping/-fif-conversion/-fif-conversion2/-fdelayed-branch/-fguess-branch-probability/-fcprop-registers]

J'écris des sources C pour lesquelles chacunes des options précédentes sont sensées avoir un effet sur le code assembleur. Je compile une fois avec l'option , et une fois sans l'option.

Par exemple:

ccppc.exe -std=c89 -fno-loop-optimize -S Test_loop.c -o no_loop_opt.txt

ccppc.exe -std=c89 -floop-optimize -S Test_loop.c -o loop_opt.txt


Le fichier Test_loop par exemple ne contient qu'une boucle for dont le code assembleur doit être optimisé avec l'option -floop-optimize .

void test_Loop(T_uint16 a, T_uint16 b )
{
for (a=0; a < 12; a++)
{
a++;
}
}



Mais je n'obtiens aucune différence entre les deux sorties.

Est il normal que je n'obtienne pas de différences?

Y a-t-il des documents qui présentent les effets des options de compilation et les conditions (exemples de sources) où ces options d'optimisation ont un effet.?


Ma version de gcc est la version 3.3.2 (Wind River vxworks-6.2)
A voir également:

10 réponses

dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
3 sept. 2009 à 16:44
je ne vois pas ce qu'un optimiseur pourrait simplifier dans .
for (a=0; a < 3; a++)
{
abs(a);
}
1
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009
9 sept. 2009 à 14:18
En optimisation tu as deux stratégies, gain de vitesse d'execution de code, ou gain de taille de code.

L'option -O fait du déroulement de boucle (loop unrolling) pour ganger du temps en execution, en effet dans la boucle for tu as à la fois la gestion de la boucle qui demande du code et la gestion de l'appel de fonction.

Lorsque tu déroules, tu n'as plus que la gestion de la l'appel de la fonction.

Sur l'imprim Ecran tu as à gauche la compil sans optimisation:

la boucle est gérée en 3 partie, le bloc de control(L2) qui suvant condition envoie vers le bloc d'execution principale (L5) ou vers le bloc de sortie (L1).

A droite avec l'optimisation tout est fait en un bloc (L6)qui s'appelle lui meme trois fois.
0
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009
9 sept. 2009 à 14:22
avec optimisation
stwu 1,-32(1)
mflr 0
stw 31,28(1)
stw 0,36(1)
li 31,0
.L6:
mr 3,31
crxor 6,6,6
bl abs
addi 0,31,1
rlwinm 31,0,0,0xffff
cmplwi 7,31,2
ble+ 7,.L6
lwz 0,36(1)
mtlr 0
lwz 31,28(1)
addi 1,1,32
blr
.


Sans optimisation

stwu 1,-48(1)
mflr 0
stw 31,44(1)
stw 0,52(1)
mr 31,1
mr 0,3
sth 0,8(31)
li 0,0
sth 0,8(31)
.L2:
lhz 0,8(31)
rlwinm 0,0,0,0xffff
cmplwi 7,0,2
ble 7,.L5
b .L1
.L5:
lhz 0,8(31)
rlwinm 0,0,0,0xffff
mr 3,0
crxor 6,6,6
bl abs
lhz 9,8(31)
addi 0,9,1
sth 0,8(31)
b .L2
.L1:
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11

0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
2 sept. 2009 à 16:15
hello
je pense qu'avec juste a++ dans la boucle, il n'y a pas grand chose à optimiser. Essaye avec du code plus complexe.
0
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009
3 sept. 2009 à 14:36
Salut

Je pense qu'il ne s'agit pas d'un probleme de code trop simple. Pour essai j'ai pris le codes suivant

void test_Loop(T_uint16 a, T_uint16 b )
{
for (a=0; a < 3; a++)
{
abs(a);
}
}
Ce code est sensé être optimisé en assembleur par l'appel de trois fois abs() avec l'option -floop-optimize

abs(0); abs(1); abs(2);

Ce qui n'est tjrs pas le cas, n'y aurait -il pas un bug de gcc à ce niveau?
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
3 sept. 2009 à 14:54
l'optimiseur ne sait pas combien de fois s'exécutera la boucle,
-floop-optimize
Perform loop optimizations: move constant expressions out of loops, simplify exit test conditions and optionally do strength-reduction as well.

l'optimiseur doit sortir le x=0 de la boucle :
int x, y;
for (a=0; a < 3; a++)
{
        x=0;
        y=x+a;
        abs(a);
}

pour les bugs: https://gcc.gnu.org/bugs/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 sept. 2009 à 14:54
Je ne sais pas si il y a grand chose à optimiser dans ton code. Essai :
int b=0;
for (a=0; a < 3; a=a+1)
{
b+=1;// ou : b=5;
}
0
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009
3 sept. 2009 à 16:04
Salut dubcek

l'option -floop-optimize fait aussi du déroulement de boucle, ce qui peut accroitre la vitesse d'execution

" optionally do strength-reduction and loop unrolling as well."

Char Snipeur J'ai essayé ton bout de code avec les deux chaines de commandes

ccppc.exe -std=c89 -floop-optimize -S Test_loop.c -o test1.txt

ccppc.exe -std=c89 -S Test_loop.c -o test2.txt

Le code assembleur est identique.

Je suis obligé de penser à un bug de gcc 3.3.2 (VxWorks)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 sept. 2009 à 16:23
essai de compiler avec l'option -O0 pour voir si il y a une différence.
Je ne suis pas sur que l'on puisse dire que ça soit un bug. Mais si tu le pense vraiment laisse un message sur le forum gcc. Mais je ne sais pas si il sera pris en compte : on en est à la version 4 de gcc.
Essai de te renseigner sur ce que fait exactement cet algorithme.
0
Les compilateurs sont des bêtes de courses, et l'optimisation, ils connaissent. Voici des programmes différents qui donnent le même binaire:
int main() { return(0); }
int main() { int i; for (i=0; i<10;) i++; return(0); }
int main() { int i; for (i=0; i<10; i++) sin(i); return(0); }
Moralité: le compilateur (en l'occurence 'gcc') sait bien détecter les lignes de code inutiles et les élimine.
Ainsi mettre une boucle vide ( for(i=0; i<1000000000; i++); ) histoire de passer un certain temps, ne sert strictement à rien.
Remerciement aux concepteurs de ces fabuleux compilateurs.
Bonne continuation.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
4 sept. 2009 à 08:19
Oui, mais si vous désactivez les optimisations, en théorie, vous ne devriez pas avoir la même chose.
0
Oui c'est vrai, pour ces exemples, j'ai oublié de le préciser, j'ai utilisé 'gcc 4.3.2' avec simplement l'option 'O2' ce qui est souvent le cas. Gentiment le compilateur nous signale pour la ligne avec 'sin(i)': déclaration sasn effet (avec la faute d'orthographe!) - inutile de préciser qu'il faut utiliser l'option '-Wall', mais comme cela va sans le dire, je ne le dis pas (d'ailleurs c'est inutile de la préciser) ;-).
Bonne journée.
0
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009
9 sept. 2009 à 16:19
Bonjour,

Une autre façon de poser la question? J'utilise gcc 3.3.2

Est il possible d'utiliser certaines des options contenues dans -O1 en désactivant les autres,

Par exemple

[-O1 -fno-defer-pop] donne le même résulat en assembleur que [ -O1].

Comme si -fno-defer-pop n'avait pas d'effet quand on active déjà -O1.
Et je suis bien sûr qu'il ne s'agit pas d'un problème de code car cette option agit normalement lors de l'appel de plusieurs fonctions, donc facilement testable.

Il me semble que sur gcc 3.3.2 il soit impossible de déscativer certaines options ,

Quelqu'un peut il le confirmer?
0