aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2020-07-11 20:03:39 +0100
committerRoger Sayle <roger@nextmovesoftware.com>2020-07-11 20:03:39 +0100
commit2b4bbc17077ac12fc9742ade4919a6de0277ac8c (patch)
treed18d787ae9291c18b6a31f6e37ad5c8c70435156
parent90efb2512d40f0a59b063aa0416a6d28849ee424 (diff)
downloadgcc-2b4bbc17077ac12fc9742ade4919a6de0277ac8c.zip
gcc-2b4bbc17077ac12fc9742ade4919a6de0277ac8c.tar.gz
gcc-2b4bbc17077ac12fc9742ade4919a6de0277ac8c.tar.bz2
middle-end: Improve RTL expansion in expand_mul_overflow,
This patch improves the RTL that the middle-end generates for testing signed overflow following a widening multiplication. During this expansion the middle-end generates a truncation which can get used multiple times. Placing this intermediate value in a pseudo register reduces the amount of code generated on platforms where this truncation requires an explicit instruction. 2020-07-11 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog: * internal-fn.c (expand_mul_overflow): When checking for signed overflow from a widening multiplication, we access the truncated lowpart RES twice, so keep this value in a pseudo register.
-rw-r--r--gcc/internal-fn.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index a15031f..8efc77d 100644
--- a/gcc/internal-fn.c
+++ b/gcc/internal-fn.c
@@ -1629,6 +1629,9 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
profile_probability::very_likely ());
else
{
+ /* RES is used more than once, place it in a pseudo. */
+ res = force_reg (mode, res);
+
rtx signbit = expand_shift (RSHIFT_EXPR, mode, res, prec - 1,
NULL_RTX, 0);
/* RES is low half of the double width result, HIPART