From: Richard Kenner Date: Tue, 24 Sep 1996 12:13:52 +0000 (-0400) Subject: (expand_inline_function): Avoid creating paradoxical subreg wider than X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2d0bd5fde06d1538ee95376c0b41a598feb9579d;p=gcc.git (expand_inline_function): Avoid creating paradoxical subreg wider than BITS_PER_WORD as inlined function result. From-SVN: r12832 --- diff --git a/gcc/integrate.c b/gcc/integrate.c index f1e778a81d8..1c5a4a7dd63 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -1673,7 +1673,21 @@ expand_inline_function (fndecl, parms, target, ignore, type, avoid machine mode mismatch when we substitute INLINE_TARGET. But TARGET is what we will return to the caller. */ if (arriving_mode != departing_mode) - reg_to_map = gen_rtx (SUBREG, arriving_mode, target, 0); + { + /* Avoid creating a paradoxical subreg wider than + BITS_PER_WORD, since that is illegal. */ + if (GET_MODE_BITSIZE (arriving_mode) > BITS_PER_WORD) + { + if (!TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (departing_mode), + GET_MODE_BITSIZE (arriving_mode))) + /* Maybe could be handled by using convert_move () ? */ + abort (); + reg_to_map = gen_reg_rtx (arriving_mode); + target = gen_lowpart (departing_mode, reg_to_map); + } + else + reg_to_map = gen_rtx (SUBREG, arriving_mode, target, 0); + } else reg_to_map = target;