par# and spark# call newSpark differently, confuses LLVM backend
If par#
and spark#
are being used in the same compilation unit, say like
case spark# (work 2) realWorld# of
(# _, _ #) -> case par# (work 1) of
_ -> return ()
The LLVM backend generates code like follows:
call ccc void (i8*,i8*)* @newSpark( i8* %lnnX, i8* %lnnZ ) nounwind
[...]
%lno7 = call ccc void (i8*,i8*)* @newSpark( i8* %lno4, i8* %lno6 ) nounwind
So both call newSpark
under the hood - but inconsistently. The first call expects no returned value, while the second does. As the first seen call doesn't have a returned value, the backend concludes that the function's type must be void (i8*,i8*) *
, which make opt
choke on the second usage:
opt: /tmp/ghc23150_0/ghc23150_0.ll:845:1: error: instructions returning void cannot have a name
%lno7 = call ccc void (i8*,i8*)* @newSpark( i8* %lno4, i8* %lno6 ) nounwind
^
The underlying reason is in code generation: It doesn't always ask for the return value of newSpark
. So one way to fix this is to just always get the return value - but simply discard it if it's not needed. Patch attached.
Trac metadata
Trac field | Value |
---|---|
Version | 7.2.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (LLVM) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |