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: https://git.libre-soc.org/?a=commitdiff_plain;h=2b4bbc17077ac12fc9742ade4919a6de0277ac8c;p=gcc.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 a15031f794d..8efc77d986b 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