#5393: Segfault with unboxed arrays, unsafeAt, optimisations
----------------------------------+-----------------------------------------
Reporter: daniel.is.fischer | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler (NCG)
Version: 7.0.4 | Keywords: unsafeAt, optimisations
Testcase: | Blockedby:
Os: Linux | Blocking:
Architecture: x86_64 (amd64) | Failure: Runtime crash
----------------------------------+-----------------------------------------
The programme
{{{
module Main (main) where
import Data.Array.Unboxed
import Data.Array.Base
arr :: UArray Int Int
arr = listArray (0,4) [3,2,5,1,4]
fun :: Int -> Int
fun n
| n < 5 = unsafeAt arr n
| n < 25 = unsafeAt arr (n `quot` 5) + unsafeAt arr (n `rem` 5)
| otherwise = fun (n `quot` 5) + fun (n `rem` 5)
main :: IO ()
main = print (fun 5)
}}}
segfaults here when compiled with optimisations using the native code
generator (I've tried various combinations of -O/-O2 and ghc 6.10.4,
6.12.3, 7.0.2, 7.0.4, HEAD).
When compiling via C:
{{{
dafis@schwartz:~/Haskell/CafeTesting> ghc -O2 -fvia-C -optc-O3 --make
debug
[1 of 1] Compiling Main ( debug.hs, debug.o )
In file included from /home/dafis/lib/ghc-7.0.4/include/Stg.h:230:0:
0,
from /tmp/ghc5608_0/ghc5608_0.hc:3:
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:189:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:195:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:201:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:207:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:237:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:243:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:249:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:255:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:261:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
/home/dafis/lib/ghc-7.0.4/include/stg/Regs.h:267:1:
Warnung: für Ruf vorgesehenes Register wurde für globale
Registervariable verwendet
on the commandline:
Warning: The -fvia-C flag will be removed in a future GHC release
Linking debug ...
}}}
(analogous warnings from 6.10.4 and 6.12.3, but not from HEAD), but the
programme doesn't segfault with 6.10 and 6.12 via C, but does with HEAD.
Nor does it segfault if compiled without optimisations or using `(!)`
instead of `unsafeAt`.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5393>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs