Index: doc/tm.texi
===================================================================
--- doc/tm.texi	(revision 165189)
+++ doc/tm.texi	(working copy)
@@ -812,6 +812,10 @@ this hook!}  The debugging options are n
 generated code.
 @end deftypefn
 
+@deftypefn {Target Hook} void TARGET_OPTION_DEFAULT_PARAMS (void)
+Set target-dependent default values for @option{--param} settings, using calls to @code{set_default_param_value}.
+@end deftypefn
+
 @deftypefn {Target Hook} void TARGET_HELP (void)
 This hook is called in response to the user invoking
 @option{--target-help} on the command line.  It gives the target a
Index: doc/tm.texi.in
===================================================================
--- doc/tm.texi.in	(revision 165189)
+++ doc/tm.texi.in	(working copy)
@@ -812,6 +812,8 @@ this hook!}  The debugging options are n
 generated code.
 @end deftypefn
 
+@hook TARGET_OPTION_DEFAULT_PARAMS
+
 @hook TARGET_HELP
 This hook is called in response to the user invoking
 @option{--target-help} on the command line.  It gives the target a
Index: target.def
===================================================================
--- target.def	(revision 165189)
+++ target.def	(working copy)
@@ -2340,6 +2340,13 @@ DEFHOOK
  void, (int level, int size),
  hook_void_int_int)
 
+DEFHOOK
+(default_params,
+"Set target-dependent default values for @option{--param} settings, using\
+ calls to @code{set_default_param_value}.",
+ void, (void),
+ hook_void_void)
+
 /* Function to determine if one function can inline another function.  */
 #undef HOOK_PREFIX
 #define HOOK_PREFIX "TARGET_"
Index: params.c
===================================================================
--- params.c	(revision 165189)
+++ params.c	(working copy)
@@ -1,5 +1,5 @@
 /* params.c - Run-time parameters.
-   Copyright (C) 2001, 2003, 2004, 2005, 2007, 2008
+   Copyright (C) 2001, 2003, 2004, 2005, 2007, 2008, 2009, 2010
    Free Software Foundation, Inc.
    Written by Mark Mitchell <mark@codesourcery.com>.
 
@@ -51,6 +51,21 @@ add_params (const param_info params[], s
   num_compiler_params += n;
 }
 
+/* Set the value of the parameter given by NUM to VALUE.  If
+   EXPLICIT_P, this is being set by the user; otherwise it is being
+   set implicitly by the compiler.  */
+
+static void
+set_param_value_internal (compiler_param num, int value,
+			  bool explicit_p)
+{
+  size_t i = (size_t) num;
+
+  compiler_params[i].value = value;
+  if (explicit_p)
+    compiler_params[i].set = true;
+}
+
 /* Set the VALUE associated with the parameter given by NAME.  */
 
 void
@@ -75,10 +90,7 @@ set_param_value (const char *name, int v
 		 compiler_params[i].option,
 		 compiler_params[i].max_value);
 	else
-	  {
-	    compiler_params[i].value = value;
-	    compiler_params[i].set = true;
-	  }
+	  set_param_value_internal ((compiler_param) i, value, true);
 	return;
       }
 
@@ -86,6 +98,26 @@ set_param_value (const char *name, int v
   error ("invalid parameter %qs", name);
 }
 
+/* Set the value of the parameter given by NUM to VALUE, implicitly,
+   if it has not been set explicitly by the user.  */
+
+void
+maybe_set_param_value (compiler_param num, int value)
+{
+  if (!PARAM_SET_P (num))
+    set_param_value_internal (num, value, false);
+}
+
+/* Set the default value of a parameter given by NUM to VALUE, before
+   option processing.  */
+
+void
+set_default_param_value (compiler_param num, int value)
+{
+  gcc_assert (!PARAM_SET_P (num));
+  set_param_value_internal (num, value, false);
+}
+
 /* Return the current value of num_compiler_params, for the benefit of
    plugins that use parameters as features.  */
 
