UNREG: fix emission of large Integer literals in C codegen
authorSergei Trofimovich <slyfox@gentoo.org>
Tue, 26 Aug 2014 10:07:14 +0000 (13:07 +0300)
committerSergei Trofimovich <slyfox@gentoo.org>
Tue, 26 Aug 2014 10:07:35 +0000 (13:07 +0300)
commit43f1b2ecd1960fa7377cf55a2b97c66059a701ef
tree599c00b6c9521a4e3f440c3bf95f45ad8e16fb8d
parent67a6ade91b77fb2252ebdad34a934d9fb54eb43d
UNREG: fix emission of large Integer literals in C codegen

Summary:
On amd64/UNREG build there is many failing tests trying
to deal with 'Integer' types.

Looking at 'integerConversions' test I've observed
invalid C code generated by GHC.

Cmm code
    CInt a = -1; (a == -1)
yields 'False' with optimisations enabled via the following C code:
    StgWord64 a = (StgWord32)0xFFFFffffFFFFffffu; (a == 0xFFFFffffFFFFffffu)

The patch fixes it by shrinking emitted literals to required sizes:
    StgWord64 a = (StgWord32)0xFFFFffffu; (a == 0xFFFFffffu)

Thanks to Reid Barton for tracking down and fixing the issue.

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Test Plan: validate on UNREG build (amd64, x86)

Reviewers: simonmar, rwbarton, austin

Subscribers: hvr, simonmar, ezyang, carter

Differential Revision: https://phabricator.haskell.org/D173
compiler/cmm/PprC.hs