Message ID | BF230D13CA30DD48930C31D4099330003A43C87D@FMSMSX101.amr.corp.intel.com |
---|---|
State | New |
Headers | show |
On Mon, Jul 01, 2013 at 05:02:57PM +0000, Iyer, Balaji V wrote: > > > > -----Original Message----- > > From: Jakub Jelinek [mailto:jakub@redhat.com] > > Sent: Monday, July 01, 2013 12:24 PM > > To: Iyer, Balaji V > > Cc: gcc-patches@gcc.gnu.org; Rainer Orth > > Subject: Re: [PATCH] Fix for PR c/57490 > > > > On Mon, Jul 01, 2013 at 04:17:37PM +0000, Iyer, Balaji V wrote: > > > gcc/c/ChangeLog > > > +2013-07-01 Balaji V. Iyer <balaji.v.iyer@intel.com> > > > + > > > > The PR c/57490 line belongs to all ChangeLog entries related to the fix, not > > just testsuite. > > > > > + * 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-07-01 Balaji V. Iyer <balaji.v.iyer@intel.com> > > > + > > > + * 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. > > > > I'll leave this to C/C++ maintainers. > > > > > gcc/testsuite/ChangeLog > > > +2013-07-01 Balaji V. Iyer <balaji.v.iyer@intel.com> > > > + > > > + PR c/57490 > > > + * c-c++-common/cilk-plus/AN/pr57490.i: New test. > > > + * gcc.dg/cilk-plus/cilk-plus.exp: Added compilation of .i files. > > > > Ugh, no. Please add the test as *.c test instead, and strip all the > > unneeded garbage from it. It would surprise me a lot if the # line ..., > > #pragma ident or blank lines were required to reproduce the problem. > > OK. The fixed patch is attached. Here are the ChangeLog entries: Aren't you still missing the PR c/57490 in ChangeLog entries? Marek
On Mon, Jul 01, 2013 at 05:02:57PM +0000, Iyer, Balaji V wrote: > OK. The fixed patch is attached. Here are the ChangeLog entries: > > gcc/cp/ChangeLog > 2013-07-01 Balaji V. Iyer <balaji.v.iyer@intel.com> > Still PR c/57490 hasn't been added to cp/ChangeLog and c/ChangeLog entries. > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c > @@ -0,0 +1,25 @@ Do you want the testcase just as a compile time test (dunno what is the default for cilk-plus.exp)? If it would be usable as a runtime test, it would be better to just convert it into a runtime test (then of course you can't use __assert, but do something like: #define assert(x) do { if (!(x)) __builtin_abort () } while (0) and use assert (__sec_reduce_add(x[0:n]) == 3.0f * n); etc. in the testcase, or just write the conditionals plus __builtin_abort etc. And add /* { dg-do run } */. > +extern void __assert(const char *, const char *, int); > +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])==(float)3*n) || (__assert("__sec_reduce_add(x[0:n])==3*n", "an-if.c", 28), 0)); > + (void)((__sec_reduce_add(y[0:n])==(float)i*n) || (__assert("__sec_reduce_add(y[0:n])==i*n", "an-if.c", 29), 0)); > + (void)((__sec_reduce_add(z[0:n])==(float)0) || (__assert("__sec_reduce_add(z[0:n])==0", "an-if.c", 30), 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])==(float)3*n) || (__assert("__sec_reduce_add(x[0:n])==3*n", "an-if.c", 43), 0)); > + (void)((__sec_reduce_add(y[0:n])==(float)i*n) || (__assert("__sec_reduce_add(y[0:n])==i*n", "an-if.c", 44), 0)); > + (void)((__sec_reduce_add(z[0:n])==(float)(3>=i?3-i:3+i)*n) || (__assert("__sec_reduce_add(z[0:n])==(3>=i?3-i:3+i)*n", "an-if.c", 45), 0)); > + } > + return 0; > +} Jakub
diff --git a/gcc/c/c-array-notation.c b/gcc/c/c-array-notation.c index 7788f7b..5747bcb 100644 --- a/gcc/c/c-array-notation.c +++ b/gcc/c/c-array-notation.c @@ -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; diff --git a/gcc/cp/cp-array-notation.c b/gcc/cp/cp-array-notation.c index d279ddd..164106f 100644 --- a/gcc/cp/cp-array-notation.c +++ b/gcc/cp/cp-array-notation.c @@ -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))) 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 index 0000000..2ce2963 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c @@ -0,0 +1,25 @@ +extern void __assert(const char *, const char *, int); +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])==(float)3*n) || (__assert("__sec_reduce_add(x[0:n])==3*n", "an-if.c", 28), 0)); + (void)((__sec_reduce_add(y[0:n])==(float)i*n) || (__assert("__sec_reduce_add(y[0:n])==i*n", "an-if.c", 29), 0)); + (void)((__sec_reduce_add(z[0:n])==(float)0) || (__assert("__sec_reduce_add(z[0:n])==0", "an-if.c", 30), 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])==(float)3*n) || (__assert("__sec_reduce_add(x[0:n])==3*n", "an-if.c", 43), 0)); + (void)((__sec_reduce_add(y[0:n])==(float)i*n) || (__assert("__sec_reduce_add(y[0:n])==i*n", "an-if.c", 44), 0)); + (void)((__sec_reduce_add(z[0:n])==(float)(3>=i?3-i:3+i)*n) || (__assert("__sec_reduce_add(z[0:n])==(3>=i?3-i:3+i)*n", "an-if.c", 45), 0)); + } + return 0; +}