Hi Jakub: Thanks for your review, attachment is v2 patch, it's also run regression with x86-64, mips64, riscv64 and riscv32. and additional, I've run gcc 6 branch with this patch, fix mips64 and riscv64 and no introduce new regression on x86-64 and riscv32 on 6/trunk, it's ok for trunk and gcc-6-branch ?
gcc/ChangeLog: 2017-01-16 Kito Cheng <kito.ch...@gmail.com> Kuan-Lin Chen <kuanlinche...@gmail.com> PR target/PR79079 * internal-fn.c (expand_mul_overflow): Use convert_modes instead of gen_lowpart. On Mon, Jan 16, 2017 at 6:13 PM, Matthew Fortune <matthew.fort...@imgtec.com> wrote: > Kito Cheng <kito.ch...@gmail.com> writes: >> On Mon, Jan 16, 2017 at 02:42:08PM +0800, Kito Cheng wrote: >> > 2017-01-16 Kito Cheng <kito.ch...@gmail.com> >> > Kuan-Lin Chen <kuanlinche...@gmail.com> >> > >> > PR target/PR79079 >> > * gcc/internal-fn.c (expand_mul_overflow): Use convert_modes >> instead of >> > gen_lowpart. > > Thanks for the fix Kito, much appreciated. > > I believe this is candidate for backport to GCC 6 given a week or so in trunk > to make sure it's OK. > > Matthew
From 68be79edd94ecd0930d0c9b9c3d0a016e01f610c Mon Sep 17 00:00:00 2001 From: Kuan-Lin Chen <ru...@andestech.com> Date: Wed, 14 Sep 2016 15:06:28 +0800 Subject: [PATCH] Get the lowpart by convert_modes which checks TRULY_NOOP_TRUNCATION inside. --- gcc/internal-fn.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index 7fb44aa..5d71cb2 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -1483,8 +1483,8 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, res = expand_expr_real_2 (&ops, NULL_RTX, wmode, EXPAND_NORMAL); rtx hipart = expand_shift (RSHIFT_EXPR, wmode, res, prec, NULL_RTX, uns); - hipart = gen_lowpart (mode, hipart); - res = gen_lowpart (mode, res); + hipart = convert_modes (mode, wmode, hipart, uns); + res = convert_modes (mode, wmode, res, uns); if (uns) /* For the unsigned multiplication, there was overflow if HIPART is non-zero. */ @@ -1517,16 +1517,16 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, unsigned int hprec = GET_MODE_PRECISION (hmode); rtx hipart0 = expand_shift (RSHIFT_EXPR, mode, op0, hprec, NULL_RTX, uns); - hipart0 = gen_lowpart (hmode, hipart0); - rtx lopart0 = gen_lowpart (hmode, op0); + hipart0 = convert_modes (hmode, mode, hipart0, uns); + rtx lopart0 = convert_modes (hmode, mode, op0, uns); rtx signbit0 = const0_rtx; if (!uns) signbit0 = expand_shift (RSHIFT_EXPR, hmode, lopart0, hprec - 1, NULL_RTX, 0); rtx hipart1 = expand_shift (RSHIFT_EXPR, mode, op1, hprec, NULL_RTX, uns); - hipart1 = gen_lowpart (hmode, hipart1); - rtx lopart1 = gen_lowpart (hmode, op1); + hipart1 = convert_modes (hmode, mode, hipart1, uns); + rtx lopart1 = convert_modes (hmode, mode, op1, uns); rtx signbit1 = const0_rtx; if (!uns) signbit1 = expand_shift (RSHIFT_EXPR, hmode, lopart1, hprec - 1, @@ -1717,11 +1717,12 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, if (loxhi >> (bitsize / 2) == 0 (if uns). */ rtx hipartloxhi = expand_shift (RSHIFT_EXPR, mode, loxhi, hprec, NULL_RTX, 0); - hipartloxhi = gen_lowpart (hmode, hipartloxhi); + hipartloxhi = convert_modes (hmode, mode, hipartloxhi, 0); rtx signbitloxhi = const0_rtx; if (!uns) signbitloxhi = expand_shift (RSHIFT_EXPR, hmode, - gen_lowpart (hmode, loxhi), + convert_modes (hmode, mode, + loxhi, 0), hprec - 1, NULL_RTX, 0); do_compare_rtx_and_jump (signbitloxhi, hipartloxhi, NE, true, hmode, @@ -1731,7 +1732,8 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, /* res = (loxhi << (bitsize / 2)) | (hmode) lo0xlo1; */ rtx loxhishifted = expand_shift (LSHIFT_EXPR, mode, loxhi, hprec, NULL_RTX, 1); - tem = convert_modes (mode, hmode, gen_lowpart (hmode, lo0xlo1), 1); + tem = convert_modes (mode, hmode, + convert_modes (hmode, mode, lo0xlo1, 1), 1); tem = expand_simple_binop (mode, IOR, loxhishifted, tem, res, 1, OPTAB_DIRECT); -- 2.7.4