From af116cae675e31b999844b7243c01bed9517c51c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 6 Feb 2014 16:47:12 +0100 Subject: [PATCH] re PR debug/59992 (Compilation of insn-recog.c too slow due to var-tracking) PR debug/59992 * var-tracking.c (adjust_mems): Before adding a SET to amd->side_effects, adjust it's SET_SRC using simplify_replace_fn_rtx. * gcc.dg/pr59992.c: New test. From-SVN: r207562 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr59992.c | 17 +++++++++++++++++ gcc/var-tracking.c | 15 +++++++++++---- 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr59992.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c5f02802385f..fcbc4567793d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-02-06 Jakub Jelinek + + PR debug/59992 + * var-tracking.c (adjust_mems): Before adding a SET + to amd->side_effects, adjust it's SET_SRC using + simplify_replace_fn_rtx. + 2014-02-06 Alan Modra PR target/60032 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 80892ee74e72..e0daf52824c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-06 Jakub Jelinek + + PR debug/59992 + * gcc.dg/pr59992.c: New test. + 2014-02-06 Marc Glisse * g++.dg/cpp0x/constexpr-attribute2.C: Restrict to target diff --git a/gcc/testsuite/gcc.dg/pr59992.c b/gcc/testsuite/gcc.dg/pr59992.c new file mode 100644 index 000000000000..5434a2fe9353 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr59992.c @@ -0,0 +1,17 @@ +/* PR debug/59992 */ +/* { dg-do compile } */ +/* { dg-require-effective-target run_expensive_tests } */ +/* { dg-options "-O2 -g" } */ +/* { dg-timeout-factor 16.0 } */ + +#define A(n) if (p[n]) { extern void foo##n (int, int, double, int, int); foo##n (p[n], 5, 8.0, p[n] + p[n + 1], 9); return; } +#define B(n) A(n##0) A(n##1) A(n##2) A(n##3) A(n##4) A(n##5) A(n##6) A(n##7) A(n##8) A(n##9) +#define C(n) B(n##0) B(n##1) B(n##2) B(n##3) B(n##4) B(n##5) B(n##6) B(n##7) B(n##8) B(n##9) +#define D(n) C(n##0) C(n##1) C(n##2) C(n##3) C(n##4) C(n##5) C(n##6) C(n##7) C(n##8) C(n##9) +#define E(n) D(n##0) D(n##1) D(n##2) D(n##3) D(n##4) D(n##5) D(n##6) D(n##7) D(n##8) D(n##9) + +void +foo (int *p) +{ + E(1) +} diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index cfa785079f64..a13cac79f37b 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -1067,10 +1067,13 @@ adjust_mems (rtx loc, const_rtx old_rtx, void *data) ? GET_MODE_SIZE (amd->mem_mode) : -GET_MODE_SIZE (amd->mem_mode), GET_MODE (loc))); + store_save = amd->store; + amd->store = false; + tem = simplify_replace_fn_rtx (tem, old_rtx, adjust_mems, data); + amd->store = store_save; amd->side_effects = alloc_EXPR_LIST (0, gen_rtx_SET (VOIDmode, - XEXP (loc, 0), - tem), + XEXP (loc, 0), tem), amd->side_effects); return addr; case PRE_MODIFY: @@ -1080,10 +1083,14 @@ adjust_mems (rtx loc, const_rtx old_rtx, void *data) addr = XEXP (loc, 0); gcc_assert (amd->mem_mode != VOIDmode); addr = simplify_replace_fn_rtx (addr, old_rtx, adjust_mems, data); + store_save = amd->store; + amd->store = false; + tem = simplify_replace_fn_rtx (XEXP (loc, 1), old_rtx, + adjust_mems, data); + amd->store = store_save; amd->side_effects = alloc_EXPR_LIST (0, gen_rtx_SET (VOIDmode, - XEXP (loc, 0), - XEXP (loc, 1)), + XEXP (loc, 0), tem), amd->side_effects); return addr; case SUBREG: -- 2.47.3