re PR tree-optimization/56608 (SLP seems to produce incorrect value with -ffast-math)

2013-03-13  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56608
	* tree-vect-slp.c (vect_schedule_slp): Do not remove scalar
	calls when vectorizing basic-blocks.

	* gcc.dg/vect/fast-math-bb-slp-call-3.c: New testcase.

From-SVN: r196632
This commit is contained in:
Richard Biener 2013-03-13 12:15:06 +00:00 committed by Richard Biener
parent 15ff4345c4
commit c40eced02b
4 changed files with 88 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2013-03-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/56608
* tree-vect-slp.c (vect_schedule_slp): Do not remove scalar
calls when vectorizing basic-blocks.
2013-03-13 Jakub Jelinek <jakub@redhat.com>
PR plugins/45078

View File

@ -1,3 +1,8 @@
2013-03-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/56608
* gcc.dg/vect/fast-math-bb-slp-call-3.c: New testcase.
2013-03-13 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56611

View File

@ -0,0 +1,68 @@
#include <stdlib.h>
#include <math.h>
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
typedef struct {
int initialHeight, initialWidth;
int rotatedHeight, rotatedWidth;
int autoCropHeight, autoCropWidth;
} ufraw_data;
void __attribute__((noinline,noclone))
ufraw_test(ufraw_data *uf)
{
int iWidth = uf->initialWidth;
int iHeight = uf->initialHeight;
double aspectRatio = ((double)iWidth) / iHeight;
double midX = iWidth / 2.0 - 0.5;
double midY = iHeight / 2.0 - 0.5;
double maxX = 0, maxY = 0;
double minX = 999999, minY = 999999;
double lastX = 0, lastY = 0, area = 0;
double scale;
int i;
for (i = 0; i < iWidth + iHeight - 1; i++)
{
int x, y;
if (i < iWidth) { // Trace the left border of the image
x = i;
y = 0;
} else { // Trace the bottom border of the image
x = iWidth - 1;
y = i - iWidth + 1;
}
double srcX = x - midX;
double srcY = y - midY;
// A digital planimeter:
area += srcY * lastX - srcX * lastY;
lastX = srcX;
lastY = srcY;
maxX = MAX(maxX, fabs(srcX));
maxY = MAX(maxY, fabs(srcY));
if (fabs(srcX / srcY) > aspectRatio)
minX = MIN(minX, fabs(srcX));
else
minY = MIN(minY, fabs(srcY));
}
scale = sqrt((iWidth - 1) * (iHeight - 1) / area);
uf->rotatedWidth = MIN(ceil(2 * maxX + 1.0) * scale, 2 * iWidth);
uf->rotatedHeight = MIN(ceil(2 * maxY + 1.0) * scale, 2 * iHeight);
uf->autoCropWidth = MIN(floor(2 * minX) * scale, 2 * iWidth);
uf->autoCropHeight = MIN(floor(2 * minY) * scale, 2 * iHeight);
if (uf->autoCropWidth != 3)
abort ();
}
int main()
{
ufraw_data uf_data;
ufraw_data *uf = &uf_data;
uf->initialWidth = 4;
uf->initialHeight = 5;
ufraw_test(uf);
return 0;
}
/* { dg-final { cleanup-tree-dump "slp" } } */

View File

@ -3181,7 +3181,15 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
unsigned int j;
gimple_stmt_iterator gsi;
vect_remove_slp_scalar_calls (root);
/* Remove scalar call stmts. Do not do this for basic-block
vectorization as not all uses may be vectorized.
??? Why should this be necessary? DCE should be able to
remove the stmts itself.
??? For BB vectorization we can as well remove scalar
stmts starting from the SLP tree root if they have no
uses. */
if (loop_vinfo)
vect_remove_slp_scalar_calls (root);
for (j = 0; SLP_TREE_SCALAR_STMTS (root).iterate (j, &store)
&& j < SLP_INSTANCE_GROUP_SIZE (instance); j++)