Commit c40eced0 by Richard Biener Committed by Richard Biener

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
parent 15ff4345
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
......
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
......
#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" } } */
......@@ -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++)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment