
#14519: Exponential runtime performance regression in GHC 8.2 + Data.Text.Lazy + Text.RE.TDFA -------------------------------------+------------------------------------- Reporter: ntc2 | Owner: tdammers Type: bug | Status: new Priority: normal | Milestone: 8.4.1 Component: Compiler | Version: 8.2.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: Runtime | Test Case: performance bug | https://github.com/ntc2/ghc-8.2.1 | -regex-lazy-text- | bug/tree/07b7bb32c6e90e8f2d2eada4b59943f37e632d53 Blocked By: | Blocking: Related Tickets: #13745, #14564 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by tdammers): Recompiled everything, with `--force-reinstalls` and `-fforce-recomp`, and `-ddump-stg` on everything including dependencies, however, grepping the entire project tree for `wnext` only matches binaries (`.o`, `.a` and the like), but none of the dumps. So I ran GHC directly on the source file inside the cabal tree: {{{ ../ghc/inplace/bin/ghc-stage2 regex-tdfa- text-1.0.0.3/Text/Regex/TDFA/Text/Lazy.hs -fforce-recomp -package-db .cabal-sandbox/x86_64-linux-ghc-8.5.20180108-packages.conf.d -ticky -c -ddump-stg -rtsopts -XMultiParamTypeClasses }}} But to no avail, `wnext2` does not appear in the STG dump: {{{ ==================== Pre unarise: ==================== sat_s6o2 :: GHC.Types.Int -> GHC.Int.Int64 [LclId] = [] \u [] GHC.Enum.toEnum GHC.Int.$fEnumInt64; $cafter_r6mQ :: GHC.Types.Int -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] GHC.Base.. Data.Text.Lazy.drop sat_s6o2; sat_s6o3 :: GHC.Types.Int -> GHC.Int.Int64 [LclId] = [] \u [] GHC.Enum.toEnum GHC.Int.$fEnumInt64; $cbefore_r6nJ :: GHC.Types.Int -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] GHC.Base.. Data.Text.Lazy.take sat_s6o3; Text.Regex.TDFA.Text.Lazy.$fExtractText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.Extract Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:Extract! [$cbefore_r6nJ $cafter_r6mQ Data.Text.Internal.Lazy.empty $cextract_r6nK]; $cextract_r6nK :: (GHC.Types.Int, GHC.Types.Int) -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] Text.Regex.Base.RegexLike.$dmextract Text.Regex.TDFA.Text.Lazy.$fExtractText; Text.Regex.TDFA.Text.Lazy.$fUnconsText [InlPrag=INLINE (sat-args=0)] :: Text.Regex.TDFA.NewDFA.Uncons.Uncons Data.Text.Internal.Lazy.Text [GblId[DFunId(nt)]] = [] \u [] Data.Text.Lazy.uncons; $cmakeRegexOptsM_r6nL :: forall (m :: * -> *). GHC.Base.Monad m => Text.Regex.TDFA.Common.CompOption -> Text.Regex.TDFA.Common.ExecOption -> Data.Text.Internal.Lazy.Text -> m Text.Regex.TDFA.Common.Regex [GblId, Arity=4, Unf=OtherCon []] = [] \r [$dMonad_s6o4 c_s6o5 e_s6o6 source_s6o7] let { sat_s6o8 [Occ=Once] :: GHC.Base.String [LclId] = [source_s6o7] \u [] Data.Text.Lazy.unpack source_s6o7; } in Text.Regex.Base.RegexLike.makeRegexOptsM Text.Regex.TDFA.String.$fRegexMakerRegexCompOptionExecOption[] $dMonad_s6o4 c_s6o5 e_s6o6 sat_s6o8; Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.RegexMaker Text.Regex.TDFA.Common.Regex Text.Regex.TDFA.Common.CompOption Text.Regex.TDFA.Common.ExecOption Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:RegexMaker! [Text.Regex.TDFA.Common.$fRegexOptionsRegexCompOptionExecOption $cmakeRegex_r6nN $cmakeRegexOpts_r6nM $cmakeRegexM_r6nO $cmakeRegexOptsM_r6nL]; $cmakeRegexOpts_r6nM :: Text.Regex.TDFA.Common.CompOption -> Text.Regex.TDFA.Common.ExecOption -> Data.Text.Internal.Lazy.Text -> Text.Regex.TDFA.Common.Regex [GblId] = [] \u [] Text.Regex.Base.RegexLike.$dmmakeRegexOpts Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText; $cmakeRegex_r6nN :: Data.Text.Internal.Lazy.Text -> Text.Regex.TDFA.Common.Regex [GblId] = [] \u [] Text.Regex.Base.RegexLike.$dmmakeRegex Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText; $cmakeRegexM_r6nO :: forall (m :: * -> *). GHC.Base.Monad m => Data.Text.Internal.Lazy.Text -> m Text.Regex.TDFA.Common.Regex [GblId, Arity=1, Unf=OtherCon []] = [] \r [$dMonad_s6o9] Text.Regex.Base.RegexLike.$dmmakeRegexM Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText $dMonad_s6o9; $trModule1_r6nP :: GHC.Prim.Addr# [GblId, Caf=NoCafRefs, Unf=OtherCon []] = "main"#; $trModule2_r6nQ :: GHC.Types.TrName [GblId, Caf=NoCafRefs, Unf=OtherCon []] = NO_CCS GHC.Types.TrNameS! [$trModule1_r6nP]; $trModule3_r6nR :: GHC.Prim.Addr# [GblId, Caf=NoCafRefs, Unf=OtherCon []] = "Text.Regex.TDFA.Text.Lazy"#; $trModule4_r6nS :: GHC.Types.TrName [GblId, Caf=NoCafRefs, Unf=OtherCon []] = NO_CCS GHC.Types.TrNameS! [$trModule3_r6nR]; Text.Regex.TDFA.Text.Lazy.$trModule :: GHC.Types.Module [GblId, Caf=NoCafRefs, Unf=OtherCon []] = NO_CCS GHC.Types.Module! [$trModule2_r6nQ $trModule4_r6nS]; $cmatchTest_r6nT :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Types.Bool [GblId] = [] \u [] Text.Regex.TDFA.NewDFA.Tester.matchTest Data.Text.Lazy.uncons; $cmatchAll_r6nU :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> [Text.Regex.Base.RegexLike.MatchArray] [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6oa s_s6ob] let { sat_s6od [Occ=Once] :: GHC.Types.Char [LclId] = NO_CCS GHC.Types.C#! ['\n'#]; } in let { sat_s6oc [Occ=Once] :: Text.Regex.TDFA.Common.Position [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Text.Regex.TDFA.NewDFA.Engine.execMatch Data.Text.Lazy.uncons r_s6oa sat_s6oc sat_s6od s_s6ob; Text.Regex.TDFA.Text.Lazy.compile :: Text.Regex.TDFA.Common.CompOption -> Text.Regex.TDFA.Common.ExecOption -> Data.Text.Internal.Lazy.Text -> Data.Either.Either GHC.Base.String Text.Regex.TDFA.Common.Regex [GblId, Arity=3, Unf=OtherCon []] = [] \r [compOpt_s6oe execOpt_s6of txt_s6og] let { sat_s6oh [Occ=Once] :: GHC.Base.String [LclId] = [txt_s6og] \u [] Data.Text.Lazy.unpack txt_s6og; } in case Text.Regex.TDFA.ReadRegex.parseRegex sat_s6oh of { Data.Either.Left err_s6oj [Occ=Once] -> let { sat_s6om [Occ=Once] :: [GHC.Types.Char] [LclId] = [err_s6oj] \u [] let { sat_s6ol [Occ=Once] :: [GHC.Types.Char] [LclId] = [err_s6oj] \u [] GHC.Show.show Text.Parsec.Error.$fShowParseError err_s6oj; } in let { sat_s6ok [Occ=Once] :: [GHC.Types.Char] [LclId] = [] \u [] GHC.CString.unpackCString# "parseRegex for Text.Regex.TDFA.Text.Lazy failed:"#; } in GHC.Base.++ sat_s6ok sat_s6ol; } in Data.Either.Left [sat_s6om]; Data.Either.Right pattern_s6on [Occ=Once] -> let { sat_s6oo [Occ=Once] :: Text.Regex.TDFA.Common.Regex [LclId] = [compOpt_s6oe execOpt_s6of pattern_s6on] \u [] Text.Regex.TDFA.TDFA.patternToRegex pattern_s6on compOpt_s6oe execOpt_s6of; } in Data.Either.Right [sat_s6oo]; }; $cmatchOnce_r6nV :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Base.Maybe Text.Regex.Base.RegexLike.MatchArray [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6op s_s6oq] let { sat_s6or [Occ=Once] :: [Text.Regex.Base.RegexLike.MatchArray] [LclId] = [r_s6op s_s6oq] \u [] $cmatchAll_r6nU r_s6op s_s6oq; } in Data.Maybe.listToMaybe sat_s6or; $cmatchAllText_r6nW :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> [Text.Regex.Base.RegexLike.MatchText Data.Text.Internal.Lazy.Text] [GblId, Arity=2, Unf=OtherCon []] = [] \r [regex_s6os source_s6ot] let { go_s6ou [Occ=LoopBreaker] :: GHC.Types.Int -> Data.Text.Internal.Lazy.Text -> [GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int)] -> [GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int))] [LclId, Arity=3, Unf=OtherCon []] = sat-only [go_s6ou] \r [i_s6ov ds_s6ow ds1_s6ox] case i_s6ov of i1_s6oy { GHC.Types.I# _ [Occ=Dead] -> case ds1_s6ox of { [] -> [] []; : x_s6oB xs_s6oC [Occ=Once] -> let { ds2_s6oD :: (GHC.Types.Int, GHC.Types.Int) [LclId] = [x_s6oB] \u [] let { sat_s6oE [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Data.Array.Base.! Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt x_s6oB sat_s6oE; } in let { off0_s6oF :: GHC.Types.Int [LclId] = [ds2_s6oD] \u [] case ds2_s6oD of { (,) off1_s6oH [Occ=Once] _ [Occ=Dead] -> off1_s6oH; }; } in let { len0_s6oJ :: GHC.Types.Int [LclId] = [ds2_s6oD] \u [] case ds2_s6oD of { (,) _ [Occ=Dead] len1_s6oM [Occ=Once] -> len1_s6oM; }; } in let { sat_s6p0 [Occ=Once] :: [GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int))] [LclId] = [go_s6ou ds_s6ow i1_s6oy xs_s6oC off0_s6oF len0_s6oJ] \u [] let { sat_s6oX [Occ=Once] :: GHC.Types.Int [LclId] = [i1_s6oy off0_s6oF len0_s6oJ] \u [] let { sat_s6oW [Occ=Once] :: GHC.Types.Int [LclId] = [i1_s6oy len0_s6oJ] \u [] GHC.Num.- GHC.Num.$fNumInt len0_s6oJ i1_s6oy; } in GHC.Num.+ GHC.Num.$fNumInt off0_s6oF sat_s6oW; } in case $cafter_r6mQ sat_s6oX ds_s6ow of t'_s6oY { __DEFAULT -> let { sat_s6oZ [Occ=Once] :: GHC.Types.Int [LclId] = [off0_s6oF len0_s6oJ] \u [] GHC.Num.+ GHC.Num.$fNumInt off0_s6oF len0_s6oJ; } in go_s6ou sat_s6oZ t'_s6oY xs_s6oC; }; } in let { sat_s6oV [Occ=Once] :: GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [ds_s6ow i1_s6oy x_s6oB] \u [] let { sat_s6oU [Occ=Once] :: (GHC.Types.Int, GHC.Types.Int) -> (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [ds_s6ow i1_s6oy] \r [pair_s6oN] case pair_s6oN of wild1_s6oO { (,) off_s6oP [Occ=Once] len_s6oQ [Occ=Once] -> let { sat_s6oT [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [ds_s6ow i1_s6oy off_s6oP len_s6oQ] \u [] let { sat_s6oR [Occ=Once] :: GHC.Types.Int [LclId] = [i1_s6oy off_s6oP] \u [] GHC.Num.- GHC.Num.$fNumInt off_s6oP i1_s6oy; } in let { sat_s6oS [Occ=Once] :: (GHC.Types.Int, GHC.Types.Int) [LclId] = NO_CCS (,)! [sat_s6oR len_s6oQ]; } in $cextract_r6nK sat_s6oS ds_s6ow; } in (,) [sat_s6oT wild1_s6oO]; }; } in GHC.Base.fmap GHC.Arr.$fFunctorArray sat_s6oU x_s6oB; } in : [sat_s6oV sat_s6p0]; }; }; } in let { sat_s6p2 [Occ=Once] :: [GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int)] [LclId] = [regex_s6os source_s6ot] \u [] $cmatchAll_r6nU regex_s6os source_s6ot; } in let { sat_s6p1 [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in go_s6ou sat_s6p1 source_s6ot sat_s6p2; $cmatchCount_r6nX :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Types.Int [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6p3 s_s6p4] let { sat_s6pm [Occ=Once] :: [Text.Regex.Base.RegexLike.MatchArray] [LclId] = [r_s6p3 s_s6p4] \u [] let { sat_s6pl [Occ=Once] :: GHC.Types.Char [LclId] = NO_CCS GHC.Types.C#! ['\n'#]; } in let { sat_s6pk [Occ=Once] :: Text.Regex.TDFA.Common.Position [LclId] = NO_CCS GHC.Types.I#! [0#]; } in let { sat_s6pj [Occ=Once] :: Text.Regex.TDFA.Common.Regex [LclId] = [r_s6p3] \u [] case r_s6p3 of wild_s6p5 { Text.Regex.TDFA.Common.Regex ds_s6p6 [Occ=Once] ds1_s6p7 [Occ=Once] ds2_s6p8 [Occ=Once] ds3_s6p9 [Occ=Once] ds4_s6pa [Occ=Once] ds5_s6pb [Occ=Once] ds6_s6pc [Occ=Once] ds7_s6pd [Occ=Once] ds8_s6pe [Occ=Once] _ [Occ=Dead] -> let { sat_s6pi [Occ=Once] :: Text.Regex.TDFA.Common.ExecOption [LclId] = [wild_s6p5] \u [] case Text.Regex.TDFA.Common.regex_execOptions wild_s6p5 of { Text.Regex.TDFA.Common.ExecOption _ [Occ=Dead] -> Text.Regex.TDFA.Common.ExecOption [GHC.Types.False]; }; } in Text.Regex.TDFA.Common.Regex [ds_s6p6 ds1_s6p7 ds2_s6p8 ds3_s6p9 ds4_s6pa ds5_s6pb ds6_s6pc ds7_s6pd ds8_s6pe sat_s6pi]; }; } in Text.Regex.TDFA.NewDFA.Engine.execMatch Data.Text.Lazy.uncons sat_s6pj sat_s6pk sat_s6pl s_s6p4; } in Data.Foldable.length Data.Foldable.$fFoldable[] sat_s6pm; $cmatchOnceText_r6nY :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Base.Maybe (Data.Text.Internal.Lazy.Text, Text.Regex.Base.RegexLike.MatchText Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text) [GblId, Arity=2, Unf=OtherCon []] = [] \r [regex_s6pn source_s6po] let { sat_s6pL [Occ=Once] :: GHC.Base.Maybe (GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int)) [LclId] = [regex_s6pn source_s6po] \u [] let { sat_s6pK [Occ=Once] :: [Text.Regex.Base.RegexLike.MatchArray] [LclId] = [regex_s6pn source_s6po] \u [] let { sat_s6pJ [Occ=Once] :: GHC.Types.Char [LclId] = NO_CCS GHC.Types.C#! ['\n'#]; } in let { sat_s6pI [Occ=Once] :: Text.Regex.TDFA.Common.Position [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Text.Regex.TDFA.NewDFA.Engine.execMatch Data.Text.Lazy.uncons regex_s6pn sat_s6pI sat_s6pJ source_s6po; } in Data.Maybe.listToMaybe sat_s6pK; } in let { sat_s6pH [Occ=Once] :: GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int) -> (Data.Text.Internal.Lazy.Text, GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)), Data.Text.Internal.Lazy.Text) [LclId] = [source_s6po] \r [ma_s6pp] let { ds_s6pq :: (GHC.Types.Int, GHC.Types.Int) [LclId] = [ma_s6pp] \u [] let { sat_s6pr [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Data.Array.Base.! Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt ma_s6pp sat_s6pr; } in let { o_s6ps :: GHC.Types.Int [LclId] = [ds_s6pq] \u [] case ds_s6pq of { (,) o1_s6pu [Occ=Once] _ [Occ=Dead] -> o1_s6pu; }; } in let { sat_s6pG [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [source_s6po ds_s6pq o_s6ps] \u [] let { sat_s6pF [Occ=Once] :: GHC.Types.Int [LclId] = [ds_s6pq o_s6ps] \u [] let { sat_s6pE [Occ=Once] :: GHC.Types.Int [LclId] = [ds_s6pq] \u [] case ds_s6pq of { (,) _ [Occ=Dead] l_s6pD [Occ=Once] -> l_s6pD; }; } in GHC.Num.+ GHC.Num.$fNumInt o_s6ps sat_s6pE; } in $cafter_r6mQ sat_s6pF source_s6po; } in let { sat_s6pA [Occ=Once] :: GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [source_s6po ma_s6pp] \u [] let { sat_s6pz [Occ=Once] :: (GHC.Types.Int, GHC.Types.Int) -> (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [source_s6po] \r [ol_s6px] let { sat_s6py [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [source_s6po ol_s6px] \u [] $cextract_r6nK ol_s6px source_s6po; } in (,) [sat_s6py ol_s6px]; } in GHC.Base.fmap GHC.Arr.$fFunctorArray sat_s6pz ma_s6pp; } in let { sat_s6pw [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [source_s6po o_s6ps] \u [] $cbefore_r6nJ o_s6ps source_s6po; } in (,,) [sat_s6pw sat_s6pA sat_s6pG]; } in GHC.Base.fmap GHC.Base.$fFunctorMaybe sat_s6pH sat_s6pL; Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.RegexLike Text.Regex.TDFA.Common.Regex Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:RegexLike! [Text.Regex.TDFA.Text.Lazy.$fExtractText $cmatchOnce_r6nV $cmatchAll_r6nU $cmatchCount_r6nX $cmatchTest_r6nT $cmatchAllText_r6nW $cmatchOnceText_r6nY]; Text.Regex.TDFA.Text.Lazy.regexec :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> Data.Either.Either GHC.Base.String (GHC.Base.Maybe (Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, [Data.Text.Internal.Lazy.Text])) [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6pM txt_s6pN] case $cmatchOnceText_r6nY r_s6pM txt_s6pN of { GHC.Base.Nothing -> Data.Either.Right [GHC.Base.Nothing]; GHC.Base.Just ds_s6pP [Occ=Once!] -> case ds_s6pP of { (,,) pre_s6pR [Occ=Once] mt_s6pS post_s6pT [Occ=Once] -> let { sat_s6pZ [Occ=Once] :: [Data.Text.Internal.Lazy.Text] [LclId] = [mt_s6pS] \u [] let { sat_s6pY [Occ=Once] :: [(Data.Text.Internal.Lazy.Text, (Text.Regex.Base.RegexLike.MatchOffset, Text.Regex.Base.RegexLike.MatchLength))] [LclId] = [mt_s6pS] \u [] let { sat_s6pX [Occ=Once] :: [(Data.Text.Internal.Lazy.Text, (Text.Regex.Base.RegexLike.MatchOffset, Text.Regex.Base.RegexLike.MatchLength))] [LclId] = [mt_s6pS] \u [] Data.Array.Base.elems Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt mt_s6pS; } in GHC.List.tail sat_s6pX; } in GHC.Base.map Data.Tuple.fst sat_s6pY; } in let { sat_s6pW [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [mt_s6pS] \u [] let { sat_s6pV [Occ=Once] :: (Data.Text.Internal.Lazy.Text, (Text.Regex.Base.RegexLike.MatchOffset, Text.Regex.Base.RegexLike.MatchLength)) [LclId] = [mt_s6pS] \u [] let { sat_s6pU [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Data.Array.Base.! Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt mt_s6pS sat_s6pU; } in Data.Tuple.fst sat_s6pV; } in let { sat_s6q0 [Occ=Once] :: (Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, [Data.Text.Internal.Lazy.Text]) [LclId] = NO_CCS (,,,)! [pre_s6pR sat_s6pW post_s6pT sat_s6pZ]; } in let { sat_s6q1 [Occ=Once] :: GHC.Base.Maybe (Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, [Data.Text.Internal.Lazy.Text]) [LclId] = NO_CCS GHC.Base.Just! [sat_s6q0]; } in Data.Either.Right [sat_s6q1]; }; }; $cmatch_r6nZ :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] Text.Regex.Base.Impl.polymatch Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText; $cmatchM_r6o0 :: forall (m :: * -> *). GHC.Base.Monad m => Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> m Data.Text.Internal.Lazy.Text [GblId, Arity=1, Unf=OtherCon []] = [] \r [$dMonad_s6q2] Text.Regex.Base.Impl.polymatchM Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText $dMonad_s6q2; Text.Regex.TDFA.Text.Lazy.$fRegexContextRegexTextText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.RegexContext Text.Regex.TDFA.Common.Regex Data.Text.Internal.Lazy.Text Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:RegexContext! [Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText $cmatch_r6nZ $cmatchM_r6o0]; Text.Regex.TDFA.Text.Lazy.execute :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> Data.Either.Either GHC.Base.String (GHC.Base.Maybe Text.Regex.Base.RegexLike.MatchArray) [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6q3 txt_s6q4] let { sat_s6q5 [Occ=Once] :: GHC.Base.Maybe Text.Regex.Base.RegexLike.MatchArray [LclId] = [r_s6q3 txt_s6q4] \u [] $cmatchOnce_r6nV r_s6q3 txt_s6q4; } in Data.Either.Right [sat_s6q5]; ==================== STG syntax: ==================== sat_s6o2 :: GHC.Types.Int -> GHC.Int.Int64 [LclId] = [] \u [] GHC.Enum.toEnum GHC.Int.$fEnumInt64; $cafter_r6mQ :: GHC.Types.Int -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] GHC.Base.. Data.Text.Lazy.drop sat_s6o2; sat_s6o3 :: GHC.Types.Int -> GHC.Int.Int64 [LclId] = [] \u [] GHC.Enum.toEnum GHC.Int.$fEnumInt64; $cbefore_r6nJ :: GHC.Types.Int -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] GHC.Base.. Data.Text.Lazy.take sat_s6o3; Text.Regex.TDFA.Text.Lazy.$fExtractText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.Extract Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:Extract! [$cbefore_r6nJ $cafter_r6mQ Data.Text.Internal.Lazy.empty $cextract_r6nK]; $cextract_r6nK :: (GHC.Types.Int, GHC.Types.Int) -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] Text.Regex.Base.RegexLike.$dmextract Text.Regex.TDFA.Text.Lazy.$fExtractText; Text.Regex.TDFA.Text.Lazy.$fUnconsText [InlPrag=INLINE (sat-args=0)] :: Text.Regex.TDFA.NewDFA.Uncons.Uncons Data.Text.Internal.Lazy.Text [GblId[DFunId(nt)]] = [] \u [] Data.Text.Lazy.uncons; $cmakeRegexOptsM_r6nL :: forall (m :: * -> *). GHC.Base.Monad m => Text.Regex.TDFA.Common.CompOption -> Text.Regex.TDFA.Common.ExecOption -> Data.Text.Internal.Lazy.Text -> m Text.Regex.TDFA.Common.Regex [GblId, Arity=4, Unf=OtherCon []] = [] \r [$dMonad_s6o4 c_s6o5 e_s6o6 source_s6o7] let { sat_s6o8 [Occ=Once] :: GHC.Base.String [LclId] = [source_s6o7] \u [] Data.Text.Lazy.unpack source_s6o7; } in Text.Regex.Base.RegexLike.makeRegexOptsM Text.Regex.TDFA.String.$fRegexMakerRegexCompOptionExecOption[] $dMonad_s6o4 c_s6o5 e_s6o6 sat_s6o8; Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.RegexMaker Text.Regex.TDFA.Common.Regex Text.Regex.TDFA.Common.CompOption Text.Regex.TDFA.Common.ExecOption Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:RegexMaker! [Text.Regex.TDFA.Common.$fRegexOptionsRegexCompOptionExecOption $cmakeRegex_r6nN $cmakeRegexOpts_r6nM $cmakeRegexM_r6nO $cmakeRegexOptsM_r6nL]; $cmakeRegexOpts_r6nM :: Text.Regex.TDFA.Common.CompOption -> Text.Regex.TDFA.Common.ExecOption -> Data.Text.Internal.Lazy.Text -> Text.Regex.TDFA.Common.Regex [GblId] = [] \u [] Text.Regex.Base.RegexLike.$dmmakeRegexOpts Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText; $cmakeRegex_r6nN :: Data.Text.Internal.Lazy.Text -> Text.Regex.TDFA.Common.Regex [GblId] = [] \u [] Text.Regex.Base.RegexLike.$dmmakeRegex Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText; $cmakeRegexM_r6nO :: forall (m :: * -> *). GHC.Base.Monad m => Data.Text.Internal.Lazy.Text -> m Text.Regex.TDFA.Common.Regex [GblId, Arity=1, Unf=OtherCon []] = [] \r [$dMonad_s6o9] Text.Regex.Base.RegexLike.$dmmakeRegexM Text.Regex.TDFA.Text.Lazy.$fRegexMakerRegexCompOptionExecOptionText $dMonad_s6o9; $trModule1_r6nP :: GHC.Prim.Addr# [GblId, Caf=NoCafRefs, Unf=OtherCon []] = "main"#; $trModule2_r6nQ :: GHC.Types.TrName [GblId, Caf=NoCafRefs, Unf=OtherCon []] = NO_CCS GHC.Types.TrNameS! [$trModule1_r6nP]; $trModule3_r6nR :: GHC.Prim.Addr# [GblId, Caf=NoCafRefs, Unf=OtherCon []] = "Text.Regex.TDFA.Text.Lazy"#; $trModule4_r6nS :: GHC.Types.TrName [GblId, Caf=NoCafRefs, Unf=OtherCon []] = NO_CCS GHC.Types.TrNameS! [$trModule3_r6nR]; Text.Regex.TDFA.Text.Lazy.$trModule :: GHC.Types.Module [GblId, Caf=NoCafRefs, Unf=OtherCon []] = NO_CCS GHC.Types.Module! [$trModule2_r6nQ $trModule4_r6nS]; $cmatchTest_r6nT :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Types.Bool [GblId] = [] \u [] Text.Regex.TDFA.NewDFA.Tester.matchTest Data.Text.Lazy.uncons; $cmatchAll_r6nU :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> [Text.Regex.Base.RegexLike.MatchArray] [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6oa s_s6ob] let { sat_s6od [Occ=Once] :: GHC.Types.Char [LclId] = NO_CCS GHC.Types.C#! ['\n'#]; } in let { sat_s6oc [Occ=Once] :: Text.Regex.TDFA.Common.Position [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Text.Regex.TDFA.NewDFA.Engine.execMatch Data.Text.Lazy.uncons r_s6oa sat_s6oc sat_s6od s_s6ob; Text.Regex.TDFA.Text.Lazy.compile :: Text.Regex.TDFA.Common.CompOption -> Text.Regex.TDFA.Common.ExecOption -> Data.Text.Internal.Lazy.Text -> Data.Either.Either GHC.Base.String Text.Regex.TDFA.Common.Regex [GblId, Arity=3, Unf=OtherCon []] = [] \r [compOpt_s6oe execOpt_s6of txt_s6og] let { sat_s6oh [Occ=Once] :: GHC.Base.String [LclId] = [txt_s6og] \u [] Data.Text.Lazy.unpack txt_s6og; } in case Text.Regex.TDFA.ReadRegex.parseRegex sat_s6oh of { Data.Either.Left err_s6oj [Occ=Once] -> let { sat_s6om [Occ=Once] :: [GHC.Types.Char] [LclId] = [err_s6oj] \u [] let { sat_s6ol [Occ=Once] :: [GHC.Types.Char] [LclId] = [err_s6oj] \u [] GHC.Show.show Text.Parsec.Error.$fShowParseError err_s6oj; } in let { sat_s6ok [Occ=Once] :: [GHC.Types.Char] [LclId] = [] \u [] GHC.CString.unpackCString# "parseRegex for Text.Regex.TDFA.Text.Lazy failed:"#; } in GHC.Base.++ sat_s6ok sat_s6ol; } in Data.Either.Left [sat_s6om]; Data.Either.Right pattern_s6on [Occ=Once] -> let { sat_s6oo [Occ=Once] :: Text.Regex.TDFA.Common.Regex [LclId] = [compOpt_s6oe execOpt_s6of pattern_s6on] \u [] Text.Regex.TDFA.TDFA.patternToRegex pattern_s6on compOpt_s6oe execOpt_s6of; } in Data.Either.Right [sat_s6oo]; }; $cmatchOnce_r6nV :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Base.Maybe Text.Regex.Base.RegexLike.MatchArray [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6op s_s6oq] let { sat_s6or [Occ=Once] :: [Text.Regex.Base.RegexLike.MatchArray] [LclId] = [r_s6op s_s6oq] \u [] $cmatchAll_r6nU r_s6op s_s6oq; } in Data.Maybe.listToMaybe sat_s6or; $cmatchAllText_r6nW :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> [Text.Regex.Base.RegexLike.MatchText Data.Text.Internal.Lazy.Text] [GblId, Arity=2, Unf=OtherCon []] = [] \r [regex_s6os source_s6ot] let { go_s6ou [Occ=LoopBreaker] :: GHC.Types.Int -> Data.Text.Internal.Lazy.Text -> [GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int)] -> [GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int))] [LclId, Arity=3, Unf=OtherCon []] = sat-only [go_s6ou] \r [i_s6ov ds_s6ow ds1_s6ox] case i_s6ov of i1_s6oy { GHC.Types.I# _ [Occ=Dead] -> case ds1_s6ox of { [] -> [] []; : x_s6oB xs_s6oC [Occ=Once] -> let { ds2_s6oD :: (GHC.Types.Int, GHC.Types.Int) [LclId] = [x_s6oB] \u [] let { sat_s6oE [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Data.Array.Base.! Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt x_s6oB sat_s6oE; } in let { off0_s6oF :: GHC.Types.Int [LclId] = [ds2_s6oD] \u [] case ds2_s6oD of { (,) off1_s6oH [Occ=Once] _ [Occ=Dead] -> off1_s6oH; }; } in let { len0_s6oJ :: GHC.Types.Int [LclId] = [ds2_s6oD] \u [] case ds2_s6oD of { (,) _ [Occ=Dead] len1_s6oM [Occ=Once] -> len1_s6oM; }; } in let { sat_s6p0 [Occ=Once] :: [GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int))] [LclId] = [go_s6ou ds_s6ow i1_s6oy xs_s6oC off0_s6oF len0_s6oJ] \u [] let { sat_s6oX [Occ=Once] :: GHC.Types.Int [LclId] = [i1_s6oy off0_s6oF len0_s6oJ] \u [] let { sat_s6oW [Occ=Once] :: GHC.Types.Int [LclId] = [i1_s6oy len0_s6oJ] \u [] GHC.Num.- GHC.Num.$fNumInt len0_s6oJ i1_s6oy; } in GHC.Num.+ GHC.Num.$fNumInt off0_s6oF sat_s6oW; } in case $cafter_r6mQ sat_s6oX ds_s6ow of t'_s6oY { __DEFAULT -> let { sat_s6oZ [Occ=Once] :: GHC.Types.Int [LclId] = [off0_s6oF len0_s6oJ] \u [] GHC.Num.+ GHC.Num.$fNumInt off0_s6oF len0_s6oJ; } in go_s6ou sat_s6oZ t'_s6oY xs_s6oC; }; } in let { sat_s6oV [Occ=Once] :: GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [ds_s6ow i1_s6oy x_s6oB] \u [] let { sat_s6oU [Occ=Once] :: (GHC.Types.Int, GHC.Types.Int) -> (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [ds_s6ow i1_s6oy] \r [pair_s6oN] case pair_s6oN of wild1_s6oO { (,) off_s6oP [Occ=Once] len_s6oQ [Occ=Once] -> let { sat_s6oT [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [ds_s6ow i1_s6oy off_s6oP len_s6oQ] \u [] let { sat_s6oR [Occ=Once] :: GHC.Types.Int [LclId] = [i1_s6oy off_s6oP] \u [] GHC.Num.- GHC.Num.$fNumInt off_s6oP i1_s6oy; } in let { sat_s6oS [Occ=Once] :: (GHC.Types.Int, GHC.Types.Int) [LclId] = NO_CCS (,)! [sat_s6oR len_s6oQ]; } in $cextract_r6nK sat_s6oS ds_s6ow; } in (,) [sat_s6oT wild1_s6oO]; }; } in GHC.Base.fmap GHC.Arr.$fFunctorArray sat_s6oU x_s6oB; } in : [sat_s6oV sat_s6p0]; }; }; } in let { sat_s6p2 [Occ=Once] :: [GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int)] [LclId] = [regex_s6os source_s6ot] \u [] $cmatchAll_r6nU regex_s6os source_s6ot; } in let { sat_s6p1 [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in go_s6ou sat_s6p1 source_s6ot sat_s6p2; $cmatchCount_r6nX :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Types.Int [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6p3 s_s6p4] let { sat_s6pm [Occ=Once] :: [Text.Regex.Base.RegexLike.MatchArray] [LclId] = [r_s6p3 s_s6p4] \u [] let { sat_s6pl [Occ=Once] :: GHC.Types.Char [LclId] = NO_CCS GHC.Types.C#! ['\n'#]; } in let { sat_s6pk [Occ=Once] :: Text.Regex.TDFA.Common.Position [LclId] = NO_CCS GHC.Types.I#! [0#]; } in let { sat_s6pj [Occ=Once] :: Text.Regex.TDFA.Common.Regex [LclId] = [r_s6p3] \u [] case r_s6p3 of wild_s6p5 { Text.Regex.TDFA.Common.Regex ds_s6p6 [Occ=Once] ds1_s6p7 [Occ=Once] ds2_s6p8 [Occ=Once] ds3_s6p9 [Occ=Once] ds4_s6pa [Occ=Once] ds5_s6pb [Occ=Once] ds6_s6pc [Occ=Once] ds7_s6pd [Occ=Once] ds8_s6pe [Occ=Once] _ [Occ=Dead] -> let { sat_s6pi [Occ=Once] :: Text.Regex.TDFA.Common.ExecOption [LclId] = [wild_s6p5] \u [] case Text.Regex.TDFA.Common.regex_execOptions wild_s6p5 of { Text.Regex.TDFA.Common.ExecOption _ [Occ=Dead] -> Text.Regex.TDFA.Common.ExecOption [GHC.Types.False]; }; } in Text.Regex.TDFA.Common.Regex [ds_s6p6 ds1_s6p7 ds2_s6p8 ds3_s6p9 ds4_s6pa ds5_s6pb ds6_s6pc ds7_s6pd ds8_s6pe sat_s6pi]; }; } in Text.Regex.TDFA.NewDFA.Engine.execMatch Data.Text.Lazy.uncons sat_s6pj sat_s6pk sat_s6pl s_s6p4; } in Data.Foldable.length Data.Foldable.$fFoldable[] sat_s6pm; $cmatchOnceText_r6nY :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> GHC.Base.Maybe (Data.Text.Internal.Lazy.Text, Text.Regex.Base.RegexLike.MatchText Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text) [GblId, Arity=2, Unf=OtherCon []] = [] \r [regex_s6pn source_s6po] let { sat_s6pL [Occ=Once] :: GHC.Base.Maybe (GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int)) [LclId] = [regex_s6pn source_s6po] \u [] let { sat_s6pK [Occ=Once] :: [Text.Regex.Base.RegexLike.MatchArray] [LclId] = [regex_s6pn source_s6po] \u [] let { sat_s6pJ [Occ=Once] :: GHC.Types.Char [LclId] = NO_CCS GHC.Types.C#! ['\n'#]; } in let { sat_s6pI [Occ=Once] :: Text.Regex.TDFA.Common.Position [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Text.Regex.TDFA.NewDFA.Engine.execMatch Data.Text.Lazy.uncons regex_s6pn sat_s6pI sat_s6pJ source_s6po; } in Data.Maybe.listToMaybe sat_s6pK; } in let { sat_s6pH [Occ=Once] :: GHC.Arr.Array GHC.Types.Int (GHC.Types.Int, GHC.Types.Int) -> (Data.Text.Internal.Lazy.Text, GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)), Data.Text.Internal.Lazy.Text) [LclId] = [source_s6po] \r [ma_s6pp] let { ds_s6pq :: (GHC.Types.Int, GHC.Types.Int) [LclId] = [ma_s6pp] \u [] let { sat_s6pr [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Data.Array.Base.! Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt ma_s6pp sat_s6pr; } in let { o_s6ps :: GHC.Types.Int [LclId] = [ds_s6pq] \u [] case ds_s6pq of { (,) o1_s6pu [Occ=Once] _ [Occ=Dead] -> o1_s6pu; }; } in let { sat_s6pG [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [source_s6po ds_s6pq o_s6ps] \u [] let { sat_s6pF [Occ=Once] :: GHC.Types.Int [LclId] = [ds_s6pq o_s6ps] \u [] let { sat_s6pE [Occ=Once] :: GHC.Types.Int [LclId] = [ds_s6pq] \u [] case ds_s6pq of { (,) _ [Occ=Dead] l_s6pD [Occ=Once] -> l_s6pD; }; } in GHC.Num.+ GHC.Num.$fNumInt o_s6ps sat_s6pE; } in $cafter_r6mQ sat_s6pF source_s6po; } in let { sat_s6pA [Occ=Once] :: GHC.Arr.Array GHC.Types.Int (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [source_s6po ma_s6pp] \u [] let { sat_s6pz [Occ=Once] :: (GHC.Types.Int, GHC.Types.Int) -> (Data.Text.Internal.Lazy.Text, (GHC.Types.Int, GHC.Types.Int)) [LclId] = [source_s6po] \r [ol_s6px] let { sat_s6py [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [source_s6po ol_s6px] \u [] $cextract_r6nK ol_s6px source_s6po; } in (,) [sat_s6py ol_s6px]; } in GHC.Base.fmap GHC.Arr.$fFunctorArray sat_s6pz ma_s6pp; } in let { sat_s6pw [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [source_s6po o_s6ps] \u [] $cbefore_r6nJ o_s6ps source_s6po; } in (,,) [sat_s6pw sat_s6pA sat_s6pG]; } in GHC.Base.fmap GHC.Base.$fFunctorMaybe sat_s6pH sat_s6pL; Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.RegexLike Text.Regex.TDFA.Common.Regex Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:RegexLike! [Text.Regex.TDFA.Text.Lazy.$fExtractText $cmatchOnce_r6nV $cmatchAll_r6nU $cmatchCount_r6nX $cmatchTest_r6nT $cmatchAllText_r6nW $cmatchOnceText_r6nY]; Text.Regex.TDFA.Text.Lazy.regexec :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> Data.Either.Either GHC.Base.String (GHC.Base.Maybe (Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, [Data.Text.Internal.Lazy.Text])) [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6pM txt_s6pN] case $cmatchOnceText_r6nY r_s6pM txt_s6pN of { GHC.Base.Nothing -> Data.Either.Right [GHC.Base.Nothing]; GHC.Base.Just ds_s6pP [Occ=Once!] -> case ds_s6pP of { (,,) pre_s6pR [Occ=Once] mt_s6pS post_s6pT [Occ=Once] -> let { sat_s6pZ [Occ=Once] :: [Data.Text.Internal.Lazy.Text] [LclId] = [mt_s6pS] \u [] let { sat_s6pY [Occ=Once] :: [(Data.Text.Internal.Lazy.Text, (Text.Regex.Base.RegexLike.MatchOffset, Text.Regex.Base.RegexLike.MatchLength))] [LclId] = [mt_s6pS] \u [] let { sat_s6pX [Occ=Once] :: [(Data.Text.Internal.Lazy.Text, (Text.Regex.Base.RegexLike.MatchOffset, Text.Regex.Base.RegexLike.MatchLength))] [LclId] = [mt_s6pS] \u [] Data.Array.Base.elems Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt mt_s6pS; } in GHC.List.tail sat_s6pX; } in GHC.Base.map Data.Tuple.fst sat_s6pY; } in let { sat_s6pW [Occ=Once] :: Data.Text.Internal.Lazy.Text [LclId] = [mt_s6pS] \u [] let { sat_s6pV [Occ=Once] :: (Data.Text.Internal.Lazy.Text, (Text.Regex.Base.RegexLike.MatchOffset, Text.Regex.Base.RegexLike.MatchLength)) [LclId] = [mt_s6pS] \u [] let { sat_s6pU [Occ=Once] :: GHC.Types.Int [LclId] = NO_CCS GHC.Types.I#! [0#]; } in Data.Array.Base.! Data.Array.Base.$fIArrayArraye GHC.Arr.$fIxInt mt_s6pS sat_s6pU; } in Data.Tuple.fst sat_s6pV; } in let { sat_s6q0 [Occ=Once] :: (Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, [Data.Text.Internal.Lazy.Text]) [LclId] = NO_CCS (,,,)! [pre_s6pR sat_s6pW post_s6pT sat_s6pZ]; } in let { sat_s6q1 [Occ=Once] :: GHC.Base.Maybe (Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, Data.Text.Internal.Lazy.Text, [Data.Text.Internal.Lazy.Text]) [LclId] = NO_CCS GHC.Base.Just! [sat_s6q0]; } in Data.Either.Right [sat_s6q1]; }; }; $cmatch_r6nZ :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> Data.Text.Internal.Lazy.Text [GblId] = [] \u [] Text.Regex.Base.Impl.polymatch Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText; $cmatchM_r6o0 :: forall (m :: * -> *). GHC.Base.Monad m => Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> m Data.Text.Internal.Lazy.Text [GblId, Arity=1, Unf=OtherCon []] = [] \r [$dMonad_s6q2] Text.Regex.Base.Impl.polymatchM Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText $dMonad_s6q2; Text.Regex.TDFA.Text.Lazy.$fRegexContextRegexTextText [InlPrag=NOUSERINLINE CONLIKE] :: Text.Regex.Base.RegexLike.RegexContext Text.Regex.TDFA.Common.Regex Data.Text.Internal.Lazy.Text Data.Text.Internal.Lazy.Text [GblId[DFunId]] = NO_CCS Text.Regex.Base.RegexLike.C:RegexContext! [Text.Regex.TDFA.Text.Lazy.$fRegexLikeRegexText $cmatch_r6nZ $cmatchM_r6o0]; Text.Regex.TDFA.Text.Lazy.execute :: Text.Regex.TDFA.Common.Regex -> Data.Text.Internal.Lazy.Text -> Data.Either.Either GHC.Base.String (GHC.Base.Maybe Text.Regex.Base.RegexLike.MatchArray) [GblId, Arity=2, Unf=OtherCon []] = [] \r [r_s6q3 txt_s6q4] let { sat_s6q5 [Occ=Once] :: GHC.Base.Maybe Text.Regex.Base.RegexLike.MatchArray [LclId] = [r_s6q3 txt_s6q4] \u [] $cmatchOnce_r6nV r_s6q3 txt_s6q4; } in Data.Either.Right [sat_s6q5]; }}} Which I think is strange, because `wnext2` doesn't look like anything GHC would autogenerate, but rather like a name a human would choose on purpose. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14519#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler