Skip to content

Rule matching regression

This shows up in the Quickhull benchmark from the vector package. I haven't been able to come up with a smaller example so far. To reproduce, download vector-0.9.1, compile benchmarks/Algo/Quickhull.hs with -O2 and look at the output of simplifier phase 2.

The bit in question is this (in hsplit, in the let-binding for packed):

                (Data.Vector.Generic.stream
                   @ Data.Vector.Unboxed.Base.Vector
                   @ ((GHC.Types.Double, GHC.Types.Double), GHC.Types.Double)
                   $dVector_a1uD
                   (Data.Vector.Generic.new
                      @ Data.Vector.Unboxed.Base.Vector
                      @ ((GHC.Types.Double, GHC.Types.Double), GHC.Types.Double)
                      $dVector_a1nZ
                      (Data.Vector.Generic.New.unstream
                         @ Data.Vector.Unboxed.Base.Vector
                         @ ((GHC.Types.Double, GHC.Types.Double), GHC.Types.Double)
                         $dVector_a1nZ
                         ...

The two dictionaries here are actually equivalent:

$dVector_a1nZ
  :: Data.Vector.Generic.Base.Vector
       Data.Vector.Unboxed.Base.Vector
       ((GHC.Types.Double, GHC.Types.Double), GHC.Types.Double)
$dVector_a1nZ =
  Data.Vector.Unboxed.Base.$fVectorVector(,)
    @ (GHC.Types.Double, GHC.Types.Double)
    @ GHC.Types.Double
    $dUnbox_s1ne
    Data.Vector.Unboxed.Base.$fUnboxDouble

$dVector_a1uD
  :: Data.Vector.Generic.Base.Vector
       Data.Vector.Unboxed.Base.Vector
       ((GHC.Types.Double, GHC.Types.Double), GHC.Types.Double)
$dVector_a1uD =
  Data.Vector.Unboxed.Base.$fVectorVector(,)
    @ (GHC.Types.Double, GHC.Types.Double)
    @ GHC.Types.Double
    $dUnbox_s1ne
    Data.Vector.Unboxed.Base.$fUnboxDouble

The bit of code in question should be fused away by this rule in Data/Vector/Generic.hs:

"stream/unstream [Vector]" forall s.
  stream (new (New.unstream s)) = s

But this isn't happening, I suspect because the dictionary arguments don't match. This was working fine in 7.2.2 which also didn't generate duplicate dictionary bindings.

Trac metadata
Trac field Value
Version 7.5
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