aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2004-10-21 10:51:02 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2004-10-21 10:51:02 +0000
commit28526e203f612c5d1fc1e6948958f818144f6ece (patch)
tree7bb761ab9af2e4180138a66d4d0fb67655d3745b /gcc
parentbe3d702cc47e210ccf01db87bd9a2d451c20b677 (diff)
downloadgcc-28526e203f612c5d1fc1e6948958f818144f6ece.zip
gcc-28526e203f612c5d1fc1e6948958f818144f6ece.tar.gz
gcc-28526e203f612c5d1fc1e6948958f818144f6ece.tar.bz2
re PR target/18004 (ICE in output_constant_pool_2 for aligned(1) float in struct)
PR 18004. * expmed.c (store_bit_field): Pass original 'value' before recursing. From-SVN: r89369
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expmed.c4
2 files changed, 9 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9aca52e..af5b63b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-10-21 Aldy Hernandez <aldyh@redhat.com>
+
+ PR 18004.
+ * expmed.c (store_bit_field): Pass original 'value' before
+ recursing.
+
2004-10-21 Nicolas Pitre <nico@cam.org>
* config/arm/ieee754-sf.S: Large speed improvements. Fix NAN handling.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 2601361..6722441 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -338,6 +338,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
unsigned HOST_WIDE_INT bitpos = bitnum % unit;
rtx op0 = str_rtx;
int byte_offset;
+ rtx orig_value;
enum machine_mode op_mode = mode_for_extraction (EP_insv, 3);
@@ -601,6 +602,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
corresponding size. This can occur on a machine with 64 bit registers
that uses SFmode for float. This can also occur for unaligned float
structure fields. */
+ orig_value = value;
if (GET_MODE_CLASS (GET_MODE (value)) != MODE_INT
&& GET_MODE_CLASS (GET_MODE (value)) != MODE_PARTIAL_INT)
value = gen_lowpart ((GET_MODE (value) == VOIDmode
@@ -667,7 +669,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
/* Fetch that unit, store the bitfield in it, then store
the unit. */
tempreg = copy_to_reg (op0);
- store_bit_field (tempreg, bitsize, bitpos, fieldmode, value);
+ store_bit_field (tempreg, bitsize, bitpos, fieldmode, orig_value);
emit_move_insn (op0, tempreg);
return value;
}