From eef6b15c13b4f37fd26d9dd72b7243ef68c7bbfe Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 12 Oct 2011 12:58:47 +0100 Subject: [PATCH] re PR c/50565 (initializer element is not computable at load time) PR c/50565 * convert.c (convert_to_integer): Do not narrow operands of pointer subtraction. testsuite: * gcc.c-torture/compile/pr50565-1.c, gcc.c-torture/compile/pr50565-2.c: New tests. From-SVN: r179847 --- gcc/ChangeLog | 6 ++++++ gcc/convert.c | 9 +++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.c-torture/compile/pr50565-1.c | 4 ++++ gcc/testsuite/gcc.c-torture/compile/pr50565-2.c | 4 ++++ 5 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr50565-1.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr50565-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 54f4e0319c84..de0cd9604d92 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-10-12 Joseph Myers + + PR c/50565 + * convert.c (convert_to_integer): Do not narrow operands of + pointer subtraction. + 2011-10-11 Eric Botcazou PR target/49965 diff --git a/gcc/convert.c b/gcc/convert.c index 055f294d1d7a..175ecb89323e 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -728,6 +728,15 @@ convert_to_integer (tree type, tree expr) tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type); tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type); + /* Do not try to narrow operands of pointer subtraction; + that will interfere with other folding. */ + if (ex_form == MINUS_EXPR + && CONVERT_EXPR_P (arg0) + && CONVERT_EXPR_P (arg1) + && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))) + && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0)))) + break; + if (outprec >= BITS_PER_WORD || TRULY_NOOP_TRUNCATION (outprec, inprec) || inprec > TYPE_PRECISION (TREE_TYPE (arg0)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 964651820a4a..6e4e386c83b6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-10-12 Joseph Myers + + PR c/50565 + * gcc.c-torture/compile/pr50565-1.c, + gcc.c-torture/compile/pr50565-2.c: New tests. + 2011-10-11 Janis Johnson PR c++/44473 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr50565-1.c b/gcc/testsuite/gcc.c-torture/compile/pr50565-1.c new file mode 100644 index 000000000000..cdaad294f1ff --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr50565-1.c @@ -0,0 +1,4 @@ +struct s { char p[2]; }; +static struct s v; +const int o0 = (int) ((void *) &v.p[0] - (void *) &v) + 0U; +const int o1 = (int) ((void *) &v.p[0] - (void *) &v) + 1U; diff --git a/gcc/testsuite/gcc.c-torture/compile/pr50565-2.c b/gcc/testsuite/gcc.c-torture/compile/pr50565-2.c new file mode 100644 index 000000000000..2d30e88021fe --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr50565-2.c @@ -0,0 +1,4 @@ +struct s { char p[2]; }; +static struct s v; +const int o0 = (int) ((void *) &v.p[0] - (void *) &v) + 0; +const int o1 = (int) ((void *) &v.p[0] - (void *) &v) + 1; -- 2.47.2