Segfault with unboxed arrays, unsafeAt, optimisations
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
.
Trac metadata
Trac field | Value |
---|---|
Version | 7.0.4 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (NCG) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture | x86_64 (amd64) |