[GHC] #8252: prefetch# isn't as general as it should be (currently the general version isn't type safe)

#8252: prefetch# isn't as general as it should be (currently the general version isn't type safe) ------------------------------------+------------------------------------- Reporter: carter | Owner: Type: feature request | Status: new Priority: normal | Milestone: 7.10.1 Component: Compiler | Version: 7.7 Keywords: | Operating System: Unknown/Multiple Architecture: Unknown/Multiple | Type of failure: None/Unknown Difficulty: Unknown | Test Case: Blocked By: 8107 | Blocking: Related Tickets: 8107 | ------------------------------------+------------------------------------- the fully general prefetch# needs to have certain arguments be compile time constants, see #8107 Internally ghc's prefetch# uses the prefetch intrinsic from lvm, compiler/llvmGen/LlvmCodeGen/CodeGen.hs with the following hard coded arguments {{{ ver <= 29 = [mkIntLit i32 0, mkIntLit i32 3] otherwise = [mkIntLit i32 0, mkIntLit i32 3, mkIntLit i32 1] }}} this correspond roughly (ignoring what the int arg to ghc means,it clearly not the analogue of the c compiler prefetch level, as i originally thoug ) prefetch# addr _ | ver <= 29 = llvm29.prefetch addr 0 3 |otherwise = llvm3.prefetch addr 0 3 1 Now: reading the LLVM language spec http://llvm.org/docs/LangRef.html #llvm-prefetch-intrinsic documents what this is supposed to, namely {{{ Syntax:¶ declare void @llvm.prefetch(i8* <address>, i32 <rw>, i32 <locality>, i32 <cache type>) Overview: The ‘llvm.prefetch‘ intrinsic is a hint to the code generator to insert a prefetch instruction if supported; otherwise, it is a noop. Prefetches have no effect on the behavior of the program but can change its performance characteristics. Arguments: address is the address to be prefetched, rw is the specifier determining if the fetch should be for a read (0) or write (1), and locality is a temporal locality specifier ranging from (0) - no locality, to (3) - extremely local keep in cache. The cache type specifies whether the prefetch is performed on the data (1) or instruction (0) cache. The rw, locality and cache type arguments must be constant integers. }}} Its important to note and emphasize that many of the alternative parameter settings have actual implementations on many modern hardware targets (especially x86_64), and can be useful for a variety of workloads. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8252 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#8252: prefetch# isn't as general as it should be (currently the general version isn't type safe) -------------------------------------+------------------------------------ Reporter: carter | Owner: Type: feature request | Status: new Priority: normal | Milestone: 7.10.1 Component: Compiler | Version: 7.7 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: 8107 Blocking: | Related Tickets: #8107 -------------------------------------+------------------------------------ Changes (by carter): * related: 8107 => #8107 -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8252#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC