diff options
author | Roger Sayle <roger@nextmovesoftware.com> | 2020-07-11 20:03:39 +0100 |
---|---|---|
committer | Roger Sayle <roger@nextmovesoftware.com> | 2020-07-11 20:03:39 +0100 |
commit | 2b4bbc17077ac12fc9742ade4919a6de0277ac8c (patch) | |
tree | d18d787ae9291c18b6a31f6e37ad5c8c70435156 | |
parent | 90efb2512d40f0a59b063aa0416a6d28849ee424 (diff) | |
download | gcc-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.c | 3 |
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 |