aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-01-07 15:26:41 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-01-07 15:26:41 +0000
commit48d534390f43b216715d3d1b4c39c998b1d0bced (patch)
treeae0eeb8d5f106c50db965c409b749196672c49cf
parent14c12d0de08c37cd2a5c89d6f8904da5515bb434 (diff)
downloadgcc-48d534390f43b216715d3d1b4c39c998b1d0bced.zip
gcc-48d534390f43b216715d3d1b4c39c998b1d0bced.tar.gz
gcc-48d534390f43b216715d3d1b4c39c998b1d0bced.tar.bz2
re PR target/58115 (testcase gcc.target/i386/intrinsics_4.c failure)
gcc/ PR target/58115 * target-globals.c (save_target_globals): Remove this_fn_optab handling. * toplev.c: Include optabs.h. (target_reinit): Temporarily restore the global options if another set of options are in force. gcc/testsuite/ * gcc.target/i386/intrinsics_4.c (bar): New function. From-SVN: r206394
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/target-globals.c3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/intrinsics_4.c7
-rw-r--r--gcc/toplev.c29
5 files changed, 48 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d7c3967..ba166cc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2014-01-07 Richard Sandiford <rdsandiford@googlemail.com>
+
+ PR target/58115
+ * target-globals.c (save_target_globals): Remove this_fn_optab
+ handling.
+ * toplev.c: Include optabs.h.
+ (target_reinit): Temporarily restore the global options if another
+ set of options are in force.
+
2014-01-07 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58668
diff --git a/gcc/target-globals.c b/gcc/target-globals.c
index 2cfe257..f2281dd 100644
--- a/gcc/target-globals.c
+++ b/gcc/target-globals.c
@@ -68,7 +68,6 @@ struct target_globals *
save_target_globals (void)
{
struct target_globals *g;
- struct target_optabs *saved_this_fn_optabs = this_fn_optabs;
g = ggc_alloc_target_globals ();
g->flag_state = XCNEW (struct target_flag_state);
@@ -88,10 +87,8 @@ save_target_globals (void)
g->bb_reorder = XCNEW (struct target_bb_reorder);
g->lower_subreg = XCNEW (struct target_lower_subreg);
restore_target_globals (g);
- this_fn_optabs = this_target_optabs;
init_reg_sets ();
target_reinit ();
- this_fn_optabs = saved_this_fn_optabs;
return g;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a8910bb..1e30242 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-07 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * gcc.target/i386/intrinsics_4.c (bar): New function.
+
2014-01-07 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/ext/is_base_of_incomplete-2.C: New.
diff --git a/gcc/testsuite/gcc.target/i386/intrinsics_4.c b/gcc/testsuite/gcc.target/i386/intrinsics_4.c
index 4e124c9..e7c074b 100644
--- a/gcc/testsuite/gcc.target/i386/intrinsics_4.c
+++ b/gcc/testsuite/gcc.target/i386/intrinsics_4.c
@@ -12,3 +12,10 @@ foo (void)
{
a[0] = _mm256_and_ps (b[0], c[0]);
}
+
+/* Try again with a combination of target and optimization attributes. */
+void __attribute__((target ("avx"), optimize(3)))
+bar (void)
+{
+ a[0] = _mm256_and_ps (b[0], c[0]);
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 38e986c..c652522 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -78,6 +78,7 @@ along with GCC; see the file COPYING3. If not see
#include "diagnostic-color.h"
#include "context.h"
#include "pass_manager.h"
+#include "optabs.h"
#if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO)
#include "dbxout.h"
@@ -1752,6 +1753,23 @@ target_reinit (void)
{
struct rtl_data saved_x_rtl;
rtx *saved_regno_reg_rtx;
+ tree saved_optimization_current_node;
+ struct target_optabs *saved_this_fn_optabs;
+
+ /* Temporarily switch to the default optimization node, so that
+ *this_target_optabs is set to the default, not reflecting
+ whatever a previous function used for the optimize
+ attribute. */
+ saved_optimization_current_node = optimization_current_node;
+ saved_this_fn_optabs = this_fn_optabs;
+ if (saved_optimization_current_node != optimization_default_node)
+ {
+ optimization_current_node = optimization_default_node;
+ cl_optimization_restore
+ (&global_options,
+ TREE_OPTIMIZATION (optimization_default_node));
+ }
+ this_fn_optabs = this_target_optabs;
/* Save *crtl and regno_reg_rtx around the reinitialization
to allow target_reinit being called even after prepare_function_start. */
@@ -1769,7 +1787,16 @@ target_reinit (void)
/* Reinitialize lang-dependent parts. */
lang_dependent_init_target ();
- /* And restore it at the end, as free_after_compilation from
+ /* Restore the original optimization node. */
+ if (saved_optimization_current_node != optimization_default_node)
+ {
+ optimization_current_node = saved_optimization_current_node;
+ cl_optimization_restore (&global_options,
+ TREE_OPTIMIZATION (optimization_current_node));
+ }
+ this_fn_optabs = saved_this_fn_optabs;
+
+ /* Restore regno_reg_rtx at the end, as free_after_compilation from
expand_dummy_function_end clears it. */
if (saved_regno_reg_rtx)
{