re PR rtl-optimization/78634 (30% performance drop after r242832.)
authorBernd Schmidt <bernds@redhat.com>
Mon, 23 Jan 2017 16:17:33 +0000 (16:17 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Mon, 23 Jan 2017 16:17:33 +0000 (16:17 +0000)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/ifcvt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/funcspec-11.c

index bd716492ec1958e5316c02d15e9e639072f2e863..35694c29b99518e7808634257f434634faba9e5e 100644 (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
index 65b32e6da56660eea82e6a2566a4b8da5f67725a..15498a954ea60148a6332d84f7a8fd01bdd852d8 100644 (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
index 6d306392f603ba2990032dc5bf0a18cc9f7a451f..e2d6c6fcc51015c38fcb82ab404bdb7e7aece5b3 100644 (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,
index de1f24b5e035604028c3905a249b6da9df56b983..5bdeda872232b8356157ef0ccceb557fe5c67b9b 100644 (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
index 7c39f4cd2a1edac40e112556236b417ff09b312b..fc79ac507426861e2bf467758f6f8aa22f8805b0 100644 (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")));