bytestring Builder performance regressions after 9.2.3
While testing the performance characteristics of a bytestring
patch meant to mitigate withForeignPtr
-related performance regressions, it was noticed that several of our Builder
-related benchmarks have also regressed seriously for unrelated reasons. The worst offender is byteStringHex
, which on my machine runs about 10 times slower and allocates 21 times as much when using ghc-9.2.4
or ghc-9.4.2
as it did when using ghc-9.2.3
. Here's a small program that can demonstrate this slowdown:
Click to expand
import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Builder as B
str :: S.ByteString
str = S.replicate 100000000 32
main :: IO ()
main = print $ L.length $ B.toLazyByteString $ B.byteStringHex str
Looking at the simplified Core generated while compiling Data.ByteString.Builder.ASCII
, it is clear that the culprit for this particular example is the local function go
in Data.ByteString.Builder.Prim.primMapByteStringBounded
. With 9.2.3, it is extracted as a join point of type $wgo :: Addr# -> Addr# -> State# RealWorld -> (# State# RealWorld, BuildSignal r #)
, while with 9.2.4, it keeps the type $wgo :: Addr# -> Addr# -> IO (BuildSignal r)
. Seemingly as a result, its recursive call in 9.2.4 lives in a lambda that ends up being allocated as a function closure after each byte processed. With ghc-9.2.4, every call site of $wgo_s6Gq
has two arguments, a cast, and one more argument. Why isn't it being eta-expanded?
9.2.3 simplified Core for byteStringHex
-- RHS size: {terms: 276, types: 242, coercions: 10, joins: 4/10}
Data.ByteString.Builder.ASCII.$wbyteStringHex [InlPrag=NOINLINE]
:: GHC.Prim.Addr#
-> GHC.ForeignPtr.ForeignPtrContents
-> GHC.Prim.Int#
-> forall {r}.
Data.ByteString.Builder.Internal.BuildStep r
-> GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r #)
[GblId,
Arity=7,
Str=<L><L><L><1CL(C1(L))><L><L><L>,
Unf=OtherCon []]
Data.ByteString.Builder.ASCII.$wbyteStringHex
= \ (ww_s6H2 :: GHC.Prim.Addr#)
(ww1_s6H3 :: GHC.ForeignPtr.ForeignPtrContents)
(ww2_s6H4 :: GHC.Prim.Int#)
(@r_s6GW)
(w_s6GX :: Data.ByteString.Builder.Internal.BuildStep r_s6GW)
(ww3_s6H8 :: GHC.Prim.Addr#)
(ww4_s6H9 :: GHC.Prim.Addr#)
(w1_s6GZ :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case w_s6GX of k_i6el { __DEFAULT ->
let {
ipe_s6CI :: GHC.Prim.Addr#
[LclId]
ipe_s6CI = GHC.Prim.plusAddr# ww_s6H2 ww2_s6H4 } in
letrec {
$wgoBS_s6GU [InlPrag=[2], Occ=LoopBreaker, Dmd=SCS(C1(C1(C1(L))))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GW #)
[LclId, Arity=4, Str=<L><L><L><L>, Unf=OtherCon []]
$wgoBS_s6GU
= \ (ww5_s6GN :: GHC.Prim.Addr#)
(ww6_s6GR :: GHC.Prim.Addr#)
(ww7_s6GS :: GHC.Prim.Addr#)
(w2_s6GK :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case GHC.Prim.ltAddr# ww5_s6GN ipe_s6CI of {
__DEFAULT ->
case GHC.Prim.touch#
@GHC.Types.LiftedRep
@GHC.ForeignPtr.ForeignPtrContents
ww1_s6H3
w2_s6GK
of s'_i6eA
{ __DEFAULT ->
((k_i6el
(Data.ByteString.Builder.Internal.BufferRange ww6_s6GR ww7_s6GS))
`cast` (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal r_s6GW>_R
:: IO (Data.ByteString.Builder.Internal.BuildSignal r_s6GW)
~R# (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GW #))))
s'_i6eA
};
1# ->
case GHC.Prim.ltAddr# ww7_s6GS (GHC.Prim.plusAddr# ww6_s6GR 2#)
of {
__DEFAULT ->
let {
x1_i6eI :: GHC.Prim.Int#
[LclId]
x1_i6eI
= GHC.Prim.uncheckedIShiftRA#
(GHC.Prim.minusAddr# ww7_s6GS ww6_s6GR) 1# } in
let {
y1_s6CM :: GHC.Prim.Int#
[LclId]
y1_s6CM = GHC.Prim.minusAddr# ipe_s6CI ww5_s6GN } in
case GHC.Prim.<=# x1_i6eI y1_s6CM of {
__DEFAULT ->
let {
ipeTmp_s6CQ :: GHC.Prim.Addr#
[LclId]
ipeTmp_s6CQ = GHC.Prim.plusAddr# ww5_s6GN y1_s6CM } in
join {
exit_X0 [Dmd=SCS(C1(C1(L)))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GW #)
[LclId[JoinId(3)], Arity=3, Str=<L><L><L>]
exit_X0 (ww8_s6GA [OS=OneShot] :: GHC.Prim.Addr#)
(ww9_s6GE [OS=OneShot] :: GHC.Prim.Addr#)
(w3_s6Gx [OS=OneShot] :: GHC.Prim.State# GHC.Prim.RealWorld)
= $wgoBS_s6GU ww8_s6GA ww9_s6GE ww7_s6GS w3_s6Gx } in
case GHC.Prim.ltAddr# ww5_s6GN ipeTmp_s6CQ of {
__DEFAULT -> jump exit_X0 ww5_s6GN ww6_s6GR w2_s6GK;
1# ->
case GHC.Prim.readWord8OffAddr#
@GHC.Prim.RealWorld ww5_s6GN 0# w2_s6GK
of
{ (# ipv3_i6eZ, ipv4_i6f0 #) ->
case Data.ByteString.Builder.Prim.Internal.Base16.lowerTable of
{ Data.ByteString.Builder.Prim.Internal.Base16.EncodingTable table_i6dI ->
case GHC.Prim.readWord16OffAddr#
@GHC.Prim.RealWorld
table_i6dI
(GHC.Prim.word2Int# (GHC.Prim.word8ToWord# ipv4_i6f0))
ipv3_i6eZ
of
{ (# ipv_i6dO, ipv1_i6dP #) ->
case GHC.Prim.writeWord16OffAddr#
@GHC.Prim.RealWorld ww6_s6GR 0# ipv1_i6dP ipv_i6dO
of s2_i6dU
{ __DEFAULT ->
joinrec {
$wgo_s6GG [InlPrag=[2], Occ=LoopBreaker, Dmd=SCS(C1(C1(L)))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GW #)
[LclId[JoinId(3)], Arity=3, Str=<L><L><L>, Unf=OtherCon []]
$wgo_s6GG (ww8_X1 :: GHC.Prim.Addr#)
(ww9_X2 :: GHC.Prim.Addr#)
(w3_X3 :: GHC.Prim.State# GHC.Prim.RealWorld)
= case GHC.Prim.ltAddr# ww8_X1 ipeTmp_s6CQ of {
__DEFAULT -> jump exit_X0 ww8_X1 ww9_X2 w3_X3;
1# ->
case GHC.Prim.readWord8OffAddr#
@GHC.Prim.RealWorld ww8_X1 0# w3_X3
of
{ (# ipv2_X6, ipv6_X7 #) ->
case GHC.Prim.readWord16OffAddr#
@GHC.Prim.RealWorld
table_i6dI
(GHC.Prim.word2Int# (GHC.Prim.word8ToWord# ipv6_X7))
ipv2_X6
of
{ (# ipv7_Xa, ipv8_Xb #) ->
case GHC.Prim.writeWord16OffAddr#
@GHC.Prim.RealWorld ww9_X2 0# ipv8_Xb ipv7_Xa
of s1_Xc
{ __DEFAULT ->
jump $wgo_s6GG
(GHC.Prim.plusAddr# ww8_X1 1#)
(GHC.Prim.plusAddr# ww9_X2 2#)
s1_Xc
}
}
}
}; } in
jump $wgo_s6GG
(GHC.Prim.plusAddr# ww5_s6GN 1#)
(GHC.Prim.plusAddr# ww6_s6GR 2#)
s2_i6dU
}
}
}
}
};
1# ->
let {
ipeTmp_s6CQ :: GHC.Prim.Addr#
[LclId]
ipeTmp_s6CQ = GHC.Prim.plusAddr# ww5_s6GN x1_i6eI } in
join {
exit_X0 [Dmd=SCS(C1(C1(L)))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GW #)
[LclId[JoinId(3)], Arity=3, Str=<L><L><L>]
exit_X0 (ww8_s6GA [OS=OneShot] :: GHC.Prim.Addr#)
(ww9_s6GE [OS=OneShot] :: GHC.Prim.Addr#)
(w3_s6Gx [OS=OneShot] :: GHC.Prim.State# GHC.Prim.RealWorld)
= $wgoBS_s6GU ww8_s6GA ww9_s6GE ww7_s6GS w3_s6Gx } in
case GHC.Prim.ltAddr# ww5_s6GN ipeTmp_s6CQ of {
__DEFAULT -> jump exit_X0 ww5_s6GN ww6_s6GR w2_s6GK;
1# ->
case GHC.Prim.readWord8OffAddr#
@GHC.Prim.RealWorld ww5_s6GN 0# w2_s6GK
of
{ (# ipv3_i6eZ, ipv4_i6f0 #) ->
case Data.ByteString.Builder.Prim.Internal.Base16.lowerTable of
{ Data.ByteString.Builder.Prim.Internal.Base16.EncodingTable table_i6dI ->
case GHC.Prim.readWord16OffAddr#
@GHC.Prim.RealWorld
table_i6dI
(GHC.Prim.word2Int# (GHC.Prim.word8ToWord# ipv4_i6f0))
ipv3_i6eZ
of
{ (# ipv_i6dO, ipv1_i6dP #) ->
case GHC.Prim.writeWord16OffAddr#
@GHC.Prim.RealWorld ww6_s6GR 0# ipv1_i6dP ipv_i6dO
of s2_i6dU
{ __DEFAULT ->
joinrec {
$wgo_s6GG [InlPrag=[2], Occ=LoopBreaker, Dmd=SCS(C1(C1(L)))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GW #)
[LclId[JoinId(3)], Arity=3, Str=<L><L><L>, Unf=OtherCon []]
$wgo_s6GG (ww8_X1 :: GHC.Prim.Addr#)
(ww9_X2 :: GHC.Prim.Addr#)
(w3_X3 :: GHC.Prim.State# GHC.Prim.RealWorld)
= case GHC.Prim.ltAddr# ww8_X1 ipeTmp_s6CQ of {
__DEFAULT -> jump exit_X0 ww8_X1 ww9_X2 w3_X3;
1# ->
case GHC.Prim.readWord8OffAddr#
@GHC.Prim.RealWorld ww8_X1 0# w3_X3
of
{ (# ipv2_X6, ipv6_X7 #) ->
case GHC.Prim.readWord16OffAddr#
@GHC.Prim.RealWorld
table_i6dI
(GHC.Prim.word2Int# (GHC.Prim.word8ToWord# ipv6_X7))
ipv2_X6
of
{ (# ipv7_Xa, ipv8_Xb #) ->
case GHC.Prim.writeWord16OffAddr#
@GHC.Prim.RealWorld ww9_X2 0# ipv8_Xb ipv7_Xa
of s1_Xc
{ __DEFAULT ->
jump $wgo_s6GG
(GHC.Prim.plusAddr# ww8_X1 1#)
(GHC.Prim.plusAddr# ww9_X2 2#)
s1_Xc
}
}
}
}; } in
jump $wgo_s6GG
(GHC.Prim.plusAddr# ww5_s6GN 1#)
(GHC.Prim.plusAddr# ww6_s6GR 2#)
s2_i6dU
}
}
}
}
}
};
1# ->
(# w2_s6GK,
Data.ByteString.Builder.Internal.BufferFull
@r_s6GW
2#
ww6_s6GR
((\ (w3_s6GJ :: Data.ByteString.Builder.Internal.BufferRange)
(w4_X1 :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case w3_s6GJ of
{ Data.ByteString.Builder.Internal.BufferRange ww9_X3 ww10_X4 ->
$wgoBS_s6GU ww5_s6GN ww9_X3 ww10_X4 w4_X1
})
`cast` (<Data.ByteString.Builder.Internal.BufferRange>_R
%<'Many>_N ->_R Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
r_s6GW>_R)
:: (Data.ByteString.Builder.Internal.BufferRange
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal
r_s6GW #))
~R# (Data.ByteString.Builder.Internal.BufferRange
-> IO
(Data.ByteString.Builder.Internal.BuildSignal
r_s6GW)))) #)
}
}; } in
$wgoBS_s6GU ww_s6H2 ww3_s6H8 ww4_s6H9 w1_s6GZ
}
-- RHS size: {terms: 19, types: 15, coercions: 0, joins: 0/0}
Data.ByteString.Builder.ASCII.byteStringHex1 [InlPrag=[final]]
:: S.ByteString
-> forall {r}.
Data.ByteString.Builder.Internal.BuildStep (r |> <*>_N)
-> Data.ByteString.Builder.Internal.BufferRange
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal (r |> <*>_N) #)
[GblId,
Arity=4,
Str=<1P(L,L,L)><1CL(C1(L))><1P(L,L)><L>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=4,unsat_ok=True,boring_ok=False)
Tmpl= \ (w_s6GV [Occ=Once1!] :: S.ByteString)
(@r_s6GW)
(w1_s6GX [Occ=Once1]
:: Data.ByteString.Builder.Internal.BuildStep r_s6GW)
(w2_s6GY [Occ=Once1!]
:: Data.ByteString.Builder.Internal.BufferRange)
(w3_s6GZ [Occ=Once1] :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case w_s6GV of
{ Data.ByteString.Internal.Type.BS ww1_s6H2 [Occ=Once1]
ww2_s6H3 [Occ=Once1] ww3_s6H4 [Occ=Once1] ->
case w2_s6GY of
{ Data.ByteString.Builder.Internal.BufferRange ww5_s6H8 [Occ=Once1]
ww6_s6H9 [Occ=Once1] ->
Data.ByteString.Builder.ASCII.$wbyteStringHex
ww1_s6H2
ww2_s6H3
ww3_s6H4
@r_s6GW
w1_s6GX
ww5_s6H8
ww6_s6H9
w3_s6GZ
}
}}]
Data.ByteString.Builder.ASCII.byteStringHex1
= \ (w_s6GV :: S.ByteString)
(@r_s6GW)
(w1_s6GX [OS=OneShot]
:: Data.ByteString.Builder.Internal.BuildStep r_s6GW)
(w2_s6GY [OS=OneShot]
:: Data.ByteString.Builder.Internal.BufferRange)
(w3_s6GZ [OS=OneShot] :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case w_s6GV of
{ Data.ByteString.Internal.Type.BS ww1_s6H2 ww2_s6H3 ww3_s6H4 ->
case w2_s6GY of
{ Data.ByteString.Builder.Internal.BufferRange ww5_s6H8 ww6_s6H9 ->
Data.ByteString.Builder.ASCII.$wbyteStringHex
ww1_s6H2
ww2_s6H3
ww3_s6H4
@r_s6GW
w1_s6GX
ww5_s6H8
ww6_s6H9
w3_s6GZ
}
}
-- RHS size: {terms: 1, types: 0, coercions: 21, joins: 0/0}
byteStringHex [InlPrag=[final]] :: S.ByteString -> Builder
[GblId,
Arity=4,
Str=<1P(L,L,L)><1CL(C1(L))><1P(L,L)><L>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=0,unsat_ok=True,boring_ok=True)
Tmpl= Data.ByteString.Builder.ASCII.byteStringHex1
`cast` (<S.ByteString>_R
%<'Many>_N ->_R forall (r :: <*>_N).
<Data.ByteString.Builder.Internal.BuildStep (r |> <*>_N)>_R
%<'Many>_N ->_R <Data.ByteString.Builder.Internal.BufferRange>_R
%<'Many>_N ->_R Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
(r |> <*>_N)>_R)
; Sym (Data.ByteString.Builder.Internal.N:Builder[0])
:: (S.ByteString
-> forall {r}.
Data.ByteString.Builder.Internal.BuildStep (r |> <*>_N)
-> Data.ByteString.Builder.Internal.BufferRange
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal (r |> <*>_N) #))
~R# (S.ByteString -> Builder))}]
byteStringHex
= Data.ByteString.Builder.ASCII.byteStringHex1
`cast` (<S.ByteString>_R
%<'Many>_N ->_R forall (r :: <*>_N).
<Data.ByteString.Builder.Internal.BuildStep (r |> <*>_N)>_R
%<'Many>_N ->_R <Data.ByteString.Builder.Internal.BufferRange>_R
%<'Many>_N ->_R Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
(r |> <*>_N)>_R)
; Sym (Data.ByteString.Builder.Internal.N:Builder[0])
:: (S.ByteString
-> forall {r}.
Data.ByteString.Builder.Internal.BuildStep (r |> <*>_N)
-> Data.ByteString.Builder.Internal.BufferRange
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal (r |> <*>_N) #))
~R# (S.ByteString -> Builder))
9.2.4 simplified Core for byteStringHex
-- RHS size: {terms: 172, types: 131, coercions: 25, joins: 1/7}
Data.ByteString.Builder.ASCII.$wbyteStringHex [InlPrag=NOINLINE]
:: GHC.Prim.Addr#
-> GHC.ForeignPtr.ForeignPtrContents
-> GHC.Prim.Int#
-> forall {r}.
Data.ByteString.Builder.Internal.BuildStep r
-> GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> IO (Data.ByteString.Builder.Internal.BuildSignal r)
[GblId, Arity=6, Str=<L><L><L><1CL(C1(L))><L><L>, Unf=OtherCon []]
Data.ByteString.Builder.ASCII.$wbyteStringHex
= \ (ww_s6GK :: GHC.Prim.Addr#)
(ww1_s6GL :: GHC.ForeignPtr.ForeignPtrContents)
(ww2_s6GM :: GHC.Prim.Int#)
(@r_s6GF)
(w_s6GG :: Data.ByteString.Builder.Internal.BuildStep r_s6GF)
(ww3_s6GQ :: GHC.Prim.Addr#)
(ww4_s6GR :: GHC.Prim.Addr#) ->
case w_s6GG of k_i6ei { __DEFAULT ->
let {
ipe_s6Cw :: GHC.Prim.Addr#
[LclId]
ipe_s6Cw = GHC.Prim.plusAddr# ww_s6GK ww2_s6GM } in
letrec {
$wgoBS_s6I9 [InlPrag=[2], Occ=LoopBreaker, Dmd=SCS(C1(C1(L)))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GF #)
[LclId, Arity=4, Str=<L><L><L><L>, Unf=OtherCon []]
$wgoBS_s6I9
= \ (ww5_s6Gw :: GHC.Prim.Addr#)
(ww6_s6GA :: GHC.Prim.Addr#)
(ww7_s6GB :: GHC.Prim.Addr#)
(eta_B0 [OS=OneShot] :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case GHC.Prim.ltAddr# ww5_s6Gw ipe_s6Cw of {
__DEFAULT ->
case GHC.Prim.touch#
@GHC.Types.LiftedRep
@GHC.ForeignPtr.ForeignPtrContents
ww1_s6GL
eta_B0
of s'_i6ex
{ __DEFAULT ->
((k_i6ei
(Data.ByteString.Builder.Internal.BufferRange ww6_s6GA ww7_s6GB))
`cast` (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal r_s6GF>_R
:: IO (Data.ByteString.Builder.Internal.BuildSignal r_s6GF)
~R# (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GF #))))
s'_i6ex
};
1# ->
case GHC.Prim.ltAddr# ww7_s6GB (GHC.Prim.plusAddr# ww6_s6GA 2#)
of {
__DEFAULT ->
let {
x1_i6eF :: GHC.Prim.Int#
[LclId]
x1_i6eF
= GHC.Prim.uncheckedIShiftRA#
(GHC.Prim.minusAddr# ww7_s6GB ww6_s6GA) 1# } in
let {
y1_s6CA :: GHC.Prim.Int#
[LclId]
y1_s6CA = GHC.Prim.minusAddr# ipe_s6Cw ww5_s6Gw } in
join {
$j_s6Cz [Dmd=1C1(L)]
:: GHC.Prim.Int#
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GF #)
[LclId[JoinId(1)], Arity=1, Str=<L>, Unf=OtherCon []]
$j_s6Cz (d_i6eI [OS=OneShot] :: GHC.Prim.Int#)
= let {
ipeTmp_s6CE :: GHC.Prim.Addr#
[LclId]
ipeTmp_s6CE = GHC.Prim.plusAddr# ww5_s6Gw d_i6eI } in
case GHC.Prim.ltAddr# ww5_s6Gw ipeTmp_s6CE of {
__DEFAULT -> $wgoBS_s6I9 ww5_s6Gw ww6_s6GA ww7_s6GB eta_B0;
1# ->
case GHC.Prim.readWord8OffAddr#
@GHC.Prim.RealWorld ww5_s6Gw 0# eta_B0
of
{ (# ipv3_i6eW, ipv4_i6eX #) ->
case Data.ByteString.Builder.Prim.Internal.Base16.lowerTable of
{ Data.ByteString.Builder.Prim.Internal.Base16.EncodingTable table_i6dG ->
case GHC.Prim.readWord16OffAddr#
@GHC.Prim.RealWorld
table_i6dG
(GHC.Prim.word2Int# (GHC.Prim.word8ToWord# ipv4_i6eX))
ipv3_i6eW
of
{ (# ipv_i6dM, ipv1_i6dN #) ->
case GHC.Prim.writeWord16OffAddr#
@GHC.Prim.RealWorld ww6_s6GA 0# ipv1_i6dN ipv_i6dM
of s2_i6dS
{ __DEFAULT ->
letrec {
$wgo_s6Gq [InlPrag=[2], Occ=LoopBreaker, Dmd=SCS(C1(C1(L)))]
:: GHC.Prim.Addr#
-> GHC.Prim.Addr#
-> IO (Data.ByteString.Builder.Internal.BuildSignal r_s6GF)
[LclId, Arity=2, Str=<L><L>, Unf=OtherCon []]
$wgo_s6Gq
= \ (ww8_X1 :: GHC.Prim.Addr#) (ww9_X2 :: GHC.Prim.Addr#) ->
case GHC.Prim.ltAddr# ww8_X1 ipeTmp_s6CE of {
__DEFAULT ->
($wgoBS_s6I9 ww8_X1 ww9_X2 ww7_s6GB)
`cast` (Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
r_s6GF>_R)
:: (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal
r_s6GF #))
~R# IO
(Data.ByteString.Builder.Internal.BuildSignal
r_s6GF));
1# ->
(\ (s_X4 :: GHC.Prim.State# GHC.Prim.RealWorld) ->
case GHC.Prim.readWord8OffAddr#
@GHC.Prim.RealWorld ww8_X1 0# s_X4
of
{ (# ipv2_X6, ipv6_X7 #) ->
case GHC.Prim.readWord16OffAddr#
@GHC.Prim.RealWorld
table_i6dG
(GHC.Prim.word2Int#
(GHC.Prim.word8ToWord# ipv6_X7))
ipv2_X6
of
{ (# ipv7_Xa, ipv8_Xb #) ->
case GHC.Prim.writeWord16OffAddr#
@GHC.Prim.RealWorld ww9_X2 0# ipv8_Xb ipv7_Xa
of s1_Xc
{ __DEFAULT ->
(($wgo_s6Gq
(GHC.Prim.plusAddr# ww8_X1 1#)
(GHC.Prim.plusAddr# ww9_X2 2#))
`cast` (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
r_s6GF>_R
:: IO
(Data.ByteString.Builder.Internal.BuildSignal
r_s6GF)
~R# (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State#
GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal
r_s6GF #))))
s1_Xc
}
}
})
`cast` (Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
r_s6GF>_R)
:: (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal
r_s6GF #))
~R# IO
(Data.ByteString.Builder.Internal.BuildSignal
r_s6GF))
}; } in
(($wgo_s6Gq
(GHC.Prim.plusAddr# ww5_s6Gw 1#)
(GHC.Prim.plusAddr# ww6_s6GA 2#))
`cast` (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal r_s6GF>_R
:: IO (Data.ByteString.Builder.Internal.BuildSignal r_s6GF)
~R# (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal
r_s6GF #))))
s2_i6dS
}
}
}
}
} } in
case GHC.Prim.<=# x1_i6eF y1_s6CA of {
__DEFAULT -> jump $j_s6Cz y1_s6CA;
1# -> jump $j_s6Cz x1_i6eF
};
1# ->
(# eta_B0,
Data.ByteString.Builder.Internal.BufferFull
@r_s6GF
2#
ww6_s6GA
(\ (w1_s6Gt :: Data.ByteString.Builder.Internal.BufferRange) ->
case w1_s6Gt of
{ Data.ByteString.Builder.Internal.BufferRange ww9_X2 ww10_X3 ->
($wgoBS_s6I9 ww5_s6Gw ww9_X2 ww10_X3)
`cast` (Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal
r_s6GF>_R)
:: (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal
r_s6GF #))
~R# IO
(Data.ByteString.Builder.Internal.BuildSignal
r_s6GF))
}) #)
}
}; } in
($wgoBS_s6I9 ww_s6GK ww3_s6GQ ww4_s6GR)
`cast` (Sym (GHC.Types.N:IO[0]
<Data.ByteString.Builder.Internal.BuildSignal r_s6GF>_R)
:: (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld,
Data.ByteString.Builder.Internal.BuildSignal r_s6GF #))
~R# IO (Data.ByteString.Builder.Internal.BuildSignal r_s6GF))
}
-- RHS size: {terms: 17, types: 13, coercions: 0, joins: 0/0}
Data.ByteString.Builder.ASCII.byteStringHex1 [InlPrag=[final]]
:: S.ByteString
-> forall r.
Data.ByteString.Builder.Internal.BuildStep r
-> Data.ByteString.Builder.Internal.BuildStep r
[GblId,
Arity=3,
Str=<1P(L,L,L)><1CL(C1(L))><1P(L,L)>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=3,unsat_ok=True,boring_ok=False)
Tmpl= \ (w_s6GE [Occ=Once1!] :: S.ByteString)
(@r_s6GF)
(w1_s6GG [Occ=Once1]
:: Data.ByteString.Builder.Internal.BuildStep r_s6GF)
(w2_s6GH [Occ=Once1!]
:: Data.ByteString.Builder.Internal.BufferRange) ->
case w_s6GE of
{ Data.ByteString.Internal.Type.BS ww1_s6GK [Occ=Once1]
ww2_s6GL [Occ=Once1] ww3_s6GM [Occ=Once1] ->
case w2_s6GH of
{ Data.ByteString.Builder.Internal.BufferRange ww5_s6GQ [Occ=Once1]
ww6_s6GR [Occ=Once1] ->
Data.ByteString.Builder.ASCII.$wbyteStringHex
ww1_s6GK ww2_s6GL ww3_s6GM @r_s6GF w1_s6GG ww5_s6GQ ww6_s6GR
}
}}]
Data.ByteString.Builder.ASCII.byteStringHex1
= \ (w_s6GE :: S.ByteString)
(@r_s6GF)
(w1_s6GG [OS=OneShot]
:: Data.ByteString.Builder.Internal.BuildStep r_s6GF)
(w2_s6GH [OS=OneShot]
:: Data.ByteString.Builder.Internal.BufferRange) ->
case w_s6GE of
{ Data.ByteString.Internal.Type.BS ww1_s6GK ww2_s6GL ww3_s6GM ->
case w2_s6GH of
{ Data.ByteString.Builder.Internal.BufferRange ww5_s6GQ ww6_s6GR ->
Data.ByteString.Builder.ASCII.$wbyteStringHex
ww1_s6GK ww2_s6GL ww3_s6GM @r_s6GF w1_s6GG ww5_s6GQ ww6_s6GR
}
}
-- RHS size: {terms: 1, types: 0, coercions: 5, joins: 0/0}
byteStringHex [InlPrag=[final]] :: S.ByteString -> Builder
[GblId,
Arity=3,
Str=<1P(L,L,L)><1CL(C1(L))><1P(L,L)>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=0,unsat_ok=True,boring_ok=True)
Tmpl= Data.ByteString.Builder.ASCII.byteStringHex1
`cast` (<S.ByteString>_R
%<'Many>_N ->_R Sym (Data.ByteString.Builder.Internal.N:Builder[0])
:: (S.ByteString
-> forall r.
Data.ByteString.Builder.Internal.BuildStep r
-> Data.ByteString.Builder.Internal.BuildStep r)
~R# (S.ByteString -> Builder))}]
byteStringHex
= Data.ByteString.Builder.ASCII.byteStringHex1
`cast` (<S.ByteString>_R
%<'Many>_N ->_R Sym (Data.ByteString.Builder.Internal.N:Builder[0])
:: (S.ByteString
-> forall r.
Data.ByteString.Builder.Internal.BuildStep r
-> Data.ByteString.Builder.Internal.BuildStep r)
~R# (S.ByteString -> Builder))