Skip to content
  • Simon Peyton Jones's avatar
    74ad75e8
    Re-implement unsafe coercions in terms of unsafe equality proofs · 74ad75e8
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    
    
    (Commit message written by Omer, most of the code is written by Simon
    and Richard)
    
    See Note [Implementing unsafeCoerce] for how unsafe equality proofs and
    the new unsafeCoerce# are implemented.
    
    New notes added:
    
    - [Checking for levity polymorphism] in CoreLint.hs
    - [Implementing unsafeCoerce] in base/Unsafe/Coerce.hs
    - [Patching magic definitions] in Desugar.hs
    - [Wiring in unsafeCoerce#] in Desugar.hs
    
    Only breaking change in this patch is unsafeCoerce# is not exported from
    GHC.Exts, instead of GHC.Prim.
    
    Fixes #17443
    Fixes #16893
    
    NoFib
    -----
    
    --------------------------------------------------------------------------------
            Program           Size    Allocs    Instrs     Reads    Writes
    --------------------------------------------------------------------------------
                 CS          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                CSD          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                 FS          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                  S          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                 VS          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                VSD          -0.1%      0.0%     -0.0%     -0.0%     -0.1%
                VSM          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               anna          -0.0%      0.0%     -0.0%     -0.0%     -0.0%
               ansi          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               atom          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             awards          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             banner          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
         bernouilli          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       binary-trees          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              boyer          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             boyer2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               bspt          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          cacheprof          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           calendar          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           cichelli          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            circsim          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           clausify          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
      comp_lab_zift          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           compress          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          compress2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
        constraints          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       cryptarithm1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       cryptarithm2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                cse          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       digits-of-e1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       digits-of-e2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             dom-lt          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              eliza          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              event          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
        exact-reals          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             exp3_8          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             expert          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
     fannkuch-redux          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              fasta          -0.1%      0.0%     -0.5%     -0.3%     -0.4%
                fem          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                fft          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               fft2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           fibheaps          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               fish          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              fluid          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             fulsom          -0.1%      0.0%     +0.0%     +0.0%     +0.0%
             gamteb          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                gcd          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
        gen_regexps          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             genfft          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                 gg          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               grep          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             hidden          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                hpg          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                ida          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              infer          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            integer          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          integrate          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       k-nucleotide          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              kahan          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            knights          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             lambda          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
         last-piece          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               lcss          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               life          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               lift          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             linear          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          listcompr          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           listcopy          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           maillist          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             mandel          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            mandel2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               mate          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            minimax          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            mkhprog          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
         multiplier          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             n-body          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           nucleic2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               para          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          paraffins          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             parser          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            parstof          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                pic          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           pidigits          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              power          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             pretty          -0.1%      0.0%     -0.1%     -0.1%     -0.1%
             primes          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          primetest          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             prolog          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             puzzle          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             queens          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            reptile          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
    reverse-complem          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            rewrite          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               rfib          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                rsa          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                scc          -0.1%      0.0%     -0.1%     -0.1%     -0.1%
              sched          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                scs          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             simple          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              solid          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            sorting          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
      spectral-norm          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             sphere          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             symalg          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                tak          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          transform          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           treejoin          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          typecheck          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            veritas          -0.0%      0.0%     -0.0%     -0.0%     -0.0%
               wang          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          wave4main          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       wheel-sieve1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       wheel-sieve2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               x2n1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
    --------------------------------------------------------------------------------
                Min          -0.1%      0.0%     -0.5%     -0.3%     -0.4%
                Max          -0.0%      0.0%     +0.0%     +0.0%     +0.0%
     Geometric Mean          -0.1%     -0.0%     -0.0%     -0.0%     -0.0%
    
    Test changes
    ------------
    
    - break006 is marked as broken, see #17833
    - The compiler allocates less when building T14683 (an unsafeCoerce#-
      heavy happy-generated code) on 64-platforms. Allocates more on 32-bit
      platforms.
    - Rest of the increases are tiny amounts (still enough to pass the
      threshold) in micro-benchmarks. I briefly looked at each one in a
      profiling build: most of the increased allocations seem to be because
      of random changes in the generated code.
    
    Metric Decrease:
        T14683
    
    Metric Increase:
        T12150
        T12234
        T12425
        T13035
        T14683
        T5837
        T6048
    
    Co-Authored-By: default avatarRichard Eisenberg <rae@cs.brynmawr.edu>
    Co-Authored-By: default avatarÖmer Sinan Ağacan <omeragacan@gmail.com>
    74ad75e8
    Re-implement unsafe coercions in terms of unsafe equality proofs
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    
    
    (Commit message written by Omer, most of the code is written by Simon
    and Richard)
    
    See Note [Implementing unsafeCoerce] for how unsafe equality proofs and
    the new unsafeCoerce# are implemented.
    
    New notes added:
    
    - [Checking for levity polymorphism] in CoreLint.hs
    - [Implementing unsafeCoerce] in base/Unsafe/Coerce.hs
    - [Patching magic definitions] in Desugar.hs
    - [Wiring in unsafeCoerce#] in Desugar.hs
    
    Only breaking change in this patch is unsafeCoerce# is not exported from
    GHC.Exts, instead of GHC.Prim.
    
    Fixes #17443
    Fixes #16893
    
    NoFib
    -----
    
    --------------------------------------------------------------------------------
            Program           Size    Allocs    Instrs     Reads    Writes
    --------------------------------------------------------------------------------
                 CS          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                CSD          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                 FS          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                  S          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                 VS          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                VSD          -0.1%      0.0%     -0.0%     -0.0%     -0.1%
                VSM          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               anna          -0.0%      0.0%     -0.0%     -0.0%     -0.0%
               ansi          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               atom          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             awards          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             banner          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
         bernouilli          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       binary-trees          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              boyer          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             boyer2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               bspt          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          cacheprof          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           calendar          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           cichelli          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            circsim          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           clausify          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
      comp_lab_zift          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           compress          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          compress2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
        constraints          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       cryptarithm1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       cryptarithm2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                cse          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       digits-of-e1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       digits-of-e2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             dom-lt          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              eliza          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              event          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
        exact-reals          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             exp3_8          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             expert          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
     fannkuch-redux          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              fasta          -0.1%      0.0%     -0.5%     -0.3%     -0.4%
                fem          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                fft          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               fft2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           fibheaps          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               fish          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              fluid          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             fulsom          -0.1%      0.0%     +0.0%     +0.0%     +0.0%
             gamteb          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                gcd          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
        gen_regexps          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             genfft          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                 gg          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               grep          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             hidden          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                hpg          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                ida          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              infer          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            integer          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          integrate          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       k-nucleotide          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              kahan          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            knights          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             lambda          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
         last-piece          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               lcss          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               life          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               lift          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             linear          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          listcompr          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           listcopy          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           maillist          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             mandel          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            mandel2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               mate          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            minimax          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            mkhprog          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
         multiplier          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             n-body          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           nucleic2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               para          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          paraffins          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             parser          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            parstof          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                pic          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           pidigits          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              power          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             pretty          -0.1%      0.0%     -0.1%     -0.1%     -0.1%
             primes          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          primetest          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             prolog          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             puzzle          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             queens          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            reptile          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
    reverse-complem          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            rewrite          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               rfib          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                rsa          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                scc          -0.1%      0.0%     -0.1%     -0.1%     -0.1%
              sched          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                scs          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             simple          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
              solid          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            sorting          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
      spectral-norm          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             sphere          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
             symalg          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
                tak          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          transform          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
           treejoin          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          typecheck          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
            veritas          -0.0%      0.0%     -0.0%     -0.0%     -0.0%
               wang          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
          wave4main          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       wheel-sieve1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
       wheel-sieve2          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
               x2n1          -0.1%      0.0%     -0.0%     -0.0%     -0.0%
    --------------------------------------------------------------------------------
                Min          -0.1%      0.0%     -0.5%     -0.3%     -0.4%
                Max          -0.0%      0.0%     +0.0%     +0.0%     +0.0%
     Geometric Mean          -0.1%     -0.0%     -0.0%     -0.0%     -0.0%
    
    Test changes
    ------------
    
    - break006 is marked as broken, see #17833
    - The compiler allocates less when building T14683 (an unsafeCoerce#-
      heavy happy-generated code) on 64-platforms. Allocates more on 32-bit
      platforms.
    - Rest of the increases are tiny amounts (still enough to pass the
      threshold) in micro-benchmarks. I briefly looked at each one in a
      profiling build: most of the increased allocations seem to be because
      of random changes in the generated code.
    
    Metric Decrease:
        T14683
    
    Metric Increase:
        T12150
        T12234
        T12425
        T13035
        T14683
        T5837
        T6048
    
    Co-Authored-By: default avatarRichard Eisenberg <rae@cs.brynmawr.edu>
    Co-Authored-By: default avatarÖmer Sinan Ağacan <omeragacan@gmail.com>
Loading