tree-data-ref.c (analyze_offset): Add a return value (bool) to indicate success/failure of the analysis.

* tree-data-ref.c (analyze_offset): Add a return value (bool) to
	indicate success/failure of the analysis. Add negation to subtrahend
	in case of subtraction. Fail if both operands contain constants.
	(create_data_ref): Fail if analyze_offset fails.

From-SVN: r122817
This commit is contained in:
Ira Rosen 2007-03-11 11:13:34 +00:00 committed by Ira Rosen
parent 7b8cd03d69
commit e838422b9e
4 changed files with 81 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2007-03-11 Ira Rosen <irar@il.ibm.com>
* tree-data-ref.c (analyze_offset): Add a return value (bool) to
indicate success/failure of the analysis. Add negation to subtrahend
in case of subtraction. Fail if both operands contain constants.
(create_data_ref): Fail if analyze_offset fails.
2007-03-11 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (frndintxf2): Rename to ...

View File

@ -1,3 +1,8 @@
2007-03-11 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/29925
* gcc.dg/vect/fast-math-vect-pr29925.c: New test.
2007-03-10 Mark Mitchell <mark@codesourcery.com>
PR c++/30274

View File

@ -0,0 +1,39 @@
/* { dg-require-effective-target vect_float } */
#include <stdlib.h>
#include "tree-vect.h"
void interp_pitch(float *exc, float *interp, int pitch, int len)
{
int i,k;
int maxj;
maxj=3;
for (i=0;i<len;i++)
{
float tmp = 0;
for (k=0;k<7;k++)
{
tmp += exc[i-pitch+k+maxj-6];
}
interp[i] = tmp;
}
}
int main()
{
float *exc = calloc(126,sizeof(float));
float *interp = calloc(80,sizeof(float));
int pitch = -35;
check_vect ();
interp_pitch(exc, interp, pitch, 80);
free(exc);
free(interp);
return 0;
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View File

@ -1835,7 +1835,7 @@ object_analysis (tree memref, tree stmt, bool is_read,
Extract INVARIANT and CONSTANT parts from OFFSET.
*/
static void
static bool
analyze_offset (tree offset, tree *invariant, tree *constant)
{
tree op0, op1, constant_0, constant_1, invariant_0, invariant_1;
@ -1851,23 +1851,36 @@ analyze_offset (tree offset, tree *invariant, tree *constant)
*constant = offset;
else
*invariant = offset;
return;
return true;
}
op0 = TREE_OPERAND (offset, 0);
op1 = TREE_OPERAND (offset, 1);
/* Recursive call with the operands. */
analyze_offset (op0, &invariant_0, &constant_0);
analyze_offset (op1, &invariant_1, &constant_1);
if (!analyze_offset (op0, &invariant_0, &constant_0)
|| !analyze_offset (op1, &invariant_1, &constant_1))
return false;
/* Combine the results. */
/* Combine the results. Add negation to the subtrahend in case of
subtraction. */
if (constant_0 && constant_1)
return false;
*constant = constant_0 ? constant_0 : constant_1;
if (code == MINUS_EXPR && constant_1)
*constant = fold_build1 (NEGATE_EXPR, TREE_TYPE (*constant), *constant);
if (invariant_0 && invariant_1)
*invariant =
fold_build2 (code, TREE_TYPE (invariant_0), invariant_0, invariant_1);
else
*invariant = invariant_0 ? invariant_0 : invariant_1;
{
*invariant = invariant_0 ? invariant_0 : invariant_1;
if (code == MINUS_EXPR && invariant_1)
*invariant =
fold_build1 (NEGATE_EXPR, TREE_TYPE (*invariant), *invariant);
}
return true;
}
/* Free the memory used by the data reference DR. */
@ -1941,7 +1954,17 @@ create_data_ref (tree memref, tree stmt, bool is_read)
STRIP_NOPS (offset);
if (offset != orig_offset)
type = TREE_TYPE (orig_offset);
analyze_offset (offset, &invariant, &constant);
if (!analyze_offset (offset, &invariant, &constant))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "\ncreate_data_ref: failed to analyze dr's");
fprintf (dump_file, " offset for ");
print_generic_expr (dump_file, memref, TDF_SLIM);
fprintf (dump_file, "\n");
}
return NULL;
}
if (type && invariant)
invariant = fold_convert (type, invariant);