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 ).
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 :
- int32_t valeur=0;
- int16_t une_autre_valeur;
- for(boucle sur une grosse quantité de données int16_t)
- {
- //calculs qui ne touchent pas valeur
- if(valeur>0)
- une_autre_valeur=-32768;
- else
- une_autre_valeur=32767;
- //autres calculs qui modifient valeur
- }
|
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