diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/expr.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr45771.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.fortran-torture/compile/pr45738.f90 | 11 | ||||
-rw-r--r-- | gcc/varpool.c | 4 |
6 files changed, 39 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 738ae88..ce8050f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2010-09-24 Jan Hubicka <jh@suse.cz> + + PR tree-optimization/45738 + PR tree-optimization/45741 + * expr.c (string_constant): Allow CONST_DECL too; + check that DECL_INITIAL is set. + * varpool.c (const_value_known_p): Only look into VAR_DECL + and CONST_DECL. + 2010-09-24 Joseph Myers <joseph@codesourcery.com> * common.opt (undef): New. @@ -9854,12 +9854,14 @@ string_constant (tree arg, tree *ptr_offset) *ptr_offset = fold_convert (sizetype, offset); return array; } - else if (TREE_CODE (array) == VAR_DECL) + else if (TREE_CODE (array) == VAR_DECL + || TREE_CODE (array) == CONST_DECL) { int length; /* Variables initialized to string literals can be handled too. */ if (!const_value_known_p (array) + || !DECL_INITIAL (array) || TREE_CODE (DECL_INITIAL (array)) != STRING_CST) return 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8c526d5..e1cd3a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-09-24 Jan Hubicka <jh@suse.cz> + + PR tree-optimization/45738 + PR tree-optimization/45741 + * gcc.c-torture/compile/pr45741.c: New. + * gfortran.fortran-torture/compile/pr45738.f90: New. + 2010-09-24 Joseph Myers <joseph@codesourcery.com> * gcc.dg/cpp/undef-opt-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr45771.c b/gcc/testsuite/gcc.c-torture/compile/pr45771.c new file mode 100644 index 0000000..2bd96ec --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr45771.c @@ -0,0 +1,7 @@ +static const int data[2048]; + +void foo (void *ptr) +{ + __builtin_memcmp (data, ptr, 1); +} + diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr45738.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr45738.f90 new file mode 100644 index 0000000..b0541e3 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr45738.f90 @@ -0,0 +1,11 @@ +PROGRAM TestInfinite + integer(8) :: bit_pattern_NegInf_i8 = -4503599627370496_8 + + integer(8) :: i + real(8) :: r + + r = transfer(bit_pattern_NegInf_i8_p,r) + i = transfer(r,i) + +END PROGRAM TestInfinite + diff --git a/gcc/varpool.c b/gcc/varpool.c index 3ce3bac..673905d 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -367,8 +367,8 @@ const_value_known_p (tree decl) { struct varpool_node *vnode; - if (TREE_CODE (decl) == PARM_DECL - || TREE_CODE (decl) == RESULT_DECL) + if (TREE_CODE (decl) != VAR_DECL + &&TREE_CODE (decl) != CONST_DECL) return false; if (TREE_CODE (decl) == CONST_DECL |