]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Make more use of force_lowpart_subreg
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 18 Jun 2024 11:22:32 +0000 (12:22 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 18 Jun 2024 11:22:32 +0000 (12:22 +0100)
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.

gcc/builtins.cc
gcc/expr.cc
gcc/optabs.cc

index 5b5307c67b8caa776662529451db44a33d464e2d..bde517b639e89bf1361995e918c1db25b96c1cef 100644 (file)
@@ -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)
index 31a7346e33f019fe7e25882a2f97644fd4206fd6..ffbac5136923035ea1c8b50a5c92fcddd43d7601 100644 (file)
@@ -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));
        }
 
index d569742beea97304fca556880e4ad8a44ce6053d..185c5b1a70535a65e78d7709c058f31da9a54be3 100644 (file)
@@ -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)