Hello Everyone,
    This patch is for the Cilkplus branch affecting both the C and C++ 
Compilers. This patch will fix a bug for max and min-index builtin function. 
The original implemention was comparing the max/min index with the value in the 
array. This patch will add a new variable and store the value in the array to 
this variable.

Thanking You,

Yours Sincerely,

Balaji V. Iyer.
diff --git a/gcc/ChangeLog.cilk b/gcc/ChangeLog.cilk
index 98e0528..4297c91 100644
--- a/gcc/ChangeLog.cilk
+++ b/gcc/ChangeLog.cilk
@@ -1,5 +1,10 @@
 2012-01-26  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
+       * c-array-notation.c (fix_builtin_array_notation_fn): Initialized the
+       maximum/minimum value for max/min index builtin function.
+
+2012-01-26  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
        * array-notation-common.c (array_notation_init_builtins): Added the
        internal array notation function "__sec_reduce_implicit_index."
        (is_sec_implicit_index_fn): New function.
diff --git a/gcc/c-array-notation.c b/gcc/c-array-notation.c
index 3ff52dc..d4a94f2 100644
--- a/gcc/c-array-notation.c
+++ b/gcc/c-array-notation.c
@@ -1379,7 +1379,7 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
 {
   tree new_var_type = NULL_TREE, func_parm, new_expr, new_yes_expr, 
new_no_expr;
   tree array_ind_value = NULL_TREE, new_no_ind, new_yes_ind, new_no_list;
-  tree new_yes_list, new_cond_expr, new_var_init;
+  tree new_yes_list, new_cond_expr, new_var_init, new_exp_init;
   an_reduce_type an_type = REDUCE_UNKNOWN;
   tree *array_list = NULL;
   int list_size = 0;
@@ -1719,6 +1719,9 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
       new_var_init = build_modify_expr
        (UNKNOWN_LOCATION, *new_var, TREE_TYPE (*new_var), NOP_EXPR,
         UNKNOWN_LOCATION, build_zero_cst (new_var_type), new_var_type);
+      new_exp_init = build_modify_expr
+       (UNKNOWN_LOCATION, array_ind_value, TREE_TYPE (array_ind_value),
+        NOP_EXPR, UNKNOWN_LOCATION, func_parm, TREE_TYPE (func_parm));
       new_no_ind = build_modify_expr
        (UNKNOWN_LOCATION, *new_var, TREE_TYPE (*new_var), NOP_EXPR,
         UNKNOWN_LOCATION, *new_var, TREE_TYPE (*new_var));
@@ -1766,6 +1769,9 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
       new_var_init = build_modify_expr
        (UNKNOWN_LOCATION, *new_var, TREE_TYPE (*new_var), NOP_EXPR,
         UNKNOWN_LOCATION, build_zero_cst (new_var_type), new_var_type);
+      new_exp_init = build_modify_expr
+       (UNKNOWN_LOCATION, array_ind_value, TREE_TYPE (array_ind_value),
+        NOP_EXPR, UNKNOWN_LOCATION, func_parm, TREE_TYPE (func_parm));
       new_no_ind = build_modify_expr
        (UNKNOWN_LOCATION, *new_var, TREE_TYPE (*new_var), NOP_EXPR,
         UNKNOWN_LOCATION, *new_var, TREE_TYPE (*new_var));
@@ -1817,12 +1823,12 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
   for (ii = 0; ii < rank; ii++)
     append_to_statement_list (ind_init [ii], &loop);
 
+  if (an_type == REDUCE_MAX_INDEX || an_type == REDUCE_MIN_INDEX)
+    append_to_statement_list (new_exp_init, &loop);
   append_to_statement_list (new_var_init, &loop);
   
   for (ii = 0; ii < rank; ii++)
     {
-      /* append_to_statement_list (ind_init [ii], &loop); */
-
       append_to_statement_list
        (build1 (LABEL_EXPR, void_type_node, if_stmt_label[ii]), &loop);
       append_to_statement_list
diff --git a/gcc/cp/ChangeLog.cilk b/gcc/cp/ChangeLog.cilk
index cf9d993..dff1fb5 100644
--- a/gcc/cp/ChangeLog.cilk
+++ b/gcc/cp/ChangeLog.cilk
@@ -1,5 +1,18 @@
 2012-01-26  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
+       * cp-array-notation.c (fix_builtin_array_notation_fn): Added new var
+       called "array_ind_value," that stores the max/min value and the *new_var
+       stores the index.  Also, replaced all build_int_cst with build_one_cst
+       and build_zero_cst.  Also, in REDUCE_ANY_ZEROS and REDUCE_ALL_ZEROS
+       cases, replaced comparing with func_parm with a new_cond_expr.  Also
+       initialized the maximum/minimum value for the max/min index builtin
+       function.
+       (contains_array_notation_expr): Deferenced array_list in if statement.
+       * typeck.c (convert_for_assignment): Checked if the rhs contains array
+       notation expr, if so we don't do any conversion.
+
+2012-01-26  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
        * cp-array-notation.c (extract_array_notation_exprs): Added a check
        to see if the call expr is sec_implicit_index function.
        (replace_array_notations): Likewise.
diff --git a/gcc/cp/cp-array-notation.c b/gcc/cp/cp-array-notation.c
index 2a27c62..11bc99a 100644
--- a/gcc/cp/cp-array-notation.c
+++ b/gcc/cp/cp-array-notation.c
@@ -1294,7 +1294,8 @@ static tree
 fix_builtin_array_notation_fn (tree an_builtin_fn, tree *new_var)
 {
   tree new_var_type = NULL_TREE, func_parm, new_expr, new_yes_expr, 
new_no_expr;
-  tree new_var_init;
+  tree array_ind_value = NULL_TREE, new_no_ind, new_yes_ind, new_no_list;
+  tree new_yes_list, new_cond_expr, new_var_init, new_exp_init;
   an_reduce_type an_type = REDUCE_UNKNOWN;
   tree *array_list = NULL;
   int list_size = 0;
@@ -1538,55 +1539,55 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
 
   *new_var = build_decl (UNKNOWN_LOCATION, VAR_DECL, NULL_TREE, new_var_type);
   gcc_assert (*new_var);
+  if (an_type == REDUCE_MAX_INDEX || an_type == REDUCE_MIN_INDEX)
+    array_ind_value = build_decl
+      (UNKNOWN_LOCATION, VAR_DECL, NULL_TREE, TREE_TYPE (func_parm));
 
   switch (an_type)
     {
     case REDUCE_ADD:
       new_var_init = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (new_var_type, 0), 1);
+       (*new_var, NOP_EXPR, build_zero_cst (new_var_type), 1);
       new_expr = build_x_modify_expr (*new_var, PLUS_EXPR, func_parm, 1);
       break;
     case REDUCE_MUL:
       new_var_init = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (new_var_type, 1), 1);
+       (*new_var, NOP_EXPR, build_one_cst (new_var_type), 1);
       new_expr = build_x_modify_expr (*new_var, MULT_EXPR, func_parm, 1);
       break;
     case REDUCE_ALL_ZEROS:
       new_var_init = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (new_var_type, 1), 1);
+       (*new_var, NOP_EXPR, build_one_cst (new_var_type), 1);
       /* Initially you assume everything is zero, now if we find a case where
        * it is NOT true, then we set the result to false. Otherwise
        * we just keep the previous value
        */
       new_yes_expr = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (TREE_TYPE (*new_var), 0), 1);
