From d6bcd83dfd7f83378ba34ee861e74c9e7ee31555 Mon Sep 17 00:00:00 2001 From: Debian Haskell Group Date: Mon, 19 Feb 2024 17:12:25 +0100 Subject: [PATCH] fix-32-bit-unreg commit 9194c9c066a31cbb7a49830e4b5e2454fd4af6ba Author: Cheng Shao Date: Mon Jan 23 13:17:07 2023 +0000 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 (cherry picked from commit d151546e59a50158f25c3df6728b00d3c27bb4b9) Gbp-Pq: Name fix-32-bit-unreg --- 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 c36d8e69..328d5714 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 -- 2.30.2