Enhanced constant folding
authorSylvain Henry <hsyl20@gmail.com>
Fri, 13 Apr 2018 17:29:07 +0000 (13:29 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sun, 17 Jun 2018 03:14:42 +0000 (23:14 -0400)
commit60e4bb4d305bc1a65457ee79b1e69c11b9ed747d
tree23e45d1fecddc3459ea92c2c052775f536de2112
parentf998947fe93a87e91a701d48cd38ddc433a8f9e1
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 fea04defa64871caab6339ff3fc5511a272f37c7)
compiler/main/DynFlags.hs
compiler/prelude/PrelRules.hs
testsuite/tests/simplCore/should_compile/spec-inline.stderr