Specialiser doesn't see through source location annotations
Unfortunately, this is a similar situation to #21489 (closed) in that I haven't found a way to trigger this problem with vanilla GHC, but it does occur on the fork I've been working on.
It seems that when the specialiser is collecting usage details and encounters an application, if the application head is a Var
wrapped in Tick
s or Cast
s, then this occurrence is not recorded:
specExpr env expr@(App {})
= go expr []
where
go (App fun arg) args = do (arg', uds_arg) <- specExpr env arg
(fun', uds_app) <- go fun (arg':args)
return (App fun' arg', uds_arg `plusUDs` uds_app)
go (Var f) args = case specVar env f of
Var f' -> return (Var f', mkCallUDs env f' args)
e' -> return (e', emptyUDs) -- I don't expect this!
go other _ = specExpr env other
This is a problem if e.g. -finfo-table-map
is turned on, since the Tick
containing the source location can now inhibit a specialisation that would otherwise happen without the source locations.