aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-02-11 17:01:21 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-02-11 17:01:21 +0000
commit6d8921479a2a47ec10342142483b9291211c95c9 (patch)
treed94d461c1c28df146266dba369b42748d807ee32
parent04eadb13265b69db0282da8803f13e357a129079 (diff)
downloadgcc-6d8921479a2a47ec10342142483b9291211c95c9.zip
gcc-6d8921479a2a47ec10342142483b9291211c95c9.tar.gz
gcc-6d8921479a2a47ec10342142483b9291211c95c9.tar.bz2
re PR tree-optimization/42998 (ICE: error: verify_stmts failed)
2010-02-11 Richard Guenther <rguenther@suse.de> 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. From-SVN: r156704
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr42998.c15
-rw-r--r--gcc/tree-ssa-pre.c12
4 files changed, 34 insertions, 4 deletions
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 <rguenther@suse.de>
+
+ PR tree-optimization/42998
+ * tree-ssa-pre.c (create_expression_by_pieces): Treat
+ POINTER_PLUS_EXPR properly.
+
2010-02-11 Sebastian Pop <sebastian.pop@amd.com>
Changpeng Fang <changpeng.fang@amd.com>
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 <rguenther@suse.de>
+
+ PR tree-optimization/42998
+ * gcc.c-torture/compile/pr42998.c: New testcase.
+
2010-02-10 Jason Merrill <jason@redhat.com>
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);