[GHC] #6084: Add stg_ap_pnnv and related call patterns
GHC
ghc-devs at haskell.org
Fri Sep 15 09:16:41 UTC 2017
#6084: Add stg_ap_pnnv and related call patterns
-------------------------------------+-------------------------------------
Reporter: SimonMeier | Owner: simonmar
Type: feature request | Status: closed
Priority: high | Milestone: 7.8.1
Component: Runtime System | Version: 7.7
Resolution: fixed | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking: 8313
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by angerman):
`-fllvm` with LLVM5 and GHC at `8a1de424`, generates some rather
interesting IR with -O2:
https://ghc.haskell.org/trac/ghc/attachment/ticket/6084/T6084.ll
specifically
{{{
...
%ln4QS = bitcast void (i64*, i64*, i64*, i64, i64, i64, i64, i64, i64,
i64)* @Main_p_info$def to void (i64*, i64*, i64*, i64, i64, i64, i64, i64,
i64, i64, float, double)*
%ln4QT = load i64*, i64** %Sp_Var
%ln4QU = load i64, i64* %R1_Var
%ln4QV = load i64, i64* %R2_Var
%ln4QW = load float, float* %F1_Var
%ln4QX = load double, double* %D2_Var
tail call ghccc void (i64*, i64*, i64*, i64, i64, i64, i64, i64, i64,
i64, float, double) %ln4QS( i64* %Base_Arg, i64* %ln4QT, i64* %Hp_Arg, i64
%ln4QU, i64 %ln4QV, i64 undef, i64 undef, i64 undef, i64 undef, i64
%SpLim_Arg, float %ln4QW, double %ln4QX ) nounwind
ret void
}
@Main_p_info = alias i8, bitcast (void (i64*, i64*, i64*, i64, i64, i64,
i64, i64, i64, i64)* @Main_p_info$def to i8*)
define ghccc void @Main_p_info$def(i64* noalias nocapture %Base_Arg, i64*
noalias nocapture %Sp_Arg, i64* noalias nocapture %Hp_Arg, i64 %R1_Arg,
i64 %R2_Arg, i64 %R3_Arg, i64 %R4_Arg, i64 %R5_Arg, i64 %R6_Arg, i64
%SpLim_Arg) align 8 nounwind prefix <{i64, i64, i64, i64, i64, i64}><{i64
add (i64 sub (i64 ptrtoint (void (i64*, i64*, i64*, i64, i64, i64, i64,
i64, i64, i64)* @Main_p_slow$def to i64),i64 ptrtoint (void (i64*, i64*,
i64*, i64, i64, i64, i64, i64, i64, i64)* @Main_p_info$def to i64)),i64
0), i64 451, i64 add (i64 sub (i64 ptrtoint (%S4QA_srt_struct*
@S4QA_srt$def to i64),i64 ptrtoint (void (i64*, i64*, i64*, i64, i64, i64,
i64, i64, i64, i64)* @Main_p_info$def to i64)),i64 0), i64 12884901888,
i64 0, i64 4294967310}>
{
...
}}}
we bitcast `@Main_p_info$def` from `(i64*, i64*, i64*, i64, i64, i64, i64,
i64, i64, i64)` to `(i64*, i64*, i64*, i64, i64, i64, i64, i64, i64, i64,
float, double)`. (E.g. we add a `float` and a `double`) to the signature.
And then we call the newly bitcasted function with an additional float and
double. However `Main_p_info$def` doesn't take those two last arguments,
and never does anything with them. At the point where we create
`Main_p_info$def` (the `CmmProc`) the `live` value hence does not include
registers `F1` and `D1`. Yet at the call site we do expect to pass them.
The LLVM backend, simply ignores this, as it always casts functions to the
expected type. However a more rigorous backend that tries to unify
functions with their callsite signatures falls over at this point.
Is it possible that some liveness logic is broken in Cmm here?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/6084#comment:35>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list