]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/23837 (Wrong code with REG_NO_CONFLICT notes (caused by combine))
authorSteven Bosscher <stevenb@suse.de>
Fri, 16 Dec 2005 22:19:09 +0000 (22:19 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Fri, 16 Dec 2005 22:19:09 +0000 (22:19 +0000)
PR rtl-optimization/23837
* optabs.c (expand_binop): For a multi-word rotate, never emit
a REG_NO_CONFLICT block.

From-SVN: r108690

gcc/ChangeLog
gcc/optabs.c

index fd9c62c39cf3ec4c9d4599869d58fb9859180e2f..4f36c02e47f859601071f48d9766f3dfe34c45fc 100644 (file)
@@ -1,3 +1,9 @@
+2005-12-16  Steven Bosscher  <stevenb@suse.de>
+
+       PR rtl-optimization/23837
+       * optabs.c (expand_binop): For a multi-word rotate, never emit
+       a REG_NO_CONFLICT block.
+
 2005-12-16  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR middle-end/25457
index a72028e04bea0eb311a435da06ac0697e028faa3..45bfbbde4822be67bede5dc28cd9624ab290a37f 100644 (file)
@@ -1420,7 +1420,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
       && ashl_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
       && lshr_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
     {
-      rtx insns, equiv_value;
+      rtx insns;
       rtx into_target, outof_target;
       rtx into_input, outof_input;
       rtx inter;
@@ -1520,20 +1520,12 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
 
       if (inter != 0)
        {
-         if (binoptab->code != UNKNOWN)
-           equiv_value = gen_rtx_fmt_ee (binoptab->code, mode, op0, op1);
-         else
-           equiv_value = 0;
-
-         /* We can't make this a no conflict block if this is a word swap,
-            because the word swap case fails if the input and output values
-            are in the same register.  */
-         if (shift_count != BITS_PER_WORD)
-           emit_no_conflict_block (insns, target, op0, op1, equiv_value);
-         else
-           emit_insn (insns);
-
-
+         /* One may be tempted to wrap the insns in a REG_NO_CONFLICT
+            block to help the register allocator a bit.  But a multi-word
+            rotate will need all the input bits when setting the output
+            bits, so there clearly is a conflict between the input and
+            output registers.  So we can't use a no-conflict block here.  */
+         emit_insn (insns);
          return target;
        }
     }