aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-01-27 10:26:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-01-27 10:26:48 +0100
commitae25db4568034756df727d432dd48caa5e5f41dc (patch)
tree16e846864fdcef1a44f9052759fe3138b9c8ffe4
parent1228a6a69b9fddc0aaa2b462db44d3d2bef4f22f (diff)
downloadgcc-ae25db4568034756df727d432dd48caa5e5f41dc.zip
gcc-ae25db4568034756df727d432dd48caa5e5f41dc.tar.gz
gcc-ae25db4568034756df727d432dd48caa5e5f41dc.tar.bz2
re PR debug/52001 (Huge compile-time regression with var-tracking)
PR debug/52001 * var-tracking.c (reverse_op): Don't add any reverse operation if V already has any constant locations. From-SVN: r183608
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/var-tracking.c9
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0a4e08b..fe748f4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/52001
+ * var-tracking.c (reverse_op): Don't add any reverse operation
+ if V already has any constant locations.
+
2012-01-27 Sandra Loosemore <sandra@codesourcery.com>
* doc/invoke.texi: Correct usage of "command line" (noun)
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 557a2ca..1f4903a 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -5298,6 +5298,7 @@ reverse_op (rtx val, const_rtx expr, rtx insn)
{
rtx src, arg, ret;
cselib_val *v;
+ struct elt_loc_list *l;
enum rtx_code code;
if (GET_CODE (expr) != SET)
@@ -5333,6 +5334,14 @@ reverse_op (rtx val, const_rtx expr, rtx insn)
if (!v || !cselib_preserved_value_p (v))
return;
+ /* Adding a reverse op isn't useful if V already has an always valid
+ location. Ignore ENTRY_VALUE, while it is always constant, we should
+ prefer non-ENTRY_VALUE locations whenever possible. */
+ for (l = v->locs; l; l = l->next)
+ if (CONSTANT_P (l->loc)
+ && (GET_CODE (l->loc) != CONST || !references_value_p (l->loc, 0)))
+ return;
+
switch (GET_CODE (src))
{
case NOT: