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:
Uros Bizjak 2017-05-12 21:04:05 +02:00 committed by Uros Bizjak
parent 88ce9dc38a
commit 4f0473fe89
3 changed files with 32 additions and 9 deletions

View File

@ -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

View File

@ -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;

View File

@ -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