(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
fast-math-bb-slp-call-3.c
       1  #include "tree-vect.h"
       2  
       3  extern double sqrt (double);
       4  extern double fabs (double);
       5  extern double ceil (double);
       6  extern double floor (double);
       7  
       8  extern void abort (void);
       9  
      10  #define MIN(a, b) (((a) < (b)) ? (a) : (b))
      11  #define MAX(a, b) (((a) > (b)) ? (a) : (b))
      12  
      13  typedef struct {
      14      int initialHeight, initialWidth;
      15      int rotatedHeight, rotatedWidth;
      16      int autoCropHeight, autoCropWidth;
      17  } ufraw_data;
      18  
      19  void __attribute__((noinline,noclone))
      20  ufraw_test(ufraw_data *uf)
      21  {
      22    int iWidth = uf->initialWidth;
      23    int iHeight = uf->initialHeight;
      24    double aspectRatio = ((double)iWidth) / iHeight;
      25    double midX = iWidth / 2.0 - 0.5;
      26    double midY = iHeight / 2.0 - 0.5;
      27    double maxX = 0, maxY = 0;
      28    double minX = 999999, minY = 999999;
      29    double lastX = 0, lastY = 0, area = 0;
      30    double scale;
      31    int i;
      32    for (i = 0; i < iWidth + iHeight - 1; i++)
      33      {
      34        int x, y;
      35        if (i < iWidth) { // Trace the left border of the image
      36  	  x = i;
      37  	  y = 0;
      38        } else { // Trace the bottom border of the image
      39  	  x = iWidth - 1;
      40  	  y = i - iWidth + 1;
      41        }
      42        double srcX = x - midX;
      43        double srcY = y - midY;
      44        // A digital planimeter:
      45        area += srcY * lastX - srcX * lastY;
      46        lastX = srcX;
      47        lastY = srcY;
      48        maxX = MAX(maxX, fabs(srcX));
      49        maxY = MAX(maxY, fabs(srcY));
      50        if (fabs(srcX / srcY) > aspectRatio)
      51  	minX = MIN(minX, fabs(srcX));
      52        else
      53  	minY = MIN(minY, fabs(srcY));
      54      }
      55    scale = sqrt((iWidth - 1) * (iHeight - 1) / area);
      56    uf->rotatedWidth = MIN(ceil(2 * maxX + 1.0) * scale, 2 * iWidth);
      57    uf->rotatedHeight = MIN(ceil(2 * maxY + 1.0) * scale, 2 * iHeight);
      58    uf->autoCropWidth = MIN(floor(2 * minX) * scale, 2 * iWidth);
      59    uf->autoCropHeight = MIN(floor(2 * minY) * scale, 2 * iHeight);
      60    if (uf->autoCropWidth != 3)
      61      abort ();
      62  }
      63  
      64  int main()
      65  {
      66    ufraw_data uf_data;
      67    ufraw_data *uf = &uf_data;
      68    check_vect ();
      69    uf->initialWidth = 4;
      70    uf->initialHeight = 5;
      71    ufraw_test(uf);
      72    return 0;
      73  }
      74