compare-elim.c (try_eliminate_compare): Canonicalize operation with embedded compare to [(set (reg:CCM) (compare:CCM...
* compare-elim.c (try_eliminate_compare): Canonicalize operation with embedded compare to [(set (reg:CCM) (compare:CCM (operation) (immediate))) (set (reg) (operation)]. * config/i386/i386.c (TARGET_FLAGS_REGNUM): New define. From-SVN: r247992
This commit is contained in:
parent
88ce9dc38a
commit
4f0473fe89
|
@ -1,3 +1,12 @@
|
||||||
|
2017-05-12 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
* compare-elim.c (try_eliminate_compare): Canonicalize
|
||||||
|
operation with embedded compare to
|
||||||
|
[(set (reg:CCM) (compare:CCM (operation) (immediate)))
|
||||||
|
(set (reg) (operation)].
|
||||||
|
|
||||||
|
* config/i386/i386.c (TARGET_FLAGS_REGNUM): New define.
|
||||||
|
|
||||||
2017-05-12 Uros Bizjak <ubizjak@gmail.com>
|
2017-05-12 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
PR target/80723
|
PR target/80723
|
||||||
|
|
|
@ -45,9 +45,9 @@ along with GCC; see the file COPYING3. If not see
|
||||||
(3) If an insn of form (2) can usefully set the flags, there is
|
(3) If an insn of form (2) can usefully set the flags, there is
|
||||||
another pattern of the form
|
another pattern of the form
|
||||||
|
|
||||||
[(set (reg) (operation)
|
[(set (reg:CCM) (compare:CCM (operation) (immediate)))
|
||||||
(set (reg:CCM) (compare:CCM (operation) (immediate)))]
|
(set (reg) (operation)]
|
||||||
|
|
||||||
The mode CCM will be chosen as if by SELECT_CC_MODE.
|
The mode CCM will be chosen as if by SELECT_CC_MODE.
|
||||||
|
|
||||||
Note that unlike NOTICE_UPDATE_CC, we do not handle memory operands.
|
Note that unlike NOTICE_UPDATE_CC, we do not handle memory operands.
|
||||||
|
@ -582,7 +582,7 @@ equivalent_reg_at_start (rtx reg, rtx_insn *end, rtx_insn *start)
|
||||||
static bool
|
static bool
|
||||||
try_eliminate_compare (struct comparison *cmp)
|
try_eliminate_compare (struct comparison *cmp)
|
||||||
{
|
{
|
||||||
rtx x, flags, in_a, in_b, cmp_src;
|
rtx flags, in_a, in_b, cmp_src;
|
||||||
|
|
||||||
/* We must have found an interesting "clobber" preceding the compare. */
|
/* We must have found an interesting "clobber" preceding the compare. */
|
||||||
if (cmp->prev_clobber == NULL)
|
if (cmp->prev_clobber == NULL)
|
||||||
|
@ -628,7 +628,8 @@ try_eliminate_compare (struct comparison *cmp)
|
||||||
Validate that PREV_CLOBBER itself does in fact refer to IN_A. Do
|
Validate that PREV_CLOBBER itself does in fact refer to IN_A. Do
|
||||||
recall that we've already validated the shape of PREV_CLOBBER. */
|
recall that we've already validated the shape of PREV_CLOBBER. */
|
||||||
rtx_insn *insn = cmp->prev_clobber;
|
rtx_insn *insn = cmp->prev_clobber;
|
||||||
x = XVECEXP (PATTERN (insn), 0, 0);
|
|
||||||
|
rtx x = XVECEXP (PATTERN (insn), 0, 0);
|
||||||
if (rtx_equal_p (SET_DEST (x), in_a))
|
if (rtx_equal_p (SET_DEST (x), in_a))
|
||||||
cmp_src = SET_SRC (x);
|
cmp_src = SET_SRC (x);
|
||||||
|
|
||||||
|
@ -666,13 +667,24 @@ try_eliminate_compare (struct comparison *cmp)
|
||||||
flags = gen_rtx_REG (cmp->orig_mode, targetm.flags_regnum);
|
flags = gen_rtx_REG (cmp->orig_mode, targetm.flags_regnum);
|
||||||
|
|
||||||
/* Generate a new comparison for installation in the setter. */
|
/* Generate a new comparison for installation in the setter. */
|
||||||
x = copy_rtx (cmp_src);
|
rtx y = copy_rtx (cmp_src);
|
||||||
x = gen_rtx_COMPARE (GET_MODE (flags), x, in_b);
|
y = gen_rtx_COMPARE (GET_MODE (flags), y, in_b);
|
||||||
x = gen_rtx_SET (flags, x);
|
y = gen_rtx_SET (flags, y);
|
||||||
|
|
||||||
|
/* Canonicalize instruction to:
|
||||||
|
[(set (reg:CCM) (compare:CCM (operation) (immediate)))
|
||||||
|
(set (reg) (operation)] */
|
||||||
|
|
||||||
|
rtvec v = rtvec_alloc (2);
|
||||||
|
RTVEC_ELT (v, 0) = y;
|
||||||
|
RTVEC_ELT (v, 1) = x;
|
||||||
|
|
||||||
|
rtx pat = gen_rtx_PARALLEL (VOIDmode, v);
|
||||||
|
|
||||||
/* Succeed if the new instruction is valid. Note that we may have started
|
/* Succeed if the new instruction is valid. Note that we may have started
|
||||||
a change group within maybe_select_cc_mode, therefore we must continue. */
|
a change group within maybe_select_cc_mode, therefore we must continue. */
|
||||||
validate_change (insn, &XVECEXP (PATTERN (insn), 0, 1), x, true);
|
validate_change (insn, &PATTERN (insn), pat, true);
|
||||||
|
|
||||||
if (!apply_change_group ())
|
if (!apply_change_group ())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -51826,6 +51826,8 @@ ix86_run_selftests (void)
|
||||||
#undef TARGET_ADDRESS_COST
|
#undef TARGET_ADDRESS_COST
|
||||||
#define TARGET_ADDRESS_COST ix86_address_cost
|
#define TARGET_ADDRESS_COST ix86_address_cost
|
||||||
|
|
||||||
|
#undef TARGET_FLAGS_REGNUM
|
||||||
|
#define TARGET_FLAGS_REGNUM FLAGS_REG
|
||||||
#undef TARGET_FIXED_CONDITION_CODE_REGS
|
#undef TARGET_FIXED_CONDITION_CODE_REGS
|
||||||
#define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
|
#define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
|
||||||
#undef TARGET_CC_MODES_COMPATIBLE
|
#undef TARGET_CC_MODES_COMPATIBLE
|
||||||
|
|
Loading…
Reference in New Issue