[Git][ghc/ghc][master] compiler: fix data section alignment in the wasm NCG

Marge Bot (@marge-bot) gitlab at gitlab.haskell.org
Mon Jan 30 10:07:28 UTC 2023



Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC


Commits:
da468391 by Cheng Shao at 2023-01-30T05:07:03-05:00
compiler: fix data section alignment in the wasm NCG

Previously we tried to lower the alignment requirement as far as
possible, based on the section kind inferred from the CLabel. For info
tables, .p2align 1 was applied given the GC should only need the
lowest bit to tag forwarding pointers. But this would lead to
unaligned loads/stores, which has a performance penalty even if the
wasm spec permits it. Furthermore, the test suite has shown memory
corruption in a few cases when compacting gc is used.

This patch takes a more conservative approach: all data sections
except C strings align to word size.

- - - - -


1 changed file:

- compiler/GHC/CmmToAsm/Wasm/FromCmm.hs


Changes:

=====================================
compiler/GHC/CmmToAsm/Wasm/FromCmm.hs
=====================================
@@ -123,15 +123,15 @@ alignmentFromWordType TagI32 = mkAlignment 4
 alignmentFromWordType TagI64 = mkAlignment 8
 alignmentFromWordType _ = panic "alignmentFromWordType: unreachable"
 
--- | Calculate a data section's alignment. Closures needs to be
--- naturally aligned; info tables need to align to 2, so to get 1 tag
--- bit as forwarding pointer marker. The rest have no alignment
--- requirements.
-alignmentFromCmmSection :: WasmTypeTag w -> CLabel -> Alignment
-alignmentFromCmmSection t lbl
-  | isStaticClosureLabel lbl = alignmentFromWordType t
-  | isInfoTableLabel lbl = mkAlignment 2
-  | otherwise = mkAlignment 1
+-- | Calculate a data section's alignment. As a conservative
+-- optimization, a data section with a single CmmString/CmmFileEmbed
+-- has no alignment requirement, otherwise we always align to the word
+-- size to satisfy pointer tagging requirements and avoid unaligned
+-- loads/stores.
+alignmentFromCmmSection :: WasmTypeTag w -> [DataSectionContent] -> Alignment
+alignmentFromCmmSection _ [DataASCII {}] = mkAlignment 1
+alignmentFromCmmSection _ [DataIncBin {}] = mkAlignment 1
+alignmentFromCmmSection t _ = alignmentFromWordType t
 
 -- | Lower a 'CmmStatic'.
 lower_CmmStatic :: CmmStatic -> WasmCodeGenM w DataSectionContent
@@ -1650,7 +1650,7 @@ onCmmData lbl s statics = do
           { dataSectionKind =
               dataSectionKindFromCmmSection s,
             dataSectionAlignment =
-              alignmentFromCmmSection ty_word lbl,
+              alignmentFromCmmSection ty_word cs,
             dataSectionContents =
               case cs of
                 [DataASCII buf] -> [DataASCII $ buf `BS.snoc` 0]



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/da468391872f6be286db37a0f016a37f9f362509

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/da468391872f6be286db37a0f016a37f9f362509
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20230130/c98d5e5e/attachment-0001.html>


More information about the ghc-commits mailing list