During jump bypassing also consider insns of the form

(insn 25 57 26 9 (parallel [
            (set (reg:CCZ 33 %cc)
                (compare:CCZ (reg:SI 60 [ _9 ])
                    (const_int 0 [0])))
            (clobber (scratch:SI))
        ]) "spaceship-fp-4.c":27:1 1746 {*tstsi_cconly_extimm}
     (nil))

by testing for a single set insn during bypass_conditional_jumps().
This is a requirement for test gcc.target/s390/spaceship-fp-4.c of the
subsequent commit.

In order to silence

cprop.cc:1621:40: error: 'setcc_dest' may be used uninitialized 
[-Werror=maybe-uninitialized]
 1621 |             src = simplify_replace_rtx (src, setcc_dest, setcc_src);
      |                   ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~

initialize setcc_{dest,src} in bypass_block() although this is not
really required.

gcc/ChangeLog:

        * cprop.cc (bypass_block): Extract single set.
        (bypass_conditional_jumps): Ditto.
---
 Bootstrapped and regtested on
 aarch64-unknown-linux-gnu,
 powerpc64le-unknown-linux-gnu,
 s390x-ibm-linux-gnu,
 x86_64-pc-linux-gnu.

 Ok for mainline?

 gcc/cprop.cc | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/gcc/cprop.cc b/gcc/cprop.cc
index bc72e64e3a7..dfe3462a0cc 100644
--- a/gcc/cprop.cc
+++ b/gcc/cprop.cc
@@ -1525,6 +1525,7 @@ static bool
 bypass_block (basic_block bb, rtx_insn *setcc, rtx_insn *jump)
 {
   rtx_insn *insn;
+  rtx setcc_src, setcc_dest;
   rtx note;
   edge e, edest;
   bool change;
@@ -1533,7 +1534,19 @@ bypass_block (basic_block bb, rtx_insn *setcc, rtx_insn 
*jump)
   unsigned i;
   edge_iterator ei;
 
-  insn = (setcc != NULL) ? setcc : jump;
+  if (setcc != NULL)
+    {
+      rtx set = single_set (setcc);
+      setcc_dest = SET_DEST (set);
+      setcc_src = SET_SRC (set);
+      insn = setcc;
+    }
+  else
+    {
+      setcc_dest = NULL;
+      setcc_src = NULL;
+      insn = jump;
+    }
 
   /* Determine set of register uses in INSN.  */
   reg_use_count = 0;
@@ -1608,9 +1621,7 @@ bypass_block (basic_block bb, rtx_insn *setcc, rtx_insn 
*jump)
          src = SET_SRC (pc_set (jump));
 
          if (setcc != NULL)
-           src = simplify_replace_rtx (src,
-                                       SET_DEST (PATTERN (setcc)),
-                                       SET_SRC (PATTERN (setcc)));
+           src = simplify_replace_rtx (src, setcc_dest, setcc_src);
 
          new_rtx = simplify_replace_rtx (src, reg_used, set->src);
 
@@ -1716,10 +1727,11 @@ bypass_conditional_jumps (void)
              {
                if (setcc)
                  break;
-               if (GET_CODE (PATTERN (insn)) != SET)
+               rtx singleset = single_set (insn);
+               if (singleset == NULL_RTX)
                  break;
 
-               dest = SET_DEST (PATTERN (insn));
+               dest = SET_DEST (singleset);
                if (REG_P (dest))
                  setcc = insn;
                else
-- 
2.49.0

Reply via email to