[GHC] #14452: `-optc-O3` getting shadowed by automatically injected -O flags
GHC
ghc-devs at haskell.org
Sat Nov 11 16:30:13 UTC 2017
#14452: `-optc-O3` getting shadowed by automatically injected -O flags
-------------------------------------+-------------------------------------
Reporter: hvr | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.2.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
Consider the following example:
{{{#!hs
{-# LANGUAGE CApiFFI #-}
{-# OPTIONS_GHC -optc-O3 #-}
module M where
foreign import capi unsafe "stdlib.h exit" c_exit :: Int -> IO ()
}}}
However, the `-optc-O3` flag has no effect, unless `ghc` is called without
any `-O` flags, or with `-O0`.
Here's the resulting C compiler invocations for different `-O` flags:
{{{
$ ghc -fforce-recomp -v -c m.hs |& grep O3
gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -O3 -x c
/tmp/ghc14023_0/ghc_2.c -o /tmp/ghc14023_0/ghc_3.s -Wimplicit -S -include
/opt/ghc/8.2.1/lib/ghc-8.2.1/include/ghcversion.h -I.
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/base-4.10.0.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/integer-gmp-1.0.1.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/include
}}}
{{{
$ ghc -fforce-recomp -O0 -v -c m.hs |& grep O3
gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -O3 -x c
/tmp/ghc14045_0/ghc_2.c -o /tmp/ghc14045_0/ghc_3.s -Wimplicit -S -include
/opt/ghc/8.2.1/lib/ghc-8.2.1/include/ghcversion.h -I.
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/base-4.10.0.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/integer-gmp-1.0.1.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/include
}}}
{{{
$ ghc -fforce-recomp -O1 -v -c m.hs |& grep O3
gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -O3 -x c
/tmp/ghc14073_0/ghc_2.c -o /tmp/ghc14073_0/ghc_3.s -Wimplicit -S -O
-include /opt/ghc/8.2.1/lib/ghc-8.2.1/include/ghcversion.h -I.
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/base-4.10.0.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/integer-gmp-1.0.1.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/include
}}}
{{{
$ ghc -fforce-recomp -O2 -v -c m.hs |& grep O3
gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -O3 -x c
/tmp/ghc14093_0/ghc_2.c -o /tmp/ghc14093_0/ghc_3.s -Wimplicit -S -O2
-include /opt/ghc/8.2.1/lib/ghc-8.2.1/include/ghcversion.h -I.
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/base-4.10.0.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/integer-gmp-1.0.1.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/include
}}}
{{{
$ ghc -fforce-recomp -O3 -v -c m.hs |& grep O3
gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -O3 -x c
/tmp/ghc14119_0/ghc_2.c -o /tmp/ghc14119_0/ghc_3.s -Wimplicit -S -O2
-include /opt/ghc/8.2.1/lib/ghc-8.2.1/include/ghcversion.h -I.
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/base-4.10.0.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/integer-gmp-1.0.1.0/include
-I/opt/ghc/8.2.1/lib/ghc-8.2.1/include
}}}
To summarise, here's the resulting effective `-O`-level passed to `gcc`:
||= GHC invocation =||= GCC invocation =||= Effective C `-O`-level =||
|| `ghc` || `gcc -O3` || `-O3` ||
|| `ghc -O0` || `gcc -O3` || `-O3` ||
|| `ghc -O1` || `gcc -O3 -O1` || `-O1` ||
|| `ghc -O2` || `gcc -O3 -O2` || `-O2` ||
|| `ghc -O3` || `gcc -O3 -O2` || `-O2` ||
Consequently, the only way to have C code compiled with `-O3` is to force
GHC into `-O0` mode; this is obviously not ideal, as it easily kills any
benefit you'd gain from passing `-O3` to the C compiler... ;-)
I see a few alternatives on how to resolve this:
1. Have GHC recognise `-optc-O[0-9]` and suppress automatically injecting
any `-O<n>` of its own
2. Have GHC inject its automatic `-O`-flags before user-provided `-optc`
flags
3. Have GHC inject `-optc` flags as late as possible on the C compiler
command-line
4. Implement a new variant of the `-optc` flag which injects its flags as
late as possible on the C compiler command-line
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14452>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list