From a4f510181a4a6ac49317acdda7036f0370517cb9 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 6 May 2016 07:38:27 +0000 Subject: [PATCH] re PR target/70941 (Test miscompiled with -O2.) 2016-05-06 Richard Biener PR middle-end/70941 * fold-const.c (split_tree): Always convert to the original type before negating. * gcc.dg/torture/pr70941.c: New testcase. From-SVN: r235943 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 17 +++++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr70941.c | 14 ++++++++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr70941.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c542478720..e8f7c8f8e0e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-06 Richard Biener + + PR middle-end/70941 + * fold-const.c (split_tree): Always convert to the original type + before negating. + 2016-05-06 Richard Biener * fwprop.c (fwprop): Remove duplicate cleanup_cfg call. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9ef43bf2259..8aabe2155fa 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -836,11 +836,10 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code, *minus_litp = *litp, *litp = 0; if (neg_conp_p) *conp = negate_expr (*conp); - if (neg_var_p) + if (neg_var_p && var) { - /* Convert to TYPE before negating a pointer type expr. */ - if (var && POINTER_TYPE_P (TREE_TYPE (var))) - var = fold_convert_loc (loc, type, var); + /* Convert to TYPE before negating. */ + var = fold_convert_loc (loc, type, var); var = negate_expr (var); } } @@ -863,10 +862,12 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code, else if (*minus_litp) *litp = *minus_litp, *minus_litp = 0; *conp = negate_expr (*conp); - /* Convert to TYPE before negating a pointer type expr. */ - if (var && POINTER_TYPE_P (TREE_TYPE (var))) - var = fold_convert_loc (loc, type, var); - var = negate_expr (var); + if (var) + { + /* Convert to TYPE before negating. */ + var = fold_convert_loc (loc, type, var); + var = negate_expr (var); + } } return var; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ec6eb7c322..d5b2df98e38 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-06 Richard Biener + + PR middle-end/70941 + * gcc.dg/torture/pr70941.c: New testcase. + 2016-05-05 Bin Cheng PR tree-optimization/57206 diff --git a/gcc/testsuite/gcc.dg/torture/pr70941.c b/gcc/testsuite/gcc.dg/torture/pr70941.c new file mode 100644 index 00000000000..3a57081abc7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr70941.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ +/* { dg-require-effective-target int32plus } */ + +extern void abort (void); + +char a = 0, b = 0, c = 0, d = 0; + +int main() +{ + a = -(b - 405418259) - ((d && c) ^ 2040097152); + if (a != -109) + abort(); + return 0; +}