From d151546e59a50158f25c3df6728b00d3c27bb4b9 Mon Sep 17 00:00:00 2001 From: Cheng Shao Date: Mon, 23 Jan 2023 13:17:07 +0000 Subject: 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 --- compiler/GHC/CmmToC.hs | 4 ++-- 1 file 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 -- cgit v1.2.1