From 731ae8dd8e76be10feb5a1286ed45825a59095c9 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sun, 18 May 2003 22:50:29 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/builtins.c | 25 ++++++++++++++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/20030518-1.c | 14 +++++++++++++ 4 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20030518-1.c 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 + 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 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 + 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 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)); +} + -- 2.7.4