https://gcc.gnu.org/g:a573ed4367ee685fb1bc50b79239b8b4b69872ee

commit r15-1400-ga573ed4367ee685fb1bc50b79239b8b4b69872ee
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Tue Jun 18 12:22:32 2024 +0100

    Make more use of force_lowpart_subreg
    
    This patch makes target-independent code use force_lowpart_subreg
    instead of simplify_gen_subreg and lowpart_subreg in some places.
    The criteria were:
    
    (1) The code is obviously specific to expand (where new pseudos
        can be created), or at least would be invalid to call when
        !can_create_pseudo_p () and temporaries are needed.
    
    (2) The value is obviously an rvalue rather than an lvalue.
    
    Doing this should reduce the likelihood of bugs like PR115464
    occuring in other situations.
    
    gcc/
            * builtins.cc (expand_builtin_issignaling): Use force_lowpart_subreg
            instead of simplify_gen_subreg and lowpart_subreg.
            * expr.cc (convert_mode_scalar, expand_expr_real_2): Likewise.
            * optabs.cc (expand_doubleword_mod): Likewise.

Diff:
---
 gcc/builtins.cc |  7 ++-----
 gcc/expr.cc     | 17 +++++++++--------
 gcc/optabs.cc   |  2 +-
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 5b5307c67b8c..bde517b639e8 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -2940,8 +2940,7 @@ expand_builtin_issignaling (tree exp, rtx target)
          {
            hi = simplify_gen_subreg (imode, temp, fmode,
                                      subreg_highpart_offset (imode, fmode));
-           lo = simplify_gen_subreg (imode, temp, fmode,
-                                     subreg_lowpart_offset (imode, fmode));
+           lo = force_lowpart_subreg (imode, temp, fmode);
            if (!hi || !lo)
              {
                scalar_int_mode imode2;
@@ -2951,9 +2950,7 @@ expand_builtin_issignaling (tree exp, rtx target)
                    hi = simplify_gen_subreg (imode, temp2, imode2,
                                              subreg_highpart_offset (imode,
                                                                      imode2));
-                   lo = simplify_gen_subreg (imode, temp2, imode2,
-                                             subreg_lowpart_offset (imode,
-                                                                    imode2));
+                   lo = force_lowpart_subreg (imode, temp2, imode2);
                  }
              }
            if (!hi || !lo)
diff --git a/gcc/expr.cc b/gcc/expr.cc
index 31a7346e33f0..ffbac5136923 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -423,7 +423,8 @@ convert_mode_scalar (rtx to, rtx from, int unsignedp)
                                        0).exists (&toi_mode))
                {
                  start_sequence ();
-                 rtx fromi = lowpart_subreg (fromi_mode, from, from_mode);
+                 rtx fromi = force_lowpart_subreg (fromi_mode, from,
+                                                   from_mode);
                  rtx tof = NULL_RTX;
                  if (fromi)
                    {
@@ -443,7 +444,7 @@ convert_mode_scalar (rtx to, rtx from, int unsignedp)
                                              NULL_RTX, 1);
                      if (toi)
                        {
-                         tof = lowpart_subreg (to_mode, toi, toi_mode);
+                         tof = force_lowpart_subreg (to_mode, toi, toi_mode);
                          if (tof)
                            emit_move_insn (to, tof);
                        }
@@ -475,7 +476,7 @@ convert_mode_scalar (rtx to, rtx from, int unsignedp)
                                    0).exists (&toi_mode))
            {
              start_sequence ();
-             rtx fromi = lowpart_subreg (fromi_mode, from, from_mode);
+             rtx fromi = force_lowpart_subreg (fromi_mode, from, from_mode);
              rtx tof = NULL_RTX;
              do
                {
@@ -510,11 +511,11 @@ convert_mode_scalar (rtx to, rtx from, int unsignedp)
                                                  temp4, shift, NULL_RTX, 1);
                  if (!temp5)
                    break;
-                 rtx temp6 = lowpart_subreg (toi_mode, temp5, fromi_mode);
+                 rtx temp6 = force_lowpart_subreg (toi_mode, temp5,
+                                                   fromi_mode);
                  if (!temp6)
                    break;
-                 tof = lowpart_subreg (to_mode, force_reg (toi_mode, temp6),
-                                       toi_mode);
+                 tof = force_lowpart_subreg (to_mode, temp6, toi_mode);
                  if (tof)
                    emit_move_insn (to, tof);
                }
@@ -9784,9 +9785,9 @@ expand_expr_real_2 (const_sepops ops, rtx target, 
machine_mode tmode,
            inner_mode = TYPE_MODE (inner_type);
 
          if (modifier == EXPAND_INITIALIZER)
-           op0 = lowpart_subreg (mode, op0, inner_mode);
+           op0 = force_lowpart_subreg (mode, op0, inner_mode);
          else
-           op0=  convert_modes (mode, inner_mode, op0,
+           op0 = convert_modes (mode, inner_mode, op0,
                                 TYPE_UNSIGNED (inner_type));
        }
 
diff --git a/gcc/optabs.cc b/gcc/optabs.cc
index d569742beea9..185c5b1a7053 100644
--- a/gcc/optabs.cc
+++ b/gcc/optabs.cc
@@ -1085,7 +1085,7 @@ expand_doubleword_mod (machine_mode mode, rtx op0, rtx 
op1, bool unsignedp)
                                         NULL_RTX, 1, OPTAB_DIRECT);
              if (v == NULL_RTX)
                return NULL_RTX;
-             v = lowpart_subreg (word_mode, v, mode);
+             v = force_lowpart_subreg (word_mode, v, mode);
              if (v == NULL_RTX)
                return NULL_RTX;
              if (i != count - 1)

Reply via email to