[GHC] #1687: A faster (^)-function.

GHC ghc-devs at haskell.org
Wed Oct 26 04:55:04 UTC 2016


#1687: A faster (^)-function.
--------------------------------------------+-----------------------------
        Reporter:  moonlite@…               |                Owner:
            Type:  bug                      |               Status:  new
        Priority:  normal                   |            Milestone:  ⊥
       Component:  Prelude                  |              Version:  6.6.1
      Resolution:                           |             Keywords:
Operating System:  Linux                    |         Architecture:  x86
 Type of failure:  Runtime performance bug  |            Test Case:
      Blocked By:                           |             Blocking:
 Related Tickets:                           |  Differential Rev(s):
       Wiki Page:                           |
--------------------------------------------+-----------------------------

Comment (by siddhanathan):

 rwbarton explained this earlier, but it took a while to wrap my head
 around it.

 I find this a bit clearer to understand:


 {{{
 {-# SPECIALISE [1] (^) ::
         Integer -> Integer -> Integer,
         Integer -> Int -> Integer,
         Int -> Int -> Int #-}
 {-# INLINABLE [1] (^) #-}    -- See Note [Inlining (^)]
 (^) :: (Num a, Integral b) => a -> b -> a
 x0 ^ y0 | y0 < 0    = errorWithoutStackTrace "Negative exponent"
         | y0 == 0   = 1
         | otherwise = f x0 y0 1
     where
           f x y z | even y    = let k = f x (y `quot` 2) z in k * k
                   | y == 1    = x * z
                   | otherwise = let k = f x ((y - 1) `quot` 2) z in k * k
 * x

 }}}

 This has identical performance to the version in the description above.

 This makes use of the fact that x^2a^ = x^a+a^ = x^a^ * x^a^ ; and x^2a+1^
 = x^a^ * x^a^ * x

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/1687#comment:18>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list