Short-circuit alt_fail case in record_reg_classes
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 13 Jan 2017 15:56:04 +0000 (15:56 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 13 Jan 2017 15:56:04 +0000 (15:56 +0000)
record_reg_classes is often the hottest function when generating
unoptimised output.  It seems typical for over 60% of the instructions
it handles to be moves, and of course moves tend to be the instructions
with the longest constraint strings.

Maybe we should avoid using move constraints to set costs in unoptimised
output and instead use the "natural" class for the mode being moved.
That's too invasive for stage 3 though.

However, seeing so many moves means that we see many "failing"
alternatives, usually because of '*' or because of hard registers
in function call sequences.  The frequency of alternatives that are
detected as failures after the first operand tends again to be more
than 60%.  Previously we would continue to process the other operands
of the alternative regardless.  This patch instead adds a short-cut.

As well as avoiding unnecessary work, it means that the alt_fail
variable can be jump-threaded away.

Tested on aach64-linux-gnu and x86_64-linux-gnu.  It reduces compile
time by about 1% on some tests with "-g -O0".

gcc/
* ira-costs.c (record_reg_classes): Break from the inner loop
early once alt_fail is known to be true.  Update outer loop
handling accordingly.

From-SVN: r244446

gcc/ChangeLog
gcc/ira-costs.c

index 203967016730ff9e5529eea105a770b79d84d9fe..95d1d0ac008167b47ed006f36fb128114be0eef6 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-13  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * ira-costs.c (record_reg_classes): Break from the inner loop
+       early once alt_fail is known to be true.  Update outer loop
+       handling accordingly.
+
 2017-01-13  Jeff Law  <law@redhat.com>
 
        * tree-ssa-dse.c (decrement_count): New function.
index 50d0c04764d00440520de21894b53d56e6887fe2..c3bddb7f7d09b338dcabd7bb4042458c85789490 100644 (file)
@@ -820,6 +820,9 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
 
          constraints[i] = p;
 
+         if (alt_fail)
+           break;
+
          /* How we account for this operand now depends on whether it
             is a pseudo register or not.  If it is, we first check if
             any register classes are valid.  If not, we ignore this
@@ -999,10 +1002,21 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
            alt_cost += ira_memory_move_cost[mode][classes[i]][1];
          else
            alt_fail = 1;
+
+         if (alt_fail)
+           break;
        }
 
       if (alt_fail)
-       continue;
+       {
+         /* The loop above might have exited early once the failure
+            was seen.  Skip over the constraints for the remaining
+            operands.  */
+         i += 1;
+         for (; i < n_ops; ++i)
+           constraints[i] = skip_alternative (constraints[i]);
+         continue;
+       }
 
       op_cost_add = alt_cost * frequency;
       /* Finally, update the costs with the information we've