aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2023-01-05 19:49:45 +0000
committerRoger Sayle <roger@nextmovesoftware.com>2023-01-05 19:49:45 +0000
commit9e6ac747ac5cff9e3f58421cdd9f03538e48ed07 (patch)
treeb551e02e15e904bbc388ad151536b57057e1f7c6 /gcc/config
parent12b0d35ec52375da5652d2b8da74083ab700b9d7 (diff)
downloadgcc-9e6ac747ac5cff9e3f58421cdd9f03538e48ed07.zip
gcc-9e6ac747ac5cff9e3f58421cdd9f03538e48ed07.tar.gz
gcc-9e6ac747ac5cff9e3f58421cdd9f03538e48ed07.tar.bz2
[Committed] PR rtl-optimization/108292: Revert "Improve ix86_expand_int_movcc to allow condition (mask) sharing"
This reverts commit d0558f420b2a5692fd38ac76ffa97ae6c1726ed9. 2023-01-05 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR rtl-optimization/108292 * config/i386/i386-expand.cc (ix86_expand_int_movcc): Revert previous changes. gcc/testsuite/ChangeLog PR rtl-optimization/108292 * gcc.target/i386/cmov10.c: Remove test case.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386-expand.cc46
1 files changed, 26 insertions, 20 deletions
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 4fd7c3c..3eddbc9 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -3284,8 +3284,8 @@ ix86_expand_int_movcc (rtx operands[])
|| negate_cc_compare_p
|| ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
{
- /* Place comparison result in its own pseudo. */
- rtx tmp = gen_reg_rtx (mode);
+ /* Detect overlap between destination and compare sources. */
+ rtx tmp = out;
if (negate_cc_compare_p)
{
@@ -3295,6 +3295,7 @@ ix86_expand_int_movcc (rtx operands[])
emit_insn (gen_x86_negsi_ccc (gen_reg_rtx (SImode),
gen_lowpart (SImode, op0)));
+ tmp = gen_reg_rtx (mode);
if (mode == DImode)
emit_insn (gen_x86_movdicc_0_m1_neg (tmp));
else
@@ -3336,6 +3337,9 @@ ix86_expand_int_movcc (rtx operands[])
}
diff = ct - cf;
+ if (reg_overlap_mentioned_p (out, compare_op))
+ tmp = gen_reg_rtx (mode);
+
if (mode == DImode)
emit_insn (gen_x86_movdicc_0_m1 (tmp, flags, compare_op));
else
@@ -3354,11 +3358,6 @@ ix86_expand_int_movcc (rtx operands[])
tmp = emit_store_flag (tmp, code, op0, op1, VOIDmode, 0, -1);
}
- /* Add a REG_EQUAL note to allow condition to be shared. */
- rtx note = gen_rtx_fmt_ee (code, mode, op0, op1);
- set_unique_reg_note (get_last_insn (), REG_EQUAL,
- gen_rtx_NEG (mode, note));
-
if (diff == 1)
{
/*
@@ -3369,8 +3368,9 @@ ix86_expand_int_movcc (rtx operands[])
* Size 5 - 8.
*/
if (ct)
- tmp = expand_simple_binop (mode, PLUS, tmp, GEN_INT (ct),
- NULL_RTX, 1, OPTAB_DIRECT);
+ tmp = expand_simple_binop (mode, PLUS,
+ tmp, GEN_INT (ct),
+ copy_rtx (tmp), 1, OPTAB_DIRECT);
}
else if (cf == -1)
{
@@ -3381,8 +3381,9 @@ ix86_expand_int_movcc (rtx operands[])
*
* Size 8.
*/
- tmp = expand_simple_binop (mode, IOR, tmp, GEN_INT (ct),
- NULL_RTX, 1, OPTAB_DIRECT);
+ tmp = expand_simple_binop (mode, IOR,
+ tmp, GEN_INT (ct),
+ copy_rtx (tmp), 1, OPTAB_DIRECT);
}
else if (diff == -1 && ct)
{
@@ -3394,10 +3395,11 @@ ix86_expand_int_movcc (rtx operands[])
*
* Size 8 - 11.
*/
- tmp = expand_simple_unop (mode, NOT, tmp, NULL_RTX, 1);
+ tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
if (cf)
- tmp = expand_simple_binop (mode, PLUS, tmp, GEN_INT (cf),
- NULL_RTX, 1, OPTAB_DIRECT);
+ tmp = expand_simple_binop (mode, PLUS,
+ copy_rtx (tmp), GEN_INT (cf),
+ copy_rtx (tmp), 1, OPTAB_DIRECT);
}
else
{
@@ -3415,18 +3417,22 @@ ix86_expand_int_movcc (rtx operands[])
{
cf = ct;
ct = 0;
- tmp = expand_simple_unop (mode, NOT, tmp, NULL_RTX, 1);
+ tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
}
- tmp = expand_simple_binop (mode, AND, tmp,
+ tmp = expand_simple_binop (mode, AND,
+ copy_rtx (tmp),
gen_int_mode (cf - ct, mode),
- NULL_RTX, 1, OPTAB_DIRECT);
+ copy_rtx (tmp), 1, OPTAB_DIRECT);
if (ct)
- tmp = expand_simple_binop (mode, PLUS, tmp, GEN_INT (ct),
- NULL_RTX, 1, OPTAB_DIRECT);
+ tmp = expand_simple_binop (mode, PLUS,
+ copy_rtx (tmp), GEN_INT (ct),
+ copy_rtx (tmp), 1, OPTAB_DIRECT);
}
- emit_move_insn (out, tmp);
+ if (!rtx_equal_p (tmp, out))
+ emit_move_insn (copy_rtx (out), copy_rtx (tmp));
+
return true;
}