Index: params.h
===================================================================
--- params.h	(revision 165189)
+++ params.h	(working copy)
@@ -1,5 +1,5 @@
 /* params.h - Run-time parameters.
-   Copyright (C) 2001, 2003, 2004, 2005, 2007, 2008, 2009
+   Copyright (C) 2001, 2003, 2004, 2005, 2007, 2008, 2009, 2010
    Free Software Foundation, Inc.
    Written by Mark Mitchell <mark@codesourcery.com>.
 
@@ -88,13 +88,24 @@ typedef enum compiler_param
   LAST_PARAM
 } compiler_param;
 
-/* The value of the parameter given by ENUM.  */
+/* The value of the parameter given by ENUM.  Not an lvalue.  */
 #define PARAM_VALUE(ENUM) \
-  (compiler_params[(int) ENUM].value)
+  ((int) compiler_params[(int) ENUM].value)
 
-/* True if the value of the parameter was explicitly changed.  */
+/* Set the value of the parameter given by NUM to VALUE, implicitly,
+   if it has not been set explicitly by the user.  */
+
+extern void maybe_set_param_value (compiler_param num, int value);
+
+/* Set the default value of a parameter given by NUM to VALUE, before
+   option processing.  */
+
+extern void set_default_param_value (compiler_param num, int value);
+
+/* True if the value of the parameter was explicitly changed.  Not an
+   lvalue.  */
 #define PARAM_SET_P(ENUM) \
-  (compiler_params[(int) ENUM].set)
+  ((bool) compiler_params[(int) ENUM].set)
 
 /* Macros for the various parameters.  */
 #define STRUCT_REORG_COLD_STRUCT_RATIO \
Index: toplev.c
===================================================================
--- toplev.c	(revision 165189)
+++ toplev.c	(working copy)
@@ -1692,6 +1692,7 @@ general_init (const char *argv0)
 
   /* Register the language-independent parameters.  */
   add_params (lang_independent_params, LAST_PARAM);
+  targetm.target_option.default_params ();
 
   /* This must be done after add_params but before argument processing.  */
   init_ggc_heuristics();
Index: opts.c
===================================================================
--- opts.c	(revision 165189)
+++ opts.c	(working copy)
@@ -669,11 +669,11 @@ init_options_once (void)
 
   /* Save initial values of parameters we reset.  */
   initial_min_crossjump_insns
-    = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
+    = PARAM_VALUE (PARAM_MIN_CROSSJUMP_INSNS);
   initial_max_fields_for_field_sensitive
-    = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
+    = PARAM_VALUE (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE);
   initial_loop_invariant_max_bbs_in_loop
-    = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
+    = PARAM_VALUE (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP);
 }
 
 /* Initialize OPTS and OPTS_SET before using them in parsing options.  */
@@ -853,12 +853,12 @@ default_options_optimization (struct gcc
   flag_ipa_sra = opt2;
 
   /* Track fields in field-sensitive alias analysis.  */
-  set_param_value ("max-fields-for-field-sensitive",
-		   (opt2) ? 100 : initial_max_fields_for_field_sensitive);
+  maybe_set_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
+			 opt2 ? 100 : initial_max_fields_for_field_sensitive);
 
   /* For -O1 only do loop invariant motion for very small loops.  */
-  set_param_value ("loop-invariant-max-bbs-in-loop",
-		   (opt2) ? initial_loop_invariant_max_bbs_in_loop : 1000);
+  maybe_set_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
+			 opt2 ? initial_loop_invariant_max_bbs_in_loop : 1000);
 
   /* -O3 optimizations.  */
   opt3 = (optimize >= 3);
@@ -891,10 +891,11 @@ default_options_optimization (struct gcc
 	optimize = 2;
 
       /* We want to crossjump as much as possible.  */
-      set_param_value ("min-crossjump-insns", 1);
+      maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1);
     }
   else
-    set_param_value ("min-crossjump-insns", initial_min_crossjump_insns);
+    maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
+			   initial_min_crossjump_insns);
 
   /* -Ofast adds optimizations to -O3.  */
   if (ofast)
