diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-30 20:47:55 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-30 20:47:55 +0000 |
| commit | 372bd947f712454b44e2ec48768a7a9714a79b0a (patch) | |
| tree | ce9549fd12687a4a303dec199bcb66780d96f7c9 | |
| parent | 9fad9bbe061016d9cdc198f0b10e08364dd2bd21 (diff) | |
| download | ppe42-gcc-372bd947f712454b44e2ec48768a7a9714a79b0a.tar.gz ppe42-gcc-372bd947f712454b44e2ec48768a7a9714a79b0a.zip | |
* config/ia64/ia64.c (hfa_element_mode): Return false for
zero-sized top-level aggregates.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92741 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/config/ia64/ia64.c | 13 |
2 files changed, 15 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ccf7ddadc77..f6d95d3d98a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-12-30 Richard Henderson <rth@redhat.com> + + * config/ia64/ia64.c (hfa_element_mode): Return false for + zero-sized top-level aggregates. + 2004-12-30 Jan Hubicka <jh@suse.cz> PR target/18019 diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 2d819c6ac3f..68e6ddbba14 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -186,7 +186,7 @@ static rtx gen_movdi_x (rtx, rtx, rtx); static rtx gen_fr_spill_x (rtx, rtx, rtx); static rtx gen_fr_restore_x (rtx, rtx, rtx); -static enum machine_mode hfa_element_mode (tree, int); +static enum machine_mode hfa_element_mode (tree, bool); static void ia64_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode, tree, int *, int); static bool ia64_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode, @@ -2968,10 +2968,14 @@ ia64_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode, An aggregate is a homogeneous floating point aggregate is if all fields/elements in it have the same floating point type (e.g, - SFmode). 128-bit quad-precision floats are excluded. */ + SFmode). 128-bit quad-precision floats are excluded. + + Variable sized aggregates should never arrive here, since we should + have already decided to pass them by reference. Top-level zero-sized + aggregates are excluded because our parallels crash the middle-end. */ static enum machine_mode -hfa_element_mode (tree type, int nested) +hfa_element_mode (tree type, bool nested) { enum machine_mode element_mode = VOIDmode; enum machine_mode mode; @@ -2979,6 +2983,9 @@ hfa_element_mode (tree type, int nested) int know_element_mode = 0; tree t; + if (!nested && (!TYPE_SIZE (type) || integer_zerop (TYPE_SIZE (type)))) + return VOIDmode; + switch (code) { case VOID_TYPE: case INTEGER_TYPE: case ENUMERAL_TYPE: |

