diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fold-const.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr42716.c | 18 |
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5b291e6..1d66583 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-01-13 Richard Guenther <rguenther@suse.de> + + PR middle-end/42716 + * fold-const.c (fold_unary_loc): Fold INDIRECT_REFs. + 2010-01-13 Jakub Jelinek <jakub@redhat.com> PR debug/41371 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e112621..9e40296 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 f8532af..38241e2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-01-13 Richard Guenther <rguenther@suse.de> + PR middle-end/42716 + * gcc.c-torture/compile/pr42716.c: New testcase. + +2010-01-13 Richard Guenther <rguenther@suse.de> + PR lto/42678 * gfortran.dg/lto/20100110-1_0.f90: New testcase. 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 0000000..e52df0f --- /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))) + { + } +} |