@@ -1114,10 +1115,8 @@ finish_options (struct gcc_options *opts
 
   if (flag_conserve_stack)
     {
-      if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME))
-        PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 100;
-      if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
-        PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
+      maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100);
+      maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40);
     }
   if (flag_wpa || flag_ltrans)
     {
Index: ggc-common.c
===================================================================
--- ggc-common.c	(revision 165189)
+++ ggc-common.c	(working copy)
@@ -857,8 +857,8 @@ void
 init_ggc_heuristics (void)
 {
 #if !defined ENABLE_GC_CHECKING && !defined ENABLE_GC_ALWAYS_COLLECT
-  set_param_value ("ggc-min-expand", ggc_min_expand_heuristic ());
-  set_param_value ("ggc-min-heapsize", ggc_min_heapsize_heuristic ());
+  set_default_param_value (GGC_MIN_EXPAND, ggc_min_expand_heuristic ());
+  set_default_param_value (GGC_MIN_HEAPSIZE, ggc_min_heapsize_heuristic ());
 #endif
 }
 
Index: config/s390/s390.c
===================================================================
--- config/s390/s390.c	(revision 165189)
+++ config/s390/s390.c	(working copy)
@@ -1687,30 +1687,22 @@ s390_option_override (void)
   if (s390_tune == PROCESSOR_2097_Z10
       || s390_tune == PROCESSOR_2817_Z196)
     {
-      if (!PARAM_SET_P (PARAM_MAX_UNROLLED_INSNS))
-	set_param_value ("max-unrolled-insns", 100);
-      if (!PARAM_SET_P (PARAM_MAX_UNROLL_TIMES))
-	set_param_value ("max-unroll-times", 32);
-      if (!PARAM_SET_P (PARAM_MAX_COMPLETELY_PEELED_INSNS))
-	set_param_value ("max-completely-peeled-insns", 2000);
-      if (!PARAM_SET_P (PARAM_MAX_COMPLETELY_PEEL_TIMES))
-	set_param_value ("max-completely-peel-times", 64);
+      maybe_set_param_value (PARAM_MAX_UNROLLED_INSNS, 100);
+      maybe_set_param_value (PARAM_MAX_UNROLL_TIMES, 32);
+      maybe_set_param_value (PARAM_MAX_COMPLETELY_PEELED_INSNS, 2000);
+      maybe_set_param_value (PARAM_MAX_COMPLETELY_PEEL_TIMES, 64);
     }
 
   set_param_value ("max-pending-list-length", 256);
   /* values for loop prefetching */
   set_param_value ("l1-cache-line-size", 256);
-  if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
-    set_param_value ("l1-cache-size", 128);
+  maybe_set_param_value (PARAM_L1_CACHE_SIZE, 128);
   /* s390 has more than 2 levels and the size is much larger.  Since
      we are always running virtualized assume that we only get a small
      part of the caches above l1.  */
-  if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
-    set_param_value ("l2-cache-size", 1500);
-  if (!PARAM_SET_P (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO))
-    set_param_value ("prefetch-min-insn-to-mem-ratio", 2);
-  if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
-    set_param_value ("simultaneous-prefetches", 6);
+  maybe_set_param_value (PARAM_L2_CACHE_SIZE, 1500);
+  maybe_set_param_value (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO, 2);
+  maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES, 6);
 
   /* This cannot reside in s390_option_optimization since HAVE_prefetch
      requires the arch flags to be evaluated already.  Since prefetching
Index: config/spu/spu.c
===================================================================
--- config/spu/spu.c	(revision 165189)
+++ config/spu/spu.c	(working copy)
@@ -151,6 +151,7 @@ char regs_ever_allocated[FIRST_PSEUDO_RE
 /*  Prototypes and external defs.  */
 static void spu_option_override (void);
 static void spu_option_optimization (int, int);
+static void spu_option_default_params (void);
 static void spu_init_builtins (void);
 static tree spu_builtin_decl (unsigned, bool);
 static bool spu_scalar_mode_supported_p (enum machine_mode mode);
@@ -482,6 +483,9 @@ static const struct attribute_spec spu_a
 #undef TARGET_OPTION_OPTIMIZATION
 #define TARGET_OPTION_OPTIMIZATION spu_option_optimization
 
