From 8e816cd8e41ffeddb0750c17047a15718403ee93 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 10 Oct 2009 17:19:46 +0000 Subject: [PATCH] 4.4.1-21 --- gcc44-pr41646.patch | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 gcc44-pr41646.patch diff --git a/gcc44-pr41646.patch b/gcc44-pr41646.patch new file mode 100644 index 0000000..b5f2763 --- /dev/null +++ b/gcc44-pr41646.patch @@ -0,0 +1,54 @@ +2009-10-09 Jakub Jelinek + + PR rtl-optimization/41646 + * calls.c (expand_call): For BLKmode types returned in registers + avoid likely spilled hard regs in copy_blkmode_from_reg generated + insns. + + * gcc.c-torture/compile/pr41646.c: New test. + +--- gcc/calls.c (revision 152596) ++++ gcc/calls.c (revision 152597) +@@ -3020,7 +3020,10 @@ expand_call (tree exp, rtx target, int i + } + else if (TYPE_MODE (rettype) == BLKmode) + { +- target = copy_blkmode_from_reg (target, valreg, rettype); ++ rtx val = valreg; ++ if (GET_MODE (val) != BLKmode) ++ val = avoid_likely_spilled_reg (val); ++ target = copy_blkmode_from_reg (target, val, rettype); + + /* We can not support sibling calls for this case. */ + sibcall_failure = 1; +--- gcc/testsuite/gcc.c-torture/compile/pr41646.c (revision 0) ++++ gcc/testsuite/gcc.c-torture/compile/pr41646.c (revision 152597) +@@ -0,0 +1,28 @@ ++/* PR rtl-optimization/41646 */ ++ ++struct A { unsigned long a; }; ++struct B { unsigned short b, c, d; }; ++struct B bar (unsigned long); ++ ++char * ++foo (char *a, struct A *x) ++{ ++ struct B b = bar (x->a); ++ unsigned char c; ++ unsigned short d; ++ a[3] = ((unsigned char) (b.b % 10) + 48); ++ d = b.b / 10; ++ a[2] = ((unsigned char) (d % 10) + 48); ++ d = d / 10; ++ a[1] = ((unsigned char) (d % 10) + 48); ++ a[0] = ((unsigned char) ((d / 10) % 10) + 48); ++ a[4] = 46; ++ c = (unsigned char) b.c; ++ a[6] = (c % 10 + 48); ++ a[5] = ((c / 10) % 10 + 48); ++ a[7] = 46; ++ c = b.d; ++ a[9] = (c % 10 + 48); ++ a[8] = ((c / 10) % 10 + 48); ++ return a + 10; ++}