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:
parent
15ff4345c4
commit
c40eced02b
@ -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
|
||||
|
@ -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
|
||||
|
68
gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c
Normal file
68
gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c
Normal 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" } } */
|
@ -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++)
|
||||
|
Loading…
Reference in New Issue
Block a user