diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 52d1a1abc4a..e95703f1e7f 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 b7ea3a29647..718b97d0f94 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 00000000000..7506d158129 --- /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 285b2c8b0b3..639adcefb23 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);