From: jsm28 Date: Wed, 12 Oct 2011 11:56:03 +0000 (+0000) Subject: PR c/50565 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2ae38d08e484fd562fa006bb63dd12eb6f2cb2e4;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179845 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 474bbb4d64f8..d9fac6fefd14 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-12 Nick Clifton * config/arm/arm.h (EMIT_EABI_ATTRIBUTE): New macro. Used to diff --git a/gcc/convert.c b/gcc/convert.c index a647193ca949..f04b20481946 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -745,6 +745,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 c0684924568c..70f89f9330cd 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 Jason Merrill PR c++/49855 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;