OSDN Git Service

Fix IA-64 breakage; Make hot/cold optimization conversation port specific; Move disab...
authormeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Jul 2008 23:44:24 +0000 (23:44 +0000)
committermeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Jul 2008 23:44:24 +0000 (23:44 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138154 138bc75d-0d04-0410-961f-82ee72b054a4

12 files changed:
gcc/ChangeLog
gcc/c-common.c
gcc/config/i386/i386.c
gcc/config/ia64/ia64.c
gcc/doc/extend.texi
gcc/doc/tm.texi
gcc/target-def.h
gcc/target.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/cmov8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/funcspec-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/funcspec-11.c [new file with mode: 0644]

index 63f0ed2..ed4a31c 100644 (file)
@@ -1,3 +1,46 @@
+2008-07-25  Michael Meissner  <gnu@the-meissners.org>
+
+       * doc/extend.texi (hot attribute): Document that the hot attribute
+       turns on -O3 for some ports.
+       (cold attribute): Document that the cold attribute turns on -Os
+       for some ports
+
+       * doc/tm.texi (OPTIMIZATION_OPTIONS): Update documentation to
+       reflect function specific option support.
+
+       * target.h (struct target_option_hooks): Add fields to say whether
+       the cold attribute implies -Os and the hot attribute implies -O3.
+
+       * target-def.h (TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION):
+       By default, do not turn on -Os for cold functions.
+       (TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION): By default, do
+       not turn on -O3 for hot functions.
+
+       * c-common.c (handle_hot_attribute): Use target hook to determine
+       if hot functions should enable -O3.
+       (handle_cold_attribute): Use target hook to determine if cold
+       functions should enable -Os.
+
+       * config/i386/i386.c (ix86_target_string): Add -m3dnowa support.
+       (override_options): Move disable scheduling to
+       optimization_options.
+       (optimization_options): Disable scheduling here, not
+       override_options.
+       (TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION): Define.
+       (TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION): Define.
+
+       * config/ia64/ia64.c (ia64_override_options): Move setting
+       scheduling flags to ia64_optimization_options.
+       (ia64_optimization_options): Disable scheduling options here, and
+       not in ia64_override_options.
+       (TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION): Define.
+       (TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION): Define.
+
+2008-07-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/36936
+       * config/i386/i386.c (override_options): Don't clear TARGET_CMOVE.
+
 2008-07-25  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/36926
index fbb5f88..c9ffd9c 100644 (file)
@@ -5046,7 +5046,6 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
                   name, "cold");
          *no_add_attrs = true;
        }
-
       else
        {
          tree old_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node);
@@ -5054,6 +5053,7 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
          /* If we are not at -O3, but are optimizing, turn on -O3
             optimizations just for this one function.  */
          if (((optimize > 0 && optimize < 3) || optimize_size)
+             && targetm.target_option.hot_attribute_sets_optimization
              && (!old_opts || old_opts == optimization_default_node))
            {
              /* Create the hot optimization node if needed.  */
@@ -5071,9 +5071,9 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
              DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node)
                = optimization_hot_node;
            }
+         /* Most of the rest of the hot processing is done later with
+            lookup_attribute.  */
        }
-      /* Most of the rest of the hot processing is done later with
-        lookup_attribute.  */
     }
   else
     {
@@ -5105,6 +5105,7 @@ handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args),
          /* If we are optimizing, but not optimizing for space, turn on -Os
             optimizations just for this one function.  */
          if (optimize && !optimize_size
+             && targetm.target_option.cold_attribute_sets_optimization
              && (!old_opts || old_opts == optimization_default_node))
            {
              /* Create the cold optimization node if needed.  */
@@ -5122,6 +5123,8 @@ handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args),
              DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node)
                = optimization_cold_node;
            }
+         /* Most of the rest of the cold processing is done later with
+            lookup_attribute.  */
        }
     }
   else
index fb4963f..7b4c243 100644 (file)
@@ -2215,6 +2215,7 @@ ix86_target_string (int isa, int flags, const char *arch, const char *tune,
     { "-msse2",                OPTION_MASK_ISA_SSE2 },
     { "-msse",         OPTION_MASK_ISA_SSE },
     { "-m3dnow",       OPTION_MASK_ISA_3DNOW },
+    { "-m3dnowa",      OPTION_MASK_ISA_3DNOW_A },
     { "-mmmx",         OPTION_MASK_ISA_MMX },
     { "-mabm",         OPTION_MASK_ISA_ABM },
     { "-mpopcnt",      OPTION_MASK_ISA_POPCNT },
@@ -3123,8 +3124,6 @@ override_options (bool main_args_p)
       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
     }
 
