diff options
author | Cheng Shao <terrorjack@type.dance> | 2023-01-23 13:17:07 +0000 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2023-01-24 12:11:29 -0500 |
commit | d151546e59a50158f25c3df6728b00d3c27bb4b9 (patch) | |
tree | c70f1907cdc0f0ccd27250942ffdd2168743f48d | |
parent | 05e6a2d939f5f9d468122a6fd9e9514668f3fc20 (diff) | |
download | haskell-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.hs | 4 |
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 |