Fix PR30957

From-SVN: r124471
This commit is contained in:
Revital Eres 2007-05-06 10:35:42 +00:00 committed by Revital Eres
parent 19df3b836e
commit 290358f770
4 changed files with 73 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2007-06-05 Revital Eres <eres@il.ibm.com>
PR 30957
* loop-unroll.c (insert_var_expansion_initialization):
Initialize the expansions with -zero instead of +zero.
2007-05-05 Aurelien Jarno <aurelien@aurel32.net>
* config/pa/pa.md: Split tgd_load, tld_load and tie_load

View File

@ -2014,7 +2014,30 @@ expand_var_during_unrolling (struct var_to_expand *ve, rtx insn)
/* Initialize the variable expansions in loop preheader.
Callbacks for htab_traverse. PLACE_P is the loop-preheader
basic block where the initialization of the expansions
should take place. */
should take place. The expansions are initialized with (-0)
when the operation is plus or minus to honor sign zero.
This way we can prevent cases where the sign of the final result is
effected by the sign of the expansion.
Here is an example to demonstrate this:
for (i = 0 ; i < n; i++)
sum += something;
==>
sum += something
....
i = i+1;
sum1 += something
....
i = i+1
sum2 += something;
....
When SUM is initialized with -zero and SOMETHING is also -zero; the
final result of sum should be -zero thus the expansions sum1 and sum2
should be initialized with -zero as well (otherwise we will get +zero
as the final result). */
static int
insert_var_expansion_initialization (void **slot, void *place_p)
@ -2023,7 +2046,9 @@ insert_var_expansion_initialization (void **slot, void *place_p)
basic_block place = (basic_block)place_p;
rtx seq, var, zero_init, insn;
unsigned i;
enum machine_mode mode = GET_MODE (ve->reg);
bool honor_signed_zero_p = HONOR_SIGNED_ZEROS (mode);
if (VEC_length (rtx, ve->var_expansions) == 0)
return 1;
@ -2031,7 +2056,11 @@ insert_var_expansion_initialization (void **slot, void *place_p)
if (ve->op == PLUS || ve->op == MINUS)
for (i = 0; VEC_iterate (rtx, ve->var_expansions, i, var); i++)
{
zero_init = CONST0_RTX (GET_MODE (var));
if (honor_signed_zero_p)
zero_init = simplify_gen_unary (NEG, mode, CONST0_RTX (mode), mode);
else
zero_init = CONST0_RTX (mode);
emit_move_insn (var, zero_init);
}
else if (ve->op == MULT)

View File

@ -1,3 +1,8 @@
2007-06-05 Revital Eres <eres@il.ibm.com>
PR 30957
* gcc.dg/pr30957-1.c: New test.
2007-05-05 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/31251

View File

@ -0,0 +1,30 @@
/* { dg-do run { xfail vax-*-* powerpc-*-*spe } } */
/* { dg-options "-O2 -funroll-loops -funsafe-math-optimizations -fvariable-expansion-in-unroller -dL" } */
extern void abort (void);
extern void exit (int);
float
foo (float d, int n)
{
unsigned i;
float accum = d;
for (i = 0; i < n; i++)
accum += d;
return accum;
}
int
main ()
{
if (__builtin_copysignf (1.0, foo (0.0 / -5.0, 10)) != -1.0)
abort ();
exit (0);
}
/* { dg-final { scan-rtl-dump "Expanding Accumulator" "loop2_unroll" } } */
/* { dg-final { cleanup-rtl-dump "loop*" } } */