Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

if p then True else False ===> p #5925

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions plutus-core/plutus-core.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,7 @@ library plutus-ir
PlutusIR.Transform.RecSplit
PlutusIR.Transform.Rename
PlutusIR.Transform.RewriteRules
PlutusIR.Transform.RewriteRules.CancelIfThenTrueElseFalse
PlutusIR.Transform.RewriteRules.CommuteFnWithConst
PlutusIR.Transform.RewriteRules.RemoveTrace
PlutusIR.Transform.StrictifyBindings
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}

module PlutusIR.Transform.RewriteRules.CancelIfThenTrueElseFalse
( rewriteRuleCancelIfThenTrueElseFalse
) where

import PlutusCore (someValue)
import PlutusCore.Default (DefaultFun, DefaultUni)
import PlutusCore.Default.Builtins qualified as Builtin
import PlutusIR.Core.Type (Term (Constant), Type (TyBuiltin))
import PlutusIR.Transform.RewriteRules.Common (pattern A, pattern B, pattern I)

rewriteRuleCancelIfThenTrueElseFalse
:: Term ty name DefaultUni DefaultFun a
-> Term ty name DefaultUni DefaultFun a
rewriteRuleCancelIfThenTrueElseFalse = \case
B Builtin.IfThenElse `I` TyBuiltin _ _ `A` p `A` Constant _ t `A` Constant _ e
| t == someValue True && e == someValue False -> p
term -> term
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
-- editorconfig-checker-disable-file
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
Expand All @@ -12,6 +13,7 @@ import PlutusCore.Name.Unique (Name)
import PlutusCore.Quote (MonadQuote)
import PlutusIR.Analysis.VarInfo (VarsInfo)
import PlutusIR.Core.Type qualified as PIR
import PlutusIR.Transform.RewriteRules.CancelIfThenTrueElseFalse (rewriteRuleCancelIfThenTrueElseFalse)
import PlutusIR.Transform.RewriteRules.CommuteFnWithConst (commuteFnWithConst)
import PlutusIR.Transform.RewriteRules.UnConstrConstrData (unConstrConstrData)
import PlutusPrelude (Default (..), (>=>))
Expand All @@ -32,7 +34,9 @@ newtype RewriteRules uni fun where
defaultUniRewriteRules :: RewriteRules DefaultUni DefaultFun
defaultUniRewriteRules = RewriteRules $ \varsInfo ->
-- The rules are composed from left to right.
pure . commuteFnWithConst >=> unConstrConstrData def varsInfo
(pure . rewriteRuleCancelIfThenTrueElseFalse)
>=> (pure . commuteFnWithConst)
>=> unConstrConstrData def varsInfo

instance Default (RewriteRules DefaultUni DefaultFun) where
def = defaultUniRewriteRules
Expand Down
27 changes: 12 additions & 15 deletions plutus-core/plutus-ir/test/PlutusIR/Transform/RewriteRules/Tests.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,30 +13,27 @@ import Test.QuickCheck
import Test.Tasty

test_rewriteRules :: TestTree
test_rewriteRules = runTestNestedIn ["plutus-ir/test/PlutusIR/Transform"] $
test_rewriteRules =
runTestNestedIn ["plutus-ir/test/PlutusIR/Transform"] $
testNested "RewriteRules" $
(fmap
(goldenPir (runQuote . runTestPass (\tc -> rewritePassSC tc def)) pTerm)
fmap
(goldenPir (runQuote . runTestPass (\tc -> rewritePassSC tc rewriteRules)) pTerm)
[ "equalsInt.pir" -- this tests that the function works on equalInteger
, "divideInt.pir" -- this tests that the function excludes not commutative functions
, "multiplyInt.pir" -- this tests that the function works on multiplyInteger
, "let.pir" -- this tests that it works in the subterms
, "unConstrConstrDataFst.pir"
, "unConstrConstrDataSnd.pir"
, "ifThenTrueElseFalse.pir"
]
)
++
(fmap
(goldenPirEvalTrace pTermAsProg)
[ "unConstrConstrDataFst.pir.eval"
]
)
++ fmap (goldenPirEvalTrace pTermAsProg) ["unConstrConstrDataFst.pir.eval"]
where
rewriteRules = def

where
goldenPirEvalTrace = goldenPirM $ \ast -> ppCatch $ do
-- we need traces to remain for checking the evaluation-order
tplc <- asIfThrown $ compileWithOpts ( set (PIR.ccOpts . PIR.coPreserveLogging) True) ast
runUPlcLogs [void tplc]
goldenPirEvalTrace = goldenPirM $ \ast -> ppCatch $ do
-- we need traces to remain for checking the evaluation-order
tplc <- asIfThrown $ compileWithOpts (set (PIR.ccOpts . PIR.coPreserveLogging) True) ast
runUPlcLogs [void tplc]

prop_rewriteRules :: Property
prop_rewriteRules =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[
{ (builtin ifThenElse) (con bool) }
[
{ (builtin ifThenElse) (con bool) }
(con bool False)
(con bool True)
(con bool False)
]
(con bool True)
(con bool False)
]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(con bool False)