From 5a6e28b5bae7a236b35994d0f64fd902a574872c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 3 Jan 2020 10:10:13 +0100 Subject: [PATCH] re PR rtl-optimization/93088 (Compile time hog on gcc/testsuite/gcc.target/i386/pr56348.c w/ -O3 -funroll-loops -fno-tree-dominator-opts -fno-tree-vrp) PR rtl-optimization/93088 * loop-iv.c (find_single_def_src): Punt after looking through 128 reg copies for regs with single definitions. Move definitions to first uses. * gcc.target/i386/pr93088.c: New test. From-SVN: r279854 --- gcc/ChangeLog | 7 +++++++ gcc/loop-iv.c | 15 +++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/pr93088.c | 5 +++++ 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr93088.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7883ed86dd..ce5cb0035dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2020-01-03 Jakub Jelinek + + PR rtl-optimization/93088 + * loop-iv.c (find_single_def_src): Punt after looking through + 128 reg copies for regs with single definitions. Move definitions + to first uses. + 2020-01-02 Dennis Zhang * config/arm/arm-c.c (arm_cpu_builtins): Define diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index 83c3eef368f..6a59954f60a 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -1384,24 +1384,23 @@ simple_rhs_p (rtx rhs) static rtx find_single_def_src (unsigned int regno) { - df_ref adef; - rtx set, src; + rtx src = NULL_RTX; - for (;;) + /* Don't look through unbounded number of single definition REG copies, + there might be loops for sources with uninitialized variables. */ + for (int cnt = 0; cnt < 128; cnt++) { - rtx note; - adef = DF_REG_DEF_CHAIN (regno); + df_ref adef = DF_REG_DEF_CHAIN (regno); if (adef == NULL || DF_REF_NEXT_REG (adef) != NULL || DF_REF_IS_ARTIFICIAL (adef)) return NULL_RTX; - set = single_set (DF_REF_INSN (adef)); + rtx set = single_set (DF_REF_INSN (adef)); if (set == NULL || !REG_P (SET_DEST (set)) || REGNO (SET_DEST (set)) != regno) return NULL_RTX; - note = find_reg_equal_equiv_note (DF_REF_INSN (adef)); - + rtx note = find_reg_equal_equiv_note (DF_REF_INSN (adef)); if (note && function_invariant_p (XEXP (note, 0))) { src = XEXP (note, 0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a3a45e4689..7be1d907092 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-03 Jakub Jelinek + + PR rtl-optimization/93088 + * gcc.target/i386/pr93088.c: New test. + 2020-01-03 Tobias Burnus PR fortran/92994 diff --git a/gcc/testsuite/gcc.target/i386/pr93088.c b/gcc/testsuite/gcc.target/i386/pr93088.c new file mode 100644 index 00000000000..dc986cfaa80 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr93088.c @@ -0,0 +1,5 @@ +/* PR rtl-optimization/93088 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -funroll-loops -fno-tree-dominator-opts -fno-tree-vrp -w" } */ + +#include "pr56348.c" -- 2.30.2