+       (*new_var, NOP_EXPR, build_zero_cst (TREE_TYPE (*new_var)), 1);
       new_no_expr = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
-      new_expr = build_x_conditional_expr (func_parm, new_yes_expr,
+      new_cond_expr = build2 (NE_EXPR, TREE_TYPE (func_parm), func_parm,
+                             build_zero_cst (TREE_TYPE (func_parm)));
+      new_expr = build_x_conditional_expr (new_cond_expr, new_yes_expr,
                                           new_no_expr, 1);
       break;
     case REDUCE_ANY_ZEROS:
       new_var_init = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (new_var_type, 0), 1);
+       (*new_var, NOP_EXPR, build_zero_cst (new_var_type), 1);
       /* Initially we assume there are NO zeros in the list. When we find
        * a non-zero, we keep the previous value. If we find a zero, we
        * set the value to true
        */
       new_no_expr = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (TREE_TYPE (*new_var), 1), 1);
+       (*new_var, NOP_EXPR, build_one_cst (TREE_TYPE (*new_var)), 1);
       new_yes_expr = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
-      new_expr = build_x_conditional_expr (func_parm, new_yes_expr,
+      new_cond_expr = build2 (NE_EXPR, TREE_TYPE (func_parm), func_parm,
+                             build_zero_cst (TREE_TYPE (func_parm)));
+      new_expr = build_x_conditional_expr (new_cond_expr, new_yes_expr,
                                           new_no_expr, 1);      
       break;
     case REDUCE_MAX:
-      if (INTEGRAL_TYPE_P (new_var_type))
-       new_var_init = build_x_modify_expr
-         (*new_var, NOP_EXPR, TYPE_MIN_VALUE (new_var_type), 1);
-      else /* Otherwise, we pick the first item in the array */
-       new_var_init = build_x_modify_expr
-         (*new_var, NOP_EXPR,
-          build_array_ref (UNKNOWN_LOCATION,
-                           TREE_OPERAND (array_operand[0], 0),
-                           build_int_cst (integer_type_node, 0)), 1);
+      /* set initial value as the first element in the list */
+      new_var_init = build_x_modify_expr (*new_var, NOP_EXPR, func_parm, 1);
       new_no_expr  = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
       new_yes_expr = build_x_modify_expr (*new_var, NOP_EXPR, func_parm, 1);
       new_expr = build_x_conditional_expr
@@ -1594,15 +1595,7 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
         new_yes_expr, new_no_expr, 1);      
       break;
     case REDUCE_MIN:
