Skip to content

Incorrect behavior on arm64 with optimisations

I compiled ghc manually on a chromebook running ubuntu on aarch64 (arm64). I used perf-llvm build during compilation. This might be related to https://ghc.haskell.org/trac/ghc/ticket/11578, but I am not sure how.

While working with stack and cabal I experienced unusually long compilation times or seemingly random build failures from time to time. Luckily, at some point I got very interesting error in package text:

Prelude> import qualified Data.Text as T
Prelude T> T.splitOn (T.pack " ") (T.pack "Hello world!")
["Hello","world!\54497\44724?\NUL\54521\44724?\NUL\NUL\NUL\NUL\NUL\34560...BIG BLOB OF BYTES HERE...\NUL"]

By default this package compiles with -O2, so I tried various options to determine when the result is correct and when is not. To test this I used bare GHC installation and cabal-install-1.24.0.2, (cabal sandbox init && cabal install text --ghc-options="...").

Here is what I tried so far:

  • BAD: -O2
  • BAD: -O2 -fllvm -optlc-O3
  • OK: -O1 -fllvm -optlc-O3
  • OK: -O1 -fllvm -fliberate-case -fregs-graph -fspec-constr -optlc-O3

That is: when text package is compiled with -O2 the result of Text.splitOn function is garbaged with random data; when it is compiled with -O1, the result is correct. Since text is represented using ByteArray# internally, I would suggest something is wrong with ByteArray#'s length attribute, but I am not sure.

Trac metadata
Trac field Value
Version 8.0.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information