aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2024-06-18 12:22:32 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2024-06-18 12:22:32 +0100
commita573ed4367ee685fb1bc50b79239b8b4b69872ee (patch)
tree1558449a90cba1ae19f39fa5beedced56e7511fe
parent6bd4fbae45d11795a9a6f54b866308d4d7134def (diff)
downloadgcc-a573ed4367ee685fb1bc50b79239b8b4b69872ee.zip
gcc-a573ed4367ee685fb1bc50b79239b8b4b69872ee.tar.gz
gcc-a573ed4367ee685fb1bc50b79239b8b4b69872ee.tar.bz2
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.
-rw-r--r--gcc/builtins.cc7
-rw-r--r--gcc/expr.cc17
-rw-r--r--gcc/optabs.cc2
3 files changed, 12 insertions, 14 deletions
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 5b5307c..bde517b 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 31a7346..ffbac51 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 d569742..185c5b1 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)