mips.c (mips_base_move_loop_invariants): New variable.
authorRichard Sandiford <richard@codesourcery.com>
Fri, 7 Sep 2007 08:14:10 +0000 (08:14 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 7 Sep 2007 08:14:10 +0000 (08:14 +0000)
gcc/
* config/mips/mips.c (mips_base_move_loop_invariants): New variable.
(mips_set_mips16_mode): Restore flag_move_loop_invariants, then set
to 0 for MIPS16.
(override_options): Set mips_base_move_loop_invariants.

From-SVN: r128232

gcc/ChangeLog
gcc/config/mips/mips.c

index ab560c4a37d4515a51c229ce42cbfe38982e3b76..5d527d263b506904b0340033e810c477d0b76de1 100644 (file)
@@ -1,3 +1,10 @@
+2007-09-07  Richard Sandiford  <richard@codesourcery.com>
+
+       * config/mips/mips.c (mips_base_move_loop_invariants): New variable.
+       (mips_set_mips16_mode): Restore flag_move_loop_invariants, then set
+       to 0 for MIPS16.
+       (override_options): Set mips_base_move_loop_invariants.
+
 2007-09-07  Richard Sandiford  <richard@codesourcery.com>
 
        * config/mips/mips.opt (mcode-readable=): Move to keep list
index 365561829e3771cbb8a12fe0e745169afdfe12f8..a4771f7d5ea328301fbd0fa5adcbfbbae28a0ca5 100644 (file)
@@ -626,6 +626,7 @@ static bool mips_base_mips16;
 /* Similar copies of option settings.  */
 static int mips_base_schedule_insns; /* flag_schedule_insns */
 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
+static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
 static int mips_base_align_loops; /* align_loops */
 static int mips_base_align_jumps; /* align_jumps */
 static int mips_base_align_functions; /* align_functions */
@@ -5273,6 +5274,7 @@ mips_set_mips16_mode (int mips16_p)
   align_functions = mips_base_align_functions;
   flag_schedule_insns = mips_base_schedule_insns;
   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
+  flag_move_loop_invariants = mips_base_move_loop_invariants;
   flag_delayed_branch = mips_flag_delayed_branch;
   
   if (mips16_p) 
@@ -5285,9 +5287,16 @@ mips_set_mips16_mode (int mips16_p)
       flag_schedule_insns = 0;
 
       /* Don't do hot/cold partitioning.  The constant layout code expects
-       the whole function to be in a single section.  */
+        the whole function to be in a single section.  */
       flag_reorder_blocks_and_partition = 0;
 
+      /* Don't move loop invariants, because it tends to increase
+        register pressure.  It also introduces an extra move in cases
+        where the constant is the first operand in a two-operand binary
+        instruction, or when it forms a register argument to a functon
+        call.  */
+      flag_move_loop_invariants = 0;
+
       /* Silently disable -mexplicit-relocs since it doesn't apply
         to mips16 code.  Even so, it would overly pedantic to warn
         about "-mips16 -mexplicit-relocs", especially given that
@@ -5804,6 +5813,7 @@ override_options (void)
   mips_base_target_flags = target_flags;
   mips_base_schedule_insns = flag_schedule_insns;
   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
+  mips_base_move_loop_invariants = flag_move_loop_invariants;
   mips_base_align_loops = align_loops;
   mips_base_align_jumps = align_jumps;
   mips_base_align_functions = align_functions;