]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: Implement TARGET_NOCE_CONVERSION_PROFITABLE_P [PR109549]
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Thu, 23 May 2024 06:43:35 +0000 (08:43 +0200)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Thu, 23 May 2024 06:43:35 +0000 (08:43 +0200)
Consider a NOCE conversion as profitable if there is at least one
conditional move.

gcc/ChangeLog:

PR target/109549
* config/s390/s390.cc (TARGET_NOCE_CONVERSION_PROFITABLE_P):
Define.
(s390_noce_conversion_profitable_p): Implement.

gcc/testsuite/ChangeLog:

* gcc.target/s390/ccor.c: Order of loads are reversed, now, as a
consequence the condition has to be reversed.

gcc/config/s390/s390.cc
gcc/testsuite/gcc.target/s390/ccor.c

index 5968808fcb6e2267674fac8afa5ce712daedd2e5..fa517bd3e77a73065b1f57a1c90e03239413cc39 100644 (file)
@@ -78,6 +78,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-pass.h"
 #include "context.h"
 #include "builtins.h"
+#include "ifcvt.h"
 #include "rtl-iter.h"
 #include "intl.h"
 #include "tm-constrs.h"
@@ -18037,6 +18038,34 @@ s390_vectorize_vec_perm_const (machine_mode vmode, machine_mode op_mode,
   return vectorize_vec_perm_const_1 (d);
 }
 
+/* Consider a NOCE conversion as profitable if there is at least one
+   conditional move.  */
+
+static bool
+s390_noce_conversion_profitable_p (rtx_insn *seq, struct noce_if_info *if_info)
+{
+  if (if_info->speed_p)
+    {
+      for (rtx_insn *insn = seq; insn; insn = NEXT_INSN (insn))
+       {
+         rtx set = single_set (insn);
+         if (set == NULL)
+           continue;
+         if (GET_CODE (SET_SRC (set)) != IF_THEN_ELSE)
+           continue;
+         rtx src = SET_SRC (set);
+         machine_mode mode = GET_MODE (src);
+         if (GET_MODE_CLASS (mode) != MODE_INT
+             && GET_MODE_CLASS (mode) != MODE_FLOAT)
+           continue;
+         if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+           continue;
+         return true;
+       }
+    }
+  return default_noce_conversion_profitable_p (seq, if_info);
+}
+
 /* Initialize GCC target structure.  */
 
 #undef  TARGET_ASM_ALIGNED_HI_OP
@@ -18350,6 +18379,9 @@ s390_vectorize_vec_perm_const (machine_mode vmode, machine_mode op_mode,
 #undef TARGET_VECTORIZE_VEC_PERM_CONST
 #define TARGET_VECTORIZE_VEC_PERM_CONST s390_vectorize_vec_perm_const
 
+#undef TARGET_NOCE_CONVERSION_PROFITABLE_P
+#define TARGET_NOCE_CONVERSION_PROFITABLE_P s390_noce_conversion_profitable_p
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-s390.h"
index 31f30f60314ebbe5bb1b90d78ad66a5dee427c5e..36a3c3a999a93fa6c35fd8778d300aa7ad791efb 100644 (file)
@@ -42,7 +42,7 @@ GENFUN1(2)
 
 GENFUN1(3)
 
-/* { dg-final { scan-assembler {locrno} } } */
+/* { dg-final { scan-assembler {locro} } } */
 
 GENFUN2(0,1)
 
@@ -58,7 +58,7 @@ GENFUN2(0,3)
 
 GENFUN2(1,2)
 
-/* { dg-final { scan-assembler {locrnlh} } } */
+/* { dg-final { scan-assembler {locrlh} } } */
 
 GENFUN2(1,3)