re PR c/57490 (ICE on c-c++-common/cilk-plus/AN/an-if.c)
authorBalaji V. Iyer <balaji.v.iyer@intel.com>
Tue, 20 Aug 2013 01:10:56 +0000 (01:10 +0000)
committerBalaji V. Iyer <bviyer@gcc.gnu.org>
Tue, 20 Aug 2013 01:10:56 +0000 (18:10 -0700)
Fix for PR c/57490.

gcc/c/ChangeLog
+2013-08-19  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+
+       PR c/57490
+       * c-array-notation.c (fix_conditional_array_notations_1): Added a
+       check for truth values.
+       (expand_array_notation_exprs): Added truth values case.  Removed an
+       unwanted else.  Added for-loop to walk through subtrees in default
+       case.
+

gcc/cp/ChangeLog
+2013-08-19  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+
+       PR c/57490
+       * cp-array-notation.c (cp_expand_cond_array_notations): Added a
+       check for truth values.
+       (expand_array_notation_exprs): Added truth values case.  Removed an
+       unwanted else.  Added for-loop to walk through subtrees in default
+       case.
+       * call.c (build_cxx_call): Inherited the type of the array notation for
+       certain built-in array notation functions.
+

gcc/testsuite/ChangeLog
+2013-08-19  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+
+       PR c/57490
+       * c-c++-common/cilk-plus/AN/pr57490.c: New test.
+

From-SVN: r201867

gcc/c/ChangeLog
gcc/c/c-array-notation.c
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-array-notation.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c [new file with mode: 0644]

index 2b9e2f7..6ce1398 100644 (file)
@@ -1,3 +1,12 @@
+2013-08-19  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+       
+       PR c/57490
+       * c-array-notation.c (fix_conditional_array_notations_1): Added a
+       check for truth values.
+       (expand_array_notation_exprs): Added truth values case.  Removed an
+       unwanted else.  Added for-loop to walk through subtrees in default
+       case.
+
 2013-08-04  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * c-objc-common.c (c_initialize_diagnostics): Don't call pp_base.
index 7788f7b..5747bcb 100644 (file)
@@ -906,6 +906,8 @@ fix_conditional_array_notations_1 (tree stmt)
     cond = COND_EXPR_COND (stmt);
   else if (TREE_CODE (stmt) == SWITCH_EXPR)
     cond = SWITCH_COND (stmt);
+  else if (truth_value_p (TREE_CODE (stmt)))
+    cond = TREE_OPERAND (stmt, 0);
   else
     /* Otherwise dont even touch the statement.  */
     return stmt;
@@ -1232,6 +1234,12 @@ expand_array_notation_exprs (tree t)
     case BIND_EXPR:
       t = expand_array_notation_exprs (BIND_EXPR_BODY (t));
       return t;
+    case TRUTH_ORIF_EXPR:
+    case TRUTH_ANDIF_EXPR:
+    case TRUTH_OR_EXPR:
+    case TRUTH_AND_EXPR:
+    case TRUTH_XOR_EXPR:
+    case TRUTH_NOT_EXPR:
     case COND_EXPR:
       t = fix_conditional_array_notations (t);
 
@@ -1246,8 +1254,6 @@ expand_array_notation_exprs (tree t)
            COND_EXPR_ELSE (t) =
              expand_array_notation_exprs (COND_EXPR_ELSE (t));
        }
-      else
-       t = expand_array_notation_exprs (t);
       return t;
     case STATEMENT_LIST:
       {
@@ -1284,6 +1290,10 @@ expand_array_notation_exprs (tree t)
         Replace those with just void zero node.  */
       t = void_zero_node;
     default:
+      for (int ii = 0; ii < TREE_CODE_LENGTH (TREE_CODE (t)); ii++)
+       if (contains_array_notation_expr (TREE_OPERAND (t, ii)))
+         TREE_OPERAND (t, ii) =
+           expand_array_notation_exprs (TREE_OPERAND (t, ii));
       return t;
     }
   return t;
index e4bf669..d4099b0 100644 (file)
@@ -1,3 +1,14 @@
+2013-08-19  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+
+       PR c/57490
+       * cp-array-notation.c (cp_expand_cond_array_notations): Added a
+       check for truth values.
+       (expand_array_notation_exprs): Added truth values case.  Removed an
+       unwanted else.  Added for-loop to walk through subtrees in default
+       case.
+       * call.c (build_cxx_call): Inherited the type of the array notation for
+       certain built-in array notation functions.
+
 2013-08-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * parser.c (cp_parser_lambda_introducer, cp_parser_decltype_expr):
index e493a79..df87d8f 100644 (file)
@@ -7177,6 +7177,33 @@ build_cxx_call (tree fn, int nargs, tree *argarray,
       && !check_builtin_function_arguments (fndecl, nargs, argarray))
     return error_mark_node;
 
