Si je me souviens bien, la conclusion de la discussion, c'etait que restrict
etait une fausse bonne idee,
Si je me souviens bien, la conclusion de la discussion, c'etait que restrict
etait une fausse bonne idee,
Si je me souviens bien, la conclusion de la discussion, c'etait que restrict
etait une fausse bonne idee,
Taurre wrote:n'est ce pas un peu excessif d'optimiser lorsque "a" ou "b" (si son
affectation est la première) sont des pointeurs restreints? La Norme
permet d'accéder à un objet pointé par un pointeur restreint si
l'accès via un autre pointeur ne vise pas à le modifier, cela me
semble un peu risqué non?
Tout ce dont tu as besoin, c'est de savoir que a et v sont
indépendants. Pour gcc, ça veut dire les mettre tous les 2 restreints.
Pour Intel/Oracle, ça veut dire en mettre au moins un des 2 restreint.
Taurre wrote:
n'est ce pas un peu excessif d'optimiser lorsque "a" ou "b" (si son
affectation est la première) sont des pointeurs restreints? La Norme
permet d'accéder à un objet pointé par un pointeur restreint si
l'accès via un autre pointeur ne vise pas à le modifier, cela me
semble un peu risqué non?
Tout ce dont tu as besoin, c'est de savoir que a et v sont
indépendants. Pour gcc, ça veut dire les mettre tous les 2 restreints.
Pour Intel/Oracle, ça veut dire en mettre au moins un des 2 restreint.
Taurre wrote:n'est ce pas un peu excessif d'optimiser lorsque "a" ou "b" (si son
affectation est la première) sont des pointeurs restreints? La Norme
permet d'accéder à un objet pointé par un pointeur restreint si
l'accès via un autre pointeur ne vise pas à le modifier, cela me
semble un peu risqué non?
Tout ce dont tu as besoin, c'est de savoir que a et v sont
indépendants. Pour gcc, ça veut dire les mettre tous les 2 restreints.
Pour Intel/Oracle, ça veut dire en mettre au moins un des 2 restreint.
Justement, je crois qu'il y avait des soucis d'interpretation de la norme,
et que dans ce cas precis, ce que compilent Intel/Oracle, on avait conclu
que ce n'etait pas du C standard...
Justement, je crois qu'il y avait des soucis d'interpretation de la norme,
et que dans ce cas precis, ce que compilent Intel/Oracle, on avait conclu
que ce n'etait pas du C standard...
Justement, je crois qu'il y avait des soucis d'interpretation de la norme,
et que dans ce cas precis, ce que compilent Intel/Oracle, on avait conclu
que ce n'etait pas du C standard...
Bonjour à tous,
Je me suis récemment penché sur la notion de pointeurs restreints
introduite par la Norme C99 et il y a plusieurs questions auxquelles
je n'ai trouvé aucune réponse:
- la première porte sur ce code:
#include <stdlib.h>
void
test (int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
la valeur de l'objet pointé par la variable "v" est chargé deux fois
dans le registre eax alors qu'elle ne devrait l'être qu'une seule
fois... l'optimisation n'aura lieu que si un ou les deux autres
pointeurs sont également déclaré avec le qualificatif "restrict".
Quelqu'un pourrait-il m'expliquer pourquoi?
Bonjour à tous,
Je me suis récemment penché sur la notion de pointeurs restreints
introduite par la Norme C99 et il y a plusieurs questions auxquelles
je n'ai trouvé aucune réponse:
- la première porte sur ce code:
#include <stdlib.h>
void
test (int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
la valeur de l'objet pointé par la variable "v" est chargé deux fois
dans le registre eax alors qu'elle ne devrait l'être qu'une seule
fois... l'optimisation n'aura lieu que si un ou les deux autres
pointeurs sont également déclaré avec le qualificatif "restrict".
Quelqu'un pourrait-il m'expliquer pourquoi?
Bonjour à tous,
Je me suis récemment penché sur la notion de pointeurs restreints
introduite par la Norme C99 et il y a plusieurs questions auxquelles
je n'ai trouvé aucune réponse:
- la première porte sur ce code:
#include <stdlib.h>
void
test (int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
la valeur de l'objet pointé par la variable "v" est chargé deux fois
dans le registre eax alors qu'elle ne devrait l'être qu'une seule
fois... l'optimisation n'aura lieu que si un ou les deux autres
pointeurs sont également déclaré avec le qualificatif "restrict".
Quelqu'un pourrait-il m'expliquer pourquoi?
On 2011-04-23, Taurre wrote:
> Bonjour à tous,
> Je me suis récemment penché sur la notion de pointeurs restreints
> introduite par la Norme C99 et il y a plusieurs questions auxquelles
> je n'ai trouvé aucune réponse:
> - la première porte sur ce code:
> #include <stdlib.h>
> void
> test (int *a, int *b, int * restrict v)
> {
> *a = *v;
> *b = *v;
> }
[...]
> la valeur de l'objet pointé par la variable "v" est chargé deux foi s
> dans le registre eax alors qu'elle ne devrait l'être qu'une seule
> fois... l'optimisation n'aura lieu que si un ou les deux autres
> pointeurs sont également déclaré avec le qualificatif "restrict".
> Quelqu'un pourrait-il m'expliquer pourquoi?
parce qu'il est interdit de copier les valeurs de deux pointeurs
restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mais
il est totalement légal de faire:
void test(int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
void test2(int *a, int * restrict v)
{
test(a, v, v);
}
Le standard demande que tous les accès aux "objets" pointés par v soi ent
fait par des expressions dérivées de la valeur du pointeur 'v' (§6. 3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dér ivé de
'v', et donc a tout a fait le droit d'aliaser v.
L'appel précédent est interdit si le prototype de 'test' est:
void test(int *a, int * restrict b, int * restrict v)
car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b ' à
'v' dans l'appel à test.
Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légale s i
il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
L'argument est bien sur symétrique pour 'a'.
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org
Le standard demande que tous les accès aux "objets" pointés par v soi ent
fait par des expressions dérivées de la valeur du pointeur 'v' (§6. 3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dér ivé de
'v', et donc a tout a fait le droit d'aliaser v.
On 2011-04-23, Taurre <jerome.frga...@yahoo.fr> wrote:
> Bonjour à tous,
> Je me suis récemment penché sur la notion de pointeurs restreints
> introduite par la Norme C99 et il y a plusieurs questions auxquelles
> je n'ai trouvé aucune réponse:
> - la première porte sur ce code:
> #include <stdlib.h>
> void
> test (int *a, int *b, int * restrict v)
> {
> *a = *v;
> *b = *v;
> }
[...]
> la valeur de l'objet pointé par la variable "v" est chargé deux foi s
> dans le registre eax alors qu'elle ne devrait l'être qu'une seule
> fois... l'optimisation n'aura lieu que si un ou les deux autres
> pointeurs sont également déclaré avec le qualificatif "restrict".
> Quelqu'un pourrait-il m'expliquer pourquoi?
parce qu'il est interdit de copier les valeurs de deux pointeurs
restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mais
il est totalement légal de faire:
void test(int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
void test2(int *a, int * restrict v)
{
test(a, v, v);
}
Le standard demande que tous les accès aux "objets" pointés par v soi ent
fait par des expressions dérivées de la valeur du pointeur 'v' (§6. 3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dér ivé de
'v', et donc a tout a fait le droit d'aliaser v.
L'appel précédent est interdit si le prototype de 'test' est:
void test(int *a, int * restrict b, int * restrict v)
car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b ' à
'v' dans l'appel à test.
Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légale s i
il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
L'argument est bien sur symétrique pour 'a'.
--
·O· Pierre Habouzit
··O madco...@debian.org
OOO http://www.madism.org
Le standard demande que tous les accès aux "objets" pointés par v soi ent
fait par des expressions dérivées de la valeur du pointeur 'v' (§6. 3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dér ivé de
'v', et donc a tout a fait le droit d'aliaser v.
On 2011-04-23, Taurre wrote:
> Bonjour à tous,
> Je me suis récemment penché sur la notion de pointeurs restreints
> introduite par la Norme C99 et il y a plusieurs questions auxquelles
> je n'ai trouvé aucune réponse:
> - la première porte sur ce code:
> #include <stdlib.h>
> void
> test (int *a, int *b, int * restrict v)
> {
> *a = *v;
> *b = *v;
> }
[...]
> la valeur de l'objet pointé par la variable "v" est chargé deux foi s
> dans le registre eax alors qu'elle ne devrait l'être qu'une seule
> fois... l'optimisation n'aura lieu que si un ou les deux autres
> pointeurs sont également déclaré avec le qualificatif "restrict".
> Quelqu'un pourrait-il m'expliquer pourquoi?
parce qu'il est interdit de copier les valeurs de deux pointeurs
restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mais
il est totalement légal de faire:
void test(int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
void test2(int *a, int * restrict v)
{
test(a, v, v);
}
Le standard demande que tous les accès aux "objets" pointés par v soi ent
fait par des expressions dérivées de la valeur du pointeur 'v' (§6. 3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dér ivé de
'v', et donc a tout a fait le droit d'aliaser v.
L'appel précédent est interdit si le prototype de 'test' est:
void test(int *a, int * restrict b, int * restrict v)
car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b ' à
'v' dans l'appel à test.
Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légale s i
il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
L'argument est bien sur symétrique pour 'a'.
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org
Le standard demande que tous les accès aux "objets" pointés par v soi ent
fait par des expressions dérivées de la valeur du pointeur 'v' (§6. 3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dér ivé de
'v', et donc a tout a fait le droit d'aliaser v.
On 26 mai, 01:25, Pierre Habouzit wrote:On 2011-04-23, Taurre wrote:
> Bonjour à tous,
> Je me suis récemment penché sur la notion de pointeurs restreints
> introduite par la Norme C99 et il y a plusieurs questions auxquelles
> je n'ai trouvé aucune réponse:
> - la première porte sur ce code:
> #include <stdlib.h>
> void
> test (int *a, int *b, int * restrict v)
> {
> *a = *v;
> *b = *v;
> }
[...]
> la valeur de l'objet pointé par la variable "v" est chargé deux fois
> dans le registre eax alors qu'elle ne devrait l'être qu'une seule
> fois... l'optimisation n'aura lieu que si un ou les deux autres
> pointeurs sont également déclaré avec le qualificatif "restrict".
> Quelqu'un pourrait-il m'expliquer pourquoi?
parce qu'il est interdit de copier les valeurs de deux pointeurs
restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mais
il est totalement légal de faire:
void test(int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
void test2(int *a, int * restrict v)
{
test(a, v, v);
}
Le standard demande que tous les accès aux "objets" pointés par v soient
fait par des expressions dérivées de la valeur du pointeur 'v' (§6.3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dérivé de
'v', et donc a tout a fait le droit d'aliaser v.
L'appel précédent est interdit si le prototype de 'test' est:
void test(int *a, int * restrict b, int * restrict v)
car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b' à
'v' dans l'appel à test.
Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légale si
il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
L'argument est bien sur symétrique pour 'a'.
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org
Mmmh... Je ne suis pas certains que cet exemple respecte la Norme.Le standard demande que tous les accès aux "objets" pointés par v soient
fait par des expressions dérivées de la valeur du pointeur 'v' (§6.3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dérivé de
'v', et donc a tout a fait le droit d'aliaser v.
Le point 6.7.3.1 § 4, indique bien "During each execution of B", "B"
étant le bloc contenant la déclaration du pointeur restreint.
On 26 mai, 01:25, Pierre Habouzit <madco...@debian.org> wrote:
On 2011-04-23, Taurre <jerome.frga...@yahoo.fr> wrote:
> Bonjour à tous,
> Je me suis récemment penché sur la notion de pointeurs restreints
> introduite par la Norme C99 et il y a plusieurs questions auxquelles
> je n'ai trouvé aucune réponse:
> - la première porte sur ce code:
> #include <stdlib.h>
> void
> test (int *a, int *b, int * restrict v)
> {
> *a = *v;
> *b = *v;
> }
[...]
> la valeur de l'objet pointé par la variable "v" est chargé deux fois
> dans le registre eax alors qu'elle ne devrait l'être qu'une seule
> fois... l'optimisation n'aura lieu que si un ou les deux autres
> pointeurs sont également déclaré avec le qualificatif "restrict".
> Quelqu'un pourrait-il m'expliquer pourquoi?
parce qu'il est interdit de copier les valeurs de deux pointeurs
restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mais
il est totalement légal de faire:
void test(int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
void test2(int *a, int * restrict v)
{
test(a, v, v);
}
Le standard demande que tous les accès aux "objets" pointés par v soient
fait par des expressions dérivées de la valeur du pointeur 'v' (§6.3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dérivé de
'v', et donc a tout a fait le droit d'aliaser v.
L'appel précédent est interdit si le prototype de 'test' est:
void test(int *a, int * restrict b, int * restrict v)
car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b' à
'v' dans l'appel à test.
Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légale si
il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
L'argument est bien sur symétrique pour 'a'.
--
·O· Pierre Habouzit
··O madco...@debian.org
OOO http://www.madism.org
Mmmh... Je ne suis pas certains que cet exemple respecte la Norme.
Le standard demande que tous les accès aux "objets" pointés par v soient
fait par des expressions dérivées de la valeur du pointeur 'v' (§6.3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dérivé de
'v', et donc a tout a fait le droit d'aliaser v.
Le point 6.7.3.1 § 4, indique bien "During each execution of B", "B"
étant le bloc contenant la déclaration du pointeur restreint.
On 26 mai, 01:25, Pierre Habouzit wrote:On 2011-04-23, Taurre wrote:
> Bonjour à tous,
> Je me suis récemment penché sur la notion de pointeurs restreints
> introduite par la Norme C99 et il y a plusieurs questions auxquelles
> je n'ai trouvé aucune réponse:
> - la première porte sur ce code:
> #include <stdlib.h>
> void
> test (int *a, int *b, int * restrict v)
> {
> *a = *v;
> *b = *v;
> }
[...]
> la valeur de l'objet pointé par la variable "v" est chargé deux fois
> dans le registre eax alors qu'elle ne devrait l'être qu'une seule
> fois... l'optimisation n'aura lieu que si un ou les deux autres
> pointeurs sont également déclaré avec le qualificatif "restrict".
> Quelqu'un pourrait-il m'expliquer pourquoi?
parce qu'il est interdit de copier les valeurs de deux pointeurs
restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mais
il est totalement légal de faire:
void test(int *a, int *b, int * restrict v)
{
*a = *v;
*b = *v;
}
void test2(int *a, int * restrict v)
{
test(a, v, v);
}
Le standard demande que tous les accès aux "objets" pointés par v soient
fait par des expressions dérivées de la valeur du pointeur 'v' (§6.3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dérivé de
'v', et donc a tout a fait le droit d'aliaser v.
L'appel précédent est interdit si le prototype de 'test' est:
void test(int *a, int * restrict b, int * restrict v)
car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b' à
'v' dans l'appel à test.
Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légale si
il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
L'argument est bien sur symétrique pour 'a'.
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org
Mmmh... Je ne suis pas certains que cet exemple respecte la Norme.Le standard demande que tous les accès aux "objets" pointés par v soient
fait par des expressions dérivées de la valeur du pointeur 'v' (§6.3.7
alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est dérivé de
'v', et donc a tout a fait le droit d'aliaser v.
Le point 6.7.3.1 § 4, indique bien "During each execution of B", "B"
étant le bloc contenant la déclaration du pointeur restreint.
On 2011-06-05, Taurre wrote:
> On 26 mai, 01:25, Pierre Habouzit wrote:
>> On 2011-04-23, Taurre wrote:
>> > Bonjour à tous,
>> > Je me suis récemment penché sur la notion de pointeurs restreint s
>> > introduite par la Norme C99 et il y a plusieurs questions auxquelles
>> > je n'ai trouvé aucune réponse:
>> > - la première porte sur ce code:
>> > #include <stdlib.h>
>> > void
>> > test (int *a, int *b, int * restrict v)
>> > {
>> > *a = *v;
>> > *b = *v;
>> > }
>> [...]
>> > la valeur de l'objet pointé par la variable "v" est chargé deux fois
>> > dans le registre eax alors qu'elle ne devrait l'être qu'une seule
>> > fois... l'optimisation n'aura lieu que si un ou les deux autres
>> > pointeurs sont également déclaré avec le qualificatif "restric t".
>> > Quelqu'un pourrait-il m'expliquer pourquoi?
>> parce qu'il est interdit de copier les valeurs de deux pointeurs
>> restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mai s
>> il est totalement légal de faire:
>> void test(int *a, int *b, int * restrict v)
>> {
>> *a = *v;
>> *b = *v;
>> }
>> void test2(int *a, int * restrict v)
>> {
>> test(a, v, v);
>> }
>> Le standard demande que tous les accès aux "objets" pointés par v soient
>> fait par des expressions dérivées de la valeur du pointeur 'v' ( §6.3.7
>> alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est d érivé de
>> 'v', et donc a tout a fait le droit d'aliaser v.
>> L'appel précédent est interdit si le prototype de 'test' est:
>> void test(int *a, int * restrict b, int * restrict v)
>> car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b' à
>> 'v' dans l'appel à test.
>> Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légal e si
>> il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
>> L'argument est bien sur symétrique pour 'a'.
>> --
>> ·O· Pierre Habouzit
>> ··O
>> OOO http://www.madism.org
> Mmmh... Je ne suis pas certains que cet exemple respecte la Norme.
>> Le standard demande que tous les accès aux "objets" pointés par v soient
>> fait par des expressions dérivées de la valeur du pointeur 'v' ( §6.3.7
>> alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est d érivé de
>> 'v', et donc a tout a fait le droit d'aliaser v.
> Le point 6.7.3.1 § 4, indique bien "During each execution of B", "B"
> étant le bloc contenant la déclaration du pointeur restreint.
Oui mais il n'y a pas de bloc ici vu que c'est le paramètre d'une
fonction. Enfin plus précisément les expressions viennent d'ailleurs et
le compilateur ne peut a priori pas savoir.
Dans la pratique GCC part du principe que les pointeurs qualifiés de
restrict ne s'aliasent pas mais qu'ils peuvent aliaser des pointeurs non
restrict lorsqu'il n'est pas capable de savoir si ils sont dérivés d' un
pointeur restrict.
Par contre au contraire de ce que tu dis dans ton autre post, dans le
scope d'un bloc GCC est capable de tracker assez finement les restricts
comme j'ai pu le constater sur différents autres types de code. Mais à
travers des prototypes de fonctions c'est différent.
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org
Oui mais il n'y a pas de bloc ici vu que c'est le paramètre d'une
fonction. Enfin plus précisément les expressions viennent d'ailleurs et
le compilateur ne peut a priori pas savoir.
Dans la pratique GCC part du principe que les pointeurs qualifiés de
restrict ne s'aliasent pas mais qu'ils peuvent aliaser des pointeurs non
restrict lorsqu'il n'est pas capable de savoir si ils sont dérivés d' un
pointeur restrict.
If D appears in the list of parameter declarations of a function definiti on, let B
denote the associated block.
On 2011-06-05, Taurre <jerome.frga...@yahoo.fr> wrote:
> On 26 mai, 01:25, Pierre Habouzit <madco...@debian.org> wrote:
>> On 2011-04-23, Taurre <jerome.frga...@yahoo.fr> wrote:
>> > Bonjour à tous,
>> > Je me suis récemment penché sur la notion de pointeurs restreint s
>> > introduite par la Norme C99 et il y a plusieurs questions auxquelles
>> > je n'ai trouvé aucune réponse:
>> > - la première porte sur ce code:
>> > #include <stdlib.h>
>> > void
>> > test (int *a, int *b, int * restrict v)
>> > {
>> > *a = *v;
>> > *b = *v;
>> > }
>> [...]
>> > la valeur de l'objet pointé par la variable "v" est chargé deux fois
>> > dans le registre eax alors qu'elle ne devrait l'être qu'une seule
>> > fois... l'optimisation n'aura lieu que si un ou les deux autres
>> > pointeurs sont également déclaré avec le qualificatif "restric t".
>> > Quelqu'un pourrait-il m'expliquer pourquoi?
>> parce qu'il est interdit de copier les valeurs de deux pointeurs
>> restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mai s
>> il est totalement légal de faire:
>> void test(int *a, int *b, int * restrict v)
>> {
>> *a = *v;
>> *b = *v;
>> }
>> void test2(int *a, int * restrict v)
>> {
>> test(a, v, v);
>> }
>> Le standard demande que tous les accès aux "objets" pointés par v soient
>> fait par des expressions dérivées de la valeur du pointeur 'v' ( §6.3.7
>> alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est d érivé de
>> 'v', et donc a tout a fait le droit d'aliaser v.
>> L'appel précédent est interdit si le prototype de 'test' est:
>> void test(int *a, int * restrict b, int * restrict v)
>> car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b' à
>> 'v' dans l'appel à test.
>> Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légal e si
>> il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
>> L'argument est bien sur symétrique pour 'a'.
>> --
>> ·O· Pierre Habouzit
>> ··O madco...@debian.org
>> OOO http://www.madism.org
> Mmmh... Je ne suis pas certains que cet exemple respecte la Norme.
>> Le standard demande que tous les accès aux "objets" pointés par v soient
>> fait par des expressions dérivées de la valeur du pointeur 'v' ( §6.3.7
>> alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est d érivé de
>> 'v', et donc a tout a fait le droit d'aliaser v.
> Le point 6.7.3.1 § 4, indique bien "During each execution of B", "B"
> étant le bloc contenant la déclaration du pointeur restreint.
Oui mais il n'y a pas de bloc ici vu que c'est le paramètre d'une
fonction. Enfin plus précisément les expressions viennent d'ailleurs et
le compilateur ne peut a priori pas savoir.
Dans la pratique GCC part du principe que les pointeurs qualifiés de
restrict ne s'aliasent pas mais qu'ils peuvent aliaser des pointeurs non
restrict lorsqu'il n'est pas capable de savoir si ils sont dérivés d' un
pointeur restrict.
Par contre au contraire de ce que tu dis dans ton autre post, dans le
scope d'un bloc GCC est capable de tracker assez finement les restricts
comme j'ai pu le constater sur différents autres types de code. Mais à
travers des prototypes de fonctions c'est différent.
--
·O· Pierre Habouzit
··O madco...@debian.org
OOO http://www.madism.org
Oui mais il n'y a pas de bloc ici vu que c'est le paramètre d'une
fonction. Enfin plus précisément les expressions viennent d'ailleurs et
le compilateur ne peut a priori pas savoir.
Dans la pratique GCC part du principe que les pointeurs qualifiés de
restrict ne s'aliasent pas mais qu'ils peuvent aliaser des pointeurs non
restrict lorsqu'il n'est pas capable de savoir si ils sont dérivés d' un
pointeur restrict.
If D appears in the list of parameter declarations of a function definiti on, let B
denote the associated block.
On 2011-06-05, Taurre wrote:
> On 26 mai, 01:25, Pierre Habouzit wrote:
>> On 2011-04-23, Taurre wrote:
>> > Bonjour à tous,
>> > Je me suis récemment penché sur la notion de pointeurs restreint s
>> > introduite par la Norme C99 et il y a plusieurs questions auxquelles
>> > je n'ai trouvé aucune réponse:
>> > - la première porte sur ce code:
>> > #include <stdlib.h>
>> > void
>> > test (int *a, int *b, int * restrict v)
>> > {
>> > *a = *v;
>> > *b = *v;
>> > }
>> [...]
>> > la valeur de l'objet pointé par la variable "v" est chargé deux fois
>> > dans le registre eax alors qu'elle ne devrait l'être qu'une seule
>> > fois... l'optimisation n'aura lieu que si un ou les deux autres
>> > pointeurs sont également déclaré avec le qualificatif "restric t".
>> > Quelqu'un pourrait-il m'expliquer pourquoi?
>> parce qu'il est interdit de copier les valeurs de deux pointeurs
>> restrict entre eux (6.3.7.1) sans respecter pas mal de conditions, mai s
>> il est totalement légal de faire:
>> void test(int *a, int *b, int * restrict v)
>> {
>> *a = *v;
>> *b = *v;
>> }
>> void test2(int *a, int * restrict v)
>> {
>> test(a, v, v);
>> }
>> Le standard demande que tous les accès aux "objets" pointés par v soient
>> fait par des expressions dérivées de la valeur du pointeur 'v' ( §6.3.7
>> alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est d érivé de
>> 'v', et donc a tout a fait le droit d'aliaser v.
>> L'appel précédent est interdit si le prototype de 'test' est:
>> void test(int *a, int * restrict b, int * restrict v)
>> car la règle assez convolue de '6.3.7.1 alinéa 4' interdit de lier 'b' à
>> 'v' dans l'appel à test.
>> Donc gcc ne *PEUT PAS* faire l'optimisation car elle n'est pas légal e si
>> il ne peut pas être sur que 'b' n'est pas dérivé de 'v'.
>> L'argument est bien sur symétrique pour 'a'.
>> --
>> ·O· Pierre Habouzit
>> ··O
>> OOO http://www.madism.org
> Mmmh... Je ne suis pas certains que cet exemple respecte la Norme.
>> Le standard demande que tous les accès aux "objets" pointés par v soient
>> fait par des expressions dérivées de la valeur du pointeur 'v' ( §6.3.7
>> alinéa 7). Or ce que j'écris dans test2 est un cas où 'b' est d érivé de
>> 'v', et donc a tout a fait le droit d'aliaser v.
> Le point 6.7.3.1 § 4, indique bien "During each execution of B", "B"
> étant le bloc contenant la déclaration du pointeur restreint.
Oui mais il n'y a pas de bloc ici vu que c'est le paramètre d'une
fonction. Enfin plus précisément les expressions viennent d'ailleurs et
le compilateur ne peut a priori pas savoir.
Dans la pratique GCC part du principe que les pointeurs qualifiés de
restrict ne s'aliasent pas mais qu'ils peuvent aliaser des pointeurs non
restrict lorsqu'il n'est pas capable de savoir si ils sont dérivés d' un
pointeur restrict.
Par contre au contraire de ce que tu dis dans ton autre post, dans le
scope d'un bloc GCC est capable de tracker assez finement les restricts
comme j'ai pu le constater sur différents autres types de code. Mais à
travers des prototypes de fonctions c'est différent.
--
·O· Pierre Habouzit
··O
OOO http://www.madism.org
Oui mais il n'y a pas de bloc ici vu que c'est le paramètre d'une
fonction. Enfin plus précisément les expressions viennent d'ailleurs et
le compilateur ne peut a priori pas savoir.
Dans la pratique GCC part du principe que les pointeurs qualifiés de
restrict ne s'aliasent pas mais qu'ils peuvent aliaser des pointeurs non
restrict lorsqu'il n'est pas capable de savoir si ils sont dérivés d' un
pointeur restrict.
If D appears in the list of parameter declarations of a function definiti on, let B
denote the associated block.