diff options
author | Richard Biener <rguenther@suse.de> | 2020-03-18 13:11:30 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-03-18 13:12:28 +0100 |
commit | 1ba9acb11e3589b96ed945ed2a3af6acd6377018 (patch) | |
tree | f24e9a4f4d9f59dcc926bfbb5574e58158bba56e /gcc/gimple-fold.c | |
parent | d5029d45940e8c12b425b4d1a23081b4155caa61 (diff) | |
download | gcc-1ba9acb11e3589b96ed945ed2a3af6acd6377018.zip gcc-1ba9acb11e3589b96ed945ed2a3af6acd6377018.tar.gz gcc-1ba9acb11e3589b96ed945ed2a3af6acd6377018.tar.bz2 |
middle-end/94206 fix memset folding to avoid types with padding
This makes sure that the store a memset is folded to uses a type
covering all bits.
2020-03-18 Richard Biener <rguenther@suse.de>
PR middle-end/94206
* gimple-fold.c (gimple_fold_builtin_memset): Avoid using
partial int modes or not mode-precision integer types for
the store.
* gcc.dg/torture/pr94206.c: New testcase.
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r-- | gcc/gimple-fold.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 3f17de9..c5939f1 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -1235,12 +1235,18 @@ gimple_fold_builtin_memset (gimple_stmt_iterator *gsi, tree c, tree len) length = tree_to_uhwi (len); if (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (etype)) != length + || (GET_MODE_PRECISION (SCALAR_INT_TYPE_MODE (etype)) + != GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE (etype))) || get_pointer_alignment (dest) / BITS_PER_UNIT < length) return NULL_TREE; if (length > HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT) return NULL_TREE; + if (!type_has_mode_precision_p (etype)) + etype = lang_hooks.types.type_for_mode (SCALAR_INT_TYPE_MODE (etype), + TYPE_UNSIGNED (etype)); + if (integer_zerop (c)) cval = 0; else |