Skip to content

Invalid transformation in simplOptExpr

Prior to this commit, CoreOpt.simple_opt_expr transforms

     case e of (b :: t1 ~# t2)
       DEFAULT -> rhs
==>
     rhs

That was plain wrong when e diverges, or calls error. Hence the commit.

But the commit does this

     case Coercible_sc e of (b :: t1 ~# t2)
       DEFAULT -> rhs
==>
     rhs

narrowing the scope of the transformation to when the scrutinee is application of the Coercible superclass selector

  Coercible_sc :: Coercible a b -> (a ~R# b)

Here's the code from CoreOpt:

      | isDeadBinder b
      , [(DEFAULT, _, rhs)] <- as
      , isCoercionType (varType b)
      , (Var fun, _args) <- collectArgs e
      , fun `hasKey` coercibleSCSelIdKey
         -- without this last check, we get #11230
      = go rhs

But that's bizarrely ad-hoc. And, worse, it is flat-out wrong... what if e diverges?

It's not actually hurting anyone right now, but what we should really do is use exprOkForSpeculation; and teach exprOkForSpeculation how to deal with class-op selectors.

Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information