LLVM backend generates malformed LLVM IR with SIMD (error: expected number in address space)
Summary
LLVM backend generates malformed LLVM IR and results in error: expected number in address space
when some SIMD operations involving broadcast
are used.
Some occurrences:
Steps to reproduce
{-# LANGUAGE MagicHash, UnboxedTuples #-}
import Data.Array.Base
import Data.Array.IO.Internals
import GHC.Exts
import GHC.IO
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, () #)
{-# INLINE writeAsFloatX4 #-}
main :: IO ()
main = do
ma <- newListArray (0, 10) [0..10]
writeAsFloatX4 ma 0 (broadcastFloatX4# 3.0#)
print =<< getElems ma
$ ghc -fforce-recomp -fllvm -pgmlc=$(brew --prefix llvm@19)/bin/llc -pgmlo=$(brew --prefix llvm@19)/bin/opt -O2 broadcast_store.hs
[1 of 2] Compiling Main ( broadcast_store.hs, broadcast_store.o )
/opt/homebrew/opt/llvm/bin/opt: /var/folders/yg/36z4_5q142d6s6sn2y53gsd00000gn/T/ghc14194_tmp_1_0/ghc_tmp_1_1.ll:585:11: error: expected number in address space
store < float 0x4008000000000000, float 0x4008000000000000, float 0x4008000000000000, float 0x4008000000000000 >, <4 x float>* %ln57, align 1 , !tbaa !1
^
<no location info>: error:
`opt' failed in phase `LLVM Optimiser'. (Exit code: 1)
Expected behavior
LLVM backend should generate a valid LLVM IR.
Environment
- GHC version used: 9.13.20241208 (4c58bdf6)
- Operating System: macOS
- System Architecture: AArch64