x86 NCG SIMD: writeFloatX4Array#/writeFloatArrayAsFloatX4# segfaults
Summary
SIMD stores to MutableByteArrays segfault with current x86 NCG.
They are not covered by the test suite (#15684).
Steps to reproduce
{-# LANGUAGE MagicHash, UnboxedTuples #-}
import GHC.Exts
import GHC.IO
import Data.Array.Base
import Data.Array.IO.Internals
import Control.Monad
import Foreign.Marshal.Array
writeFloatX4OffAddr :: Ptr Float -> Int -> FloatX4# -> IO ()
writeFloatX4OffAddr (Ptr addr) (I# i) v =
IO $ \s -> (# writeFloatX4OffAddr# addr i v s, () #)
writeAsFloatX4OffAddr :: Ptr Float -> Int -> FloatX4# -> IO ()
writeAsFloatX4OffAddr (Ptr addr) (I# i) v =
IO $ \s -> (# writeFloatOffAddrAsFloatX4# addr i v s, () #)
writeFloatX4 :: IOUArray Int Float -> Int -> FloatX4# -> IO ()
writeFloatX4 (IOUArray (STUArray l _ _ mba)) i v = case i - l of
I# i# -> IO $ \s -> (# writeFloatX4Array# mba i# v s, () #)
writeAsFloatX4 :: IOUArray Int Float -> Int -> FloatX4# -> IO ()
writeAsFloatX4 (IOUArray (STUArray l _ _ mba)) i v = case i - l of
I# i# -> IO $ \s -> (# writeFloatArrayAsFloatX4# mba i# v s, () #)
main :: IO ()
main = do
let v = packFloatX4# (# 0.1#, 1.1#, 2.2#, 3.3# #)
xs <- withArray ([0..15] :: [Float]) $ \ptr -> do
writeFloatX4OffAddr ptr 2 v
peekArray 16 ptr
print xs
ys <- withArray ([0..15] :: [Float]) $ \ptr -> do
writeAsFloatX4OffAddr ptr 2 v
peekArray 16 ptr
print ys
ma <- newListArray (0, 9) ([0..9] :: [Float])
writeFloatX4 ma 1 v
print =<< getElems ma
ma <- newListArray (0, 9) ([0..9] :: [Float])
writeAsFloatX4 ma 1 v
print =<< getElems ma
$ ghc -fforce-recomp -fllvm floatx4_write.hs
$ ./floatx4_write # OK
[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,0.1,1.1,2.2,3.3,12.0,13.0,14.0,15.0]
[0.0,1.0,0.1,1.1,2.2,3.3,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0]
[0.0,1.0,2.0,3.0,0.1,1.1,2.2,3.3,8.0,9.0]
[0.0,0.1,1.1,2.2,3.3,5.0,6.0,7.0,8.0,9.0]
$ ghc -fforce-recomp -msse4 floatx4_write.hs
$ ./floatx4_write
[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,0.1,1.1,2.2,3.3,12.0,13.0,14.0,15.0]
[0.0,1.0,0.1,1.1,2.2,3.3,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0]
Segmentation fault (core dumped)
Expected behavior
The program compiled by NCG should not crash.
Environment
- GHC version used: 9.13.20241115 (8f2e0832)
- Operating System: Linux (Ubuntu 22.04)
- System Architecture: x86_64