https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69400

--- Comment #10 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
Author: rsandifo
Date: Tue Jan 26 09:53:33 2016
New Revision: 232817

URL: https://gcc.gnu.org/viewcvs?rev=232817&root=gcc&view=rev
Log:
PR 69400: Invalid 128-bit modulus result

As described in the PR, wi::divmod_internal was sign- rather than
zero-extending a modulus result in cases where the result has fewer
HWIs than the precision and the upper bit of the upper HWI was set.

This patch tries to make things more robust by getting wi_pack
to handle the canonicalisation step itself.

Tested on x86_64-linux-gnu.  I added tests to the wide-int
plugin since that seemed more direct.

gcc/
        PR tree-optimization/69400
        * wide-int.cc (wi_pack): Take the precision as argument and
        perform canonicalization here rather than in the callers.
        Use the main loop to handle all full-width HWIs.  Add a
        zero HWI if in_len isn't a full result.
        (wi::divmod_internal): Update accordingly.
        (wi::mul_internal): Likewise.  Simplify.

gcc/testsuite/
        PR tree-optimization/69400
        * gcc.dg/plugin/wide-int_plugin.c (test_wide_int_mod_trunc): New
        function.
        (plugin_init): Call it.
        * gcc.dg/torture/pr69400.c: New test.

Added:
    trunk/gcc/testsuite/gcc.dg/torture/pr69400.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/plugin/wide-int_plugin.c
    trunk/gcc/wide-int.cc

Reply via email to