middle-end: Improve RTL expansion in expand_mul_overflow,
authorRoger Sayle <roger@nextmovesoftware.com>
Sat, 11 Jul 2020 19:03:39 +0000 (20:03 +0100)
committerRoger Sayle <roger@nextmovesoftware.com>
Sat, 11 Jul 2020 19:03:39 +0000 (20:03 +0100)
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.

gcc/internal-fn.c

index a15031f794d849042667da8258068b634ae6baed..8efc77d986b927dc4a37e396e6c710ffeda663ff 100644 (file)
@@ -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