@@ -483,6 +483,10 @@ Og
Common Optimization
Optimize for debugging experience rather than speed or size.
+Oz
+Common Optimization
+Optimize for space aggressively rather than speed.
+
Q
Driver
@@ -370,12 +370,14 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
case OPT_Ofast:
case OPT_Og:
case OPT_Os:
+ case OPT_Oz:
existing_opt = -1;
for (j = 0; j < decoded_options.length (); ++j)
if (decoded_options[j].opt_index == OPT_O
|| decoded_options[j].opt_index == OPT_Ofast
|| decoded_options[j].opt_index == OPT_Og
- || decoded_options[j].opt_index == OPT_Os)
+ || decoded_options[j].opt_index == OPT_Os
+ || decoded_options[j].opt_index == OPT_Oz)
{
existing_opt = j;
break;
@@ -407,6 +409,7 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
level = MAX (level, 1);
break;
case OPT_Os:
+ case OPT_Oz:
level = MAX (level, 2);
break;
default:
@@ -428,6 +431,7 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
level = MAX (level, 1);
break;
case OPT_Os:
+ case OPT_Oz:
level = MAX (level, 2);
break;
default:
@@ -725,6 +729,7 @@ append_compiler_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
case OPT_Ofast:
case OPT_Og:
case OPT_Os:
+ case OPT_Oz:
break;
case OPT_Xassembler:
@@ -93,7 +93,7 @@ var_opt_char[1] = "optimize_size";
var_opt_char[2] = "optimize_debug";
var_opt_char[3] = "optimize_fast";
var_opt_range["optimize"] = "0, 255";
-var_opt_range["optimize_size"] = "0, 1";
+var_opt_range["optimize_size"] = "0, 2";
var_opt_range["optimize_debug"] = "0, 1";
var_opt_range["optimize_fast"] = "0, 1";
@@ -745,6 +745,15 @@ default_options_optimization (struct gcc_options *opts,
opts->x_optimize_debug = 0;
break;
+ case OPT_Oz:
+ opts->x_optimize_size = 2;
+
+ /* Optimizing for size forces optimize to be 2. */
+ opts->x_optimize = 2;
+ opts->x_optimize_fast = 0;
+ opts->x_optimize_debug = 0;
+ break;
+
case OPT_Ofast:
/* -Ofast only adds flags to -O3. */
opts->x_optimize_size = 0;
@@ -2609,6 +2618,7 @@ common_handle_option (struct gcc_options *opts,
case OPT_Os:
case OPT_Ofast:
case OPT_Og:
+ case OPT_Oz:
/* Currently handled in a prescan. */
break;
@@ -2213,7 +2213,14 @@
case TYPE_IMOV:
gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
if (get_attr_mode (insn) == MODE_SI)
- return "mov{l}\t{%k1, %k0|%k0, %k1}";
+ {
+ if (optimize_size > 1
+ && TARGET_64BIT
+ && CONST_INT_P (operands[1])
+ && IN_RANGE (INTVAL (operands[1]), -128, 127))
+ return "push{q}\t%1\n\tpop{q}\t%0";
+ return "mov{l}\t{%k1, %k0|%k0, %k1}";
+ }
else if (which_alternative == 4)
return "movabs{q}\t{%1, %0|%0, %1}";
else if (ix86_use_lea_for_mov (insn, operands))
@@ -2431,6 +2438,14 @@
gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
if (ix86_use_lea_for_mov (insn, operands))
return "lea{l}\t{%E1, %0|%0, %E1}";
+ else if (optimize_size > 1
+ && CONST_INT_P (operands[1])
+ && IN_RANGE (INTVAL (operands[1]), -128, 127))
+ {
+ if (TARGET_64BIT)
+ return "push{q}\t%1\n\tpop{q}\t%q0";
+ return "push{l}\t%1\n\tpop{l}\t%0";
+ }
else
return "mov{l}\t{%1, %0|%0, %1}";
new file mode 100644
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-Oz" } */
+
+int foo()
+{
+ return 25;
+}
+
+/* { dg-final { scan-assembler "push" } } */
+/* { dg-final { scan-assembler "pop" } } */