Enhanced constant folding
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 (cherry picked from commit fea04def)
Showing
- compiler/main/DynFlags.hs 3 additions, 0 deletionscompiler/main/DynFlags.hs
- compiler/prelude/PrelRules.hs 296 additions, 9 deletionscompiler/prelude/PrelRules.hs
- testsuite/tests/simplCore/should_compile/spec-inline.stderr 10 additions, 28 deletionstestsuite/tests/simplCore/should_compile/spec-inline.stderr
Loading
Please register or sign in to comment