-
Notifications
You must be signed in to change notification settings - Fork 477
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PLT-7745: Basic rewrite rules for builtins
Make CommuteFnWithConst transformation a RewriteRule
- Loading branch information
Showing
37 changed files
with
275 additions
and
138 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5 changes: 5 additions & 0 deletions
5
plutus-core/changelog.d/20231027_133344_bezirg_pir_rewrite.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
### Added | ||
|
||
- A new pass in the simplifier that rewrites PIR terms given user-provided rules. | ||
It behaves similar to GHC's RULES, but for the PIR language. | ||
By default, a pre-defined set of rules are applied when the PIR simplifier is enabled. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
plutus-core/plutus-ir/src/PlutusIR/Transform/RewriteRules.hs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
{-# LANGUAGE FlexibleInstances #-} | ||
{-# LANGUAGE GADTs #-} | ||
{-# LANGUAGE RankNTypes #-} | ||
{-# LANGUAGE TypeOperators #-} | ||
module PlutusIR.Transform.RewriteRules | ||
( userRewrite | ||
, RewriteRules (..) | ||
, defaultUniRewriteRules | ||
) where | ||
|
||
import PlutusCore.Default | ||
import PlutusCore.Name | ||
import PlutusCore.Quote | ||
import PlutusIR as PIR | ||
import PlutusIR.Analysis.VarInfo | ||
import PlutusIR.Transform.RewriteRules.CommuteFnWithConst | ||
import PlutusPrelude | ||
|
||
import Control.Lens | ||
|
||
|
||
-- | Rewrite a `Term` using the given `RewriteRules` (similar to functions of Term -> Term) | ||
-- Normally the rewrite rules are configured at entrypoint time of the compiler. | ||
userRewrite :: ( Semigroup a, t ~ Term tyname name uni fun a | ||
, HasUnique name TermUnique | ||
, HasUnique tyname TypeUnique | ||
, MonadQuote m | ||
) | ||
=> RewriteRules uni fun | ||
-> t | ||
-> m t | ||
userRewrite (RewriteRules rules) t = | ||
-- We collect `VarsInfo` on the whole program term and pass it on as arg to each RewriteRule. | ||
-- This has the limitation that any variables newly-introduced by the rules would | ||
-- not be accounted in `VarsInfo`. This is currently fine, because we only rely on VarsInfo | ||
-- for isPure; isPure is safe w.r.t "open" terms. | ||
let vinfo = termVarInfo t | ||
in transformMOf termSubterms (rules vinfo) t | ||
|
||
-- | A bundle of composed `RewriteRules`, to be passed at entrypoint of the compiler. | ||
newtype RewriteRules uni fun = RewriteRules { | ||
unRewriteRules :: forall tyname name m a | ||
. (MonadQuote m, Semigroup a) | ||
=> VarsInfo tyname name uni a | ||
-> PIR.Term tyname name uni fun a | ||
-> m (PIR.Term tyname name uni fun a) | ||
} | ||
|
||
-- | The rules for the Default Universe/Builtin. | ||
defaultUniRewriteRules :: RewriteRules DefaultUni DefaultFun | ||
defaultUniRewriteRules = RewriteRules $ \ _vinfo -> | ||
-- The rules are composed from left to right. | ||
pure . commuteFnWithConst | ||
-- FIXME: Unfortunately, unicode text is currently broken (at least on plutus-tx level), so | ||
-- we disable this rewrite until fix is in and further tested. See PLT-8314 | ||
-- >=> pure . decodeEncodeUtf8 | ||
|
||
instance Default (RewriteRules DefaultUni DefaultFun) where | ||
def = defaultUniRewriteRules |
Oops, something went wrong.