From 69f111d5078d349329ae81f85ab13b792049c21c Mon Sep 17 00:00:00 2001 From: rguenth Date: Tue, 21 Aug 2007 09:18:15 +0000 Subject: [PATCH] 2007-08-21 Richard Guenther * fold-const.c (fold_binary): Revert removing of index +p PTR * folding. * gcc.dg/pointer-arith-10.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127660 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/fold-const.c | 7 +++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/pointer-arith-10.c | 10 ++++++++++ 4 files changed, 25 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pointer-arith-10.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8223bdd..aa40fb4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2007-08-21 Richard Guenther + * fold-const.c (fold_binary): Revert removing of index +p PTR folding. + +2007-08-21 Richard Guenther + PR middle-end/33122 * fold-const.c (fold_binary): Remove index +p PTR folding. Fix types of POINTER_PLUS_EXPR generated by folding of diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 8faf77d..33467eb 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9528,6 +9528,13 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) fold_convert (sizetype, arg1), fold_convert (sizetype, arg0))); + /* index +p PTR -> PTR +p index */ + if (POINTER_TYPE_P (TREE_TYPE (arg1)) + && INTEGRAL_TYPE_P (TREE_TYPE (arg0))) + return fold_build2 (POINTER_PLUS_EXPR, type, + fold_convert (type, arg1), + fold_convert (sizetype, arg0)); + /* (PTR +p B) +p A -> PTR +p (B + A) */ if (TREE_CODE (arg0) == POINTER_PLUS_EXPR) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29500ed8..9f0b0c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2007-08-21 Richard Guenther + * gcc.dg/pointer-arith-10.c: New testcase. + +2007-08-21 Richard Guenther + PR middle-end/33122 * gcc.c-torture/compile/pr33122.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/pointer-arith-10.c b/gcc/testsuite/gcc.dg/pointer-arith-10.c new file mode 100644 index 0000000..220891e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pointer-arith-10.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-original" } */ + +char *foo(char *p, __SIZE_TYPE__ i) +{ + return (char *)i + (__SIZE_TYPE__)p; +} + +/* { dg-final { scan-tree-dump "p +" "original" } } */ +/* { dg-final { cleanup-tree-dump "original" } } */ -- 2.7.4