@@ -40,7 +40,7 @@ import Data.Map qualified as Map
40
40
import Data.Maybe (catMaybes , fromMaybe )
41
41
import Data.Sequence as Seq (Seq , fromList , (|>) )
42
42
import Data.Set qualified as Set
43
- import Data.Text as Text (Text , pack )
43
+ import Data.Text as Text (Text , pack , unpack )
44
44
import Numeric.Natural
45
45
import Prettyprinter
46
46
@@ -1001,16 +1001,32 @@ performRewrite ::
1001
1001
Pattern ->
1002
1002
io (Natural , Seq (RewriteTrace () ), RewriteResult Pattern )
1003
1003
performRewrite rewriteConfig pat = do
1004
+ -- simplify all constraints (individually) before starting to rewrite
1004
1005
simplifiedConstraints <-
1005
1006
withContext CtxSimplify $ evaluateConstraints definition llvmApi smtSolver pat. constraints
1006
- case simplifiedConstraints of
1007
- Right constraints ->
1008
- (flip runStateT rewriteStart $ doSteps False pat{constraints})
1009
- >>= \ (rr, RewriteStepsState {counter, traces}) -> pure (counter, traces, rr)
1010
- Left r@ (SideConditionFalse {}) ->
1011
- pure (0 , fromList [RewriteSimplified (Just r)], error " Just return #Bottom here" )
1012
- Left err ->
1013
- error (show err)
1007
+ (rr, RewriteStepsState {counter, traces}) <-
1008
+ case simplifiedConstraints of
1009
+ Right constraints ->
1010
+ flip runStateT rewriteStart $ doSteps False pat{constraints}
1011
+ Left r@ SideConditionFalse {} ->
1012
+ -- a side condition was found to be false, return a vacuous state
1013
+ pure (RewriteTrivial pat, rewriteStart{traces = Seq. fromList [RewriteSimplified (Just r)]})
1014
+ Left (InternalError msg) -> do
1015
+ -- fail hard on internal errors
1016
+ withContext CtxSimplify $ withContext CtxError $ logMessage msg
1017
+ error $ Text. unpack msg
1018
+ Left err -> do
1019
+ -- log but ignore other actual errors (IndexIsNone,
1020
+ -- TooManyIterations, EquationLoop, TooManyRecursions,
1021
+ -- EquationLoop, UndefinedTerm), proceeding with the
1022
+ -- original constraints (to fail later when processing
1023
+ -- the constraints during rewriting or at the end).
1024
+ getPrettyModifiers >>= \ case
1025
+ ModifiersRep (_ :: FromModifiersT mods => Proxy mods ) ->
1026
+ withContext CtxSimplify . withContext CtxWarn . logMessage $
1027
+ renderOneLineText (pretty' @ mods err)
1028
+ flip runStateT rewriteStart $ doSteps False pat
1029
+ pure (counter, traces, rr)
1014
1030
where
1015
1031
RewriteConfig
1016
1032
{ definition
0 commit comments