[GHC] #14375: Implement with# primop
GHC
ghc-devs at haskell.org
Tue Nov 27 13:51:03 UTC 2018
#14375: Implement with# primop
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: bgamari
Type: bug | Status: new
Priority: highest | Milestone: 8.8.1
Component: Compiler | Version: 8.2.1
Resolution: | Keywords: JoinPoints
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: #14346 | Differential Rev(s): ​Phab:D4110,
Wiki Page: | Phab:D4189
-------------------------------------+-------------------------------------
Comment (by tdammers):
Updated Phab:D4110 with the original patch rebased onto master.
Also added two tests.
The first one, `T14375`, is a slightly modified version of the small test
case from comment:14:ticket:14346; the original reproduction case is
unsuitable for testsuite use due to the crucially important use of
`forever`, but by throwing an exception, we can stop execution while still
tricking the optimizer into considering the code after `forever`
unreachable. I have verified that this test fails on GHC 8.2 and passes
after this patch. However, due to other changes in the meantime, it also
passes on GHC versions just before the patch, even when we disable the
obvious suspect (`NOINLINE` pragmas on the `alloca...` functions, the
previous workaround), so there must be yet something else going on.
The second test case, `T14375-2`, was suggested by bgamari in a private
chat. The idea is to verify the correct operation of the new `with#`
primop by using it on a binding that is also the key of a weak pointer,
using its finalizer to attach observable behavior to its deallocation.
This way, we can tell from the test output whether the finalizer runs
before or after the end of the block wrapped in `with#`. Unfortunately,
finalizers are somewhat unpredictable creatures, and so the test case is
somewhat brittle - in order to actually see the finalizer running, the
test has to be compiled unoptimized, and the `threadDelay` calls in
strategic locations are needed to trigger GC. Obviously, since we're using
the new `with#` primop directly in this second test, it is impossible to
verify that it fixes anything; it just tells us that `with#` behaves as
expected in this case.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14375#comment:22>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list