diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-10-04 14:34:06 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-10-04 14:34:06 +0200 |
commit | f548a3173e47b45bf132c533091c8776ca79b629 (patch) | |
tree | e03429ddfdb28c26c0b8a6b943ec84b3196db8b1 | |
parent | 8cba60274732940251f0cd65af9f2d3b6f7b7e18 (diff) | |
download | gcc-f548a3173e47b45bf132c533091c8776ca79b629.zip gcc-f548a3173e47b45bf132c533091c8776ca79b629.tar.gz gcc-f548a3173e47b45bf132c533091c8776ca79b629.tar.bz2 |
fold-const.c (fold_unary_loc): Don't optimize POINTER_PLUS_EXPR casted to TYPE_RESTRICT pointer by casting the...
* fold-const.c (fold_unary_loc): Don't optimize
POINTER_PLUS_EXPR casted to TYPE_RESTRICT pointer by
casting the inner pointer if it isn't TYPE_RESTRICT.
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't through
casts from non-TYPE_RESTRICT pointer to TYPE_RESTRICT pointer.
* gcc.dg/tree-ssa/restrict-4.c: New test.
From-SVN: r179500
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fold-const.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c | 26 | ||||
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 5 |
5 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ee1a18..3b973a0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-10-04 Jakub Jelinek <jakub@redhat.com> + + * fold-const.c (fold_unary_loc): Don't optimize + POINTER_PLUS_EXPR casted to TYPE_RESTRICT pointer by + casting the inner pointer if it isn't TYPE_RESTRICT. + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't through + casts from non-TYPE_RESTRICT pointer to TYPE_RESTRICT pointer. + 2011-10-04 Joseph Myers <joseph@codesourcery.com> * config.gcc (i[34567]86-*-elf*, x86_64-*-elf*): Use diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 79ebd8b..c3871f1 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7946,6 +7946,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */ if (POINTER_TYPE_P (type) && TREE_CODE (arg0) == POINTER_PLUS_EXPR + && (!TYPE_RESTRICT (type) || TYPE_RESTRICT (TREE_TYPE (arg0))) && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5e2965b..b0d2d2c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-04 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/tree-ssa/restrict-4.c: New test. + 2011-10-04 Artem Shinkarov <artyom.shinkaroff@gmail.com> * gcc.c-torture/execute/vector-compare-1.c: Fix trailing white diff --git a/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c b/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c new file mode 100644 index 0000000..a307c89 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int +foo (int *x, int y) +{ + int *__restrict p1 = x; + int *__restrict p2 = x + 32; + p1[y] = 1; + p2[4] = 2; + return p1[y]; +} + +int +bar (int *x, int y) +{ + int *__restrict p1 = x; + int *p3 = x + 32; + int *__restrict p2 = p3; + p1[y] = 1; + p2[4] = 2; + return p1[y]; +} + +/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index a8737da..c6b92cf 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -804,6 +804,11 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, && ((rhs_code == SSA_NAME && rhs == name) || CONVERT_EXPR_CODE_P (rhs_code))) { + /* Don't propagate restrict pointer's RHS. */ + if (TYPE_RESTRICT (TREE_TYPE (lhs)) + && !TYPE_RESTRICT (TREE_TYPE (name)) + && !is_gimple_min_invariant (def_rhs)) + return false; /* Only recurse if we don't deal with a single use or we cannot do the propagation to the current statement. In particular we can end up with a conversion needed for a non-invariant |