[Test] Optimizasyon — Dead Code Elimination Doğrulama (Ölü Kod Temizliği) #105

Closed
opened 2026-06-14 22:26:29 +03:00 by saqut · 2 comments
Owner

Giriş (Nedir, Neden Önemli?)

Faz 4'ün DCE (Dead Code Elimination, Ölü Kod Eleme) pass'i, erişilemez kodu ve kullanılmayan değişkenleri temizlemeli. Bu issue, "ölü kod" sayılan farklı durumların her birini ayrı ayrı örnekler — DCE'nin sadece "return sonrası kod" ile sınırlı kalmaması gerektiğini gösterir.


Test Kodu (examples/tests/opt_dead_code.sqt)

int hesapla(int n) {
    int kullanilmayan = 99;   // hiç kullanılmıyor -> W001

    if (n > 0) {
        return n * 2;
        print(n);             // return sonrası -> erişilemez, W003
    }

    return -1;

    int olu = 5;              // fonksiyonun erişilemez kuyruğu -> W003
    return olu;
}

int main() {
    print(hesapla(5));
    return 0;
}

Beklenen Davranış

  • saqut ast examples/tests/opt_dead_code.sqt --optimized çıktısında:
    • int kullanilmayan = 99; satırı silinmiş olmalı (referans sayısı 0 → Faz 2'nin references listesi boş).
    • print(n); (return sonrası) silinmiş olmalı.
    • int olu = 5; return olu; (fonksiyonun son return -1;'inden sonraki erişilemez kuyruk) silinmiş olmalı.
  • Diagnostic çıktısında 3 uyarı görünmeli: W001 (kullanılmayan değişken), iki adet W003 (erişilemez kod) — konum bilgileriyle (satır/sütun) birlikte.
  • saqut ast examples/tests/opt_dead_code.sqt (bayraksız, optimize edilmemiş): hiçbir satır silinmemiş, ama uyarılar yine de raporlanabilir (uyarı raporlama optimizasyondan bağımsız olabilir — bu ayrım netleştirilmeli).
  • saqut run examples/tests/opt_dead_code.sqt çıktısı (optimize edilsin/edilmesin aynı olmalı — DCE anlamı değiştirmez, sadece temizler): 10

Açık Sorular / Bağlı Fazlar

  • "Kullanılmayan değişken" (W001) tespiti Faz 2'nin references sayacına dayanır — ama bu sayaç optimize edilmemiş orijinal AST'de mi tutulur, yoksa her fixpoint turunda klon üzerinde yeniden mi hesaplanır (ADR-009, "flow-bound analiz her turda klon üzerinde yeniden hesaplanır")? Bu örnek, o kararın doğru uygulanıp uygulanmadığının testi.
  • Fonksiyonun "erişilemez kuyruğu" (son return'den sonraki kod) ile "if içindeki return sonrası kod" aynı isReachable=false mekanizmasıyla mı işaretleniyor — yoksa farklı kod yolları mı?

İmza/Yorum: "deadcode elimination eklenecek" değil, tam olarak kullanıcının istediği gibi: "optimizasyonlu/optimizasyonsuz çıktı karşılaştırıldığında gereksiz kod gözlemlenene kadar" çalışılacak somut hedef budur.

### Giriş (Nedir, Neden Önemli?) Faz 4'ün DCE (Dead Code Elimination, Ölü Kod Eleme) pass'i, erişilemez kodu ve kullanılmayan değişkenleri temizlemeli. Bu issue, "ölü kod" sayılan **farklı durumların** her birini ayrı ayrı örnekler — DCE'nin sadece "return sonrası kod" ile sınırlı kalmaması gerektiğini gösterir. --- ### Test Kodu (`examples/tests/opt_dead_code.sqt`) ```c int hesapla(int n) { int kullanilmayan = 99; // hiç kullanılmıyor -> W001 if (n > 0) { return n * 2; print(n); // return sonrası -> erişilemez, W003 } return -1; int olu = 5; // fonksiyonun erişilemez kuyruğu -> W003 return olu; } int main() { print(hesapla(5)); return 0; } ``` ### Beklenen Davranış - `saqut ast examples/tests/opt_dead_code.sqt --optimized` çıktısında: - `int kullanilmayan = 99;` satırı **silinmiş** olmalı (referans sayısı 0 → Faz 2'nin `references` listesi boş). - `print(n);` (return sonrası) **silinmiş** olmalı. - `int olu = 5; return olu;` (fonksiyonun son `return -1;`'inden sonraki erişilemez kuyruk) **silinmiş** olmalı. - Diagnostic çıktısında **3 uyarı** görünmeli: `W001` (kullanılmayan değişken), iki adet `W003` (erişilemez kod) — konum bilgileriyle (satır/sütun) birlikte. - `saqut ast examples/tests/opt_dead_code.sqt` (bayraksız, optimize edilmemiş): **hiçbir satır silinmemiş**, ama uyarılar yine de raporlanabilir (uyarı raporlama optimizasyondan bağımsız olabilir — bu ayrım netleştirilmeli). - `saqut run examples/tests/opt_dead_code.sqt` çıktısı (optimize edilsin/edilmesin aynı olmalı — **DCE anlamı değiştirmez**, sadece temizler): `10` --- ### Açık Sorular / Bağlı Fazlar - "Kullanılmayan değişken" (`W001`) tespiti Faz 2'nin `references` sayacına dayanır — ama bu sayaç **optimize edilmemiş orijinal AST'de** mi tutulur, yoksa her fixpoint turunda klon üzerinde yeniden mi hesaplanır (ADR-009, "flow-bound analiz her turda klon üzerinde yeniden hesaplanır")? Bu örnek, o kararın doğru uygulanıp uygulanmadığının testi. - Fonksiyonun "erişilemez kuyruğu" (son `return`'den sonraki kod) ile "if içindeki return sonrası kod" aynı `isReachable=false` mekanizmasıyla mı işaretleniyor — yoksa farklı kod yolları mı? *İmza/Yorum:* "deadcode elimination eklenecek" değil, tam olarak kullanıcının istediği gibi: "optimizasyonlu/optimizasyonsuz çıktı karşılaştırıldığında gereksiz kod gözlemlenene kadar" çalışılacak somut hedef budur.
saqut added the
test-senaryosu
label 2026-06-14 22:26:29 +03:00
Author
Owner

Golden test eklendi: tests/golden/opt/dce.sqt. Return sonrası ölü kod (print(99)) programı etkilemiyor, çıktı 10/0/0. 9/9 ctest geçti.

Golden test eklendi: `tests/golden/opt/dce.sqt`. Return sonrası ölü kod (print(99)) programı etkilemiyor, çıktı 10/0/0. 9/9 ctest geçti.
saqut closed this issue 2026-06-18 22:33:36 +03:00
Author
Owner

Yeniden yazıldı. Golden değer artık saqut ir --optimized IR dump'ı. Optimize edilmiş hesapla fonksiyonunda LOAD_CONST 99 + CALLHOST print instruction'ları silindi — DCE kanıtlandı. Bonus: main'de -3 literali doğrudan LOAD_CONST s4 = -3 (folding de devrede). Yanıltıcı run-output testi kaldırıldı.

Yeniden yazıldı. Golden değer artık `saqut ir --optimized` IR dump'ı. Optimize edilmiş `hesapla` fonksiyonunda `LOAD_CONST 99` + `CALLHOST print` instruction'ları silindi — DCE kanıtlandı. Bonus: `main`'de `-3` literali doğrudan `LOAD_CONST s4 = -3` (folding de devrede). Yanıltıcı run-output testi kaldırıldı.
Sign in to join this conversation.
No description provided.