g++ 3.2, djvulibre i athlon

Michal Moskal malekith w pld-linux.org
Śro, 4 Gru 2002, 18:48:45 CET


On Wed, Dec 04, 2002 at 06:16:15PM +0100, Jakub Bogusz wrote:
> On Wed, Dec 04, 2002 at 03:05:33PM +0100, Michal Moskal wrote:
> > On Wed, Dec 04, 2002 at 12:16:59AM +0100, Jakub Bogusz wrote:
> > > WRESZCIE namierzyłem byka. Tylko gdzie - w gcc, czy w djvulibre?
> > > 
> > > Ktoś chyba tutaj (malekith?) pisał, że C++ nie dopuszcza równoczesnego
> > > istnienia wskaźników różnych typów do tej samej zmiennej i gcc 3.x
> > > wykorzystuje to przy optymalizacji. Jakie są dokładne ograniczenia?
> > 
> > Od razu zaznaczam, że nie wiem na 100%, na pewno jest to napisane w
> > standardzie C++ (i/lub C), ale nie da się ukryć, że czytanie go to
> > średnia przyjemność. Tak czy inaczej void* może być aliasem dla T*, dla
> > dowolnego T. Natomiast nie wiem jak to się przenosi na void*&. Na zdrowy
> > rozum powinno się przenosić.
> 
> Reguły aliasingu dla C++ składają się głównie z wywołania funkcji
> z c_common...
> Nie wiem jak tamte funkcje traktują referencje.

W gcc wskaźniki i referencje są dość zbliżone, w szczególności na
poziomie RTL są już chyba nie do odróżnienia. Natomiast na poziomie 
drzew jest POINTER_TYPE i REFERENCE_TYPE. Tyle, że GCC robi
optymalizacje na poziomie RTL, więc pewnie void*& nie różni się zbytnio
od void**, który to z kolei chyba nie jest traktowany specjalnie, tak
jak void*. Ale to tylko czyste spekulacje. 

A co do reguł aliasowania w C++ to hm... jeśli nie jesteś w stanie
stwierdzić znaczenia programu bez godziny grzebania w standardzie, to
znaczy, że język ssie. Ale to tak tylko IMHO. Caml forever ;-)

> > Czy ten kod działa z -fno-strict-aliasing?
> 
> Właśnie sprawdziłem - tak.
> Dla athlona .s różni się w 3 miejscach, jedno z nich to wspomniany
> fragment.
> Dla i686 różni się w 2 pozostałych miejscach.

Ciekawe czy czegoś nie psuje ;-) Jako tymczasowe obejście można by ten
program kompilować z -fno-strict-aliasing. Ta opcja była właśnie
pomyślana dla programów niezgodnych ze standardem.

-- 
: Michal Moskal ::::: malekith/at/pld-linux.org :  GCS {C,UL}++++$ a? !tv
: PLD Linux ::::::: Wroclaw University, CS Dept :  {E-,w}-- {b++,e}>+++ h



Więcej informacji o liście dyskusyjnej pld-devel-pl