PR rtl-optimization/23837
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Dec 2005 22:19:09 +0000 (22:19 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Dec 2005 22:19:09 +0000 (22:19 +0000)
* optabs.c (expand_binop): For a multi-word rotate, never emit
a REG_NO_CONFLICT block.

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

gcc/ChangeLog
gcc/optabs.c

index fd9c62c..4f36c02 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 a72028e..45bfbbd 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;
        }
     }