From: Richard Guenther Date: Wed, 13 Jan 2010 13:31:13 +0000 (+0000) Subject: re PR middle-end/42716 (ICE in extract_range_from_assert, at tree-vrp.c:1423) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=48f30f629fb6991ba1ddbd40385993a2a29457a8;p=gcc.git re PR middle-end/42716 (ICE in extract_range_from_assert, at tree-vrp.c:1423) 2010-01-13 Richard Guenther PR middle-end/42716 * fold-const.c (fold_unary_loc): Fold INDIRECT_REFs. * gcc.c-torture/compile/pr42716.c: New testcase. From-SVN: r155859 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5b291e65138..1d66583818e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-01-13 Richard Guenther + + PR middle-end/42716 + * fold-const.c (fold_unary_loc): Fold INDIRECT_REFs. + 2010-01-13 Jakub Jelinek PR debug/41371 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e1126219689..9e40296123c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8942,6 +8942,19 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) } return NULL_TREE; + case INDIRECT_REF: + /* Fold *&X to X if X is an lvalue. */ + if (TREE_CODE (op0) == ADDR_EXPR) + { + tree op00 = TREE_OPERAND (op0, 0); + if ((TREE_CODE (op00) == VAR_DECL + || TREE_CODE (op00) == PARM_DECL + || TREE_CODE (op00) == RESULT_DECL) + && !TREE_READONLY (op00)) + return op00; + } + return NULL_TREE; + default: return NULL_TREE; } /* switch (code) */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f8532afa361..38241e23fbb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-13 Richard Guenther + + PR middle-end/42716 + * gcc.c-torture/compile/pr42716.c: New testcase. + 2010-01-13 Richard Guenther PR lto/42678 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42716.c b/gcc/testsuite/gcc.c-torture/compile/pr42716.c new file mode 100644 index 00000000000..e52df0f4ae3 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr42716.c @@ -0,0 +1,18 @@ +static short foo (long long si1, short si2) +{ + return si1 > 0 && si2 > 0 || si1 < 0 + && si2 < 0 && si1 < 1 - si2 ? : si1 + si2; +} + +int g_13; +unsigned g_17; + +int safe (int, int); + +void bar (short p_51, short * p_52) +{ + int *const l_55 = &g_13; + if (safe (*p_52, g_13 != foo (*p_52 & *l_55 == g_13 && g_17 >= 1, 0))) + { + } +}