aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-im.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2016-01-26 09:53:33 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2016-01-26 09:53:33 +0000
commit5ee31e57d2fe70a7847dae2a3df0f19e3875fd97 (patch)
treefd774b686410ec17d1edca42822f9013a8f9d3e8 /gcc/tree-ssa-loop-im.c
parent7ddfb31dfd323973d479e89a6a6e386b95d06de5 (diff)
downloadgcc-5ee31e57d2fe70a7847dae2a3df0f19e3875fd97.zip
gcc-5ee31e57d2fe70a7847dae2a3df0f19e3875fd97.tar.gz
gcc-5ee31e57d2fe70a7847dae2a3df0f19e3875fd97.tar.bz2
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. From-SVN: r232817
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
0 files changed, 0 insertions, 0 deletions