re PR middle-end/22156 (bit-field copying regressed)
PR middle-end/22156 * tree-sra.c (struct sra_elt): Add in_bitfld_block. (sra_hash_tree): Handle BIT_FIELD_REFs. (sra_elt_hash): Don't hash bitfld blocks. (sra_elt_eq): Skip them in parent compares as well. Handle BIT_FIELD_REFs. (build_element_name_1): Handle BIT_FIELD_REFs. (instantiate_element): Propagate nowarn from parents. Create BIT_FIELD_REF for variables that are widened by scalarization. Gimple-zero-initialize all bit-field variables that are not part of parameters that are going to be scalarized on entry. (instantiate_missing_elements_1): Return the sra_elt. (canon_type_for_field): New. (try_instantiate_multiple_fields): New. Infer widest possible access mode from decl or member type, but clip it at word size, and only widen it if a field crosses an alignment boundary. (instantiate_missing_elements): Use them. (generate_one_element_ref): Handle BIT_FIELD_REFs. (scalar_bitfield_p): New. (sra_build_assignment): Optimize assignments from scalarizable BIT_FIELD_REFs. Use BITS_BIG_ENDIAN to determine shift counts. (REPLDUP): New. (sra_build_bf_assignment): New. Optimize assignments to scalarizable BIT_FIELD_REFs. (sra_build_elt_assignment): New. Optimize BIT_FIELD_REF assignments to full variables. (generate_copy_inout): Use the new macros and functions. (generate_element_copy): Likewise. Handle bitfld differences. (generate_element_zero): Don't recurse for blocks. Use sra_build_elt_assignment. (generate_one_element_init): Take elt instead of var. Use sra_build_elt_assignment. (generate_element_init_1): Adjust. (bitfield_overlap_info): New struct. (bitfield_overlaps_p): New. (sra_explode_bitfield_assignment): New. Adjust widened variables to account for endianness. (sra_sync_for_bitfield_assignment): New. (scalarize_use): Re-expand assignment to/from scalarized BIT_FIELD_REFs. Explode or sync needed members for BIT_FIELD_REFs accesses or assignments. Use REPLDUP. (scalarize_copy): Use REPLDUP. (scalarize_ldst): Move assert before dereference. Adjust EH handling. (dump_sra_elt_name): Handle BIT_FIELD_REFs. From-SVN: r128908
This commit is contained in:
parent
a567207e71
commit
510335c8b6
2 changed files with 1280 additions and 47 deletions
|
@ -1,3 +1,53 @@
|
|||
2007-10-01 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR middle-end/22156
|
||||
* tree-sra.c (struct sra_elt): Add in_bitfld_block.
|
||||
(sra_hash_tree): Handle BIT_FIELD_REFs.
|
||||
(sra_elt_hash): Don't hash bitfld blocks.
|
||||
(sra_elt_eq): Skip them in parent compares as well. Handle
|
||||
BIT_FIELD_REFs.
|
||||
(build_element_name_1): Handle BIT_FIELD_REFs.
|
||||
(instantiate_element): Propagate nowarn from parents. Create
|
||||
BIT_FIELD_REF for variables that are widened by scalarization.
|
||||
Gimple-zero-initialize all bit-field variables that are not
|
||||
part of parameters that are going to be scalarized on entry.
|
||||
(instantiate_missing_elements_1): Return the sra_elt.
|
||||
(canon_type_for_field): New.
|
||||
(try_instantiate_multiple_fields): New. Infer widest possible
|
||||
access mode from decl or member type, but clip it at word
|
||||
size, and only widen it if a field crosses an alignment
|
||||
boundary.
|
||||
(instantiate_missing_elements): Use them.
|
||||
(generate_one_element_ref): Handle BIT_FIELD_REFs.
|
||||
(scalar_bitfield_p): New.
|
||||
(sra_build_assignment): Optimize assignments from scalarizable
|
||||
BIT_FIELD_REFs. Use BITS_BIG_ENDIAN to determine shift
|
||||
counts.
|
||||
(REPLDUP): New.
|
||||
(sra_build_bf_assignment): New. Optimize assignments to
|
||||
scalarizable BIT_FIELD_REFs.
|
||||
(sra_build_elt_assignment): New. Optimize BIT_FIELD_REF
|
||||
assignments to full variables.
|
||||
(generate_copy_inout): Use the new macros and functions.
|
||||
(generate_element_copy): Likewise. Handle bitfld differences.
|
||||
(generate_element_zero): Don't recurse for blocks. Use
|
||||
sra_build_elt_assignment.
|
||||
(generate_one_element_init): Take elt instead of var. Use
|
||||
sra_build_elt_assignment.
|
||||
(generate_element_init_1): Adjust.
|
||||
(bitfield_overlap_info): New struct.
|
||||
(bitfield_overlaps_p): New.
|
||||
(sra_explode_bitfield_assignment): New. Adjust widened
|
||||
variables to account for endianness.
|
||||
(sra_sync_for_bitfield_assignment): New.
|
||||
(scalarize_use): Re-expand assignment to/from scalarized
|
||||
BIT_FIELD_REFs. Explode or sync needed members for
|
||||
BIT_FIELD_REFs accesses or assignments. Use REPLDUP.
|
||||
(scalarize_copy): Use REPLDUP.
|
||||
(scalarize_ldst): Move assert before dereference. Adjust EH
|
||||
handling.
|
||||
(dump_sra_elt_name): Handle BIT_FIELD_REFs.
|
||||
|
||||
2007-10-01 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
* simplify-rtx.c (comparison_result, simplify_relational_operation_1):
|
||||
|
|
1277
gcc/tree-sra.c
1277
gcc/tree-sra.c
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue