From: Roger Sayle Date: Sun, 18 May 2003 22:50:29 +0000 (+0000) Subject: re PR middle-end/10472 (ICE in instantiate_virtual_regs_lossage) X-Git-Tag: releases/gcc-3.4.0~6487 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=731ae8dd8e76be10feb5a1286ed45825a59095c9;p=thirdparty%2Fgcc.git 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 Co-Authored-By: Zack Weinberg From-SVN: r66941 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 367e99f01ab2..96f2290c53f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-05-18 Roger Sayle + Zack Weinberg + + 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 * config/m68k/m68k.md: Use define_constants for unspec numbers. diff --git a/gcc/builtins.c b/gcc/builtins.c index c3965e927ecd..c3cb06dba3de 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 f2aa0b23e8bf..9d036cc5b786 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-05-18 Roger Sayle + Kaveh R. Ghazi + + * gcc.c-torture/compile/20030518-1.c: New test case. + 2003-05-18 Mark Mitchell * 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 000000000000..8cf2034518f9 --- /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)); +} +