summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCheng Shao <terrorjack@type.dance>2023-01-23 13:17:07 +0000
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-01-24 12:11:29 -0500
commitd151546e59a50158f25c3df6728b00d3c27bb4b9 (patch)
treec70f1907cdc0f0ccd27250942ffdd2168743f48d
parent05e6a2d939f5f9d468122a6fd9e9514668f3fc20 (diff)
downloadhaskell-d151546e59a50158f25c3df6728b00d3c27bb4b9.tar.gz
CmmToC: fix CmmRegOff for 64-bit register on a 32-bit target
We used to print the offset value to a platform word sized integer. This is incorrect when the offset is negative (e.g. output of cmm constant folding) and the register is 64-bit but on a 32-bit target, and may lead to incorrect runtime result (e.g. #22607). The fix is simple: just treat it as a proper MO_Add, with the correct width info inferred from the register itself. Metric Increase: T12707 T13379 T4801 T5321FD T5321Fun
-rw-r--r--compiler/GHC/CmmToC.hs4
1 files changed, 2 insertions, 2 deletions
diff --git a/compiler/GHC/CmmToC.hs b/compiler/GHC/CmmToC.hs
index 03058eee9c..58d6b9d0af 100644
--- a/compiler/GHC/CmmToC.hs
+++ b/compiler/GHC/CmmToC.hs
@@ -382,8 +382,8 @@ pprExpr platform e = case e of
CmmRegOff reg 0 -> pprCastReg reg
-- CmmRegOff is an alias of MO_Add
- CmmRegOff reg i -> pprCastReg reg <> char '+' <>
- pprHexVal platform (fromIntegral i) (wordWidth platform)
+ CmmRegOff reg i -> pprExpr platform $ CmmMachOp (MO_Add w) [CmmReg reg, CmmLit $ CmmInt (toInteger i) w]
+ where w = cmmRegWidth platform reg
CmmMachOp mop args -> pprMachOpApp platform mop args