From f2dd440f45c158db6f71408390b278f9f20bce5d Mon Sep 17 00:00:00 2001 From: Steven Bosscher Date: Tue, 16 Aug 2005 22:24:30 +0000 Subject: [PATCH] re PR target/23376 (ICE on GCC 4.x with -O1 -funroll-loops -fvariable-expansion-in-unroller) PR target/23376 * loop-unroll.c (analyze_insn_to_expand_var): Make sure that force_operand will work later on using have_insn_for. From-SVN: r103181 --- gcc/ChangeLog | 6 ++++++ gcc/fortran/ChangeLog | 2 +- gcc/loop-unroll.c | 14 +++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/x86_64/pr23376.c | 21 +++++++++++++++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/x86_64/pr23376.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f2689b6bf43..54cea246995d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-08-16 Steven Bosscher + + PR target/23376 + * loop-unroll.c (analyze_insn_to_expand_var): Make sure that + force_operand will work later on using have_insn_for. + 2005-08-16 Volker Reichelt * fold-const.c (tree_expr_nonnegative_p): Regroup cases. diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1850b3127b4d..87f6e123dd6c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -22,7 +22,7 @@ * trans-stmt.c (gfc_trans_arithmetic_if): Optimized in case of equal labels. -2005-09-11 Francois-Xavier Coudert +2005-08-11 Francois-Xavier Coudert Steven Bosscher PR libfortran/20006 diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 8293448f5cff..4cabfd585049 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -1574,7 +1574,19 @@ analyze_insn_to_expand_var (struct loop *loop, rtx insn) && GET_CODE (src) != MINUS && GET_CODE (src) != MULT) return NULL; - + + /* Hmm, this is a bit paradoxical. We know that INSN is a valid insn + in MD. But if there is no optab to generate the insn, we can not + perform the variable expansion. This can happen if an MD provides + an insn but not a named pattern to generate it, for example to avoid + producing code that needs additional mode switches like for x87/mmx. + + So we check have_insn_for which looks for an optab for the operation + in SRC. If it doesn't exist, we can't perform the expansion even + though INSN is valid. */ + if (!have_insn_for (GET_CODE (src), GET_MODE (src))) + return NULL; + if (!XEXP (src, 0)) return NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 043d4c7e1e2e..96be244e0c20 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-16 Steven Bosscher + + PR target/23376 + * gcc.target/x86_64/pr23376.c: New test. + 2005-08-16 Ian Lance Taylor PR c++/23337 diff --git a/gcc/testsuite/gcc.target/x86_64/pr23376.c b/gcc/testsuite/gcc.target/x86_64/pr23376.c new file mode 100644 index 000000000000..ba60399f9579 --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/pr23376.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -funroll-loops -fvariable-expansion-in-unroller" } */ + +typedef int __m64 __attribute__ ((__vector_size__ (8))); +typedef int __v2si __attribute__ ((__vector_size__ (8))); + +static __inline __m64 __attribute__((__always_inline__)) +_mm_add_pi32 (__m64 __m1, __m64 __m2) +{ + return (__m64) __builtin_ia32_paddd ((__v2si)__m1, (__v2si)__m2); +} + +__m64 +simple_block_diff_up_mmx_4 (const int width, __m64 ref1) +{ + __m64 sum; + int count = width >>1; + while (count--) + sum = _mm_add_pi32 (sum, ref1); + return sum; +} -- 2.43.5