+    /* If it is a built-in array notation function, then the return type of
+     the function is the element type of the array passed in as array 
+     notation (i.e. the first parameter of the function).  */
+  if (flag_enable_cilkplus && TREE_CODE (fn) == CALL_EXPR) 
+    {
+      enum built_in_function bif = 
+       is_cilkplus_reduce_builtin (CALL_EXPR_FN (fn));
+      if (bif == BUILT_IN_CILKPLUS_SEC_REDUCE_ADD
+         || bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MUL
+         || bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX
+         || bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN
+         || bif == BUILT_IN_CILKPLUS_SEC_REDUCE
+         || bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING)
+       { 
+         /* for bif == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO or
+            BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO or
+            BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO or 
+            BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_NONZERO or
+            BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND or
+             BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND
+            The pre-defined return-type is the correct one.  */
+         tree array_ntn = CALL_EXPR_ARG (fn, 0); 
+         TREE_TYPE (fn) = TREE_TYPE (array_ntn); 
+         return fn;
+       }
+    }
+
   /* Some built-in function calls will be evaluated at compile-time in
      fold ().  Set optimize to 1 when folding __builtin_constant_p inside
      a constexpr function so that fold_builtin_1 doesn't fold it to 0.  */
index eb6a70d..f4581f0 100644 (file)
@@ -857,6 +857,19 @@ cp_expand_cond_array_notations (tree orig_stmt)
          return error_mark_node;
        }
     }
+  else if (truth_value_p (TREE_CODE (orig_stmt)))
+    {
+      size_t left_rank = 0, right_rank = 0;
+      tree left_expr = TREE_OPERAND (orig_stmt, 0);
+      tree right_expr = TREE_OPERAND (orig_stmt, 1);
+      if (!find_rank (EXPR_LOCATION (left_expr), left_expr, left_expr, true,
+                     &left_rank)
+         || !find_rank (EXPR_LOCATION (right_expr), right_expr, right_expr,
+                        true, &right_rank))
+       return error_mark_node;
+      if (right_rank == 0 && left_rank == 0)
+       return orig_stmt;
+    }
 
   if (!find_rank (EXPR_LOCATION (orig_stmt), orig_stmt, orig_stmt, true,
                  &rank))
@@ -1213,6 +1226,12 @@ expand_array_notation_exprs (tree t)
       if (TREE_OPERAND (t, 0) == error_mark_node)
        return TREE_OPERAND (t, 0); 
       return t;
+    case TRUTH_ANDIF_EXPR:
+    case TRUTH_ORIF_EXPR:
+    case TRUTH_AND_EXPR:
+    case TRUTH_OR_EXPR:
+    case TRUTH_XOR_EXPR:
+    case TRUTH_NOT_EXPR:
     case COND_EXPR:
       t = cp_expand_cond_array_notations (t);
       if (TREE_CODE (t) == COND_EXPR)
@@ -1222,8 +1241,6 @@ expand_array_notation_exprs (tree t)
          COND_EXPR_ELSE (t) =
            expand_array_notation_exprs (COND_EXPR_ELSE (t));
        }
-      else
-       t = expand_array_notation_exprs (t);
       return t;
     case FOR_STMT:
       if (contains_array_notation_expr (FOR_COND (t)))
index 9d262b9..f01cbc6 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-19  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+       
+       PR c/57490
+       * c-c++-common/cilk-plus/AN/pr57490.c: New test.
+
 2013-08-19  Peter Bergner  <bergner@vnet.ibm.com>
 
        * gcc.target/powerpc/dfp-dd-2.c: New test.
diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c
new file mode 100644 (file)
index 0000000..db38b30
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+const int n = 8;
+float x[8], y[8], z[8];
+int main() {
+    int i = 0;
+    float x_sum =0;
+    for(i=1; i<=5; i+=4 ) {
+        x[0:n] = 3;
+        y[0:n] = i;
+        z[0:n] = 0;
+        (void)((__sec_reduce_add(x[0:n])==3*n) || (__builtin_abort (), 0));
+        (void)((__sec_reduce_add(y[0:n])==i*n) || (__builtin_abort (), 0));
+        (void)((__sec_reduce_add(z[0:n])==0) || (__builtin_abort (), 0));
+
+        if (x[0:n] >= y[0:n]) {
+            z[0:n] = x[0:n] - y[0:n];
+        } else {
+            z[0:n] = x[0:n] + y[0:n];
+        }
+        (void)((__sec_reduce_add(x[0:n])==3*n) || (__builtin_abort (), 0));
+        (void)((__sec_reduce_add(y[0:n])==i*n) || (__builtin_abort (), 0));
+        (void)((__sec_reduce_add(z[0:n])==(3>=i?3-i:3+i)*n) 
+              || (__builtin_abort (), 0));
+    }
+    return 0;
+}