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