Hello, the attached patch fixes PR:s c/35162 (just a documentation fix) and fortran/29549.
c/35162 is just a small documentation fix where the documentation was inconsistent with the code as well as C99. It adds a new option -fcx-fortran-rules which sets flag_complex_method to 1, and makes libgfortran use that switch, gaining a factor of 4 speedup on complex matrix multplication. Regtested on i686-pc-linux-gnu, doc changes tested with 'make info' and 'make pdf'. Ok for trunk? -- Janne Blomqvist
gcc ChangeLog:
2008-02-19 Janne Blomqvist <[EMAIL PROTECTED]>
PR fortran/29549
PR c/35162
* doc/invoke.texi (-fcx-limited-range): Correct to be in line with
actual behaviour and C99.
(-fcx-fortran-rules): Document new option.
* toplev.c (process_options): Handle -fcx-fortran-rules.
* common.opt: Add documentation for -fcx-fortran-rules
libgfortran ChangeLog:
2008-02-19 Janne Blomqvist <[EMAIL PROTECTED]>
PR fortran/29549
* Makefile.am: Add -fcx-fortran-rules to AM_CFLAGS for all of
libgfortran.
* Makefile.in: Regenerated.
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi (revision 132440)
+++ gcc/doc/invoke.texi (working copy)
@@ -320,7 +320,8 @@ Objective-C and Objective-C++ Dialects}.
-fauto-inc-dec -fbranch-probabilities -fbranch-target-load-optimize @gol
-fbranch-target-load-optimize2 -fbtr-bb-exclusive -fcaller-saves @gol
-fcheck-data-deps -fcprop-registers -fcrossjumping -fcse-follow-jumps @gol
--fcse-skip-blocks -fcx-limited-range -fdata-sections -fdce -fdce @gol
+-fcse-skip-blocks -fcx-fortran-rules -fcx-limited-range @gol
+-fdata-sections -fdce -fdce @gol
-fdelayed-branch -fdelete-null-pointer-checks -fdse -fdse @gol
-fearly-inlining -fexpensive-optimizations -ffast-math @gol
-ffinite-math-only -ffloat-store -fforward-propagate @gol
@@ -6541,13 +6542,25 @@ implicitly converting it to double preci
@item -fcx-limited-range
@opindex fcx-limited-range
When enabled, this option states that a range reduction step is not
-needed when performing complex division. The default is
[EMAIL PROTECTED], but is enabled by @option{-ffast-math}.
+needed when performing complex division. Also, there is no checking
+whether the result of a complex multiplication or division is NaN +
+I*NaN, with an attempt to rescue the situation in that case.
+The default is @option{-fno-cx-limited-range}, but is enabled by
[EMAIL PROTECTED]
This option controls the default setting of the ISO C99
@code{CX_LIMITED_RANGE} pragma. Nevertheless, the option applies to
all languages.
[EMAIL PROTECTED] -fcx-fortran-rules
[EMAIL PROTECTED] fcx-fortran-rules
+Complex multiplication and division follow Fortran rules. Range
+reduction is done as part of complex division, but there is no checking
+whether the result of a complex multiplication or division is NaN +
+I*NaN, with an attempt to rescue the situation in that case.
+
+The default is @option{-fno-cx-fortran-rules}.
+
@end table
The following options control optimizations that may improve
Index: gcc/toplev.c
===================================================================
--- gcc/toplev.c (revision 132440)
+++ gcc/toplev.c (working copy)
@@ -2001,6 +2001,10 @@ process_options (void)
if (flag_cx_limited_range)
flag_complex_method = 0;
+ /* With -fcx-fortran-rules, we do something in-between cheap and C99. */
+ if (flag_cx_fortran_rules)
+ flag_complex_method = 1;
+
/* Targets must be able to place spill slots at lower addresses. If the
target already uses a soft frame pointer, the transition is trivial. */
if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)
Index: gcc/common.opt
===================================================================
--- gcc/common.opt (revision 132440)
+++ gcc/common.opt (working copy)
@@ -390,6 +390,10 @@ fcx-limited-range
Common Report Var(flag_cx_limited_range) Optimization
Omit range reduction step when performing complex division
+fcx-fortran-rules
+Common Report Var(flag_cx_fortran_rules) Optimization
+Complex multiplication and division follow Fortran rules
+
fdata-sections
Common Report Var(flag_data_sections) Optimization
Place data items into their own section
Index: libgfortran/Makefile.am
===================================================================
--- libgfortran/Makefile.am (revision 132440)
+++ libgfortran/Makefile.am (working copy)
@@ -28,6 +28,9 @@ AM_CPPFLAGS = -iquote$(srcdir)/io -I$(sr
-I$(srcdir)/$(MULTISRCTOP)../gcc/config \
-I$(MULTIBUILDTOP)../../$(host_subdir)/gcc -D_GNU_SOURCE
+# Fortran rules for complex multiplication and division
+AM_CFLAGS += -fcx-fortran-rules
+
gfor_io_src= \
io/close.c \
io/file_pos.c \
Index: libgfortran/Makefile.in
===================================================================
--- libgfortran/Makefile.in (revision 132440)
+++ libgfortran/Makefile.in (working copy)
@@ -730,7 +730,9 @@ ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
-AM_CFLAGS = @AM_CFLAGS@
+
+# Fortran rules for complex multiplication and division
+AM_CFLAGS = @AM_CFLAGS@ -fcx-fortran-rules
AM_FCFLAGS = @AM_FCFLAGS@
AR = @AR@
AS = @AS@
@@ -789,13 +791,9 @@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_AS = @ac_ct_AS@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
ac_ct_FC = @ac_ct_FC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
@@ -812,6 +810,9 @@ build_os = @build_os@
build_subdir = @build_subdir@
build_vendor = @build_vendor@
datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
enable_shared = @enable_shared@
enable_static = @enable_static@
exec_prefix = @exec_prefix@
@@ -822,11 +823,13 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_subdir = @host_subdir@
host_vendor = @host_vendor@
+htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
+localedir = @localedir@
localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@
@@ -836,8 +839,10 @@ oldincludedir = @oldincludedir@
onestep = @onestep@
onestep_FALSE = @onestep_FALSE@
onestep_TRUE = @onestep_TRUE@
+pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
+psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
signature.asc
Description: OpenPGP digital signature
