diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 26a0c96f366d2d8ff64aa7ebe62334439fca838c..8382f5091decd9a444844c826b6aa9a3d80c3927 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-02-17  Joseph Myers  <joseph@codesourcery.com>
+
+	* common.opt (optimize_fast): New Variable.
+	* opts.c (default_options_optimization): Use opts->x_optimize_fast
+	instead of local variable ofast.
+
 2011-02-17  Nicola Pero  <nicola.pero@meta-innovation.com>
 
 	* doc/invoke.texi (fobjc-abi-version): Documented.
diff --git a/gcc/common.opt b/gcc/common.opt
index 1f24a3a67a0f243481d44fa72ee44197aa0a159c..f95805c7f1e0d4fc58c1a8f1fe06c507749ba95e 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -32,6 +32,11 @@ int optimize
 Variable
 int optimize_size
 
+; Not used directly to control optimizations, only to save -Ofast
+; setting for "optimize" attributes.
+Variable
+int optimize_fast
+
 ; 0 means straightforward implementation of complex divide acceptable.
 ; 1 means wide ranges of inputs must work for complex divide.
 ; 2 means C99-like requirements for complex multiply and divide.
diff --git a/gcc/opts.c b/gcc/opts.c
index 8ca9c67bb8e8e46928bcc8a29161dd42308bd54b..9f93356539f5f37d07874f5326cc882e8b65f9ae 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -524,7 +524,6 @@ default_options_optimization (struct gcc_options *opts,
 {
   unsigned int i;
   int opt2;
-  int ofast = 0;
 
   /* Scan to see what optimization level has been specified.  That will
      determine the default value of many flags.  */
@@ -538,7 +537,7 @@ default_options_optimization (struct gcc_options *opts,
 	    {
 	      opts->x_optimize = 1;
 	      opts->x_optimize_size = 0;
-	      ofast = 0;
+	      opts->x_optimize_fast = 0;
 	    }
 	  else
 	    {
@@ -553,7 +552,7 @@ default_options_optimization (struct gcc_options *opts,
 		  if ((unsigned int) opts->x_optimize > 255)
 		    opts->x_optimize = 255;
 		  opts->x_optimize_size = 0;
-		  ofast = 0;
+		  opts->x_optimize_fast = 0;
 		}
 	    }
 	  break;
@@ -563,14 +562,14 @@ default_options_optimization (struct gcc_options *opts,
 
 	  /* Optimizing for size forces optimize to be 2.  */
 	  opts->x_optimize = 2;
-	  ofast = 0;
+	  opts->x_optimize_fast = 0;
 	  break;
 
 	case OPT_Ofast:
 	  /* -Ofast only adds flags to -O3.  */
 	  opts->x_optimize_size = 0;
 	  opts->x_optimize = 3;
-	  ofast = 1;
+	  opts->x_optimize_fast = 1;
 	  break;
 
 	default:
@@ -581,7 +580,7 @@ default_options_optimization (struct gcc_options *opts,
 
   maybe_default_options (opts, opts_set, default_options_table,
 			 opts->x_optimize, opts->x_optimize_size,
-			 ofast, lang_mask, handlers, loc, dc);
+			 opts->x_optimize_fast, lang_mask, handlers, loc, dc);
 
   /* -O2 param settings.  */
   opt2 = (opts->x_optimize >= 2);
@@ -611,7 +610,7 @@ default_options_optimization (struct gcc_options *opts,
   maybe_default_options (opts, opts_set,
 			 targetm.target_option.optimization_table,
 			 opts->x_optimize, opts->x_optimize_size,
-			 ofast, lang_mask, handlers, loc, dc);
+			 opts->x_optimize_fast, lang_mask, handlers, loc, dc);
 }
 
 /* After all options at LOC have been read into OPTS and OPTS_SET,