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
This commit is contained in:
parent
8cba602747
commit
f548a3173e
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
26
gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c
Normal file
26
gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c
Normal file
@ -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" } } */
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user