From 4886c7ce3b4d17a8fdef1e116f0797acd1dca183 Mon Sep 17 00:00:00 2001 From: krangelov Date: Tue, 14 Dec 2021 09:16:40 +0100 Subject: [PATCH] optimize certain pathological pattern matchings for strings --- src/compiler/GF/Compile/TypeCheck/Concrete.hs | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/compiler/GF/Compile/TypeCheck/Concrete.hs b/src/compiler/GF/Compile/TypeCheck/Concrete.hs index 80011af68..5ff41f487 100644 --- a/src/compiler/GF/Compile/TypeCheck/Concrete.hs +++ b/src/compiler/GF/Compile/TypeCheck/Concrete.hs @@ -336,21 +336,33 @@ measurePatt gr p = return (len,Just len,p) PT t p -> do (min,max,p') <- measurePatt gr p return (min,max,PT t p') - PAs x p -> do (min,max,p') <- measurePatt gr p - return (min,max,PAs x p') + PAs x p -> do (min,max,p) <- measurePatt gr p + case p of + PW -> return (0,Nothing,PV x) + _ -> return (min,max,PAs x p) PImplArg p -> do (min,max,p') <- measurePatt gr p return (min,max,PImplArg p') PNeg p -> do (_,_,p') <- measurePatt gr p return (0,Nothing,PNeg p') - PAlt p1 p2 -> do (min1,max1,p1') <- measurePatt gr p1 - (min2,max2,p2') <- measurePatt gr p2 - return (min min1 min2,liftM2 max max1 max2,PAlt p1' p2') + PAlt p1 p2 -> do (min1,max1,p1) <- measurePatt gr p1 + (min2,max2,p2) <- measurePatt gr p2 + case (p1,p2) of + (PString [c1],PString [c2]) -> return (1,Just 1,PChars [c1,c2]) + (PString [c], PChars cs) -> return (1,Just 1,PChars ([c]++cs)) + (PChars cs, PString [c]) -> return (1,Just 1,PChars (cs++[c])) + (PChars cs1, PChars cs2) -> return (1,Just 1,PChars (cs1++cs2)) + _ -> return (min min1 min2,liftM2 max max1 max2,PAlt p1 p2) PSeq _ _ p1 _ _ p2 - -> do (min1,max1,p1') <- measurePatt gr p1 - (min2,max2,p2') <- measurePatt gr p2 - return (min1+min2,liftM2 (+) max1 max2,PSeq min1 max1 p1' min2 max2 p2') - PRep _ _ p -> do (minp,maxp,p') <- measurePatt gr p - return (0,Nothing,PRep minp maxp p') + -> do (min1,max1,p1) <- measurePatt gr p1 + (min2,max2,p2) <- measurePatt gr p2 + case (p1,p2) of + (PW,PW) -> return (0,Nothing,PW) + _ -> return (min1+min2,liftM2 (+) max1 max2,PSeq min1 max1 p1 min2 max2 p2) + PRep _ _ p -> do (minp,maxp,p) <- measurePatt gr p + case p of + PW -> return (0,Nothing,PW) + PChar -> return (0,Nothing,PW) + _ -> return (0,Nothing,PRep minp maxp p) PChar -> return (1,Just 1,p) PChars _ -> return (1,Just 1,p) _ -> return (0,Nothing,p)