• Sylvain Henry's avatar
    Enhanced constant folding · fea04def
    Sylvain Henry authored
    Until now GHC only supported basic constant folding (lit op lit, expr op
    0, etc.).
    
    This patch uses laws of +/-/* (associativity, commutativity,
    distributivity) to support some constant folding into nested
    expressions.
    
    Examples of new transformations:
    
       - simple nesting: (10 + x) + 10 becomes 20 + x
       - deep nesting: 5 + x + (y + (z + (t + 5))) becomes 10 + (x + (y + (z + t)))
       - distribution: (5 + x) * 6 becomes 30 + 6*x
       - simple factorization: 5 + x + (x + (x + (x + 5))) becomes 10 + (4 *x)
       - siblings: (5 + 4*x) - (3*x + 2) becomes 3 + x
    
    Test Plan: validate
    
    Reviewers: simonpj, austin, bgamari
    
    Reviewed By: bgamari
    
    Subscribers: thomie
    
    GHC Trac Issues: #9136
    
    Differential Revision: https://phabricator.haskell.org/D2858
    fea04def
PrelRules.hs 78.4 KB