middle-end/102683 - fix .DEFERRED_INIT expansion

Message ID 3179q198-42rq-psp3-622-pop8p167n878@fhfr.qr
State New
Headers show
Series
  • middle-end/102683 - fix .DEFERRED_INIT expansion
Related show

Commit Message

Richard Sandiford via Gcc-patches Oct. 11, 2021, 2:22 p.m.
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  <rguenther@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(-)

-- 
2.31.1

Patch

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);