[résolu] GCC optimisat. avec -ftree-vrp et code qui ne fonctionne plus

GCC optimisat. avec -ftree-vrp et code qui ne fonctionne plus [résolu] - C - Programmation

Marsh Posté le 28-05-2022 à 22:56:33    

Bonsoir,
 
c'est peut-être trop pointu comme question mais je n'ai rien trouvé de clair sur internet et je suis emmerdé...
 
J'ai un code C (que je ne peux pas publier) assez basique qui va lire des données dans un fichier, faire quelque calculs et écrire les données résultats dans un autre fichier. Le code compile avec -Wall -Wextra -Werror -pedantic.
 
Problème: Si je compile le code sans indiquer à GCC le niveau d'optimisation ou alors avec -O1 tout fonctionne, par contre si je mets -O2 ou -O3 le fichier en sortie ne contient plus que des conneries (que du 0xFF en fait mais bon, vu que je ne peux pas en dire plus c'est pas très utile :o ).
 
J'ai regardé les différences entre -O1 et O2 et fait quelque tests, à priori c'est -ftree-vrp qui fout le bazar. Dans la doc il est marqué

Citation :

-ftree-vrp
Perform Value Range Propagation on trees. This is similar to the constant propagation pass, but instead of values, ranges of values are propagated. This allows the optimizers to remove unnecessary range checks like array bound checks and null pointer checks. This is enabled by default at -O2 and higher. Null pointer check elimination is only done if -fdelete-null-pointer-checks is enabled.

ce qui n'est pas franchement clair pour moi.
 
J'ai rajouté quelque printf() et je me suis aperçu que ce bout de code semble poser problème:

Code :
  1. int32_t valeur=0;
  2. int16_t une_autre_valeur;
  3. for(boucle sur une grosse quantité de données int16_t)
  4. {
  5.     //calculs qui ne touchent pas valeur
  6.     if(valeur>0)
  7.         une_autre_valeur=-32768;
  8.     else
  9.         une_autre_valeur=32767;
  10.     //autres calculs qui modifient valeur
  11. }


 
En effet - vu avec des printf() - valeur est parfois positif et parfois négatif, mais le if() ne "fonctionne plus", comme si il était toujours vrai ou faux, en fonction de la valeur avec laquelle j'initialise la variable "valeur" (p.ex. 100 ou -100).
 
Quelqu'un à qui ça parle et/ou qui peut me dire ce que fait réellement ce -ftree-vrp? Je ne parle pas l'ASM x86/x64 malheureusement, donc je ne peux pas débugger facilement ça.


Message édité par rat de combat le 29-05-2022 à 15:01:51
Reply

Marsh Posté le 28-05-2022 à 22:56:33   

Reply

Marsh Posté le 29-05-2022 à 01:19:59    

Je serais toi, j'essaierais de recompiler avec la dernière version de GCC (11.3 je crois), pour voir si ce n'est pas un bug du compilo, corrigé depuis.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-05-2022 à 11:20:18    

Oui, c'est une bonne idée, sauf que le GCC 11 faut le trouver quelque part... La j'essaye de le compiler dans une VM Deb11, mais la première tentative a déjà échouée avec un beau segfault...

 

Si je n'y arrive pas je vais installer Debian testing (qui contient GCC 11) dans une VM, mais avec ma connection internet anémique ça va encore me prendre du temps...

 

Je ferai un retour.


Message édité par rat de combat le 29-05-2022 à 11:20:57
Reply

Marsh Posté le 29-05-2022 à 11:21:48    

Ah ! Moi je l'ai dans mon installation MSys2 :D
Installé par pacman.
A+,


Message édité par gilou le 29-05-2022 à 11:22:18

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-05-2022 à 11:35:39    

Bon, j'ai lancé la compil une seconde fois et cette fois ci ça a fonctionné. Faut pas chercher...
 
Par contre toujours le même problème avec GCC11.2: -O1 -> ok, -O2 ou -O3 -> n'importe quoi. :(  
 
J'aimerais bien comprendre. :sweat:

Reply

Marsh Posté le 29-05-2022 à 11:48:58    

J'ai trouvé cette publication qui semble parler de ce problème (cherchez -ftree-vrp), mais c'est toujours pas clair pour moi. Bug compilo ou alors dans mon code?? Je continue de chercher (pas le choix...).

 

EDIT: En mettant un "volatile" devant la déclaration de int32_t valeur ça fonctionne avec -O3, mais normalement ce "volatile" il n'a rien à faire là...


Message édité par rat de combat le 29-05-2022 à 11:59:23
Reply

Marsh Posté le 29-05-2022 à 13:44:54    

Et moi j'ai trouvé ceci : https://www.spinics.net/lists/gcchelp/msg20462.html
Et pas mal de bugs anciens liés à -tree-vrp, qui reviennent parfois.
Tu pourrais essayer avec ces options :
-fno-tree-vrp -fdisable-tree-cunrolli -fdisable-tree-cunroll
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-05-2022 à 15:00:52    

Merci mille fois gilou! :jap:  
 
Avec -O3 -fno-tree-vrp ça fonctionne. J'ai regardé ton lien, ils parlent de comportement non défini dans le standard C, faudra que je regarde ça et ce code de plus près quand j'aurais le temps (dimanche bien rempli...).
 
Problème résolu.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed