re PR rtl-optimization/78634 (30% performance drop after r242832.)

PR rtl-optimization/78634
	* config/i386/i386.c (ix86_max_noce_ifcvt_seq_cost): New function.
	(TARGET_MAX_NOCE_IFCVT_SEQ_COST): Define.
	* ifcvt.c (noce_try_cmove): Add missing cost check.

testsuite/
	PR rtl-optimization/78634
	* gcc.target/i386/funcspec-11.c: Also pass -mtune=i686.

From-SVN: r244816
This commit is contained in:
Bernd Schmidt 2017-01-23 16:17:33 +00:00 committed by Bernd Schmidt
parent 8539a302cd
commit e9c4fbe9c1
5 changed files with 38 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2017-01-23 Bernd Schmidt <bschmidt@redhat.com>
PR rtl-optimization/78634
* config/i386/i386.c (ix86_max_noce_ifcvt_seq_cost): New function.
(TARGET_MAX_NOCE_IFCVT_SEQ_COST): Define.
* ifcvt.c (noce_try_cmove): Add missing cost check.
2017-01-23 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/70754

View File

@ -50486,6 +50486,28 @@ ix86_spill_class (reg_class_t rclass, machine_mode mode)
return NO_REGS;
}
/* Implement TARGET_MAX_NOCE_IFCVT_SEQ_COST. Like the default implementation,
but returns a lower bound. */
static unsigned int
ix86_max_noce_ifcvt_seq_cost (edge e)
{
bool predictable_p = predictable_edge_p (e);
enum compiler_param param
= (predictable_p
? PARAM_MAX_RTL_IF_CONVERSION_PREDICTABLE_COST
: PARAM_MAX_RTL_IF_CONVERSION_UNPREDICTABLE_COST);
/* If we have a parameter set, use that, otherwise take a guess using
BRANCH_COST. */
if (global_options_set.x_param_values[param])
return PARAM_VALUE (param);
else
return BRANCH_COST (true, predictable_p) * COSTS_N_INSNS (2);
}
/* Implement targetm.vectorize.init_cost. */
static void *
@ -52035,6 +52057,8 @@ ix86_run_selftests (void)
#undef TARGET_EXPAND_DIVMOD_LIBFUNC
#define TARGET_EXPAND_DIVMOD_LIBFUNC ix86_expand_divmod_libfunc
#undef TARGET_MAX_NOCE_IFCVT_SEQ_COST
#define TARGET_MAX_NOCE_IFCVT_SEQ_COST ix86_max_noce_ifcvt_seq_cost
#if CHECKING_P
#undef TARGET_RUN_TARGET_SELFTESTS
#define TARGET_RUN_TARGET_SELFTESTS selftest::ix86_run_selftests

View File

@ -1826,7 +1826,7 @@ noce_try_cmove (struct noce_if_info *if_info)
noce_emit_move_insn (if_info->x, target);
seq = end_ifcvt_sequence (if_info);
if (!seq)
if (!seq || !noce_conversion_profitable_p (seq, if_info))
return FALSE;
emit_insn_before_setloc (seq, if_info->jump,

View File

@ -1,3 +1,8 @@
2017-01-23 Bernd Schmidt <bschmidt@redhat.com>
PR rtl-optimization/78634
* gcc.target/i386/funcspec-11.c: Also pass -mtune=i686.
2017-01-23 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/70754

View File

@ -1,7 +1,7 @@
/* PR target/36936 */
/* { dg-do compile } */
/* { dg-require-effective-target ia32 } */
/* { dg-options "-O2 -march=i386" } */
/* { dg-options "-O2 -march=i386 -mtune=i686" } */
/* { dg-final { scan-assembler "cmov" } } */
extern int foo (int) __attribute__((__target__("arch=i686")));