From: Roger Sayle Date: Sat, 11 Jul 2020 19:03:39 +0000 (+0100) Subject: middle-end: Improve RTL expansion in expand_mul_overflow, X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fffd1a230944c0e9d486d327dc0a4e6c17942553;p=thirdparty%2Fgcc.git 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 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. --- diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index a15031f794d8..8efc77d986b9 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