La forma SSA vale la pena se il codice genera un linguaggio di alto livello?

4

Sto scrivendo un compilatore che si compila in C. Ciò significa che la maggior parte delle volte mi piacciono le C per ottimizzare e generare codice per più piattaforme.

In questo momento posso pensare a qualche motivo per cui potrebbe essere utile:

  • Posso eseguire ottimizzazioni specifiche per la mia lingua
  • Sarà più semplice tradurre la SSA semplificata in C piuttosto che gestire tutti i casi limite nella traduzione la mia lingua semi-complessa in C
  • Faciliterà alcune analisi sul codice

Posso pensare ad alcuni inconvenienti:

  • Il compilatore è più lento poiché dovrò generare SSA IR

Ma ne vale la pena?

La mia domanda principale è che sarà in grado di ottimizzare il codice tradotto da un pozzo SSA IR o meglio ?

Immagino che il codice che il modulo SSA tradurrà avrà etichette e salti ovunque. Non userà costrutti C come loop for o se dichiarazioni, ecc. Sarà C più facile o difficile da ottimizzare?

Sono entusiasta di farlo solo per saperne di più sul modulo SSA, così come se alla fine generassi codice per LLVM , sarà un po 'più facile.

Domanda bonus: c'è un IR diverso che posso esaminare che potrebbe essere più adatto al problema in questione?

    
posta flooblebit 28.11.2016 - 21:28
fonte

3 risposte

2

È piuttosto difficile rispondere in modo definitivo senza saperne di più sulla lingua che stai scrivendo. Tuttavia, è probabilmente utile pensare a quale tipo di trasformazioni di codice ti aspetti di eseguire tra il controllo del tipo e il codice gen. Se stai pianificando alcuni passaggi di ottimizzazione o qualche forma di sofisticata memoria o analisi di blocco, allora potrebbe valerne la pena.

Per lo stesso motivo è difficile dire se una rappresentazione intermedia possa aiutare o ostacolare le ottimizzazioni del C. Probabilmente è corretto dire che se si utilizza un IR di basso livello, come quelli di LLVM, si rischia di perdere informazioni di tipo che a loro volta potrebbero limitare le analisi con cui il compilatore C può lavorare.

Per ispirazione, ti consiglio di consultare i recenti lavori su RIR's MIR o SIL di Swift che sono entrambi IR di alto livello che conservano le informazioni sul tipo. È interessante notare che entrambi si abbassano all'IR di LLVM per l'ottimizzazione e il codice gen. Le discussioni coprono il costo delle prestazioni, ed entrambe hanno sostenuto la spesa del ri-factoring per includere l'IR di alto livello. Avevano diverse ragioni per l'inclusione, ma entrambe, in effetti, includevano passaggi di analisi sofisticati che consideravano giustificato il costo. YMMV naturalmente.

    
risposta data 29.11.2016 - 14:15
fonte
1

Sul lato dell'ottimizzazione della tua domanda, la risposta è no. Le ottimizzazioni del compilatore C non saranno mirate al codice C simile a SSA. Sarà mirato al codice che assomiglia al codice C.

Inoltre, il modulo SSA può esprimere cose a un livello che C non può; LLVM IR può esprimere più di C. Può avere invarianti (o varianti) che C non può - per esempio, diverse regole di aliasing.

In assoluto migliore , il compilatore C ottimizzerà altrettanto bene il compilatore LLVM.

    
risposta data 28.11.2016 - 22:53
fonte
1

Sembra che l'SSA rappresenti un ulteriore passo nel tuo caso e mi chiedo se hai considerato se vale la pena di preoccuparsi della possibile ottimizzazione.

A volte il tuo linguaggio può essere utilizzato per scrivere funzioni / procedure che eseguono calcoli pesanti che non chiamano funzioni di livello inferiore ? Se è così, l'ottimizzazione a livello di compilatore è un problema valido.

Chiedo solo perché a volte le persone sono preoccupate dell'ottimizzazione nel codice in cui il puntatore dell'istruzione è raramente, perché è nelle funzioni di livello inferiore o perché non viene chiamato così spesso.

    
risposta data 29.11.2016 - 17:57
fonte

Leggi altre domande sui tag