-      if (INTEGRAL_TYPE_P (new_var_type))
-       new_var_init = build_x_modify_expr
-         (*new_var, NOP_EXPR, TYPE_MAX_VALUE (new_var_type), 1);
-      else /* Otherwise, we the first item in the array */
-       new_var_init = build_x_modify_expr
-         (*new_var, NOP_EXPR,
-          build_array_ref (UNKNOWN_LOCATION,
-                           TREE_OPERAND (array_operand[0], 0),
-                           build_int_cst (integer_type_node, 0)), 1);
+      new_var_init = build_x_modify_expr (*new_var, NOP_EXPR, func_parm, 1);
       new_no_expr  = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
       new_yes_expr = build_x_modify_expr (*new_var, NOP_EXPR, func_parm, 1);
       new_expr = build_x_conditional_expr
@@ -1610,46 +1603,87 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree 
*new_var)
         new_yes_expr, new_no_expr, 1);
       break;
     case REDUCE_MAX_INDEX:
-      new_var_init = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (new_var_type, 0), 1);
-      new_no_expr  = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
+      new_var_init = build_x_modify_expr (*new_var, NOP_EXPR, array_var[0], 1);
+      new_exp_init = build_x_modify_expr (array_ind_value, NOP_EXPR, func_parm,
+                                         1);
+      new_no_ind   = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
+      new_no_expr  = build_x_modify_expr (array_ind_value, NOP_EXPR,
+                                         array_ind_value, 1);
       if (list_size > 1) /* this means there is more than 1 */
-       new_yes_expr = build_x_modify_expr (*new_var, NOP_EXPR, array_var[0],
-                                           1);
-      else                                 
-       new_yes_expr = build_x_modify_expr
-         (*new_var, NOP_EXPR, TREE_OPERAND (array_operand[0], 1), 1);
+       {
+         new_yes_ind  = build_x_modify_expr (*new_var, NOP_EXPR, array_var[0],
+                                             1);
+         new_yes_expr = build_x_modify_expr (array_ind_value, NOP_EXPR,
+                                             func_parm, 1);
+       }
+      else
+       {
+         new_yes_ind  = build_x_modify_expr
+           (*new_var, NOP_EXPR, TREE_OPERAND (array_operand[0], 1), 1);
+         new_yes_expr = build_x_modify_expr (array_ind_value, NOP_EXPR,
+                                             func_parm, 1);
+       }
+      new_yes_list = alloc_stmt_list ();
+      append_to_statement_list (new_yes_ind, &new_yes_list);
+      append_to_statement_list (new_yes_expr, &new_yes_list);
+
+      new_no_list = alloc_stmt_list ();
+      append_to_statement_list (new_no_ind, &new_no_list);
+      append_to_statement_list (new_no_expr, &new_no_list);
       
       new_expr = build_x_conditional_expr
-       (build2 (LT_EXPR, TREE_TYPE (*new_var), *new_var, func_parm),
-        new_yes_expr, new_no_expr, 1);
+       (build2 (LT_EXPR, TREE_TYPE (array_ind_value), array_ind_value,
+                func_parm),
+        new_yes_list, new_no_list, 1);
       break;
     case REDUCE_MIN_INDEX:
