]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cprop: Allow jump bypassing for single set insns
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Wed, 30 Jul 2025 13:25:54 +0000 (15:25 +0200)
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Wed, 30 Jul 2025 13:25:54 +0000 (15:25 +0200)
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.

gcc/cprop.cc

index bc72e64e3a706d37056751806cda91f67e9025e1..dfe3462a0cc1fa7c310f2f5e26472a048caf6bac 100644 (file)
@@ -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