[PATCH][PR target/80358][7 regression] Fix boundary check error in expand_block_compare
Aaron Sawdey
acsawdey@linux.vnet.ibm.com
Fri Apr 7 19:39:00 GMT 2017
Turns out we get passed const -1 for the length arg from this code.
ROUND_UP adds load_mode_size to that resulting in a small positive
number, hilarity ensues. Fixed by computing a sensible limit and using
IN_RANGE instead, which won't overflow in this way.
OK for trunk if bootstrap/regtest in progress passes?
2017-04-07  Aaron Sawdey  <acsawdey@linux.vnet.ibm.com>
PR target/80358
* config/rs6000/rs6000.c (expand_block_compare): Fix boundary check.
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 246771)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -19672,8 +19672,9 @@
unsigned int load_mode_size = GET_MODE_SIZE (load_mode);
/* We don't want to generate too much code. */
- if (ROUND_UP (bytes, load_mode_size) / load_mode_size
- > (unsigned HOST_WIDE_INT) rs6000_block_compare_inline_limit)
+ unsigned HOST_WIDE_INT max_bytes =
+ load_mode_size * (unsigned HOST_WIDE_INT) rs6000_block_compare_inline_limit;
+ if (!IN_RANGE (bytes, 1, max_bytes))
return false;
bool generate_6432_conversion = false;
--
Aaron Sawdey, Ph.D. acsawdey@linux.vnet.ibm.com
050-2/C113 (507) 253-7520 home: 507/263-0782
IBM Linux Technology Center - PPC Toolchain
More information about the Gcc-patches
mailing list