From 50b9db1a88275264c8d60b614a53289d9e460ecd Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 11 Feb 2010 17:01:21 +0000 Subject: [PATCH] 2010-02-11 Richard Guenther PR tree-optimization/42998 * tree-ssa-pre.c (create_expression_by_pieces): Treat POINTER_PLUS_EXPR properly. * gcc.c-torture/compile/pr42998.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156704 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr42998.c | 15 +++++++++++++++ gcc/tree-ssa-pre.c | 12 ++++++++---- 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr42998.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 52d1a1a..e95703f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-02-11 Richard Guenther + + PR tree-optimization/42998 + * tree-ssa-pre.c (create_expression_by_pieces): Treat + POINTER_PLUS_EXPR properly. + 2010-02-11 Sebastian Pop Changpeng Fang diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b7ea3a2..718b97d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-11 Richard Guenther + + PR tree-optimization/42998 + * gcc.c-torture/compile/pr42998.c: New testcase. + 2010-02-10 Jason Merrill PR c++/41896 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42998.c b/gcc/testsuite/gcc.c-torture/compile/pr42998.c new file mode 100644 index 0000000..7506d15 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr42998.c @@ -0,0 +1,15 @@ +void foo(void *); +void bar(void *); +void ndisc_fill_addr_option(unsigned char *opt, int data_len, + unsigned short addr_type) +{ + int pad; + if (addr_type == 32) + pad = 2; + else + pad = 0; + __builtin_memset(opt + 2, 0, pad); + opt += pad; + __builtin_constant_p(data_len) ? foo (opt+2) : bar (opt+2); +} + diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 285b2c8..639adce 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -3013,14 +3013,18 @@ create_expression_by_pieces (basic_block block, pre_expr expr, stmts, domstmt); if (!genop1 || !genop2) return NULL_TREE; - genop1 = fold_convert (TREE_TYPE (nary->op[0]), - genop1); /* Ensure op2 is a sizetype for POINTER_PLUS_EXPR. It may be a constant with the wrong type. */ if (nary->opcode == POINTER_PLUS_EXPR) - genop2 = fold_convert (sizetype, genop2); + { + genop1 = fold_convert (nary->type, genop1); + genop2 = fold_convert (sizetype, genop2); + } else - genop2 = fold_convert (TREE_TYPE (nary->op[1]), genop2); + { + genop1 = fold_convert (TREE_TYPE (nary->op[0]), genop1); + genop2 = fold_convert (TREE_TYPE (nary->op[1]), genop2); + } folded = fold_build2 (nary->opcode, nary->type, genop1, genop2); -- 2.7.4