diff options
author | Richard Biener <rguenther@suse.de> | 2023-04-28 09:25:16 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-04-28 11:07:54 +0200 |
commit | 977a43f5ba778b5c5cf9c56ba04ed4fde5d1ae78 (patch) | |
tree | 7d72072212b6d99d37f602ba829329170a5062c6 /gcc/gimplify.cc | |
parent | 821ef93976e750c118d42a2ad33b96dbd1b9f3a5 (diff) | |
download | gcc-977a43f5ba778b5c5cf9c56ba04ed4fde5d1ae78.zip gcc-977a43f5ba778b5c5cf9c56ba04ed4fde5d1ae78.tar.gz gcc-977a43f5ba778b5c5cf9c56ba04ed4fde5d1ae78.tar.bz2 |
Avoid more invalid GIMPLE with register bases
The Ada frontend, for example with gnat.dg/inline2_pkg.adb, tends
to create VIEW_CONVERT expressions with aggregate type even of
non-aggregate entities. In this case for example
return <retval> = (BIT_FIELD_REF <VIEW_CONVERT_EXPR<struct inline2_pkg__ieee_short_real>(number), 16, 16> & 32640) != 32640;
currently gimplification and SSA rewrite turn this into
_1 = BIT_FIELD_REF <VIEW_CONVERT_EXPR<struct inline2_pkg__ieee_short_real>(number_2(D));
which is two operations on a register. While as seen with PR109652
we might not want to completely rule out register to aggregate type
VIEW_CONVERTs we definitely do not want to stack multiple ops here.
The solution is to make sure the gimplifier puts a non-register as
the base object. For the above this will add
number.1 = number;
and use number.1 in the compound reference. Code generation is
unchanged, FRE optimizes this to BIT_FIELD_REF <number_2(D), ...>.
I think BIT_FIELD_REF <VIEW_CONVERT (x), ...> could be always
rewritten into BIT_FIELD_REF <x, ...>, but that's a separate thing.
* gimplify.cc (gimplify_compound_lval): When there's a
non-register type produced by one of the handled component
operations make sure we get a non-register base.
Diffstat (limited to 'gcc/gimplify.cc')
-rw-r--r-- | gcc/gimplify.cc | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index c38a962..3740a89 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -3264,6 +3264,11 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, } need_non_reg = true; } + else if (!is_gimple_reg_type (TREE_TYPE (t))) + /* When the result of an operation, in particular a VIEW_CONVERT_EXPR + is a non-register type then require the base object to be a + non-register as well. */ + need_non_reg = true; } /* Step 2 is to gimplify the base expression. Make sure lvalue is set |