aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-09-18 00:05:40 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2007-09-18 00:05:40 +0200
commitabc2dd3c9eb9058cc9c9babab700ba68dfda1881 (patch)
treed66ae6d516b7dcb5059047dc0517249ce4476555
parent93a85f02f1a82d47efba7f10ea4a12ea2502ba18 (diff)
downloadgcc-abc2dd3c9eb9058cc9c9babab700ba68dfda1881.zip
gcc-abc2dd3c9eb9058cc9c9babab700ba68dfda1881.tar.gz
gcc-abc2dd3c9eb9058cc9c9babab700ba68dfda1881.tar.bz2
re PR middle-end/33423 (internal compiler error: in expand_expr_real_1, at expr.c:8670)
PR middle-end/33423 * builtins.c (expand_builtin_memory_chk): Handle COMPOUND_EXPRs returned by build_call_expr. * gcc.c-torture/compile/20070915-1.c: New test. From-SVN: r128554
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/builtins.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20070915-1.c20
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2d4575a..7bbe988 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/33423
+ * builtins.c (expand_builtin_memory_chk): Handle COMPOUND_EXPRs
+ returned by build_call_expr.
+
2007-09-17 Eric Botcazou <ebotcazou@adacore.com>
* tree-sra.c (maybe_lookup_element_for_expr) <COMPONENT_REF>: Return
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 50d4b62..bb43ab6 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -11558,6 +11558,13 @@ expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode,
return NULL_RTX;
fn = build_call_expr (fn, 3, dest, src, len);
+ STRIP_TYPE_NOPS (fn);
+ while (TREE_CODE (fn) == COMPOUND_EXPR)
+ {
+ expand_expr (TREE_OPERAND (fn, 0), const0_rtx, VOIDmode,
+ EXPAND_NORMAL);
+ fn = TREE_OPERAND (fn, 1);
+ }
if (TREE_CODE (fn) == CALL_EXPR)
CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
return expand_expr (fn, target, mode, EXPAND_NORMAL);
@@ -11606,6 +11613,13 @@ expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode,
if (!fn)
return NULL_RTX;
fn = build_call_expr (fn, 4, dest, src, len, size);
+ STRIP_TYPE_NOPS (fn);
+ while (TREE_CODE (fn) == COMPOUND_EXPR)
+ {
+ expand_expr (TREE_OPERAND (fn, 0), const0_rtx, VOIDmode,
+ EXPAND_NORMAL);
+ fn = TREE_OPERAND (fn, 1);
+ }
if (TREE_CODE (fn) == CALL_EXPR)
CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
return expand_expr (fn, target, mode, EXPAND_NORMAL);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae89416..a110de35 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/33423
+ * gcc.c-torture/compile/20070915-1.c: New test.
+
2007-09-17 Tobias Burnus <burnus@net-b.de>
PR fortran/33106
diff --git a/gcc/testsuite/gcc.c-torture/compile/20070915-1.c b/gcc/testsuite/gcc.c-torture/compile/20070915-1.c
new file mode 100644
index 0000000..1cd64e5
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20070915-1.c
@@ -0,0 +1,20 @@
+/* PR middle-end/33423 */
+
+static struct
+{
+ char buf[15];
+} u2;
+
+void
+test6 (void)
+{
+ int len;
+ char *p;
+
+ for (len = 0; len < 2; len++)
+ {
+ p = __builtin___memset_chk (u2.buf, '\0', len, 15);
+ if (p != u2.buf)
+ return;
+ }
+}