-      new_var_init = build_x_modify_expr
-       (*new_var, NOP_EXPR, build_int_cst (new_var_type, 0), 1);
-      new_no_expr  = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
-      if (list_size > 1)
-       new_yes_expr = build_x_modify_expr (*new_var, NOP_EXPR, array_var[0],
-                                           1);
+      new_var_init = build_x_modify_expr (*new_var, NOP_EXPR, array_var[0], 1);
+      new_exp_init = build_x_modify_expr (array_ind_value, NOP_EXPR, func_parm,
+                                         1);
+      new_no_ind   = build_x_modify_expr (*new_var, NOP_EXPR, *new_var, 1);
+      new_no_expr  = build_x_modify_expr (array_ind_value, NOP_EXPR,
+                                         array_ind_value, 1);
+      if (list_size > 1) /* this means there is more than 1 */
+       {
+         new_yes_ind  = build_x_modify_expr (*new_var, NOP_EXPR, array_var[0],
+                                             1);
+         new_yes_expr = build_x_modify_expr (array_ind_value, NOP_EXPR,
+                                             func_parm, 1);
+       }
       else
-       new_yes_expr = build_x_modify_expr
-         (*new_var, NOP_EXPR, TREE_OPERAND (array_operand[0], 1), 1);
+       {
+         new_yes_ind  = build_x_modify_expr
+           (*new_var, NOP_EXPR, TREE_OPERAND (array_operand[0], 1), 1);
+         new_yes_expr = build_x_modify_expr (array_ind_value, NOP_EXPR,
+                                             func_parm, 1);
+       }
+      new_yes_list = alloc_stmt_list ();
+      append_to_statement_list (new_yes_ind, &new_yes_list);
+      append_to_statement_list (new_yes_expr, &new_yes_list);
+
+      new_no_list = alloc_stmt_list ();
+      append_to_statement_list (new_no_ind, &new_no_list);
+      append_to_statement_list (new_no_expr, &new_no_list);
       
       new_expr = build_x_conditional_expr
-       (build2 (GT_EXPR, TREE_TYPE (*new_var), *new_var, func_parm),
-        new_yes_expr, new_no_expr, 1);
+       (build2 (GT_EXPR, TREE_TYPE (array_ind_value), array_ind_value,
+                func_parm),
+        new_yes_list, new_no_list, 1);
       break;
     default:
       gcc_unreachable ();
       break;
     }
 
+  for (ii = 0; ii < rank; ii++)
+    append_to_statement_list (ind_init[ii], &loop);
+    
   append_to_statement_list (new_var_init, &loop);
