summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2003-05-18 22:50:29 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2003-05-18 22:50:29 +0000
commit156f6115e16e3bb7fd16e1bac57f88b16ebdbad5 (patch)
tree2c5a4fef2fea4ee8851e816f5d8c43eaad5e04f9
parent104e421a5ed9b0397de53e97e29515be2eadcc86 (diff)
downloadppe42-gcc-156f6115e16e3bb7fd16e1bac57f88b16ebdbad5.tar.gz
ppe42-gcc-156f6115e16e3bb7fd16e1bac57f88b16ebdbad5.zip
PR middle-end/10472
* builtins.c (expand_builtin_memcpy): Call force_operand on expressions and use simplify_gen_binary to create the addition. * gcc.c-torture/compile/20030518-1.c: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66941 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c25
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20030518-1.c14
4 files changed, 45 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 367e99f01ab..96f2290c53f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-05-18 Roger Sayle <roger@eyesopen.com>
+ Zack Weinberg <zack@codesourcery.com>
+
+ PR middle-end/10472
+ * builtins.c (expand_builtin_memcpy): Call force_operand on
+ expressions and use simplify_gen_binary to create the addition.
+
2003-05-18 Andreas Schwab <schwab@suse.de>
* config/m68k/m68k.md: Use define_constants for unspec numbers.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index c3965e927ec..c3cb06dba3d 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2311,10 +2311,15 @@ expand_builtin_memcpy (arglist, target, mode, endp)
#endif
if (endp)
{
- rtx result = gen_rtx_PLUS (GET_MODE (dest_mem), dest_mem, len_rtx);
+ rtx result;
+ rtx delta = len_rtx;
+
if (endp == 2)
- result = simplify_gen_binary (MINUS, GET_MODE (result), result, const1_rtx);
- return result;
+ delta = GEN_INT (INTVAL (delta) - 1);
+
+ result = simplify_gen_binary (PLUS, GET_MODE (dest_mem),
+ dest_mem, delta);
+ return force_operand (result, NULL_RTX);
}
else
return dest_mem;
@@ -2338,10 +2343,18 @@ expand_builtin_memcpy (arglist, target, mode, endp)
if (endp)
{
- rtx result = gen_rtx_PLUS (GET_MODE (dest_addr), dest_addr, len_rtx);
+ rtx result = force_operand (len_rtx, NULL_RTX);
+
if (endp == 2)
- result = simplify_gen_binary (MINUS, GET_MODE (result), result, const1_rtx);
- return result;
+ {
+ result = simplify_gen_binary (MINUS, GET_MODE (result),
+ result, const1_rtx);
+ result = force_operand (result, NULL_RTX);
+ }
+
+ result = simplify_gen_binary (PLUS, GET_MODE (dest_addr),
+ dest_addr, result);
+ return force_operand (result, NULL_RTX);
}
else
return dest_addr;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f2aa0b23e8b..9d036cc5b78 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-05-18 Roger Sayle <roger@eyesopen.com>
+ Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.c-torture/compile/20030518-1.c: New test case.
+
2003-05-18 Mark Mitchell <mark@codesourcery.com>
* lib/gcc-dg.exp (gcc-dg-debug-runtest): Add opt_opts parameter.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20030518-1.c b/gcc/testsuite/gcc.c-torture/compile/20030518-1.c
new file mode 100644
index 00000000000..8cf2034518f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20030518-1.c
@@ -0,0 +1,14 @@
+/* Test case from PR middle-end/10472 */
+
+extern void f (char *);
+
+void foo (char *s)
+{
+ f (__builtin_stpcpy (s, "hi"));
+}
+
+void bar (char *s)
+{
+ f (__builtin_mempcpy (s, "hi", 3));
+}
+
OpenPOWER on IntegriCloud