[GHC] #13904: LLVM does not need to trash callee-saved registers.

GHC ghc-devs at haskell.org
Fri Jun 30 13:56:02 UTC 2017


#13904: LLVM does not need to trash callee-saved registers.
-------------------------------------+-------------------------------------
           Reporter:  kavon          |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:  llvm, codegen  |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Compile-time
  Unknown/Multiple                   |  performance bug
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:  #4992
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 **Summary**: This ticket is a simplification of the LLVM backend that I
 already plan to do in another branch, but I'd like to push the patch into
 `master`, and then merge from `master` into that branch.

 The LLVM backend attempts to trash the physical registers corresponding to
 Rx, Fx, and Dx registers that are caller-saved before an FFI call by
 emitting a sequence such as this:

 {{{#!llvm
   store i64 undef, i64* %R3_Var
   store i64 undef, i64* %R4_Var
   store i64 undef, i64* %R5_Var
   store i64 undef, i64* %R6_Var
   store float undef, float* %F1_Var
   store double undef, double* %D1_Var
   store float undef, float* %F2_Var
   store double undef, double* %D2_Var
   store float undef, float* %F3_Var
   store double undef, double* %D3_Var
   store float undef, float* %F4_Var
   store double undef, double* %D4_Var
   store float undef, float* %F5_Var
   store double undef, double* %D5_Var
   store float undef, float* %F6_Var
   store double undef, double* %D6_Var
   %ln7bu = call ccc double (double) @llvm.sin.f64( double %ln7bs )
 nounwind
 }}}

 Where the Rx/Fx/Dx registers are chosen based on what physical register
 those global registers map to, and whether those physical registers are
 caller-saved according to the C ABI.

 I'm certain this is unnecessary, as there is no way to know the physical
 register corresponding to those vars within an LLVM IR function. The
 calling convention used for the FFI call will preserve caller-saved
 registers as needed, i.e., only if such a value is needed after the call.

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


More information about the ghc-tickets mailing list