This avoids using an integer type for which we don't have an
approprate mode when expanding .DEFERRED_INIT to a non-memory
entity.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Will push after it finished.

Richard.

2021-10-11  Richard Biener  <rguent...@suse.de>

        PR middle-end/102683
        * internal-fn.c (expand_DEFERRED_INIT): Check for mode
        availability before building an integer type for storage
        purposes.
---
 gcc/internal-fn.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index 6bc256832f7..b3638192fb9 100644
--- a/gcc/internal-fn.c
+++ b/gcc/internal-fn.c
@@ -3074,7 +3074,9 @@ expand_DEFERRED_INIT (internal_fn, gcall *stmt)
       tree init;
       if (tree_fits_uhwi_p (var_size)
          && (init_type == AUTO_INIT_PATTERN
-             || !is_gimple_reg_type (var_type)))
+             || !is_gimple_reg_type (var_type))
+         && int_mode_for_size (tree_to_uhwi (var_size) * BITS_PER_UNIT,
+                               0).exists ())
        {
          unsigned HOST_WIDE_INT total_bytes = tree_to_uhwi (var_size);
          unsigned char *buf = (unsigned char *) xmalloc (total_bytes);
-- 
2.31.1

Reply via email to