OSDN Git Service

gcc/
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Mar 2010 18:18:54 +0000 (18:18 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Mar 2010 18:18:54 +0000 (18:18 +0000)
PR rtl-optimization/42258
* ira-lives.c (check_and_make_def_conflict): Ignore conflict for a
use that may match DEF.

testsuite/
PR rtl-optimization/42258
* gcc.target/arm/thumb1-mul-moves.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157581 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ira-lives.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/thumb1-mul-moves.c [new file with mode: 0644]

index c255935..bdc8dae 100644 (file)
@@ -1,3 +1,9 @@
+2010-03-19  Bernd Schmidt  <bernd.schmidt@codesourcery.com>
+
+       PR rtl-optimization/42258
+       * ira-lives.c (check_and_make_def_conflict): Ignore conflict for a
+       use that may match DEF.
+
 2010-03-19  Michael Matz  <matz@suse.de>
 
        PR c++/43116
index ac69e22..b88082a 100644 (file)
@@ -499,6 +499,8 @@ check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
 
   for (use = 0; use < recog_data.n_operands; use++)
     {
+      int alt1;
+
       if (use == def || recog_data.operand_type[use] == OP_OUT)
        continue;
 
@@ -507,6 +509,22 @@ check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
       else
        use_cl = recog_op_alt[use][alt].cl;
 
+      /* If there's any alternative that allows USE to match DEF, do not
+        record a conflict.  If that causes us to create an invalid
+        instruction due to the earlyclobber, reload must fix it up.  */         
+      for (alt1 = 0; alt1 < recog_data.n_alternatives; alt1++)
+       if (recog_op_alt[use][alt1].matches == def
+           || (use < recog_data.n_operands - 1
+               && recog_data.constraints[use][0] == '%'
+               && recog_op_alt[use + 1][alt1].matches == def)
+           || (use >= 1
+               && recog_data.constraints[use - 1][0] == '%'
+               && recog_op_alt[use - 1][alt1].matches == def))
+         break;
+
+      if (alt1 < recog_data.n_alternatives)
+       continue;
+
       advance_p = check_and_make_def_use_conflict (dreg, def_cl, use,
                                                   use_cl, advance_p);
 
index 758456e..a13e712 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-19  Bernd Schmidt  <bernd.schmidt@codesourcery.com>
+
+       PR rtl-optimization/42258
+       * gcc.target/arm/thumb1-mul-moves.c: New test.
+       
 2010-03-19  Michael Matz  <matz@suse.de>
 
        PR c++/43116
diff --git a/gcc/testsuite/gcc.target/arm/thumb1-mul-moves.c b/gcc/testsuite/gcc.target/arm/thumb1-mul-moves.c
new file mode 100644 (file)
index 0000000..6235774
--- /dev/null
@@ -0,0 +1,11 @@
+/* Check for unnecessary register moves.  */
+/* { dg-options "-mthumb -Os" }  */
+/* { dg-require-effective-target arm_thumb1_ok } */
+
+int f(int x)
+{
+  return x*42;
+}
+
+/* { dg-final { scan-assembler-not "mov\[\\t \]*r0," } } */
+