VAX: Handle subtracting from self with QMATH DImode add/sub
authorMaciej W. Rozycki <macro@linux-mips.org>
Sun, 13 Dec 2020 20:46:17 +0000 (20:46 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Sun, 13 Dec 2020 20:46:17 +0000 (20:46 +0000)
Remove an assertion the failure of which has not been actually observed,
but which appears clearly dangerous, for when the QMATH DImode add/sub
handler is invoked with the subtrahend and the minuend both the same.
Instead handle the operation by emitting a move of constant 0 to the
output operand.  Adjust the relevant inline comment accordingly.

gcc/
* config/vax/vax.c (vax_expand_addsub_di_operands): Handle equal
input operands with subtraction.

gcc/config/vax/vax.c

index 2274cce6a5b9ebf49cf125be213bd628bc174550..07c499c78af29125dc816c1d70b20335fa785c56 100644 (file)
@@ -2042,12 +2042,14 @@ vax_expand_addsub_di_operands (rtx * operands, enum rtx_code code)
     }
   else
     {
-      /* If are adding the same value together, that's really a multiply by 2,
-        and that's just a left shift of 1.  */
+      /* If we are adding a value to itself, that's really a multiply by 2,
+        and that's just a left shift by 1.  If subtracting, it's just 0.  */
       if (rtx_equal_p (operands[1], operands[2]))
        {
-         gcc_assert (code != MINUS);
-         emit_insn (gen_ashldi3 (operands[0], operands[1], const1_rtx));
+         if (code == PLUS)
+           emit_insn (gen_ashldi3 (operands[0], operands[1], const1_rtx));
+         else
+           emit_move_insn (operands[0], const0_rtx);
          return;
        }