[Test] Optimizasyon — Constant Folding Doğrulama (--optimized Öncesi/Sonrası) #104

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

Giriş (Nedir, Neden Önemli?)

Faz 4'ün constant folding pass'i, sabit ifadeleri derleme zamanında hesaplayıp Literal düğümüyle değiştirmeli (bkz. roadmap Faz 4). Bu issue, "öncesi/sonrası" AST karşılaştırmasının tam olarak nasıl görünmesi gerektiğini somutlaştırır.


Test Kodu (examples/tests/opt_constant_folding.sqt)

int main() {
    int x = 2 + 3 * 4;       // sabit ifade -> 14
    int y = (10 - 4) / 2;    // sabit ifade -> 3
    int z = x + y;           // x, y sabit olduğu için z de katlanabilir -> 17
    int w = 10 / 0;          // sıfıra bölme: KATLANMAZ, W002 uyarısı
    print(z);
    print(w);
    return 0;
}

Beklenen Davranış

  • saqut ast examples/tests/opt_constant_folding.sqt (bayraksız): orijinal AST — x'in initializer'ı BinaryExpression(2, +, BinaryExpression(3, *, 4)) olarak değişmeden görünür.
  • saqut ast examples/tests/opt_constant_folding.sqt --optimized: klonlanmış AST'de:
    • x'in initializer'ı → Literal(14)
    • y'nin initializer'ı → Literal(3)
    • z'nin initializer'ı → Literal(17) (zincirleme: x ve y önce katlanmalı, sonra z = x + y de katlanabilmeli — bu, fixpoint döngüsünün gerekliliğinin kanıtıdır)
    • w'nin initializer'ı → değişmez (10 / 0 kalır), ve diagnostic çıktısında W002 (sıfıra bölme) uyarısı görünür.
  • saqut run examples/tests/opt_constant_folding.sqt çıktısı (VM tamamlandığında): 17 ve ardından 10 / 0 çalışma-zamanı hatası (bu son satır, IR/VM tasarımına E0xx/runtime-error kategorisi notu olarak düşülmeli).

Açık Sorular / Bağlı Fazlar

  • "Zincirleme katlama" (z = x + y, x ve y kendileri katlanmış sabitlerden geliyor) tek bir fixpoint turunda mı yoksa birden fazla turda mı gerçekleşmeli — bu, ADR-009'daki fixpoint/iterasyon-tavanı kararının somut test sayısı olabilir (örn. "bu örnek 2 turda kararlı hale gelmeli").
  • 10 / 0 ifadesinin derleme zamanında uyarı, çalışma zamanında hata ayrımı IR/VM tasarımına (#74-78) açıkça not edilmeli.

İmza/Yorum: Bu test dosyası, Faz 4'ün "bitti" tanımının resmi kanıtı olabilir — roadmap'teki "Doğrulama" bölümüne doğrudan eklenebilir.

### Giriş (Nedir, Neden Önemli?) Faz 4'ün constant folding pass'i, sabit ifadeleri derleme zamanında hesaplayıp `Literal` düğümüyle değiştirmeli (bkz. roadmap Faz 4). Bu issue, "öncesi/sonrası" AST karşılaştırmasının **tam olarak nasıl görünmesi gerektiğini** somutlaştırır. --- ### Test Kodu (`examples/tests/opt_constant_folding.sqt`) ```c int main() { int x = 2 + 3 * 4; // sabit ifade -> 14 int y = (10 - 4) / 2; // sabit ifade -> 3 int z = x + y; // x, y sabit olduğu için z de katlanabilir -> 17 int w = 10 / 0; // sıfıra bölme: KATLANMAZ, W002 uyarısı print(z); print(w); return 0; } ``` ### Beklenen Davranış - `saqut ast examples/tests/opt_constant_folding.sqt` (bayraksız): orijinal AST — `x`'in initializer'ı `BinaryExpression(2, +, BinaryExpression(3, *, 4))` olarak **değişmeden** görünür. - `saqut ast examples/tests/opt_constant_folding.sqt --optimized`: klonlanmış AST'de: - `x`'in initializer'ı → `Literal(14)` - `y`'nin initializer'ı → `Literal(3)` - `z`'nin initializer'ı → `Literal(17)` (**zincirleme**: `x` ve `y` önce katlanmalı, sonra `z = x + y` de katlanabilmeli — bu, fixpoint döngüsünün gerekliliğinin kanıtıdır) - `w`'nin initializer'ı → **değişmez** (`10 / 0` kalır), ve diagnostic çıktısında `W002` (sıfıra bölme) uyarısı görünür. - `saqut run examples/tests/opt_constant_folding.sqt` çıktısı (VM tamamlandığında): `17` ve ardından `10 / 0` çalışma-zamanı hatası (bu son satır, IR/VM tasarımına `E0xx`/runtime-error kategorisi notu olarak düşülmeli). --- ### Açık Sorular / Bağlı Fazlar - "Zincirleme katlama" (`z = x + y`, `x` ve `y` kendileri katlanmış sabitlerden geliyor) tek bir fixpoint turunda mı yoksa birden fazla turda mı gerçekleşmeli — bu, ADR-009'daki fixpoint/iterasyon-tavanı kararının **somut test sayısı** olabilir (örn. "bu örnek 2 turda kararlı hale gelmeli"). - `10 / 0` ifadesinin **derleme zamanında uyarı, çalışma zamanında hata** ayrımı IR/VM tasarımına (#74-78) açıkça not edilmeli. *İmza/Yorum:* Bu test dosyası, Faz 4'ün "bitti" tanımının resmi kanıtı olabilir — roadmap'teki "Doğrulama" bölümüne doğrudan eklenebilir.
saqut added the
test-senaryosu
label 2026-06-14 22:26:28 +03:00
Author
Owner

Golden test eklendi: tests/golden/opt/folding.sqt. Sabit katlama (aritmetik, karşılaştırma, mantıksal) — beklenen çıktı doğrulandı. Beyaz-kutu IR karşılaştırması için saqut ir --optimized ile ayrıca manuel inceleme yapılabilir; siyah-kutu çıktı testi kilitleniyor.

Golden test eklendi: `tests/golden/opt/folding.sqt`. Sabit katlama (aritmetik, karşılaştırma, mantıksal) — beklenen çıktı doğrulandı. Beyaz-kutu IR karşılaştırması için `saqut ir --optimized` ile ayrıca manuel inceleme yapılabilir; siyah-kutu çıktı testi kilitleniyor.
saqut closed this issue 2026-06-18 22:33:35 +03:00
Author
Owner

Yeniden yazıldı. Golden değer artık program çıktısı değil saqut ir --optimized IR dump'ı. 2+3*4LOAD_CONST s0 = 14 (tek instruction), (10-4)/2LOAD_CONST s1 = 3. Yanıltıcı run-output testi kaldırıldı. Ayrıca düzeltme: IR generator'da hasDirectValue okunmuyordu, katlanmış literal'lar 0 veriyordu — giderildi.

Yeniden yazıldı. Golden değer artık program çıktısı değil `saqut ir --optimized` IR dump'ı. `2+3*4` → `LOAD_CONST s0 = 14` (tek instruction), `(10-4)/2` → `LOAD_CONST s1 = 3`. Yanıltıcı run-output testi kaldırıldı. Ayrıca düzeltme: IR generator'da `hasDirectValue` okunmuyordu, katlanmış literal'lar 0 veriyordu — giderildi.
Sign in to join this conversation.
No description provided.