[Git][ghc/ghc][wip/ncg-simd] Add test for #25169

sheaf (@sheaf) gitlab at gitlab.haskell.org
Wed Aug 28 09:19:56 UTC 2024



sheaf pushed to branch wip/ncg-simd at Glasgow Haskell Compiler / GHC


Commits:
506ebaeb by sheaf at 2024-08-28T11:19:12+02:00
Add test for #25169

- - - - -


6 changed files:

- + testsuite/tests/simd/should_run/T25169.hs
- + testsuite/tests/simd/should_run/T25169.stdout
- testsuite/tests/simd/should_run/all.T
- + testsuite/tests/simd/should_run/simd014.hs
- + testsuite/tests/simd/should_run/simd014.stdout
- + testsuite/tests/simd/should_run/simd014Cmm.cmm


Changes:

=====================================
testsuite/tests/simd/should_run/T25169.hs
=====================================
@@ -0,0 +1,202 @@
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE UnboxedTuples #-}
+
+module Main where
+
+-- base
+import GHC.Exts
+
+--------------------------------------------------------------------------------
+
+data DoubleX2 = DX2# DoubleX2#
+
+instance Show DoubleX2 where
+  show ( DX2# d ) = case unpackDoubleX2# d of
+    (# a, b #) -> show ( D# a, D# b )
+
+type T = (# DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#
+          , DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2# #)
+
+type F =  DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+       -> T
+
+f :: T -> T
+f (# x00, x01, x02, x03, x04, x05, x06, x07, x08, x09
+   , x10, x11, x12, x13, x14, x15, x16, x17, x18, x19
+   , x20, x21, x22, x23, x24, x25, x26, x27, x28, x29
+   , x30, x31, x32, x33, x34, x35, x36, x37, x38, x39
+   , x40, x41, x42, x43, x44, x45, x46, x47, x48, x49 #)
+ = (# x01, x02, x03, x04, x05, x06, x07, x08, x09
+    , x10, x11, x12, x13, x14, x15, x16, x17, x18, x19
+    , x20, x21, x22, x23, x24, x25, x26, x27, x28, x29
+    , x30, x31, x32, x33, x34, x35, x36, x37, x38, x39
+    , x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x00 #)
+{-# OPAQUE f #-}
+
+f2 :: T -> T -> T
+f2 a b = f a
+{-# OPAQUE f2 #-}
+
+w :: Int -> T -> T
+w 0 t = t
+w i t =
+  -- This recursion is designed to trigger stack overflow,
+  -- so that we run into the register save/restore logic in the RTS
+  -- when we reach the corresponding stack underflow frame.
+  case w ( i - 1 ) t of
+    r -> f2 r t
+{-# OPAQUE w #-}
+
+main :: IO ()
+main = do
+  let !( DX2# x00 ) = z00
+      !( DX2# x01 ) = z01
+      !( DX2# x02 ) = z02
+      !( DX2# x03 ) = z03
+      !( DX2# x04 ) = z04
+      !( DX2# x05 ) = z05
+      !( DX2# x06 ) = z06
+      !( DX2# x07 ) = z07
+      !( DX2# x08 ) = z08
+      !( DX2# x09 ) = z09
+      !( DX2# x10 ) = z10
+      !( DX2# x11 ) = z11
+      !( DX2# x12 ) = z12
+      !( DX2# x13 ) = z13
+      !( DX2# x14 ) = z14
+      !( DX2# x15 ) = z15
+      !( DX2# x16 ) = z16
+      !( DX2# x17 ) = z17
+      !( DX2# x18 ) = z18
+      !( DX2# x19 ) = z19
+      !( DX2# x20 ) = z20
+      !( DX2# x21 ) = z21
+      !( DX2# x22 ) = z22
+      !( DX2# x23 ) = z23
+      !( DX2# x24 ) = z24
+      !( DX2# x25 ) = z25
+      !( DX2# x26 ) = z26
+      !( DX2# x27 ) = z27
+      !( DX2# x28 ) = z28
+      !( DX2# x29 ) = z29
+      !( DX2# x30 ) = z30
+      !( DX2# x31 ) = z31
+      !( DX2# x32 ) = z32
+      !( DX2# x33 ) = z33
+      !( DX2# x34 ) = z34
+      !( DX2# x35 ) = z35
+      !( DX2# x36 ) = z36
+      !( DX2# x37 ) = z37
+      !( DX2# x38 ) = z38
+      !( DX2# x39 ) = z39
+      !( DX2# x40 ) = z40
+      !( DX2# x41 ) = z41
+      !( DX2# x42 ) = z42
+      !( DX2# x43 ) = z43
+      !( DX2# x44 ) = z44
+      !( DX2# x45 ) = z45
+      !( DX2# x46 ) = z46
+      !( DX2# x47 ) = z47
+      !( DX2# x48 ) = z48
+      !( DX2# x49 ) = z49
+      !t = (# x00, x01, x02, x03, x04, x05, x06, x07, x08, x09
+            , x10, x11, x12, x13, x14, x15, x16, x17, x18, x19
+            , x20, x21, x22, x23, x24, x25, x26, x27, x28, x29
+            , x30, x31, x32, x33, x34, x35, x36, x37, x38, x39
+            , x40, x41, x42, x43, x44, x45, x46, x47, x48, x49 #)
+  let !u = w ( 2 * 50 + 16 ) t
+  case u of
+    (# r00, r01, r02, r03, r04, r05, r06, r07, r08, r09
+     , r10, r11, r12, r13, r14, r15, r16, r17, r18, r19
+     , r20, r21, r22, r23, r24, r25, r26, r27, r28, r29
+     , r30, r31, r32, r33, r34, r35, r36, r37, r38, r39
+     , r40, r41, r42, r43, r44, r45, r46, r47, r48, r49 #)
+       -> do putStrLn "Should start listing pairs from 16:\n"
+             putStrLn $ unlines $ map show $
+               [ DX2# r00, DX2# r01, DX2# r02, DX2# r03, DX2# r04, DX2# r05, DX2# r06, DX2# r07, DX2# r08, DX2# r09
+               , DX2# r10, DX2# r11, DX2# r12, DX2# r13, DX2# r14, DX2# r15, DX2# r16, DX2# r17, DX2# r18, DX2# r19
+               , DX2# r20, DX2# r21, DX2# r22, DX2# r23, DX2# r24, DX2# r25, DX2# r26, DX2# r27, DX2# r28, DX2# r29
+               , DX2# r30, DX2# r31, DX2# r32, DX2# r33, DX2# r34, DX2# r35, DX2# r36, DX2# r37, DX2# r38, DX2# r39
+               , DX2# r40, DX2# r41, DX2# r42, DX2# r43, DX2# r44, DX2# r45, DX2# r46, DX2# r47, DX2# r48, DX2# r49 ]
+  let !v = w ( 2 * 50 + 23 - 16 ) $ u
+  case v of
+    (# r00, r01, r02, r03, r04, r05, r06, r07, r08, r09
+     , r10, r11, r12, r13, r14, r15, r16, r17, r18, r19
+     , r20, r21, r22, r23, r24, r25, r26, r27, r28, r29
+     , r30, r31, r32, r33, r34, r35, r36, r37, r38, r39
+     , r40, r41, r42, r43, r44, r45, r46, r47, r48, r49 #)
+       -> do putStrLn "\nShould start listing pairs from 23:\n"
+             putStrLn $ unlines $ map show $
+               [ DX2# r00, DX2# r01, DX2# r02, DX2# r03, DX2# r04, DX2# r05, DX2# r06, DX2# r07, DX2# r08, DX2# r09
+               , DX2# r10, DX2# r11, DX2# r12, DX2# r13, DX2# r14, DX2# r15, DX2# r16, DX2# r17, DX2# r18, DX2# r19
+               , DX2# r20, DX2# r21, DX2# r22, DX2# r23, DX2# r24, DX2# r25, DX2# r26, DX2# r27, DX2# r28, DX2# r29
+               , DX2# r30, DX2# r31, DX2# r32, DX2# r33, DX2# r34, DX2# r35, DX2# r36, DX2# r37, DX2# r38, DX2# r39
+               , DX2# r40, DX2# r41, DX2# r42, DX2# r43, DX2# r44, DX2# r45, DX2# r46, DX2# r47, DX2# r48, DX2# r49 ]
+
+z00 :: DoubleX2; z00 = DX2# ( packDoubleX2# (#  0.1##,  0.2## #) ); {-# OPAQUE z00 #-}
+z01 :: DoubleX2; z01 = DX2# ( packDoubleX2# (#  1.1##,  1.2## #) ); {-# OPAQUE z01 #-}
+z02 :: DoubleX2; z02 = DX2# ( packDoubleX2# (#  2.1##,  2.2## #) ); {-# OPAQUE z02 #-}
+z03 :: DoubleX2; z03 = DX2# ( packDoubleX2# (#  3.1##,  3.2## #) ); {-# OPAQUE z03 #-}
+z04 :: DoubleX2; z04 = DX2# ( packDoubleX2# (#  4.1##,  4.2## #) ); {-# OPAQUE z04 #-}
+z05 :: DoubleX2; z05 = DX2# ( packDoubleX2# (#  5.1##,  5.2## #) ); {-# OPAQUE z05 #-}
+z06 :: DoubleX2; z06 = DX2# ( packDoubleX2# (#  6.1##,  6.2## #) ); {-# OPAQUE z06 #-}
+z07 :: DoubleX2; z07 = DX2# ( packDoubleX2# (#  7.1##,  7.2## #) ); {-# OPAQUE z07 #-}
+z08 :: DoubleX2; z08 = DX2# ( packDoubleX2# (#  8.1##,  8.2## #) ); {-# OPAQUE z08 #-}
+z09 :: DoubleX2; z09 = DX2# ( packDoubleX2# (#  9.1##,  9.2## #) ); {-# OPAQUE z09 #-}
+z10 :: DoubleX2; z10 = DX2# ( packDoubleX2# (# 10.1##, 10.2## #) ); {-# OPAQUE z10 #-}
+z11 :: DoubleX2; z11 = DX2# ( packDoubleX2# (# 11.1##, 11.2## #) ); {-# OPAQUE z11 #-}
+z12 :: DoubleX2; z12 = DX2# ( packDoubleX2# (# 12.1##, 12.2## #) ); {-# OPAQUE z12 #-}
+z13 :: DoubleX2; z13 = DX2# ( packDoubleX2# (# 13.1##, 13.2## #) ); {-# OPAQUE z13 #-}
+z14 :: DoubleX2; z14 = DX2# ( packDoubleX2# (# 14.1##, 14.2## #) ); {-# OPAQUE z14 #-}
+z15 :: DoubleX2; z15 = DX2# ( packDoubleX2# (# 15.1##, 15.2## #) ); {-# OPAQUE z15 #-}
+z16 :: DoubleX2; z16 = DX2# ( packDoubleX2# (# 16.1##, 16.2## #) ); {-# OPAQUE z16 #-}
+z17 :: DoubleX2; z17 = DX2# ( packDoubleX2# (# 17.1##, 17.2## #) ); {-# OPAQUE z17 #-}
+z18 :: DoubleX2; z18 = DX2# ( packDoubleX2# (# 18.1##, 18.2## #) ); {-# OPAQUE z18 #-}
+z19 :: DoubleX2; z19 = DX2# ( packDoubleX2# (# 19.1##, 19.2## #) ); {-# OPAQUE z19 #-}
+z20 :: DoubleX2; z20 = DX2# ( packDoubleX2# (# 20.1##, 20.2## #) ); {-# OPAQUE z20 #-}
+z21 :: DoubleX2; z21 = DX2# ( packDoubleX2# (# 21.1##, 21.2## #) ); {-# OPAQUE z21 #-}
+z22 :: DoubleX2; z22 = DX2# ( packDoubleX2# (# 22.1##, 22.2## #) ); {-# OPAQUE z22 #-}
+z23 :: DoubleX2; z23 = DX2# ( packDoubleX2# (# 23.1##, 23.2## #) ); {-# OPAQUE z23 #-}
+z24 :: DoubleX2; z24 = DX2# ( packDoubleX2# (# 24.1##, 24.2## #) ); {-# OPAQUE z24 #-}
+z25 :: DoubleX2; z25 = DX2# ( packDoubleX2# (# 25.1##, 25.2## #) ); {-# OPAQUE z25 #-}
+z26 :: DoubleX2; z26 = DX2# ( packDoubleX2# (# 26.1##, 26.2## #) ); {-# OPAQUE z26 #-}
+z27 :: DoubleX2; z27 = DX2# ( packDoubleX2# (# 27.1##, 27.2## #) ); {-# OPAQUE z27 #-}
+z28 :: DoubleX2; z28 = DX2# ( packDoubleX2# (# 28.1##, 28.2## #) ); {-# OPAQUE z28 #-}
+z29 :: DoubleX2; z29 = DX2# ( packDoubleX2# (# 29.1##, 29.2## #) ); {-# OPAQUE z29 #-}
+z30 :: DoubleX2; z30 = DX2# ( packDoubleX2# (# 30.1##, 30.2## #) ); {-# OPAQUE z30 #-}
+z31 :: DoubleX2; z31 = DX2# ( packDoubleX2# (# 31.1##, 31.2## #) ); {-# OPAQUE z31 #-}
+z32 :: DoubleX2; z32 = DX2# ( packDoubleX2# (# 32.1##, 32.2## #) ); {-# OPAQUE z32 #-}
+z33 :: DoubleX2; z33 = DX2# ( packDoubleX2# (# 33.1##, 33.2## #) ); {-# OPAQUE z33 #-}
+z34 :: DoubleX2; z34 = DX2# ( packDoubleX2# (# 34.1##, 34.2## #) ); {-# OPAQUE z34 #-}
+z35 :: DoubleX2; z35 = DX2# ( packDoubleX2# (# 35.1##, 35.2## #) ); {-# OPAQUE z35 #-}
+z36 :: DoubleX2; z36 = DX2# ( packDoubleX2# (# 36.1##, 36.2## #) ); {-# OPAQUE z36 #-}
+z37 :: DoubleX2; z37 = DX2# ( packDoubleX2# (# 37.1##, 37.2## #) ); {-# OPAQUE z37 #-}
+z38 :: DoubleX2; z38 = DX2# ( packDoubleX2# (# 38.1##, 38.2## #) ); {-# OPAQUE z38 #-}
+z39 :: DoubleX2; z39 = DX2# ( packDoubleX2# (# 39.1##, 39.2## #) ); {-# OPAQUE z39 #-}
+z40 :: DoubleX2; z40 = DX2# ( packDoubleX2# (# 40.1##, 40.2## #) ); {-# OPAQUE z40 #-}
+z41 :: DoubleX2; z41 = DX2# ( packDoubleX2# (# 41.1##, 41.2## #) ); {-# OPAQUE z41 #-}
+z42 :: DoubleX2; z42 = DX2# ( packDoubleX2# (# 42.1##, 42.2## #) ); {-# OPAQUE z42 #-}
+z43 :: DoubleX2; z43 = DX2# ( packDoubleX2# (# 43.1##, 43.2## #) ); {-# OPAQUE z43 #-}
+z44 :: DoubleX2; z44 = DX2# ( packDoubleX2# (# 44.1##, 44.2## #) ); {-# OPAQUE z44 #-}
+z45 :: DoubleX2; z45 = DX2# ( packDoubleX2# (# 45.1##, 45.2## #) ); {-# OPAQUE z45 #-}
+z46 :: DoubleX2; z46 = DX2# ( packDoubleX2# (# 46.1##, 46.2## #) ); {-# OPAQUE z46 #-}
+z47 :: DoubleX2; z47 = DX2# ( packDoubleX2# (# 47.1##, 47.2## #) ); {-# OPAQUE z47 #-}
+z48 :: DoubleX2; z48 = DX2# ( packDoubleX2# (# 48.1##, 48.2## #) ); {-# OPAQUE z48 #-}
+z49 :: DoubleX2; z49 = DX2# ( packDoubleX2# (# 49.1##, 49.2## #) ); {-# OPAQUE z49 #-}


=====================================
testsuite/tests/simd/should_run/T25169.stdout
=====================================
@@ -0,0 +1,107 @@
+Should start listing pairs from 16:
+
+(16.1,16.2)
+(17.1,17.2)
+(18.1,18.2)
+(19.1,19.2)
+(20.1,20.2)
+(21.1,21.2)
+(22.1,22.2)
+(23.1,23.2)
+(24.1,24.2)
+(25.1,25.2)
+(26.1,26.2)
+(27.1,27.2)
+(28.1,28.2)
+(29.1,29.2)
+(30.1,30.2)
+(31.1,31.2)
+(32.1,32.2)
+(33.1,33.2)
+(34.1,34.2)
+(35.1,35.2)
+(36.1,36.2)
+(37.1,37.2)
+(38.1,38.2)
+(39.1,39.2)
+(40.1,40.2)
+(41.1,41.2)
+(42.1,42.2)
+(43.1,43.2)
+(44.1,44.2)
+(45.1,45.2)
+(46.1,46.2)
+(47.1,47.2)
+(48.1,48.2)
+(49.1,49.2)
+(0.1,0.2)
+(1.1,1.2)
+(2.1,2.2)
+(3.1,3.2)
+(4.1,4.2)
+(5.1,5.2)
+(6.1,6.2)
+(7.1,7.2)
+(8.1,8.2)
+(9.1,9.2)
+(10.1,10.2)
+(11.1,11.2)
+(12.1,12.2)
+(13.1,13.2)
+(14.1,14.2)
+(15.1,15.2)
+
+
+Should start listing pairs from 23:
+
+(23.1,23.2)
+(24.1,24.2)
+(25.1,25.2)
+(26.1,26.2)
+(27.1,27.2)
+(28.1,28.2)
+(29.1,29.2)
+(30.1,30.2)
+(31.1,31.2)
+(32.1,32.2)
+(33.1,33.2)
+(34.1,34.2)
+(35.1,35.2)
+(36.1,36.2)
+(37.1,37.2)
+(38.1,38.2)
+(39.1,39.2)
+(40.1,40.2)
+(41.1,41.2)
+(42.1,42.2)
+(43.1,43.2)
+(44.1,44.2)
+(45.1,45.2)
+(46.1,46.2)
+(47.1,47.2)
+(48.1,48.2)
+(49.1,49.2)
+(0.1,0.2)
+(1.1,1.2)
+(2.1,2.2)
+(3.1,3.2)
+(4.1,4.2)
+(5.1,5.2)
+(6.1,6.2)
+(7.1,7.2)
+(8.1,8.2)
+(9.1,9.2)
+(10.1,10.2)
+(11.1,11.2)
+(12.1,12.2)
+(13.1,13.2)
+(14.1,14.2)
+(15.1,15.2)
+(16.1,16.2)
+(17.1,17.2)
+(18.1,18.2)
+(19.1,19.2)
+(20.1,20.2)
+(21.1,21.2)
+(22.1,22.2)
+


=====================================
testsuite/tests/simd/should_run/all.T
=====================================
@@ -49,8 +49,12 @@ test('simd013',
      , unless(arch('x86_64'), skip) # because the C file uses Intel intrinsics
      ],
      compile_and_run, ['simd013C.c'])
-
-
+test('simd014',
+     [ unless(arch('x86_64'), skip) ],
+        # ^ the test uses hand-written low-level Cmm which makes use
+        # of the XMM4 register, which may not be mapped to a real machine
+        # register on non-x86 architectures.
+     compile_and_run, ['simd014Cmm.cmm'])
 
 test('T22187', [],compile,[''])
 test('T22187_run', [],compile_and_run,[''])
@@ -63,3 +67,5 @@ test('T25062_V64', [ unless(have_cpu_feature('avx512f'), skip)
                    , only_ways(llvm_ways) # SIMD NCG TODO: support 512 bit wide vectors
                    ]
                  , compile_and_run, [''])
+
+test('T25169', [], compile_and_run, [''])


=====================================
testsuite/tests/simd/should_run/simd014.hs
=====================================
@@ -0,0 +1,35 @@
+{-# LANGUAGE GHCForeignImportPrim #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UnliftedFFITypes #-}
+
+module Main where
+
+-- base
+import GHC.Exts
+  ( Double(..), DoubleX2#
+  , packDoubleX2#, unpackDoubleX2#
+  )
+
+-- Test for handwritten Cmm code and realArgsRegCover (relates to #25169).
+
+--------------------------------------------------------------------------------
+
+data DoubleX2 = DX2# DoubleX2#
+
+instance Show DoubleX2 where
+  show ( DX2# d ) = case unpackDoubleX2# d of
+    (# a, b #) -> show ( D# a, D# b )
+
+foreign import prim "f1"
+  f1 :: DoubleX2# -> DoubleX2# -> DoubleX2# -> DoubleX2#
+     -> (# DoubleX2#, DoubleX2#, DoubleX2#, DoubleX2# #)
+
+main :: IO ()
+main = do
+  let !x1 = packDoubleX2# (# 1.1##, 1.2## #)
+      !x2 = packDoubleX2# (# 2.1##, 2.2## #)
+      !x3 = packDoubleX2# (# 3.1##, 3.2## #)
+      !x4 = packDoubleX2# (# 4.1##, 4.2## #)
+      !(# y1, y2, y3, y4 #) = f1 x1 x2 x3 x4
+  print [ DX2# y1, DX2# y2, DX2# y3, DX2# y4 ]


=====================================
testsuite/tests/simd/should_run/simd014.stdout
=====================================
@@ -0,0 +1 @@
+[(3.1,3.2),(2.1,2.2),(1.1,1.2),(4.1,4.2)]


=====================================
testsuite/tests/simd/should_run/simd014Cmm.cmm
=====================================
@@ -0,0 +1,28 @@
+#include "Cmm.h"
+
+f1
+{
+  // Switch XMM1 and XMM2
+  XMM6 = XMM1 ;
+  XMM1 = XMM2 ;
+  XMM2 = XMM6 ;
+  jump f2 [ XMM1, XMM2, XMM3, XMM4 ];
+}
+
+f2
+{
+  // Switch XMM2 and XMM3
+  XMM6 = XMM2 ;
+  XMM2 = XMM3 ;
+  XMM3 = XMM6 ;
+  jump f3 [ XMM1, XMM2, XMM3, XMM4 ];
+}
+
+f3
+{
+  // Switch XMM1 and XMM2
+  XMM6 = XMM1 ;
+  XMM1 = XMM2 ;
+  XMM2 = XMM6 ;
+  jump %ENTRY_CODE(Sp(0)) [ XMM1, XMM2, XMM3, XMM4 ];
+}



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

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/506ebaeb58e7199d30fef4be35b7ab06257eb6a5
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/20240828/60623f4e/attachment-0001.html>


More information about the ghc-commits mailing list