aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2017-01-13 15:56:04 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-01-13 15:56:04 +0000
commit3d8e492088897fadb3434917d73f5728f1bbbc19 (patch)
tree929449609619b78f8928c5c255b6a6dacb0c58c6
parent92daf2dedd1c8b0fda49ebf3b824cf251808be02 (diff)
downloadgcc-3d8e492088897fadb3434917d73f5728f1bbbc19.zip
gcc-3d8e492088897fadb3434917d73f5728f1bbbc19.tar.gz
gcc-3d8e492088897fadb3434917d73f5728f1bbbc19.tar.bz2
Short-circuit alt_fail case in record_reg_classes
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira-costs.c16
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2039670..95d1d0a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index 50d0c04..c3bddb7 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -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