]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR middle-end/33423
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2007 22:05:40 +0000 (22:05 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2007 22:05:40 +0000 (22:05 +0000)
* builtins.c (expand_builtin_memory_chk): Handle COMPOUND_EXPRs
returned by build_call_expr.

* gcc.c-torture/compile/20070915-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128554 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20070915-1.c [new file with mode: 0644]

index 2d4575aec128ac449fcad284e5558666a5a8ba1d..7bbe988d839233ef364e96c864d005a866cca5d2 100644 (file)
@@ -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
index 50d4b6211e118910f3f522b9443257567cd187f0..bb43ab61b3d4e209f25379a02eab3e52257788fd 100644 (file)
@@ -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);
index ae89416b95bd0be320f23282b548a56618852ee4..a110de35d12b992e3b5d01ab7cc2f689083e6945 100644 (file)
@@ -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 (file)
index 0000000..1cd64e5
--- /dev/null
@@ -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;
+    }
+}