This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR79079 Fix __builtin_mul_overflow code gen for !TRULY_NOOP_TRUNCATION target
- From: Kito Cheng <kito dot cheng at gmail dot com>
- To: Matthew Fortune <Matthew dot Fortune at imgtec dot com>
- Cc: Jakub Jelinek <jakub at redhat dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Kuan-Lin Chen <kuanlinchentw at gmail dot com>, "clm at codesourcery dot com" <clm at codesourcery dot com>, Andrew Waterman <andrew at sifive dot com>, Palmer Dabbelt <palmer at dabbelt dot com>
- Date: Tue, 17 Jan 2017 18:09:29 +0800
- Subject: Re: [PATCH] PR79079 Fix __builtin_mul_overflow code gen for !TRULY_NOOP_TRUNCATION target
- Authentication-results: sourceware.org; auth=none
- References: <CA+yXCZDNijzskL8f6MrDXA3RqdUNknE0meZzCEorkSAHuKHpsA@mail.gmail.com> <20170116074038.GJ1867@tucnak> <6D39441BF12EF246A7ABCE6654B0235380B2A3CD@HHMAIL01.hh.imgtec.org>
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.cheng@gmail.com>
Kuan-Lin Chen <kuanlinchentw@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.Fortune@imgtec.com> wrote:
> Kito Cheng <kito.cheng@gmail.com> writes:
>> On Mon, Jan 16, 2017 at 02:42:08PM +0800, Kito Cheng wrote:
>> > 2017-01-16 Kito Cheng <kito.cheng@gmail.com>
>> > Kuan-Lin Chen <kuanlinchentw@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 <rufus@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