UNREG: fix pprHexVal to emit zeros (#10518)
authorSergei Trofimovich <slyfox@gentoo.org>
Sun, 14 Jun 2015 15:42:03 +0000 (16:42 +0100)
committerSergei Trofimovich <siarheit@google.com>
Sun, 14 Jun 2015 15:42:53 +0000 (16:42 +0100)
jakzale on #ghc reported a build failure
when ported GHC on a new target.

The code 'pprHexVal (2^32) W32' emits '0xU'
which is invalid C.

I've introduced bug in
    43f1b2ecd1960fa7377cf55a2b97c66059a701ef
when added literal truncation. That truncation
is a new source of zeros.

Signed-off-by: Sergei Trofimovich <siarheit@google.com>
Test Plan: added test and tested on UNREG ghc

Reviewers: austin

Reviewed By: austin

Subscribers: thomie, bgamari

Differential Revision: https://phabricator.haskell.org/D987

GHC Trac Issues: #10518

compiler/cmm/PprC.hs
testsuite/tests/codeGen/should_compile/T10518.cmm [new file with mode: 0644]
testsuite/tests/codeGen/should_compile/all.T

index 92c8182..538dfcd 100644 (file)
@@ -1214,7 +1214,6 @@ commafy xs = hsep $ punctuate comma xs
 
 -- Print in C hex format: 0x13fa
 pprHexVal :: Integer -> Width -> SDoc
-pprHexVal 0 _ = ptext (sLit "0x0")
 pprHexVal w rep
   | w < 0     = parens (char '-' <>
                     ptext (sLit "0x") <> intToDoc (-w) <> repsuffix rep)
@@ -1234,7 +1233,9 @@ pprHexVal w rep
       repsuffix _ = char 'U'
 
       intToDoc :: Integer -> SDoc
-      intToDoc i = go (truncInt i)
+      intToDoc i = case truncInt i of
+                       0 -> char '0'
+                       v -> go v
 
       -- We need to truncate value as Cmm backend does not drop
       -- redundant bits to ease handling of negative values.
diff --git a/testsuite/tests/codeGen/should_compile/T10518.cmm b/testsuite/tests/codeGen/should_compile/T10518.cmm
new file mode 100644 (file)
index 0000000..966cd4a
--- /dev/null
@@ -0,0 +1,5 @@
+foo() {
+    bits64 a;
+    a = 0x10000000000000000; // overflows 64 bits
+    return (a);
+}
index e06cead..c78f9ac 100644 (file)
@@ -30,3 +30,4 @@ test('debug', extra_clean(['debug.cmm']),
      run_command,
      ['$MAKE -s --no-print-directory debug'])
 test('T9964', normal, compile, ['-O'])
+test('T10518', [cmm_src], compile, [''])