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
This commit is contained in:
Steven Bosscher 2005-08-16 22:24:30 +00:00
parent 196f5a8dcd
commit f2dd440f45
5 changed files with 46 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2005-08-16 Steven Bosscher <stevenb@suse.de>
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 <reichelt@igpm.rwth-aachen.de>
* fold-const.c (tree_expr_nonnegative_p): Regroup cases.

View File

@ -22,7 +22,7 @@
* trans-stmt.c (gfc_trans_arithmetic_if): Optimized in case of equal
labels.
2005-09-11 Francois-Xavier Coudert <coudert@clipper.ens.fr>
2005-08-11 Francois-Xavier Coudert <coudert@clipper.ens.fr>
Steven Bosscher <stevenb@suse.de>
PR libfortran/20006

View File

@ -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;

View File

@ -1,3 +1,8 @@
2005-08-16 Steven Bosscher <stevenb@suse.de>
PR target/23376
* gcc.target/x86_64/pr23376.c: New test.
2005-08-16 Ian Lance Taylor <ian@airs.com>
PR c++/23337

View File

@ -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;
}