diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-05-18 22:50:29 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-05-18 22:50:29 +0000 |
commit | 731ae8dd8e76be10feb5a1286ed45825a59095c9 (patch) | |
tree | 2c5a4fef2fea4ee8851e816f5d8c43eaad5e04f9 /gcc | |
parent | d1b3178b37f1930e3e8bdce625bd870107baa37d (diff) | |
download | gcc-731ae8dd8e76be10feb5a1286ed45825a59095c9.zip gcc-731ae8dd8e76be10feb5a1286ed45825a59095c9.tar.gz gcc-731ae8dd8e76be10feb5a1286ed45825a59095c9.tar.bz2 |
re PR middle-end/10472 (ICE in instantiate_virtual_regs_lossage)
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.
Co-Authored-By: Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
Co-Authored-By: Zack Weinberg <zack@codesourcery.com>
From-SVN: r66941
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/builtins.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20030518-1.c | 14 |
4 files changed, 45 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 367e99f..96f2290 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 c3965e9..c3cb06d 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 f2aa0b2..9d036cc 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 0000000..8cf2034 --- /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)); +} + |