https://gcc.gnu.org/g:22141f856d83473b48e5d706879fb646c6476e2a

commit r16-2643-g22141f856d83473b48e5d706879fb646c6476e2a
Author: Stefan Schulze Frielinghaus <stefa...@gcc.gnu.org>
Date:   Wed Jul 30 15:25:54 2025 +0200

    cprop: Allow jump bypassing for single set insns
    
    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.

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

diff --git a/gcc/cprop.cc b/gcc/cprop.cc
index bc72e64e3a70..dfe3462a0cc1 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

Reply via email to