Dato il codice seguente:Quale ottimizzazione GHC è responsabile della duplicazione delle espressioni del caso?
{-# OPTIONS_GHC -funbox-strict-fields #-}
module Test where
data X = X !Int !Int
test (X a b) (X c d) = X (max a c) (max b d)
GHC genera questo nucleo durante la compilazione con ottimizzazioni (rinominato agevolare la lettura):
test
test =
\ u v ->
case u of x { X y z ->
case v of c { X d e ->
case tagToEnum# (<=# y d) of _ {
False ->
case tagToEnum# (<=# z e) of _ {
False -> x;
True -> X y e
};
True ->
case tagToEnum# (<=# z e) of _ {
False -> X d z;
True -> c
}
}
}
}
noti come GHC ha generato in percorsi totali codice diversi . In generale, il numero di percorsi di codice cresce in modo esponenziale con il numero di condizioni.
Quale ottimizzazione GHC conduce a tale comportamento? C'è una bandiera per controllare questa ottimizzazione? Nel mio caso, questo genera un enorme aumento di codice e rende molto difficili da leggere i dump di core a causa di espressioni caso nidificate.
Sei sicuro al 100% che si tratti di un'ottimizzazione? Ho sempre pensato che l'istruzione 'case' di Core fosse limitata per eseguire una corrispondenza di pattern alla volta, e quindi questo tipo di' casing 'nidificato è necessario quando si gestiscono più pattern in una definizione. – Bakuriu
Oh hmm, giuro che ha generato qualcos'altro senza ottimizzazione. Ma ora che sto cercando di riprodurlo, non lo fa più. Fammi controllare ... – bennofs