Skip to content
  • Simon Peyton Jones's avatar
    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