+#undef TARGET_OPTION_DEFAULT_PARAMS
+#define TARGET_OPTION_DEFAULT_PARAMS spu_option_default_params
+
 #undef TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO  sjlj_except_unwind_info
 
@@ -490,23 +494,27 @@ struct gcc_target targetm = TARGET_INITI
 static void
 spu_option_optimization (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
 {
-  /* Override some of the default param values.  With so many registers
-     larger values are better for these params.  */
-  MAX_PENDING_LIST_LENGTH = 128;
-
   /* With so many registers this is better on by default. */
   flag_rename_registers = 1;
 }
 
+/* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
+static void
+spu_option_default_params (void)
+{
+  /* Override some of the default param values.  With so many registers
+     larger values are better for these params.  */
+  set_default_param_value (PARAM_MAX_PENDING_LIST_LENGTH, 128);
+}
+
 /* Implement TARGET_OPTION_OVERRIDE.  */
 static void
 spu_option_override (void)
 {
   /* Small loops will be unpeeled at -O3.  For SPU it is more important
      to keep code small by default.  */
-  if (!flag_unroll_loops && !flag_peel_loops
-      && !PARAM_SET_P (PARAM_MAX_COMPLETELY_PEEL_TIMES))
-    PARAM_VALUE (PARAM_MAX_COMPLETELY_PEEL_TIMES) = 1;
+  if (!flag_unroll_loops && !flag_peel_loops)
+    maybe_set_param_value (PARAM_MAX_COMPLETELY_PEEL_TIMES, 1);
 
   flag_omit_frame_pointer = 1;
 
Index: config/sparc/sparc.c
===================================================================
--- config/sparc/sparc.c	(revision 165189)
+++ config/sparc/sparc.c	(working copy)
@@ -916,21 +916,19 @@ sparc_option_override (void)
     target_flags |= MASK_LONG_DOUBLE_128;
 #endif
 
-  if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
-    set_param_value ("simultaneous-prefetches",
-		     ((sparc_cpu == PROCESSOR_ULTRASPARC
-		       || sparc_cpu == PROCESSOR_NIAGARA
-		       || sparc_cpu == PROCESSOR_NIAGARA2)
-		      ? 2
-		      : (sparc_cpu == PROCESSOR_ULTRASPARC3
-			 ? 8 : 3)));
-  if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
-    set_param_value ("l1-cache-line-size",
-		     ((sparc_cpu == PROCESSOR_ULTRASPARC
-		       || sparc_cpu == PROCESSOR_ULTRASPARC3
-		       || sparc_cpu == PROCESSOR_NIAGARA
-		       || sparc_cpu == PROCESSOR_NIAGARA2)
-		      ? 64 : 32));
+  maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
+			 ((sparc_cpu == PROCESSOR_ULTRASPARC
+			   || sparc_cpu == PROCESSOR_NIAGARA
+			   || sparc_cpu == PROCESSOR_NIAGARA2)
+			  ? 2
+			  : (sparc_cpu == PROCESSOR_ULTRASPARC3
+			     ? 8 : 3)));
+  maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
+			 ((sparc_cpu == PROCESSOR_ULTRASPARC
+			   || sparc_cpu == PROCESSOR_ULTRASPARC3
+			   || sparc_cpu == PROCESSOR_NIAGARA
+			   || sparc_cpu == PROCESSOR_NIAGARA2)
+			  ? 64 : 32));
 }
 
 /* Miscellaneous utilities.  */
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 165189)
+++ config/i386/i386.c	(working copy)
@@ -3632,15 +3632,11 @@ ix86_option_override_internal (bool main
   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);
