// RUN: %libomp-compile-and-run
#include <stdio.h>
#include <math.h>
#include "omp_testsuite.h"

int test_omp_sections_reduction()
{
  int sum;
  int known_sum;
  double dpt,dsum;
  double dknown_sum;
  double dt=0.5; /* base of geometric row for + and - test*/
  double rounding_error= 1.E-9;
  int diff;
  double ddiff;
  int product;
  int known_product;
  int logic_and;
  int bit_and;
  int logic_or;
  int bit_or;
  int exclusiv_bit_or;
  int logics[1000];
  int i;
  int result;
  /* int my_islarger; */
  /*int is_larger=1;*/
  sum =7;
  dpt =1;
  dsum=0;
  product =1;
  logic_and=1;
  bit_and=1;
  logic_or=0;
  bit_or=0;
  exclusiv_bit_or=0;
  result = 0;
  dt = 1./3.;

  known_sum = (999*1000)/2+7;
  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(+:sum)
    {
      #pragma omp section
      {
        for (i=1;i<300;i++) {
          sum=sum+i;
        }
      }
      #pragma omp section
      {
        for (i=300;i<700;i++) {
          sum=sum+i;
        }
      }
      #pragma omp section
      {
        for (i=700;i<1000;i++) {
          sum=sum+i;
        }
      }
    }
  }
  if(known_sum!=sum) {
    ++result;
    fprintf(stderr,"Error in sum with integers: Result was %d"
      " instead of %d\n", sum,known_sum);
  }

  diff = (999*1000)/2;
  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(-:diff)
    {
      #pragma omp section
      {
        for (i=1;i<300;i++) {
          diff=diff-i;
        }
      }
      #pragma omp section
      {
        for (i=300;i<700;i++) {
          diff=diff-i;
        }
      }
      #pragma omp section
      {
        for (i=700;i<1000;i++) {
          diff=diff-i;
        }
      }
    }
  }
  if(diff != 0) {
    result++;
    fprintf(stderr,"Error in Difference with integers: Result was %d"
      " instead of 0.\n",diff);
  }

  for (i=0;i<20;++i) {
    dpt*=dt;
  }
  dknown_sum = (1-dpt)/(1-dt);
  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(+:dsum)
    {
      #pragma omp section
      {
        for (i=0;i<6;++i) {
          dsum += pow(dt,i);
        }
      }
      #pragma omp section
      {
        for (i=6;i<12;++i) {
          dsum += pow(dt,i);
        }
      }
      #pragma omp section
      {
        for (i=12;i<20;++i) {
          dsum += pow(dt,i);
        }
      }
    }
  }
  if( fabs(dsum-dknown_sum) > rounding_error ) {
    result++; 
    fprintf(stderr,"Error in sum with doubles: Result was %f"
      " instead of %f (Difference: %E)\n",
      dsum, dknown_sum, dsum-dknown_sum);
  }

  dpt=1;
  for (i=0;i<20;++i) {
    dpt*=dt;
  }
  fprintf(stderr,"\n");
  ddiff = (1-dpt)/(1-dt);
  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(-:ddiff)
    {
      #pragma omp section
      {
        for (i=0;i<6;++i) {
          ddiff -= pow(dt,i);
        }
      }
      #pragma omp section
      {
        for (i=6;i<12;++i) {
          ddiff -= pow(dt,i);
        }
      }
      #pragma omp section
      {
        for (i=12;i<20;++i) {
          ddiff -= pow(dt,i);
        }
      }
    }
  }

  if(fabs(ddiff) > rounding_error) {
    result++;
    fprintf(stderr,"Error in Difference with doubles: Result was %E"
      " instead of 0.0\n",ddiff);
  }

  known_product = 3628800;
  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(*:product)
    {
      #pragma omp section
      {  
        for(i=1;i<3;i++) {
          product *= i;
        }
      }
      #pragma omp section
      {
        for(i=3;i<7;i++) {
          product *= i;
        }
      }
      #pragma omp section
      {
        for(i=7;i<11;i++) {
          product *= i;
        }
      }
    }
  }
  if(known_product != product) {
    result++;
    fprintf(stderr,"Error in Product with integers: Result was %d"
      " instead of %d\n",product,known_product);
  }

  for(i=0;i<1000;i++) {
    logics[i]=1;
  }

  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(&&:logic_and)
    {
      #pragma omp section
      {
        for (i=1;i<300;i++) {
          logic_and = (logic_and && logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=300;i<700;i++) {
          logic_and = (logic_and && logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=700;i<1000;i++) {
          logic_and = (logic_and && logics[i]);
        }
      }
    }
  }
  if(!logic_and) {
    result++;
    fprintf(stderr,"Error in logic AND part 1\n");
  }

  logic_and = 1;
  logics[501] = 0;

  #pragma omp parallel
  {
    #pragma omp sections private(i) reduction(&&:logic_and)
    {
      #pragma omp section
      {
        for (i=1;i<300;i++) {
          logic_and = (logic_and && logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=300;i<700;i++) {
          logic_and = (logic_and && logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=700;i<1000;i++) {
          logic_and = (logic_and && logics[i]);
        }
      }
    }
  }
  if(logic_and) {
    result++;
    fprintf(stderr,"Error in logic AND part 2\n");
  }

  for(i=0;i<1000;i++) {
    logics[i]=0;
  }

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(||:logic_or)
    {
      #pragma omp section
      {
        for (i=1;i<300;i++) {
          logic_or = (logic_or || logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=300;i<700;i++) {
          logic_or = (logic_or || logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=700;i<1000;i++) {
          logic_or = (logic_or || logics[i]);
        }
      }
    }
  }
  if(logic_or) {
    result++;
    fprintf(stderr,"\nError in logic OR part 1\n");
  }

  logic_or = 0;
  logics[501]=1;

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(||:logic_or)
    {
      #pragma omp section
      {
        for (i=1;i<300;i++) {
          logic_or = (logic_or || logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=300;i<700;i++) {
          logic_or = (logic_or || logics[i]);
        }
      }
      #pragma omp section
      {
        for (i=700;i<1000;i++) {
          logic_or = (logic_or || logics[i]);
        }
      }
    }
  }
  if(!logic_or) {
    result++;
    fprintf(stderr,"Error in logic OR part 2\n");
  }

  for(i=0;i<1000;++i) {
    logics[i]=1;
  }

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(&:bit_and)
    {
      #pragma omp section
      {  
        for(i=0;i<300;++i) {
          bit_and = (bit_and & logics[i]);
        }
      }
      #pragma omp section
      {  
        for(i=300;i<700;++i) {
          bit_and = (bit_and & logics[i]);
        }
      }
      #pragma omp section
      {  
        for(i=700;i<1000;++i) {
          bit_and = (bit_and & logics[i]);
        }
      }
    }
  }
  if(!bit_and) {
    result++;
    fprintf(stderr,"Error in BIT AND part 1\n");
  }

  bit_and = 1;
  logics[501]=0;

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(&:bit_and)
    {
      #pragma omp section
      {
        for(i=0;i<300;++i) {
          bit_and = bit_and & logics[i];
        }
      }
      #pragma omp section
      {
        for(i=300;i<700;++i) {
          bit_and = bit_and & logics[i];
        }
      }
      #pragma omp section
      {
        for(i=700;i<1000;++i) {
          bit_and = bit_and & logics[i];
        }
      }
    }
  }
  if(bit_and) {
    result++;
    fprintf(stderr,"Error in BIT AND part 2\n");
  }

  for(i=0;i<1000;i++) {
    logics[i]=0;
  }

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(|:bit_or)
    {
      #pragma omp section
      {
        for(i=0;i<300;++i) {
          bit_or = bit_or | logics[i];
        }
      }
      #pragma omp section
      {
        for(i=300;i<700;++i) {
          bit_or = bit_or | logics[i];
        }
      }
      #pragma omp section
      {
        for(i=700;i<1000;++i) {
          bit_or = bit_or | logics[i];
        }
      }
    }
  }
  if(bit_or) {
    result++;
    fprintf(stderr,"Error in BIT OR part 1\n");
  }
  bit_or = 0;
  logics[501]=1;

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(|:bit_or)
    {
      #pragma omp section
      {
        for(i=0;i<300;++i) {
          bit_or = bit_or | logics[i];
        }
      }
      #pragma omp section
      {
        for(i=300;i<700;++i) {
          bit_or = bit_or | logics[i];
        }
      }
      #pragma omp section
      {
        for(i=700;i<1000;++i) {
          bit_or = bit_or | logics[i];
        }
      }
    }
  }
  if(!bit_or) {
    result++;
    fprintf(stderr,"Error in BIT OR part 2\n");
  }

  for(i=0;i<1000;i++) {
    logics[i]=0;
  }

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(^:exclusiv_bit_or)
    {
      #pragma omp section
      {  
        for(i=0;i<300;++i) {
          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
        }
      }
      #pragma omp section
      {  
        for(i=300;i<700;++i) {
          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
        }
      }
      #pragma omp section
      {  
        for(i=700;i<1000;++i) {
          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
        }
      }
    }
  }
  if(exclusiv_bit_or) {
    result++;
    fprintf(stderr,"Error in EXCLUSIV BIT OR part 1\n");
  }

  exclusiv_bit_or = 0;
  logics[501]=1;

  #pragma omp parallel 
  {
    #pragma omp sections private(i) reduction(^:exclusiv_bit_or)
    {
      #pragma omp section
      {
        for(i=0;i<300;++i) {
          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
        }
      }
      #pragma omp section
      {
        for(i=300;i<700;++i) {
          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
        }
      }
      #pragma omp section
      {
        for(i=700;i<1000;++i) {
          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
        }
      }
    }
  }
  if(!exclusiv_bit_or) {
    result++;
    fprintf(stderr,"Error in EXCLUSIV BIT OR part 2\n");
  }

  /*printf("\nResult:%d\n",result);*/
  return (result==0);
}
int main()
{
  int i;
  int num_failed=0;

  for(i = 0; i < REPETITIONS; i++) {
    if(!test_omp_sections_reduction()) {
      num_failed++;
    }
  }
  return num_failed;
}
