From 1c6304f6dd38e7c75a840ad744db3139a4732755 Mon Sep 17 00:00:00 2001 From: steven Date: Tue, 16 Aug 2005 22:24:30 +0000 Subject: [PATCH] PR target/23376 * loop-unroll.c (analyze_insn_to_expand_var): Make sure that force_operand will work later on using have_insn_for. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103181 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 4f2689b6bf4..54cea246995 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 1850b3127b4..87f6e123dd6 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 8293448f5cf..4cabfd58504 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 043d4c7e1e2..96be244e0c2 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 00000000000..ba60399f957 --- /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.11.4.GIT