[PATCH, i386]: Fix PR80723, ignore cost of adding/subtracting a carry flag for ADC/SBB insns
Uros Bizjak
ubizjak@gmail.com
Fri May 12 19:01:00 GMT 2017
Hello!
Attached patch adjusts RTX costs to ignore addition or subtraction of
a carry flag for ADC or SBB instruction. These operations are
essentially free.
2017-05-12 Uros Bizjak <ubizjak@gmail.com>
PR target/80723
* config/i386/i386.c (ix86_rtx_cost) [case PLUS]: Ignore the
cost of adding a carry flag for ADC instruction.
[case MINUS]: Ignore the cost of subtracting a carry flag
for SBB instruction.
Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}, where
the patch fixes gcc.target/i386/cadd.c FAIL.
Committed to mainline SVN.
Uros.
-------------- next part --------------
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c (revision 247980)
+++ config/i386/i386.c (working copy)
@@ -40913,9 +40913,16 @@ ix86_rtx_costs (rtx x, machine_mode mode, int oute
}
else if (GET_CODE (XEXP (x, 0)) == PLUS)
{
- *total = cost->lea;
- *total += rtx_cost (XEXP (XEXP (x, 0), 0), mode,
- outer_code, opno, speed);
+ /* Add with carry, ignore the cost of adding a carry flag. */
+ if (ix86_carry_flag_operator (XEXP (XEXP (x, 0), 0), mode))
+ *total = cost->add;
+ else
+ {
+ *total = cost->lea;
+ *total += rtx_cost (XEXP (XEXP (x, 0), 0), mode,
+ outer_code, opno, speed);
+ }
+
*total += rtx_cost (XEXP (XEXP (x, 0), 1), mode,
outer_code, opno, speed);
*total += rtx_cost (XEXP (x, 1), mode,
@@ -40926,6 +40933,20 @@ ix86_rtx_costs (rtx x, machine_mode mode, int oute
/* FALLTHRU */
case MINUS:
+ /* Subtract with borrow, ignore the cost of subtracting a carry flag. */
+ if (GET_MODE_CLASS (mode) == MODE_INT
+ && GET_MODE_SIZE (mode) <= UNITS_PER_WORD
+ && GET_CODE (XEXP (x, 0)) == MINUS
+ && ix86_carry_flag_operator (XEXP (XEXP (x, 0), 1), mode))
+ {
+ *total = cost->add;
+ *total += rtx_cost (XEXP (XEXP (x, 0), 0), mode,
+ outer_code, opno, speed);
+ *total += rtx_cost (XEXP (x, 1), mode,
+ outer_code, opno, speed);
+ return true;
+ }
+
if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
{
/* ??? SSE cost should be used here. */
More information about the Gcc-patches
mailing list