-  if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
-    set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
-  if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
-    set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
-  if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
-    set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
+  maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
+			 ix86_cost->simultaneous_prefetches);
+  maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE, ix86_cost->prefetch_block);
+  maybe_set_param_value (PARAM_L1_CACHE_SIZE, ix86_cost->l1_cache_size);
+  maybe_set_param_value (PARAM_L2_CACHE_SIZE, ix86_cost->l2_cache_size);
 
   /* Enable sw prefetching at -O3 for CPUS that prefetching is helpful.  */
   if (flag_prefetch_loop_arrays < 0
Index: config/sh/sh.c
===================================================================
--- config/sh/sh.c	(revision 165189)
+++ config/sh/sh.c	(working copy)
@@ -184,6 +184,7 @@ static rtx gen_block_redirect (rtx, int,
 static void sh_reorg (void);
 static void sh_option_override (void);
 static void sh_option_optimization (int, int);
+static void sh_option_default_params (void);
 static void output_stack_adjust (int, rtx, int, HARD_REG_SET *, bool);
 static rtx frame_insn (rtx);
 static rtx push (int);
@@ -342,6 +343,8 @@ static const struct attribute_spec sh_at
 #define TARGET_OPTION_OVERRIDE sh_option_override
 #undef TARGET_OPTION_OPTIMIZATION
 #define TARGET_OPTION_OPTIMIZATION sh_option_optimization
+#undef TARGET_OPTION_DEFAULT_PARAMS
+#define TARGET_OPTION_DEFAULT_PARAMS sh_option_default_params
 
 #undef TARGET_PRINT_OPERAND
 #define TARGET_PRINT_OPERAND sh_print_operand
@@ -731,8 +734,13 @@ sh_option_optimization (int level, int s
      the user explicitly requested this to be on or off.  */
   if (flag_schedule_insns > 0)
     flag_schedule_insns = 2;
+}
 
-  set_param_value ("simultaneous-prefetches", 2);
+/* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
+static void
+sh_option_default_params (void)
+{
+  set_default_param_value (PARAM_SIMULTANEOUS_PREFETCHES, 2);
 }
 
 /* Implement TARGET_OPTION_OVERRIDE macro.  Validate and override 
Index: config/ia64/ia64.c
===================================================================
--- config/ia64/ia64.c	(revision 165189)
+++ config/ia64/ia64.c	(working copy)
@@ -203,6 +203,7 @@ static rtx gen_fr_restore_x (rtx, rtx, r
 
 static void ia64_option_override (void);
 static void ia64_option_optimization (int, int);
+static void ia64_option_default_params (void);
 static bool ia64_can_eliminate (const int, const int);
 static enum machine_mode hfa_element_mode (const_tree, bool);
 static void ia64_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
@@ -372,6 +373,8 @@ static const struct attribute_spec ia64_
 #define TARGET_OPTION_OVERRIDE ia64_option_override
 #undef TARGET_OPTION_OPTIMIZATION
 #define TARGET_OPTION_OPTIMIZATION ia64_option_optimization
+#undef TARGET_OPTION_DEFAULT_PARAMS
+#define TARGET_OPTION_DEFAULT_PARAMS ia64_option_default_params
 
 #undef TARGET_ASM_FUNCTION_PROLOGUE
 #define TARGET_ASM_FUNCTION_PROLOGUE ia64_output_function_prologue
@@ -10839,15 +10842,20 @@ ia64_option_optimization (int level ATTR
 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
   SUBTARGET_OPTIMIZATION_OPTIONS;
 #endif
+}
 
+/* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
+static void
+ia64_option_default_params (void)
+{
   /* Let the scheduler form additional regions.  */
-  set_param_value ("max-sched-extend-regions-iters", 2);
+  set_default_param_value (PARAM_MAX_SCHED_EXTEND_REGIONS_ITERS, 2);
 
   /* Set the default values for cache-related parameters.  */
-  set_param_value ("simultaneous-prefetches", 6);
-  set_param_value ("l1-cache-line-size", 32);
+  set_default_param_value (PARAM_SIMULTANEOUS_PREFETCHES, 6);
+  set_default_param_value (PARAM_L1_CACHE_LINE_SIZE, 32);
 
-  set_param_value("sched-mem-true-dep-cost", 4);
+  set_default_param_value (PARAM_SCHED_MEM_TRUE_DEP_COST, 4);
 }
 
 /* HP-UX version_id attribute.
Index: config/rs6000/rs6000.c
===================================================================
--- config/rs6000/rs6000.c	(revision 165189)
+++ config/rs6000/rs6000.c	(working copy)
@@ -1137,6 +1137,7 @@ static rtx altivec_expand_vec_ext_builti
 static int get_element_number (tree, tree);
 static void rs6000_option_override (void);
 static void rs6000_option_optimization (int, int);
+static void rs6000_option_default_params (void);
 static bool rs6000_handle_option (size_t, const char *, int);
 static void rs6000_parse_tls_size_option (void);
 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
@@ -1604,6 +1605,9 @@ static const struct attribute_spec rs600
 #undef TARGET_OPTION_OPTIMIZATION
 #define TARGET_OPTION_OPTIMIZATION rs6000_option_optimization
 
+#undef TARGET_OPTION_DEFAULT_PARAMS
+#define TARGET_OPTION_DEFAULT_PARAMS rs6000_option_default_params
+
 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
   rs6000_builtin_vectorized_function
@@ -3154,15 +3158,12 @@ rs6000_option_override_internal (const c
 	gcc_unreachable ();
       }
 
-  if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
-    set_param_value ("simultaneous-prefetches",
-		     rs6000_cost->simultaneous_prefetches);
-  if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
-    set_param_value ("l1-cache-size", rs6000_cost->l1_cache_size);
-  if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
-    set_param_value ("l1-cache-line-size", rs6000_cost->cache_line_size);
-  if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
-    set_param_value ("l2-cache-size", rs6000_cost->l2_cache_size);
+  maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
+			 rs6000_cost->simultaneous_prefetches);
+  maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size);
+  maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
+			 rs6000_cost->cache_line_size);
+  maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size);
 
   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
      can be optimized to ap = __builtin_next_arg (0).  */
@@ -3681,9 +3682,6 @@ rs6000_option_optimization (int level AT
        avoid calling them when that's the only reason we would.  */
     flag_errno_math = 0;
 
-  /* Double growth factor to counter reduced min jump length.  */
-  set_param_value ("max-grow-copy-bb-insns", 16);
-
   /* Enable section anchors by default.
      Skip section anchors for Objective C and Objective C++
      until front-ends fixed.  */
@@ -3691,6 +3689,15 @@ rs6000_option_optimization (int level AT
     flag_section_anchors = 2;
 }
 
+/* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
+
+static void
+rs6000_option_default_params (void)
+{
+  /* Double growth factor to counter reduced min jump length.  */
+  set_default_param_value (PARAM_MAX_GROW_COPY_BB_INSNS, 16);
+}
+
 static enum fpu_type_t
 rs6000_parse_fpu_option (const char *option)
 {
Index: config/picochip/picochip.c
===================================================================
--- config/picochip/picochip.c	(revision 165189)
+++ config/picochip/picochip.c	(working copy)
@@ -342,10 +342,10 @@ picochip_option_override (void)
   /* If we are optimizing for stack, dont let inliner to inline functions
      that could potentially increase stack size.*/
    if (flag_conserve_stack)
-   {
-     PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 0;
-     PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 0;
-   }
+     {
+       maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 0);
+       maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 0);
+     }
 
   /* Turn off the elimination of unused types. The elaborator
      generates various interesting types to represent constants,
Index: config/arm/arm.c
===================================================================
--- config/arm/arm.c	(revision 165189)
+++ config/arm/arm.c	(working copy)
@@ -1953,13 +1953,12 @@ arm_option_override (void)
       flag_reorder_blocks = 1;
     }
 
-  if (!PARAM_SET_P (PARAM_GCSE_UNRESTRICTED_COST)
-      && flag_pic)
+  if (flag_pic)
     /* Hoisting PIC address calculations more aggressively provides a small,
        but measurable, size reduction for PIC code.  Therefore, we decrease
        the bar for unrestricted expression hoisting to the cost of PIC address
        calculation, which is 2 instructions.  */
-    set_param_value ("gcse-unrestricted-cost", 2);
+    maybe_set_param_value (PARAM_GCSE_UNRESTRICTED_COST, 2);
 
   /* Register global variables with the garbage collector.  */
   arm_add_gc_roots ();
