aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2008-12-02 11:13:05 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2008-12-02 11:13:05 +0100
commit0d2a6e08da09208f8c93b36cf8a2a216b1db1955 (patch)
tree3c0d9842ad0f29acf2ac2c76dae29e4a695facf4
parentbfb139b409e012903a3faf0c6934792cc7d2a838 (diff)
downloadgcc-0d2a6e08da09208f8c93b36cf8a2a216b1db1955.zip
gcc-0d2a6e08da09208f8c93b36cf8a2a216b1db1955.tar.gz
gcc-0d2a6e08da09208f8c93b36cf8a2a216b1db1955.tar.bz2
re PR middle-end/38343 (ice for legal code with -O2)
PR middle-end/38343 * builtins.c (expand_builtin_mempcpy_args): Handle COMPOUND_EXPRs potentially returned from folding memcpy. (expand_builtin_stpcpy_args): Similarly for folding strcpy. (fold_builtin_2): Handle BUILT_IN_STPCPY if result is ignored. * gcc.c-torture/compile/pr38343.c: New test. From-SVN: r142348
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/builtins.c43
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr38343.c12
4 files changed, 57 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 75fa2e7..928a0aa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,12 @@
-2008-12-02 Danny Smith <dannysmith@users.sourceforge.net>
+2008-12-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/38343
+ * builtins.c (expand_builtin_mempcpy_args): Handle COMPOUND_EXPRs
+ potentially returned from folding memcpy.
+ (expand_builtin_stpcpy_args): Similarly for folding strcpy.
+ (fold_builtin_2): Handle BUILT_IN_STPCPY if result is ignored.
+
+2008-12-02 Danny Smith <dannysmith@users.sourceforge.net>
PR target/38054
* config/i386/winnt.c (i386_pe_encode_section_info): Condition stdcall
diff --git a/gcc/builtins.c b/gcc/builtins.c
index a6ee5a9..3406667 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -3406,7 +3406,7 @@ expand_builtin_memcpy (tree exp, rtx target, enum machine_mode mode)
stpcpy. */
static rtx
-expand_builtin_mempcpy(tree exp, rtx target, enum machine_mode mode)
+expand_builtin_mempcpy (tree exp, rtx target, enum machine_mode mode)
{
if (!validate_arglist (exp,
POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
@@ -3433,15 +3433,18 @@ expand_builtin_mempcpy_args (tree dest, tree src, tree len, tree type,
rtx target, enum machine_mode mode, int endp)
{
/* If return value is ignored, transform mempcpy into memcpy. */
- if (target == const0_rtx)
+ if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_MEMCPY])
{
tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
+ tree result = build_call_expr (fn, 3, dest, src, len);
- if (!fn)
- return NULL_RTX;
-
- return expand_expr (build_call_expr (fn, 3, dest, src, len),
- target, mode, EXPAND_NORMAL);
+ while (TREE_CODE (result) == COMPOUND_EXPR)
+ {
+ expand_expr (TREE_OPERAND (result, 0), const0_rtx, VOIDmode,
+ EXPAND_NORMAL);
+ result = TREE_OPERAND (result, 1);
+ }
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
else
{
@@ -3707,14 +3710,19 @@ expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode)
src = CALL_EXPR_ARG (exp, 1);
/* If return value is ignored, transform stpcpy into strcpy. */
- if (target == const0_rtx)
+ if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_STRCPY])
{
tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
- if (!fn)
- return NULL_RTX;
+ tree result = build_call_expr (fn, 2, dst, src);
- return expand_expr (build_call_expr (fn, 2, dst, src),
- target, mode, EXPAND_NORMAL);
+ STRIP_NOPS (result);
+ while (TREE_CODE (result) == COMPOUND_EXPR)
+ {
+ expand_expr (TREE_OPERAND (result, 0), const0_rtx, VOIDmode,
+ EXPAND_NORMAL);
+ result = TREE_OPERAND (result, 1);
+ }
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
else
{
@@ -10463,6 +10471,17 @@ fold_builtin_2 (tree fndecl, tree arg0, tree arg1, bool ignore)
case BUILT_IN_STRCPY:
return fold_builtin_strcpy (fndecl, arg0, arg1, NULL_TREE);
+ case BUILT_IN_STPCPY:
+ if (ignore)
+ {
+ tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
+ if (!fn)
+ break;
+
+ return build_call_expr (fn, 2, arg0, arg1);
+ }
+ break;
+
case BUILT_IN_STRCMP:
return fold_builtin_strcmp (arg0, arg1);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 440872d..ad317b7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-12-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/38343
+ * gcc.c-torture/compile/pr38343.c: New test.
+
2008-12-01 Janis Johnson <janis187@us.ibm.com>
* gcc.target/powerpc/pr18096-1.c: Adjust location of expected error.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38343.c b/gcc/testsuite/gcc.c-torture/compile/pr38343.c
new file mode 100644
index 0000000..589ba33
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr38343.c
@@ -0,0 +1,12 @@
+/* PR middle-end/38343 */
+
+static struct A
+{
+ char f[6];
+} a[] = { {"01000"} };
+
+void
+foo (void)
+{
+ __builtin_stpcpy (a[0].f, "S0022");
+}