From: Tamar Christina Date: Mon, 2 Oct 2023 10:48:26 +0000 (+0100) Subject: ifcvt: replace C++ sort with vec::qsort [PR109154] X-Git-Tag: basepoints/gcc-15~5778 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19610580d49f3d2d8d511fba55b39efa0764dfc2;p=thirdparty%2Fgcc.git ifcvt: replace C++ sort with vec::qsort [PR109154] As requested later on, this replaces the C++ sort with vec::qsort. gcc/ChangeLog: PR tree-optimization/109154 * tree-if-conv.cc (INCLUDE_ALGORITHM): Remove. (cmp_arg_entry): New. (predicate_scalar_phi): Use it. --- diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc index a8c915913aed..281984d0522d 100644 --- a/gcc/tree-if-conv.cc +++ b/gcc/tree-if-conv.cc @@ -80,7 +80,6 @@ along with GCC; see the file COPYING3. If not see :; */ -#define INCLUDE_ALGORITHM #include "config.h" #include "system.h" #include "coretypes.h" @@ -2045,6 +2044,28 @@ gen_phi_nest_statement (gphi *phi, gimple_stmt_iterator *gsi, return lhs; } +typedef std::pair > ArgEntry; +static int +cmp_arg_entry (const void *p1, const void *p2) +{ + const ArgEntry sval1 = *(const ArgEntry *)p1; + const ArgEntry sval2 = *(const ArgEntry *)p2; + auto x1 = sval1.second; + auto x2 = sval2.second; + + if (x1.first < x2.first) + return -1; + else if (x1.first > x2.first) + return 1; + + if (x1.second < x2.second) + return -1; + else if (x1.second > x2.second) + return 1; + + return 0; +} + /* Replace a scalar PHI node with a COND_EXPR using COND as condition. This routine can handle PHI nodes with more than two arguments. @@ -2186,7 +2207,6 @@ predicate_scalar_phi (gphi *phi, gimple_stmt_iterator *gsi) /* Determine element with max number of occurrences and complexity. Looking at only number of occurrences as a measure for complexity isn't enough as all usages can be unique but the comparisons to reach the PHI node differ per branch. */ - typedef std::pair > ArgEntry; auto_vec argsKV; for (i = 0; i < args.length (); i++) { @@ -2204,10 +2224,7 @@ predicate_scalar_phi (gphi *phi, gimple_stmt_iterator *gsi) } /* Sort elements based on rankings ARGS. */ - std::sort(argsKV.begin(), argsKV.end(), [](const ArgEntry &left, - const ArgEntry &right) { - return left.second < right.second; - }); + argsKV.qsort (cmp_arg_entry); for (i = 0; i < args.length (); i++) args[i] = argsKV[i].first;