]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[APX CCMP] Adjust startegy for selecting ccmp candidates
authorHongyu Wang <hongyu.wang@intel.com>
Tue, 9 Apr 2024 08:05:26 +0000 (16:05 +0800)
committerHongyu Wang <hongyu.wang@intel.com>
Thu, 6 Jun 2024 07:29:47 +0000 (15:29 +0800)
For general ccmp scenario, the tree sequence is like

_1 = (a < b)
_2 = (c < d)
_3 = _1 & _2

current ccmp expanding will try to swap compare order for _1 and _2,
compare the expansion cost/cost2 for expanding _1 or _2 first, then
return the sequence with lower cost.

It is possible that one expansion succeeds and the other fails.
For example, x86 has int ccmp but not fp ccmp, so a combined fp and
int comparison must be ordered such that the fp comparison happens
first.  The costs are not meaningful for failed expansions.

Check the expand_ccmp_next result ret and ret2, returns the valid one
before cost comparison.

gcc/ChangeLog:

* ccmp.cc (expand_ccmp_expr_1): Check ret and ret2 of
expand_ccmp_next, returns the valid one first instead of
comparing cost.

gcc/ccmp.cc

index 7cb525addf422c1dcd1f6bee412ad8178f2f2b77..4d50708d986e4ec73840ff23c9e8bcd0c0177579 100644 (file)
@@ -247,7 +247,15 @@ expand_ccmp_expr_1 (gimple *g, rtx_insn **prep_seq, rtx_insn **gen_seq)
              cost2 = seq_cost (prep_seq_2, speed_p);
              cost2 += seq_cost (gen_seq_2, speed_p);
            }
-         if (cost2 < cost1)
+
+         /* It's possible that one expansion succeeds and the other
+            fails.
+            For example, x86 has int ccmp but not fp ccmp, and so a
+            combined fp and int comparison must be ordered such that
+            the fp comparison happens first. The costs are not
+            meaningful for failed expansions.  */
+
+         if (ret2 && (!ret || cost2 < cost1))
            {
              *prep_seq = prep_seq_2;
              *gen_seq = gen_seq_2;