mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-11 19:11:07 +08:00
re PR c/57490 (ICE on c-c++-common/cilk-plus/AN/an-if.c)
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
This commit is contained in:
parent
e42c64cb6d
commit
318cda8521
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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):
|
||||
|
@ -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. */
|
||||
|
@ -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)))
|
||||
|
@ -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.
|
||||
|
28
gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c
Normal file
28
gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c
Normal file
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user