From d91dfff4d1a480cd924e7273d5c79d02bd4ec768 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Wed, 27 Jan 1999 11:35:30 +0000 Subject: [PATCH] function.c (purge_addressof_1): Handle case when a register has been used in a wider mode. * function.c (purge_addressof_1): Handle case when a register has been used in a wider mode. From-SVN: r24887 --- gcc/ChangeLog | 5 +++++ gcc/function.c | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d6b33f8919..6da65eeeaf0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Jan 27 19:31:36 1999 J"orn Rennecke + + * function.c (purge_addressof_1): Handle case when a register + has been used in a wider mode. + Wed Jan 27 11:58:18 1999 Dave Brolley * cpplib.h (cpp_notice): Add prototype. diff --git a/gcc/function.c b/gcc/function.c index 90540d792cd..e2c836d6ff1 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2939,7 +2939,20 @@ purge_addressof_1 (loc, insn, force, store) < GET_MODE_SIZE (GET_MODE (y))) abort (); - z = gen_lowpart (GET_MODE (x), z); + if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD + && (GET_MODE_SIZE (GET_MODE (x)) + > GET_MODE_SIZE (GET_MODE (z)))) + { + /* This can occur as a result in invalid + pointer casts, e.g. float f; ... + *(long long int *)&f. + ??? We could emit a warning here, but + without a line number that wouldn't be + very helpful. */ + z = gen_rtx_SUBREG (GET_MODE (x), z, 0); + } + else + z = gen_lowpart (GET_MODE (x), z); } *loc = z; -- 2.30.2