Admin message

Due to a large amount of spam we do not allow new users to create repositories, they are "external" users. If you are a new user and want to create a repository, for example for forking GHC, open a new issue on ghc/ghc using the "get-verified" issue template

9.14.1/HEAD no longer specializes code that <=9.12 used to
## Summary As in title. ## Steps to reproduce Get demo project from https://github.com/arybczak/perf-test.git and compile it with 9.12.3 and 9.14.1/HEAD for comparison. <details> <summary>9.12.3 output</summary> ``` $ cabal build -w ghc-9.12.3 Resolving dependencies... Build profile: -w ghc-9.12.3 -O1 In order, the following will be built (use -v for more details): - perf-test-0.1.0.0 (lib) (first run) Configuring library for perf-test-0.1.0.0... Preprocessing library for perf-test-0.1.0.0... Building library for perf-test-0.1.0.0... [1 of 1] Compiling MyLib ( src/MyLib.hs, dist-newstyle/build/x86_64-linux/ghc-9.12.3/perf-test-0.1.0.0/build/MyLib.o, dist-newstyle/build/x86_64-linux/ghc-9.12.3/perf-test-0.1.0.0/build/MyLib.dyn_o ) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: iadjoin_12_3 (Optics.IxTraversal) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op $p1Mapping (BUILTIN) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update1 @Identity @_ @_ (MyLib) Rule fired: SPEC update1 @Identity @_ @_ (MyLib) Rule fired: SPEC update1 @Identity @_ @_ (MyLib) Rule fired: Class op eq_sel (BUILTIN) Rule fired: SPEC/MyLib iadjoin3 @A_Traversal @A_Traversal @A_Traversal @(WithIx Int) @Int @_ @_ (MyLib) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op <*> (BUILTIN) Rule fired: Class op <*> (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: itraversed__ -> imapped__ (Optics.Internal.IxTraversal) Rule fired: Class op $p1TraversableWithIndex (BUILTIN) Rule fired: Class op imap (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op liftA2 (BUILTIN) Rule fired: Class op pure (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op iwander (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op iwander (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op iwander (BUILTIN) Rule fired: Class op $p1Traversing (BUILTIN) Rule fired: Class op $p2Visiting (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op linear (BUILTIN) Rule fired: Class op $p2Visiting (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op linear (BUILTIN) Rule fired: Class op $p2Visiting (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op linear (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op $p1Choice (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p2Visiting (BUILTIN) Rule fired: Class op linear (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op $p1Choice (BUILTIN) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op $p1Choice (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op liftA2 (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op pure (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op $p2Visiting (BUILTIN) Rule fired: Class op linear (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op $p1Choice (BUILTIN) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op $p1Choice (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op dimap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op right' (BUILTIN) Rule fired: Class op pure (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op >>= (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op return (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p2Visiting (BUILTIN) Rule fired: Class op linear (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op $p1Choice (BUILTIN) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op dimap (BUILTIN) Rule fired: Class op $p1Visiting (BUILTIN) Rule fired: Class op right' (BUILTIN) Rule fired: Class op mempty (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op fmap (BUILTIN) ==================== Tidy Core ==================== Result size of Tidy Core = {terms: 169, types: 418, coercions: 111, joins: 1/4} lvl_r2Az = I# 0# poly_$dApplicative_r2AA = \ @a_a1dq -> $fApplicativeConst $fMonoidEndo test = \ @a_a1dq eta1_X1 eta_B0 -> letrec { go1_s2pW = \ ds_a2kH -> case ds_a2kH of { [] -> [] `cast` <Co:6> :: ...; : y_a2kK ys_a2kL -> (: (case y_a2kK of { (k1_a2hz, a1_a2hA) -> (k1_a2hz, eta1_X1 k1_a2hz a1_a2hA) }) ((go1_s2pW ys_a2kL) `cast` <Co:5> :: ...)) `cast` <Co:6> :: ... }; } in (case eta_B0 of { (a1_a2dJ, b2_a2dK, c2_a2dL) -> case a1_a2dJ of { (x_a2ul, y_a2um) -> (x_a2ul, case (go1_s2pW (: (x_a2ul, y_a2um) [])) `cast` <Co:5> :: ... of { [] -> y_a2um; : ds1_a1X2 _ -> case ds1_a1X2 of { (ds2_a1X6, a'_a1X7) -> a'_a1X7 } }) } }, letrec { go2_s2z9 = \ ds_a2kH eta2_X2 -> case ds_a2kH of { [] -> ([], eta2_X2) `cast` <Co:9> :: ...; : y_a2kK ys_a2kL -> let { ds1_s2yW = go2_s2z9 ys_a2kL (case eta2_X2 of { [] -> []; : ds2_a1X2 as'_a1X3 -> case ds2_a1X2 of { (ds3_a1X6, a'_a1X7) -> as'_a1X3 } }) } in (: (case eta2_X2 of { [] -> y_a2kK; : ds2_a1X2 as'_a1X3 -> case ds2_a1X2 of { (ds3_a1X6, a'_a1X7) -> a'_a1X7 } }) (case ds1_s2yW `cast` <Co:8> :: ... of { (x_a2yL, s''_a2yM) -> x_a2yL }), case ds1_s2yW `cast` <Co:8> :: ... of { (x_a2yP, s''_a2yQ) -> s''_a2yQ }) `cast` <Co:9> :: ... }; } in case (go2_s2z9 (case eta_B0 of { (a1_a2dx, b2_a2dy, c1_a2dz) -> b2_a2dy }) (case eta_B0 of { (a2_a2eq, b1_a2er, c2_a2es) -> (go1_s2pW (((itraverseListOff poly_$dApplicative_r2AA lvl_r2Az ((\ i1_a2pI x_a29m eta2_X5 -> : (i1_a2pI, x_a29m) eta2_X5) `cast` <Co:22> :: ...) b1_a2er) `cast` <Co:15> :: ...) [])) `cast` <Co:5> :: ... })) `cast` <Co:8> :: ... of { (a1_a2sQ, _) -> a1_a2sQ }, case eta_B0 of { (a1_a2dD, b2_a2dE, c2_a2dF) -> case c2_a2dF of { (x_a2ul, y_a2um) -> (x_a2ul, join { $j_s2At a2_a2sQ = case a2_a2sQ of { Left x1_a1U3 -> x1_a1U3; Right y1_a1U5 -> Just y1_a1U5 } } in case y_a2um of { Nothing -> Nothing; Just y1_a1TZ -> Just (case (go1_s2pW (: (x_a2ul, y1_a1TZ) [])) `cast` <Co:5> :: ... of { [] -> y1_a1TZ; : ds1_a1X2 _ -> case ds1_a1X2 of { (ds2_a1X6, a'_a1X7) -> a'_a1X7 } }) }) } }) $trModule4 = "perf-test-0.1.0.0-inplace"# $trModule3 = TrNameS $trModule4 $trModule2 = "MyLib"# $trModule1 = TrNameS $trModule2 $trModule = Module $trModule3 $trModule1 ------ Local rules for imported ids -------- "SPEC/MyLib iadjoin3 @A_Traversal @A_Traversal @A_Traversal @(WithIx Int) @Int @_ @_" [1] forall @s_a1Wt @a_a1Wu $dIs_s29J $dIs1_s29K $dIs2_s29L $dHasSingleIndex_s29M. iadjoin3 $dIs_s29J $dIs1_s29K $dIs2_s29L $dHasSingleIndex_s29M = (\ eta_a1Wz eta1_a1WA eta2_a1WB @p_a1WC @i1_a1WD eta3_a1WE eta4_a1WF -> let { update1_a1WH = \ @m_a1WO @b_a1WP @a1_a1WQ $dMonad_a1WR a2_a1WS s1_a1WT -> >>= $dMonad_a1WR (return $dMonad_a1WR (s1_a1WT, s1_a1WT)) (\ ds_a1WV -> case ds_a1WV of { (a3_a1WX, s'_a1WY) -> case a3_a1WX of { [] -> return $dMonad_a1WR (a2_a1WS, s'_a1WY); : ds1_a1X2 as'_a1X3 -> case ds1_a1X2 of { (_, a'_a1X7) -> >>= $dMonad_a1WR (return $dMonad_a1WR ((), as'_a1X3)) (\ ds3_a1X9 -> return $dMonad_a1WR (a'_a1X7, case ds3_a1X9 of { (_, s'1_a1Xc) -> s'1_a1Xc })) } } }) } in (conjoined__ eta3_a1WE (let { eta5_a1Xe = \ @p1_a1Xh @i2_a1Xi _ eta7_a1Xk -> let { update2_a1Xl = \ @m_a1Xo @b_a1Xp $dMonad_a1Xq a1_a1Xr s1_a1Xs -> >>= $dMonad_a1Xq (return $dMonad_a1Xq (s1_a1Xs, s1_a1Xs)) (\ ds_a1Xt -> case ds_a1Xt of { (a2_a1Xv, s'_a1Xw) -> case a2_a1Xv of { [] -> return $dMonad_a1Xq (a1_a1Xr, s'_a1Xw); : a'_a1XA as'_a1XB -> >>= $dMonad_a1Xq (return $dMonad_a1Xq ((), as'_a1XB)) (\ ds1_a1XD -> return $dMonad_a1Xq (a'_a1XA, case ds1_a1XD of { (_, s'1_a1XG) -> s'1_a1XG })) } }) } in let { f_a1XI = wander (eta7_a1Xk `cast` <Co:3> :: ...) (\ @f1_a1XJ $dApplicative2_a1XK -> let { $dApplicative3_a1XL = $fApplicativeStateT $fFunctorIdentity $fMonadIdentity } in let { $dFunctor2_a21F = $p1Applicative $dApplicative2_a1XK } in \ f2_a21G s0_a21H -> <*> $dApplicative2_a1XK (fmap $dFunctor2_a21F (\ r1_a21I r2_a21J -> case ((((((eta2_a1WB `cast` <Co:8> :: ...) ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a1XL) `cast` <Co:8> :: ...) ((update2_a1Xl $fMonadIdentity) `cast` <Co:21> :: ...)) `cast` <Co:13> :: ...) (case ((((((eta1_a1WA `cast` <Co:8> :: ...) ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a1XL) `cast` <Co:8> :: ...) ((update2_a1Xl $fMonadIdentity) `cast` <Co:21> :: ...)) `cast` <Co:13> :: ...) s0_a21H) `cast` <Co:5> :: ...) r1_a21I) `cast` <Co:5> :: ... of { (x_a223, _) -> x_a223 })) `cast` <Co:5> :: ...) r2_a21J) `cast` <Co:5> :: ... of { (x_a227, _) -> x_a227 }) (f2_a21G ((((((eta1_a1WA `cast` <Co:8> :: ...) $fProfunctorForget (($fTraversingForget $fMonoidEndo) `cast` <Co:7> :: ...) ((\ ds_a27F ds1_a27G -> : ds_a27F ds1_a27G) `cast` <Co:18> :: ...)) `cast` <Co:12> :: ...) s0_a21H) `cast` <Co:3> :: ...) []))) (f2_a21G ((((((eta2_a1WB `cast` <Co:8> :: ...) $fProfunctorForget (($fTraversingForget $fMonoidEndo) `cast` <Co:7> :: ...) ((\ ds_a27I ds1_a27J -> : ds_a27I ds1_a27J) `cast` <Co:18> :: ...)) `cast` <Co:12> :: ...) s0_a21H) `cast` <Co:3> :: ...) []))) } in let { g_a27K = traversed__ (eta7_a1Xk `cast` <Co:3> :: ...) $fTraversableList } in \ x_a27V -> f_a1XI ((g_a27K x_a27V) `cast` <Co:8> :: ...) } in let { update2_a27W = \ @m_a27Z @b_a280 $dMonad_a281 a1_a282 s1_a283 -> >>= $dMonad_a281 (return $dMonad_a281 (s1_a283, s1_a283)) (\ ds_a284 -> case ds_a284 of { (a2_a286, s'_a287) -> case a2_a286 of { [] -> return $dMonad_a281 (a1_a282, s'_a287); : a'_a28b as'_a28c -> >>= $dMonad_a281 (return $dMonad_a281 ((), as'_a28c)) (\ ds1_a28e -> return $dMonad_a281 (a'_a28b, case ds1_a28e of { (_, s'1_a28h) -> s'1_a28h })) } }) } in let { f_a28j = wander (eta4_a1WF `cast` <Co:3> :: ...) (\ @f1_a28k $dApplicative2_a28l -> let { $dApplicative3_a28m = $fApplicativeStateT $fFunctorIdentity $fMonadIdentity } in let { $dFunctor2_a28n = $p1Applicative $dApplicative2_a28l } in \ f2_a28o s0_a28p -> <*> $dApplicative2_a28l (fmap $dFunctor2_a28n (\ r1_a28q r2_a28r -> case (((((eta5_a1Xe ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a28m) `cast` <Co:8> :: ...) ((update2_a27W $fMonadIdentity) `cast` <Co:21> :: ...)) `cast` <Co:12> :: ...) (case ((((((eta_a1Wz `cast` <Co:8> :: ...) ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a28m) `cast` <Co:8> :: ...) ((update2_a27W $fMonadIdentity) `cast` <Co:21> :: ...)) `cast` <Co:13> :: ...) s0_a28p) `cast` <Co:5> :: ...) r1_a28q) `cast` <Co:5> :: ... of { (x_a28w, _) -> x_a28w })) `cast` <Co:5> :: ...) r2_a28r) `cast` <Co:5> :: ... of { (x_a28A, _) -> x_a28A }) (f2_a28o ((((((eta_a1Wz `cast` <Co:8> :: ...) $fProfunctorForget (($fTraversingForget $fMonoidEndo) `cast` <Co:7> :: ...) ((\ ds_a28E ds1_a28F -> : ds_a28E ds1_a28F) `cast` <Co:18> :: ...)) `cast` <Co:12> :: ...) s0_a28p) `cast` <Co:3> :: ...) []))) (f2_a28o (((((eta5_a1Xe $fProfunctorForget (($fTraversingForget $fMonoidEndo) `cast` <Co:7> :: ...) ((\ ds_a28G ds1_a28H -> : ds_a28G ds1_a28H) `cast` <Co:18> :: ...)) `cast` <Co:11> :: ...) s0_a28p) `cast` <Co:3> :: ...) []))) } in let { g_a28I = traversed__ (eta4_a1WF `cast` <Co:3> :: ...) $fTraversableList } in (\ x_a28J -> f_a28j ((g_a28I x_a28J) `cast` <Co:8> :: ...)) `cast` <Co:11> :: ...) (let { f_a28K = wander (eta4_a1WF `cast` <Co:3> :: ...) (\ @f1_a28L $dApplicative2_a28M -> let { $dApplicative3_a28N = $fApplicativeStateT $fFunctorIdentity $fMonadIdentity } in let { $dFunctor2_a28O = $p1Applicative $dApplicative2_a28M } in \ f2_a28P s0_a28Q -> <*> $dApplicative2_a28M (<*> $dApplicative2_a28M (fmap $dFunctor2_a28O (\ r1_a28R r2_a28S r3_a28T -> case ((((((eta2_a1WB `cast` <Co:8> :: ...) ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a28N) `cast` <Co:10> :: ...) ((update1_a1WH $fMonadIdentity) `cast` <Co:25> :: ...)) `cast` <Co:15> :: ...) (case ((((((eta1_a1WA `cast` <Co:8> :: ...) ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a28N) `cast` <Co:10> :: ...) ((update1_a1WH $fMonadIdentity) `cast` <Co:25> :: ...)) `cast` <Co:15> :: ...) (case ((((((eta_a1Wz `cast` <Co:8> :: ...) ($fProfunctorStar ($fFunctorStateT $fFunctorIdentity)) (($fTraversingStar $dApplicative3_a28N) `cast` <Co:10> :: ...) ((update1_a1WH $fMonadIdentity) `cast` <Co:25> :: ...)) `cast` <Co:15> :: ...) s0_a28Q) `cast` <Co:7> :: ...) r1_a28R) `cast` <Co:7> :: ... of { (x_a294, _) -> x_a294 })) `cast` <Co:7> :: ...) r2_a28S) `cast` <Co:7> :: ... of { (x_a298, _) -> x_a298 })) `cast` <Co:7> :: ...) r3_a28T) `cast` <Co:7> :: ... of { (x_a29c, _) -> x_a29c }) (f2_a28P ((((((eta_a1Wz `cast` <Co:8> :: ...) $fProfunctorIxForget (($fTraversingIxForget $fMonoidEndo) `cast` <Co:9> :: ...) ((\ i2_a29l x_a29m -> let { ds_a29n = (i2_a29l, x_a29m) } in \ ds1_a29o -> : ds_a29n ds1_a29o) `cast` <Co:23> :: ...)) `cast` <Co:21> :: ...) id s0_a28Q) `cast` <Co:5> :: ...) []))) (f2_a28P ((((((eta1_a1WA `cast` <Co:8> :: ...) $fProfunctorIxForget (($fTraversingIxForget $fMonoidEndo) `cast` <Co:9> :: ...) ((\ i2_a29q x_a29r -> let { ds_a29s = (i2_a29q, x_a29r) } in \ ds1_a29t -> : ds_a29s ds1_a29t) `cast` <Co:23> :: ...)) `cast` <Co:21> :: ...) id s0_a28Q) `cast` <Co:5> :: ...) []))) (f2_a28P ((((((eta2_a1WB `cast` <Co:8> :: ...) $fProfunctorIxForget (($fTraversingIxForget $fMonoidEndo) `cast` <Co:9> :: ...) ((\ i2_a29v x_a29w -> let { ds_a29x = (i2_a29v, x_a29w) } in \ ds1_a29y -> : ds_a29x ds1_a29y) `cast` <Co:23> :: ...)) `cast` <Co:21> :: ...) id s0_a28Q) `cast` <Co:5> :: ...) []))) } in let { g_a29z = traversed__ (eta4_a1WF `cast` <Co:3> :: ...) $fTraversableList } in let { g1_a29A = itraversed__ (eta4_a1WF `cast` <Co:3> :: ...) $fTraversableWithIndexkTuple2 } in (\ x_a29B -> f_a28K ((g_a29z ((g1_a29A x_a29B) `cast` <Co:20> :: ...)) `cast` <Co:15> :: ...)) `cast` <Co:29> :: ...)) `cast` <Co:22> :: ...) `cast` <Co:33> :: ... ``` </details> <details> <summary>9.14.1 output</summary> ``` $ cabal build -w ghc-9.14.1 Resolving dependencies... Build profile: -w ghc-9.14.1 -O1 In order, the following will be built (use -v for more details): - perf-test-0.1.0.0 (lib) (first run) Configuring library for perf-test-0.1.0.0... Preprocessing library for perf-test-0.1.0.0... Building library for perf-test-0.1.0.0... [1 of 1] Compiling MyLib ( src/MyLib.hs, dist-newstyle/build/x86_64-linux/ghc-9.14.1/perf-test-0.1.0.0/build/MyLib.o, dist-newstyle/build/x86_64-linux/ghc-9.14.1/perf-test-0.1.0.0/build/MyLib.dyn_o ) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op _1 (BUILTIN) Rule fired: Class op appendIndices (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op _2 (BUILTIN) Rule fired: Class op appendIndices (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op _3 (BUILTIN) Rule fired: Class op appendIndices (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op appendIndices (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: Class op joinKinds (BUILTIN) Rule fired: iadjoin_12_3 (Optics.IxTraversal) Rule fired: Class op $p1HasSingleIndex (BUILTIN) Rule fired: Class op eq_sel (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op $p1Mapping (BUILTIN) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update2 @Identity @_ (MyLib) Rule fired: SPEC update1 @Identity @_ @_ (MyLib) Rule fired: SPEC update1 @Identity @_ @_ (MyLib) Rule fired: SPEC update1 @Identity @_ @_ (MyLib) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: Class op implies (BUILTIN) Rule fired: SPEC/MyLib iadjoin3 @A_Traversal @A_Traversal @A_Traversal @(WithIx Int) @Int @_ @_ (MyLib) Rule fired: Class op conjoined__ (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op $p1Applicative (BUILTIN) Rule fired: Class op <*> (BUILTIN) Rule fired: Class op <*> (BUILTIN) Rule fired: Class op fmap (BUILTIN) Rule fired: itraversed__ -> imapped__ (Optics.Internal.IxTraversal) Rule fired: Class op $p1TraversableWithIndex (BUILTIN) Rule fired: Class op imap (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op $p3TraversableWithIndex (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op itraverse (BUILTIN) Rule fired: Class op wander (BUILTIN) Rule fired: Class op traverse (BUILTIN) Rule fired: Class op pure (BUILTIN) Rule fired: Class op liftA2 (BUILTIN) ==================== Tidy Core ==================== Result size of Tidy Core = {terms: 364, types: 1,500, coercions: 696, joins: 0/7} test1 = \ @a_a1Xw i2_a29B x_a29C eta_B0 -> : (i2_a29B, x_a29C) eta_B0 test2 = \ @a_a1Xw -> $fTraversingIxForget $fMonoidEndo test9 = \ @a_a1Xw -> $fApplicativeStateT $fFunctorIdentity $fMonadIdentity test8 = \ @a_a1Xw -> $fTraversingStar test9 test11 = \ @a_a1Xw -> $fFunctorStateT $fFunctorIdentity test10 = \ @a_a1Xw -> $fProfunctorStar test11 test3 = \ @a_s2mB @f_a2fR $dFunctor_a2fS k_a2fT ds_a2fU -> let { b1_a2fV = case ds_a2fU of { (a1_a2fX, b2_a2fY, c1_a2fZ) -> b2_a2fY } } in let { c1_a2g1 = case ds_a2fU of { (a1_a2g3, b2_a2g4, c2_a2g5) -> c2_a2g5 } } in fmap $dFunctor_a2fS (\ a'1_a2g7 -> (a'1_a2g7, b1_a2fV, c1_a2g1)) (k_a2fT (case ds_a2fU of { (a1_a2g9, b2_a2ga, c2_a2gb) -> a1_a2g9 })) $weta = \ @a_s2mB @p_s2mC @i_s2mD irred_s2mF eta_s2mG -> linear ($p2Visiting ($p1Traversing (irred_s2mF `cast` <Co:3> :: ...))) test3 ((conjoined__ ($p1Choice ($p1Visiting ($p1Traversing (irred_s2mF `cast` <Co:3> :: ...)))) (wander (irred_s2mF `cast` <Co:3> :: ...) (\ @f1_a2jY -> $fTraversableTuple2_$ctraverse)) (iwander (irred_s2mF `cast` <Co:3> :: ...) (\ @f1_a2k0 -> $fTraversableWithIndexkTuple2_$citraverse)) eta_s2mG) `cast` <Co:20> :: ...) test6 = \ @a_s2mK @f_a2gy $dFunctor_a2gz k_a2gA ds_a2gB -> let { a1_a2gC = case ds_a2gB of { (a2_a2gE, b1_a2gF, c1_a2gG) -> a2_a2gE } } in let { c1_a2gI = case ds_a2gB of { (a2_a2gK, b1_a2gL, c2_a2gM) -> c2_a2gM } } in fmap $dFunctor_a2gz (\ b'1_a2gO -> (a1_a2gC, b'1_a2gO, c1_a2gI)) (k_a2gA (case ds_a2gB of { (a2_a2gQ, b1_a2gR, c2_a2gS) -> b1_a2gR })) test5 = I# 0# test4 = \ @a_s2mK @f1_a2k0 $dApplicative_a2k1 eta_a1X6 eta1_a1X7 -> itraverseListOff $dApplicative_a2k1 test5 eta_a1X6 eta1_a1X7 $weta1 = \ @a_s2mK @p_s2mL @i_s2mM irred_s2mO eta_s2mP -> linear ($p2Visiting ($p1Traversing (irred_s2mO `cast` <Co:3> :: ...))) test6 ((conjoined__ ($p1Choice ($p1Visiting ($p1Traversing (irred_s2mO `cast` <Co:3> :: ...)))) (wander (irred_s2mO `cast` <Co:3> :: ...) (\ @f1_a2jN -> $fTraversableList_$ctraverse)) (iwander (irred_s2mO `cast` <Co:3> :: ...) test4) eta_s2mP) `cast` <Co:18> :: ...) test15 = \ @a_a1h8 -> Left Nothing test14 = \ @a_a1h8 x_a1Th -> case x_a1Th of { Nothing -> test15; Just y_a1Tl -> Right y_a1Tl } test13 = \ @a_a1h8 ds1_a1Tn -> case ds1_a1Tn of { Left x_a1Tp -> x_a1Tp; Right y_a1Tr -> Just y_a1Tr } test16 = \ @a_a1h8 @f_a2h9 $dFunctor_a2ha k_a2hb ds_a2hc -> let { a1_a2hd = case ds_a2hc of { (a2_a2hf, b1_a2hg, c1_a2hh) -> a2_a2hf } } in let { b1_a2hj = case ds_a2hc of { (a2_a2hl, b2_a2hm, c1_a2hn) -> b2_a2hm } } in fmap $dFunctor_a2ha (\ c'1_a2hp -> (a1_a2hd, b1_a2hj, c'1_a2hp)) (k_a2hb (case ds_a2hc of { (a2_a2hr, b2_a2hs, c1_a2ht) -> c1_a2ht })) test12 = \ @a_a1h8 @p_X5 @i_X6 $dProfunctor_X7 irred_X8 eta_B0 -> linear ($p2Visiting ($p1Traversing (irred_X8 `cast` <Co:3> :: ...))) test16 ((conjoined__ ($p1Choice ($p1Visiting ($p1Traversing (irred_X8 `cast` <Co:3> :: ...)))) (wander (irred_X8 `cast` <Co:3> :: ...) (\ @f1_a2jY -> $fTraversableTuple2_$ctraverse)) (iwander (irred_X8 `cast` <Co:3> :: ...) (\ @f1_a2k0 -> $fTraversableWithIndexkTuple2_$citraverse)) ((dimap $dProfunctor_X7 test14 test13 (right' ($p1Visiting ($p1Traversing (irred_X8 `cast` <Co:3> :: ...))) eta_B0)) `cast` <Co:8> :: ...)) `cast` <Co:26> :: ...) test_update1 = \ @m_a1XQ @b_a1XR @a1_a1XS $dMonad_a1XT a2_a1XU s1_a1XV -> >>= $dMonad_a1XT (return $dMonad_a1XT (s1_a1XV, s1_a1XV)) (\ ds_a1XX -> case ds_a1XX of { (a3_a1XZ, s'_a1Y0) -> case a3_a1XZ of { [] -> return $dMonad_a1XT (a2_a1XU, s'_a1Y0); : ds1_a1Y4 as'_a1Y5 -> case ds1_a1Y4 of { (ds2_a1Y8, a'_a1Y9) -> >>= $dMonad_a1XT (return $dMonad_a1XT ((), as'_a1Y5)) (\ ds3_a1Yb -> return $dMonad_a1XT (a'_a1Y9, case ds3_a1Yb of { (a4_a1Yd, s'1_a1Ye) -> s'1_a1Ye })) } } }) test7 = \ @a_a1h8 -> test_update1 $fMonadIdentity test = \ @a_a1h8 eta1_X1 eta_B0 -> letrec { go1_s2nG = \ ds_a2lD -> case ds_a2lD of { [] -> [] `cast` <Co:6> :: ...; : y_a2lG ys_a2lH -> (: (case y_a2lG of { (k1_a2jD, a1_a2jE) -> (k1_a2jD, eta1_X1 k1_a2jD a1_a2jE) }) ((go1_s2nG ys_a2lH) `cast` <Co:5> :: ...)) `cast` <Co:6> :: ... }; } in case (((((test12 test10 (test8 `cast` <Co:10> :: ...) (test7 `cast` <Co:25> :: ...)) `cast` <Co:49> :: ...) (case ((((($weta1 (test8 `cast` <Co:10> :: ...) (test7 `cast` <Co:25> :: ...)) `cast` <Co:33> :: ...) (case ((((($weta (test8 `cast` <Co:10> :: ...) (test7 `cast` <Co:25> :: ...)) `cast` <Co:33> :: ...) eta_B0) `cast` <Co:16> :: ...) ((go1_s2nG ((((($weta (test2 `cast` <Co:9> :: ...) (test1 `cast` <Co:23> :: ...)) `cast` <Co:39> :: ...) breakpoint eta_B0) `cast` <Co:5> :: ...) [])) `cast` <Co:5> :: ...)) `cast` <Co:16> :: ... of { (x_a29a, _) -> x_a29a })) `cast` <Co:16> :: ...) ((go1_s2nG ((((($weta1 (test2 `cast` <Co:9> :: ...) (test1 `cast` <Co:23> :: ...)) `cast` <Co:39> :: ...) breakpoint eta_B0) `cast` <Co:5> :: ...) [])) `cast` <Co:5> :: ...)) `cast` <Co:16> :: ... of { (x_a29e, _) -> x_a29e })) `cast` <Co:16> :: ...) ((go1_s2nG (((((test12 $fProfunctorIxForget (test2 `cast` <Co:9> :: ...) (test1 `cast` <Co:23> :: ...)) `cast` <Co:48> :: ...) breakpoint eta_B0) `cast` <Co:5> :: ...) [])) `cast` <Co:5> :: ...)) `cast` <Co:16> :: ... of { (x_a29i, _) -> x_a29i } $trModule4 = "perf-test-0.1.0.0-inplace"# $trModule3 = TrNameS $trModule4 $trModule2 = "MyLib"# $trModule1 = TrNameS $trModule2 $trModule = Module $trModule3 $trModule1 ``` </details> Looks like the order of rules firing changed (e.g. `iadjoin_12_3` defined [here](https://github.com/well-typed/optics/blob/34a06592ad5239ca027d650a1b4780f4d1e46f31/optics-core/src/Optics/IxTraversal.hs#L433) fires a bit later) and thus all the class methods that are being specialized away in 9.12.3 no longer are in 9.14.1 (same with HEAD)? ## Expected behavior Type class methods specialize away. ## Environment * GHC version used: 9.14.1 Optional: * Operating System: Arch Linux * System Architecture: x86_64
issue