-  TARGET_CMOVE = 0;
-
   /* For sane SSE instruction set generation we need fcomi instruction.
      It is safe to enable all CMOVE instructions.  */
   if (TARGET_SSE)
@@ -3139,11 +3138,6 @@ override_options (bool main_args_p)
     *p = '\0';
   }
 
-  /* When scheduling description is not available, disable scheduler pass
-     so it won't slow down the compilation and make x87 code slower.  */
-  if (!TARGET_SCHEDULE)
-    flag_schedule_insns_after_reload = flag_schedule_insns = 0;
-
   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
     set_param_value ("simultaneous-prefetches",
                     ix86_cost->simultaneous_prefetches);
@@ -3911,6 +3905,11 @@ optimization_options (int level, int size ATTRIBUTE_UNUSED)
     flag_schedule_insns = 0;
 #endif
 
+  /* When scheduling description is not available, disable scheduler pass
+     so it won't slow down the compilation and make x87 code slower.  */
+  if (!TARGET_SCHEDULE)
+    flag_schedule_insns_after_reload = flag_schedule_insns = 0;
+
   if (TARGET_MACHO)
     /* The Darwin libraries never set errno, so we might as well
        avoid calling them when that's the only reason we would.  */
@@ -27345,6 +27344,12 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree)
 #undef TARGET_OPTION_CAN_INLINE_P
 #define TARGET_OPTION_CAN_INLINE_P ix86_can_inline_p
 
+#undef TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION
+#define TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION true
+
+#undef TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION
+#define TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION true
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 #include "gt-i386.h"
index e93ae31..29a9a8d 100644 (file)
@@ -493,6 +493,12 @@ static const struct attribute_spec ia64_attribute_table[] =
 #undef TARGET_C_MODE_FOR_SUFFIX
 #define TARGET_C_MODE_FOR_SUFFIX ia64_c_mode_for_suffix
 
+#undef TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION
+#define TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION true
+
+#undef TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION
+#define TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION true
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 typedef enum
@@ -5232,9 +5238,6 @@ ia64_override_options (void)
       TARGET_INLINE_SQRT = INL_MAX_THR;
     }
 
-  ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
-  flag_schedule_insns_after_reload = 0;
-
   ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
 
   init_machine_status = ia64_init_machine_status;
