optabs: make prepare_cmp_insn goto fail when cbranchcc4 checks unsatisfied
authorHaochen Gui <guihaoc@gcc.gnu.org>
Thu, 8 Dec 2022 05:22:29 +0000 (13:22 +0800)
committerHaochen Gui <guihaoc@gcc.gnu.org>
Tue, 13 Dec 2022 08:32:15 +0000 (16:32 +0800)
prepare_cmp_insn is a help function to generate comparison rtx.
It should not assume that cbranchcc4 exists and all sub-CC modes
are supported on a target.  When the check fails, it could go to
fail and return a NULL rtx as its callers check the return value
for CCmode.

The test case (gcc.target/powerpc/cbranchcc4-1.c) which covers
failure path will be committed with an rs6000 specific patch.

2022-12-05  Haochen Gui <guihaoc@linux.ibm.com>

gcc/
* optabs.cc (prepare_cmp_insn): Return a NULL rtx other than
assertion failure when targets don't have cbranch optab or
predicate check fails.

gcc/optabs.cc

index 262a37f..2ffd455 100644 (file)
@@ -4491,10 +4491,14 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
     {
       enum insn_code icode = optab_handler (cbranch_optab, CCmode);
       test = gen_rtx_fmt_ee (comparison, VOIDmode, x, y);
-      gcc_assert (icode != CODE_FOR_nothing
-                  && insn_operand_matches (icode, 0, test));
-      *ptest = test;
-      return;
+      if (icode != CODE_FOR_nothing
+         && insn_operand_matches (icode, 0, test))
+       {
+         *ptest = test;
+         return;
+       }
+      else
+       goto fail;
     }
 
   test = gen_rtx_fmt_ee (comparison, VOIDmode, x, y);