KSP.sk

Korešpondenčný seminár z programovania


Odpovedať 
 
Hodnotenie témy:
  • 0 Hlasov - 0 Priemer
  • 1
  • 2
  • 3
  • 4
  • 5
Divne spravanie s -O2
26.05.2012, 22:44:39
Príspevok: #1
Divne spravanie s -O2
Caute,
ked skompilujem tento kod bez akychkolvek optimalizacii
Kód:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int e[100], n;

#define DEBUG(x) cerr << #x << ": " << x << endl;

void foo(void) {
    int k = 0;

    for (int i = 0; i < n; ++i) {
        e[k++] = 10;
        e[k++] = 10;
    }
    for (int i = 0; i < k; ++i)
        DEBUG(e[i]);
    DEBUG(k);
}          

int main(void) {
    n = 10;
    foo();
    return 0;
}
vsetko funguje ako ma (program teda vypise 20 desiatok). Ked pridam -O2, premenna k ma nakoniec hodnotu 20, ale ziadne cislo s pola e sa nevypise. dafuq? Vie mi niekto povedat preco? Ked dam "k" do globalu, alebo ked vo for-cykle zmenim "n" za "10", alebo do tohto for-cyklu pridam nakoniec "DEBUG(k)", tak to ide. Takto som sa tusim odrbal aj na vyberku... co sa tam moze diat?
Vyhľadať všetky príspevky tohoto používateľa
Citovať príspevok v odpovedi
27.05.2012, 23:24:21
Príspevok: #2
RE: Divne spravanie s -O2
Up to my best knowledge ide o nejaký bug gcc, v rámci optimalizácií nesprávne "vylepší" ten for-cyklus. Skúsil som to práve v najnovšom stabilnom g++ (4.7.0) a robí to furt. Dosť zlé. Skúsim to pohľadať v ich bug db a ak nič nenájdem tak submitnúť bugreport. (Je teoretická šanca že ten kód nie je validné C++, ale vonkoncom na to nevidím dôvod.)
Navštíviť používateľov web Vyhľadať všetky príspevky tohoto používateľa
Citovať príspevok v odpovedi
28.05.2012, 19:38:31
Príspevok: #3
RE: Divne spravanie s -O2
Ak to nie je validne C++, tak by som cakal aspon warning. Chcelo by to skusit este nejaky clang + llvm, pripadne Borland ci MS C++ Icon_smile
Navštíviť používateľov web Vyhľadať všetky príspevky tohoto používateľa
Citovať príspevok v odpovedi
30.05.2012, 12:59:19
Príspevok: #4
RE: Divne spravanie s -O2
Bug reportu sa darí celkom dobre, sledovať vývoj situácie sa dá tu:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53501
Navštíviť používateľov web Vyhľadať všetky príspevky tohoto používateľa
Citovať príspevok v odpovedi
Odpovedať 







Účet

Ako sa prihlásim?
 
loading

Redirecting