@@ -9927,6 +9930,13 @@ void
 ia64_optimization_options (int level ATTRIBUTE_UNUSED,
                            int size ATTRIBUTE_UNUSED)
 {
+  /* Disable the second machine independent scheduling pass and use one for the
+     IA-64.  This needs to be here instead of in OVERRIDE_OPTIONS because this
+     is done whenever the optimization is changed via #pragma GCC optimize or
+     attribute((optimize(...))).  */
+  ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
+  flag_schedule_insns_after_reload = 0;
+
   /* Let the scheduler form additional regions.  */
   set_param_value ("max-sched-extend-regions-iters", 2);
 
index a804092..4b1d302 100644 (file)
@@ -2853,7 +2853,7 @@ that affect more than one function.
 This can be used for instance to have frequently executed functions
 compiled with more aggressive optimization options that produce faster
 and larger code, while other functions can be called with less
-aggressive options.  The @code{hot} attribute implies
+aggressive options.  On some targets, the @code{hot} attribute implies
 @code{optimize("O3")}, and @code{cold} attribute implies
 @code{optimize("Os")}.
 
@@ -2903,8 +2903,9 @@ are automatically detected and this attribute is ignored.
 The @code{hot} attribute is not implemented in GCC versions earlier
 than 4.3.
 
-Starting with GCC 4.4, the @code{hot} attribute sets
-@code{optimize("O3")} to turn on more aggressive optimization.
+Starting with GCC 4.4, the @code{cold} attribute sets
+@code{optimize("O3")} to turn on more aggressive optimization on the
+the i386, x86_64, and IA-64 targets.
 
 @item cold
 @cindex @code{cold} function attribute
@@ -2924,7 +2925,8 @@ are automatically detected and this attribute is ignored.
 The @code{cold} attribute is not implemented in GCC versions earlier than 4.3.
 
 Starting with GCC 4.4, the @code{cold} attribute sets
-@code{optimize("Os")} to save space.
+@code{optimize("Os")} to save space on the the i386, x86_64, and IA-64
+targets.
 
 @item regparm (@var{number})
 @cindex @code{regparm} attribute
index 274e69b..5183736 100644 (file)
@@ -833,10 +833,9 @@ specified, 1 if @option{-O} is specified, and 0 if neither is specified.
 
 @var{size} is nonzero if @option{-Os} is specified and zero otherwise.
 
-You should not use this macro to change options that are not
-machine-specific.  These should uniformly selected by the same
-optimization level on all supported machines.  Use this macro to enable
-machine-specific optimizations.
+This macro is run once at program startup and when the optimization
+options are changed via @code{#pragma GCC optimize} or by using the
+@code{optimize} attribute.
 
 @strong{Do not examine @code{write_symbols} in
 this macro!} The debugging options are not supposed to alter the
index 1d138e5..bf8c7e7 100644 (file)
 #define TARGET_OPTION_CAN_INLINE_P default_target_option_can_inline_p
 #endif
 
+#ifndef TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION
+#define TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION false
+#endif
+
+#ifndef TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION
+#define TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION false
+#endif
+
 #define TARGET_OPTION_HOOKS                    \
   {                                            \
     TARGET_OPTION_VALID_ATTRIBUTE_P,           \
     TARGET_OPTION_PRINT,                       \
     TARGET_OPTION_PRAGMA_PARSE,                        \
     TARGET_OPTION_CAN_INLINE_P,                        \
+    TARGET_OPTION_COLD_ATTRIBUTE_SETS_OPTIMIZATION, \
+    TARGET_OPTION_HOT_ATTRIBUTE_SETS_OPTIMIZATION, \
   }
 
 /* The whole shebang.  */
index 468e5d7..a44ab0b 100644 (file)
@@ -989,6 +989,12 @@ struct gcc_target
 
     /* Function to determine if one function can inline another function.  */
     bool (*can_inline_p) (tree, tree);
+
+    /* Whether the cold attribute changes the optimization level.  */
+    bool cold_attribute_sets_optimization;
+
+    /* Whether the hot attribute changes the optimization level.  */
+    bool hot_attribute_sets_optimization;
   } target_option;
 
   /* For targets that need to mark extra registers as live on entry to
index 85ac795..db8df62 100644 (file)
@@ -1,3 +1,10 @@
+2008-07-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/36936
+       * gcc.target/i386/cmov8.c: New.
+       * gcc.target/i386/funcspec-10.c: Likewise.
+       * gcc.target/i386/funcspec-11.c: Likewise.
+
 2008-07-25  Joseph Myers  <joseph@codesourcery.com>
 
        * lib/target-supports.exp (check_effective_target_arm_thumb1_ok):
diff --git a/gcc/testsuite/gcc.target/i386/cmov8.c b/gcc/testsuite/gcc.target/i386/cmov8.c
new file mode 100644 (file)
index 0000000..639fb62
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR target/36936 */
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -march=i686" } */
+/* { dg-final { scan-assembler "cmov\[^8\]" } } */
+
+int
+foo (int x)
+{
+  if (x < 0)
+    x = 1;
+  return x;
+}
diff --git a/gcc/testsuite/gcc.target/i386/funcspec-10.c b/gcc/testsuite/gcc.target/i386/funcspec-10.c
new file mode 100644 (file)
index 0000000..9446cdf
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/36936 */
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -march=i686" } */
+/* { dg-final { scan-assembler-not "cmov" } } */
+
+extern int foo (int) __attribute__((__option__("arch=i386")));
+
+int
+foo (int x)
+{
+  if (x < 0)
+    x = 1;
+  return x;
+}
diff --git a/gcc/testsuite/gcc.target/i386/funcspec-11.c b/gcc/testsuite/gcc.target/i386/funcspec-11.c
new file mode 100644 (file)
index 0000000..ec32e0c
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/36936 */
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -march=i386" } */
+/* { dg-final { scan-assembler "cmov" } } */
+
+extern int foo (int) __attribute__((__option__("arch=i686")));
+
+int
+foo (int x)
+{
+  if (x < 0)
+    x = 1;
+  return x;
+}