rpms/gcc/devel gcc41-pr25005.patch,NONE,1.1
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Thu Dec 22 20:25:08 UTC 2005
- Previous message (by thread): rpms/gcc/devel gcc41-pr25328-test.patch, NONE, 1.1 gcc41-pr25364.patch, NONE, 1.1 gcc41-pr25535.patch, NONE, 1.1 .cvsignore, 1.122, 1.123 gcc41-pr25432.patch, 1.1, 1.2 gcc41.spec, 1.11, 1.12 sources, 1.124, 1.125 gcc41-pr25121.patch, 1.2, NONE
- Next message (by thread): rpms/libavc1394/devel libavc1394.spec,1.16,1.17
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: jakub
Update of /cvs/dist/rpms/gcc/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv13201
Added Files:
gcc41-pr25005.patch
Log Message:
4.1.0-0.11
gcc41-pr25005.patch:
regrename.c | 49 ++++++++++++++++++++++++++++++-----------
testsuite/g++.dg/opt/pr25005.C | 34 ++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 13 deletions(-)
--- NEW FILE gcc41-pr25005.patch ---
2005-12-21 Jakub Jelinek <jakub at redhat.com>
PR target/25005
* regrename.c (replace_oldest_value_reg): Use validate_change with
IN_GROUP set to 1 instead of doing direct modifications.
(copyprop_hardreg_forward_1): Likewise. If any replace_oldest_*
replacements have been performed on an instruction, use
apply_change_group ().
* g++.dg/opt/pr25005.C: New test.
--- gcc/regrename.c.jj 2005-12-20 13:43:55.000000000 +0100
+++ gcc/regrename.c 2005-12-21 14:14:55.000000000 +0100
@@ -1408,7 +1408,7 @@ replace_oldest_value_reg (rtx *loc, enum
fprintf (dump_file, "insn %u: replaced reg %u with %u\n",
INSN_UID (insn), REGNO (*loc), REGNO (new));
- *loc = new;
+ validate_change (insn, loc, new, 1);
return true;
}
return false;
@@ -1574,8 +1574,9 @@ copyprop_hardreg_forward_1 (basic_block
for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
{
int n_ops, i, alt, predicated;
- bool is_asm;
+ bool is_asm, any_replacements;
rtx set;
+ bool replaced[MAX_RECOG_OPERANDS];
if (! INSN_P (insn))
{
@@ -1687,11 +1688,13 @@ copyprop_hardreg_forward_1 (basic_block
}
no_move_special_case:
+ any_replacements = false;
+
/* For each input operand, replace a hard register with the
eldest live copy that's in an appropriate register class. */
for (i = 0; i < n_ops; i++)
{
- bool replaced = false;
+ replaced[i] = false;
/* Don't scan match_operand here, since we've no reg class
information to pass down. Any operands that we could
@@ -1708,39 +1711,59 @@ copyprop_hardreg_forward_1 (basic_block
if (recog_data.operand_type[i] == OP_IN)
{
if (recog_op_alt[i][alt].is_address)
- replaced
+ replaced[i]
= replace_oldest_value_addr (recog_data.operand_loc[i],
recog_op_alt[i][alt].cl,
VOIDmode, insn, vd);
else if (REG_P (recog_data.operand[i]))
- replaced
+ replaced[i]
= replace_oldest_value_reg (recog_data.operand_loc[i],
recog_op_alt[i][alt].cl,
insn, vd);
else if (MEM_P (recog_data.operand[i]))
- replaced = replace_oldest_value_mem (recog_data.operand[i],
- insn, vd);
+ replaced[i] = replace_oldest_value_mem (recog_data.operand[i],
+ insn, vd);
}
else if (MEM_P (recog_data.operand[i]))
- replaced = replace_oldest_value_mem (recog_data.operand[i],
- insn, vd);
+ replaced[i] = replace_oldest_value_mem (recog_data.operand[i],
+ insn, vd);
/* If we performed any replacement, update match_dups. */
- if (replaced)
+ if (replaced[i])
{
int j;
rtx new;
- changed = true;
-
new = *recog_data.operand_loc[i];
recog_data.operand[i] = new;
for (j = 0; j < recog_data.n_dups; j++)
if (recog_data.dup_num[j] == i)
- *recog_data.dup_loc[j] = new;
+ validate_change (insn, recog_data.dup_loc[j], new, 1);
+
+ any_replacements = true;
}
}
+ if (any_replacements)
+ {
+ if (! apply_change_group ())
+ {
+ for (i = 0; i < n_ops; i++)
+ if (replaced[i])
+ {
+ rtx old = *recog_data.operand_loc[i];
+ recog_data.operand[i] = old;
+ }
+
+ if (dump_file)
+ fprintf (dump_file,
+ "insn %u: reg replacements not verified\n",
+ INSN_UID (insn));
+ }
+ else
+ changed = true;
+ }
+
did_replacement:
/* Clobber call-clobbered registers. */
if (CALL_P (insn))
--- gcc/testsuite/g++.dg/opt/pr25005.C.jj 2005-12-21 14:08:15.000000000 +0100
+++ gcc/testsuite/g++.dg/opt/pr25005.C 2005-12-21 14:08:07.000000000 +0100
@@ -0,0 +1,34 @@
+// PR target/25005
+// { dg-options "-O2 -funroll-loops" }
+// { dg-do compile }
+
+inline void *operator new (__SIZE_TYPE__, void *__p) throw() { return __p; }
+
+struct M { ~M() { } };
+
+struct P
+{
+ P () { v[0] = 0; v[1] = 0; v[2] = 0; }
+ P (const P &x) { for (int i = 0; i < 3; ++i) v[i] = x.v[i]; }
+ double v[3];
+};
+
+struct V : public M
+{
+ V (const P *x, const P *y)
+ {
+ P *b = this->a = ::new P[2];
+ for (; x != y; ++x, ++b)
+ ::new (b) P(*x);
+ }
+ P *a;
+};
+
+void bar (const V &);
+
+void
+foo ()
+{
+ const P d[2] = { P(), P() };
+ bar (V (&d[0], &d[2]));
+}
- Previous message (by thread): rpms/gcc/devel gcc41-pr25328-test.patch, NONE, 1.1 gcc41-pr25364.patch, NONE, 1.1 gcc41-pr25535.patch, NONE, 1.1 .cvsignore, 1.122, 1.123 gcc41-pr25432.patch, 1.1, 1.2 gcc41.spec, 1.11, 1.12 sources, 1.124, 1.125 gcc41-pr25121.patch, 1.2, NONE
- Next message (by thread): rpms/libavc1394/devel libavc1394.spec,1.16,1.17
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-cvs-commits
mailing list