GCC hiba?

Sziasztok!

WTF-en talaltam a kommentek kozt egy aranyos dolgot. Nyilvan semmi ertelme ilyen formaban, de jol mutatja, hogy vigyazni kell a tulzott optimalizacioval. (Gentoo :) )


int main()
{
  int n = 0;

  while(n >= 0) n++;
}

Hogy mukodik a kod? Van egy (elojeles) int valtozo, es egy ciklus. A while addig fut, amig n nemnegativ. A cikluson belul noveljuk a valtozot, ami idovel tulcsordul. Tulcsordulas utan az erteke negativ lesz (-2^31 x86-on), igy a ciklus vegeter, a program kilep.

gcc forditoteszt.c
./a.out
Varunk, par masodperc alatt lefut, kilep, orulunk.

Termeszetesen semmi ertelme egy ciklusban novelni egy valtozot, ez csak keslelteti a futast. Egy jo fordito ezt okosan kioptimalizalna. Lassuk:

gcc -O3 forditoteszt.c
./a.out
^C

Turelmesen varunk, nem tortenik semmi, kilepunk. Hat ez nem lett gyorsabb.
Nezzuk mi lett belole forditas utan:

gcc -O3 -S forditoteszt.c
cat forditoteszt.s


...
.L2:
        jmp     .L2
...

Szep vegtelen ciklus. Ugyes. Amugy -O2-re is ez a helyzet, pedig ez az ajanlott. A -O1 viszont mukodik.

Hozzászólások

> Termeszetesen semmi ertelme egy ciklusban novelni egy valtozot, ez csak keslelteti a futast.

Tekintve, hogy az a ciklusváltozó, ez azért picit meggondolalan dolognak tűnik. (Pl. azért, mert van pár ciklus, ami ugye ezen alapszik. Mint mondjuk a fenti.) Szóval rendes bug ez, április elsejétől függetlenül - már ha valóban így működik. Mert nekem az alapértelmezett O2-re és a kézzel kiadott O3-ra is szépen működik. gcc (GCC) 4.2.1 20070719 [FreeBSD]

Nalam ez a verzio, es a fenti tunetet produkalja (datumtol fuggetlenul, csak epp ma talaltam).

nyos@nyos:~/src$ gcc --version
gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

A "semmi ertelme"-t ugy ertettem, hogy egy ures ciklus, ami a ciklusvaltozot valtoztatja csak, ezen tul semmit nem csinal. Szoval ennyi erovel lehetne ott egy n="valami architekturafuggo negativ szam" is. Ami nyilvan gyorsabb, tehat arra optimalizalhato.

--
I don't always dress in a T-shirt and jeans. Sometimes people give me awards, and I dress like a penguin instead. - Linus Torvalds

Milyen architekturat hasznalsz?
ARM-on nalam is helyesen mukodik, csak 32 bites x86-on hibas.


.L5:
        adds    r3, r3, #1
        bpl     .L5

Igaz, ott a fordito is joval regebbi: GCC: (GNU) 2.95.1 19990816 (release)

--
I don't always dress in a T-shirt and jeans. Sometimes people give me awards, and I dress like a penguin instead. - Linus Torvalds

Nem hiszem, hogy bug volna. Csak "undefined behaviour": http://www.airs.com/blog/archives/120. Viszont warning-ot is csak az oldalon talalhato peldara kapok:

int f()
{
int i;
int j = 0;
for (i = 1; i > 0; i += i)
++j;
return j;
}

overflow.c: In function 'main':
overflow.c:3: warning: assuming signed overflow does not occur when simplifying conditional to constant

undefined behaviour

--
When in doubt, use brute force.