+  if (an_type == REDUCE_MAX_INDEX || an_type == REDUCE_MIN_INDEX)
+    append_to_statement_list (new_exp_init, &loop);
   
   for (ii = 0; ii < rank; ii++)
     {
-      append_to_statement_list (ind_init [ii], &loop);
-
       append_to_statement_list
        (build1 (LABEL_EXPR, void_type_node, if_stmt_label[ii]), &loop);
       append_to_statement_list
@@ -2078,7 +2112,7 @@ contains_array_notation_expr (tree expr)
   int list_size = 0;
   
   extract_array_notation_exprs (expr, false, &array_list, &list_size);
-  if (*array_list == NULL || list_size == 0)
+  if (array_list == NULL || list_size == 0)
     return false;
   else
     return true;
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 741d5b4..a161742 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -62,6 +62,7 @@ static tree lookup_destructor (tree, tree, tree);
 static void warn_args_num (location_t, tree, bool);
 static int convert_arguments (tree, VEC(tree,gc) **, tree, int,
                               tsubst_flags_t);
+extern bool contains_array_notation_expr (tree);
 
 /* Do `exp = require_complete_type (exp);' to make sure exp
    does not have an incomplete type.  (That includes void types.)
@@ -7393,6 +7394,9 @@ convert_for_assignment (tree type, tree rhs,
 {
   tree rhstype;
   enum tree_code coder;
+  
+  if (flag_enable_cilk && contains_array_notation_expr (rhs))
+    return rhs;
 
   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
diff --git a/gcc/testsuite/ChangeLog.cilk b/gcc/testsuite/ChangeLog.cilk
index 7f67680..7753823 100644
--- a/gcc/testsuite/ChangeLog.cilk
+++ b/gcc/testsuite/ChangeLog.cilk
@@ -1,3 +1,9 @@
+2012-01-26  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
+       * gcc.dg/cilk-plus/array_notation_tests/builtin_func_double.c(main):
+       Fixed a variable mistake.
+       * g++.dg/cilk-plus/array_notation_tests/builtin_func_double.cc: New.
+
 2012-01-25  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
        * gcc.dg/cilk-plus/array_notation_tests/sec_implicit_ex.c: New.
diff --git 
a/gcc/testsuite/g++.dg/cilk-plus/array_notation_tests/builtin_func_double.cc 
b/gcc/testsuite/g++.dg/cilk-plus/array_notation_tests/builtin_func_double.cc
new file mode 100644
index 0000000..682c008
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cilk-plus/array_notation_tests/builtin_func_double.cc
@@ -0,0 +1,72 @@
+#if HAVE_IO
+#include <iostream>
+using namespace std;
+#endif
+#include <stdlib.h>
+
+/* char __sec_reduce_add (int *); */
+int main(int argc, char **argv)
+{
+  int ii,array[10], y = 0, y_int = 0, array2[10];
+  double x, yy, array3[10], array4[10];
+  for (ii = 0; ii < 10; ii++)
+    {
+      array[ii] = 1+ii;
+      array2[ii]= 2; 
+    }
+
+  for (ii = 0; ii < 10; ii++)
+    {
+      if (ii%2 && ii)
+       array3[ii] = (double)(1.0000/(double)ii);
+      else
+       array3[ii] = (double) ii + 0.10;
+      array4[ii] = (double) (1.00000/ (double)(ii+1));
+    }
+
+  /* array[:] = 5; */
+  x = __sec_reduce_max (array3[:] * array4[:]); 
+  y = __sec_reduce_max_ind ( array3[:] * array4[:]); 
+#if HAVE_IO
+  for (ii = 0; ii < 10; ii++) 
+    cout << array3[ii] * array4[ii] << " ";
+  cout << endl;
+  cout << "Max = " << x << " Max Index = " << y << endl;
+#endif
+
+  x = __sec_reduce_min (array3[:] * array4[:]); 
+  y = __sec_reduce_min_ind ( array3[:] * array4[:]); 
+#if HAVE_IO
+  for (ii = 0; ii < 10; ii++) 
+    cout << array3[ii] * array4[ii] << " ";
+  cout << endl;
+  cout << "Min = " << x << " Min Index = " << y << endl;
+#endif
+
+  x = __sec_reduce_add (array3[:] * array4[:]); 
+  yy = __sec_reduce_mul ( array3[:] * array4[:]); 
+#if HAVE_IO
+  for (ii = 0; ii < 10; ii++) 
+    cout << array3[ii] * array4[ii] << " ";
+  cout << endl;
+  cout << "Add = " << x << " Mul = " << yy << endl;
+#endif
+
+  for (ii = 0; ii < 10; ii++)
+    {
+      if (ii%2 && ii)
+       array3[ii] = (double)(1.0000/(double)ii);
+      else
+       array3[ii] = (double) ii + 0.00;
+      array4[ii] = (double) (1.00000/ (double)(ii+1));
+    }
+  y_int = __sec_reduce_any_zeros (array3[:] * array4[:]); 
+  y = __sec_reduce_all_zeros ( array3[:] * array4[:]); 
+#if HAVE_IO
+  for (ii = 0; ii < 10; ii++) 
+    cout << array3[ii] * array4[ii] << " ";
+  cout << endl;
+  cout << "Any Zeros = " << y_int << " All Zeros = " << y << endl;
+#endif
+  return 0;
+}
diff --git 
a/gcc/testsuite/gcc.dg/cilk-plus/array_notation_tests/builtin_func_double.c 
b/gcc/testsuite/gcc.dg/cilk-plus/array_notation_tests/builtin_func_double.c
index e52bbcc..ff38a71 100644
--- a/gcc/testsuite/gcc.dg/cilk-plus/array_notation_tests/builtin_func_double.c
+++ b/gcc/testsuite/gcc.dg/cilk-plus/array_notation_tests/builtin_func_double.c
@@ -50,7 +50,7 @@ int main(int argc, char **argv)
   for (ii = 0; ii < 10; ii++) 
     printf("%5.3f ", array3[ii] * array4[ii]);
   printf("\n");
-  printf("Add = %5.3f\t Mul = %f\n", x, y);
+  printf("Add = %5.3f\t Mul = %f\n", x, yy);
 #endif
 
   for (ii = 0; ii < 10; ii++)

Reply via email to