* [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
@ 2011-04-04 1:59 Nathan Froyd
0 siblings, 0 replies; 9+ messages in thread
From: Nathan Froyd @ 2011-04-04 1:59 UTC (permalink / raw)
To: gcc-patches
This patch does just what $SUBJECT suggests: pushes down the DECL_RTL
field into LABEL_DECL. In this way, LABEL_DECL can inherit from
tree_decl_common instead of tree_decl_with_rtl.
I realize this looks like pure code shuffling; the reason for doing this
is that I want to split tree_decl_common into two structures: one that
includes DECL_SIZE and DECL_SIZE_UNIT and one that doesn't. The latter
can then be used for CONST_DECL, LABEL_DECL, and--possibly--RESULT_DECL
and--*maybe*--PARM_DECL. (Once the latter two have DECL_RTL "pushed
down" as well, of course.) And I think that less multipurposing of
DECL_RTL is not a bad thing.
Tested on x86_64-unknown-linux-gnu. OK to commit?
-Nathan
* tree.h (struct tree_label_decl): Inherit from tree_decl_common.
Add `label' field.
(LABEL_DECL_CODE_LABEL): New macro.
* stmt.c (label_rtx): Use it.
(expand_label): Use `label_r', rather than fetching DECL_RTL.
* tree.c (initialize_tree_contains_struct): Adjust LABEL_DECL
inheritance and tree_contains_struct asserts.
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 1a9f9e5..13a906f 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -135,17 +135,15 @@ static struct case_node *add_case_node (struct case_node *, tree,
rtx
label_rtx (tree label)
{
- gcc_assert (TREE_CODE (label) == LABEL_DECL);
-
- if (!DECL_RTL_SET_P (label))
+ if (!LABEL_DECL_CODE_LABEL (label))
{
rtx r = gen_label_rtx ();
- SET_DECL_RTL (label, r);
+ LABEL_DECL_CODE_LABEL (label) = r;
if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
LABEL_PRESERVE_P (r) = 1;
}
- return DECL_RTL (label);
+ return LABEL_DECL_CODE_LABEL (label);
}
/* As above, but also put it on the forced-reference list of the
@@ -207,7 +205,7 @@ expand_label (tree label)
do_pending_stack_adjust ();
emit_label (label_r);
if (DECL_NAME (label))
- LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
+ LABEL_NAME (label_r) = IDENTIFIER_POINTER (DECL_NAME (label));
if (DECL_NONLOCAL (label))
{
diff --git a/gcc/tree.c b/gcc/tree.c
index ee47982..3c2154f 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -440,6 +440,7 @@ initialize_tree_contains_struct (void)
case TS_DECL_WRTL:
case TS_CONST_DECL:
+ case TS_LABEL_DECL:
MARK_TS_DECL_COMMON (code);
break;
@@ -449,7 +450,6 @@ initialize_tree_contains_struct (void)
case TS_DECL_WITH_VIS:
case TS_PARM_DECL:
- case TS_LABEL_DECL:
case TS_RESULT_DECL:
MARK_TS_DECL_WRTL (code);
break;
@@ -492,7 +492,6 @@ initialize_tree_contains_struct (void)
gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_WRTL]);
gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_WRTL]);
gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_WRTL]);
- gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_WRTL]);
gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_MINIMAL]);
gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_MINIMAL]);
gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_MINIMAL]);
diff --git a/gcc/tree.h b/gcc/tree.h
index fcdebd9..952e13d 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2940,6 +2940,11 @@ struct GTY(()) tree_field_decl {
#define LABEL_DECL_UID(NODE) \
(LABEL_DECL_CHECK (NODE)->label_decl.label_decl_uid)
+/* The CODE_LABEL associated with a LABEL_DECL. This macro should not
+ be used directly; use label_rtx instead. */
+#define LABEL_DECL_CODE_LABEL(NODE) \
+ (LABEL_DECL_CHECK (NODE)->label_decl.label)
+
/* In a LABEL_DECL, the EH region number for which the label is the
post_landing_pad. */
#define EH_LANDING_PAD_NR(NODE) \
@@ -2951,7 +2956,8 @@ struct GTY(()) tree_field_decl {
(LABEL_DECL_CHECK (NODE)->decl_common.decl_flag_0)
struct GTY(()) tree_label_decl {
- struct tree_decl_with_rtl common;
+ struct tree_decl_common common;
+ rtx label;
int label_decl_uid;
int eh_landing_pad_nr;
};
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-21 16:34 ` Michael Matz
@ 2011-04-21 17:19 ` Nathan Froyd
0 siblings, 0 replies; 9+ messages in thread
From: Nathan Froyd @ 2011-04-21 17:19 UTC (permalink / raw)
To: Michael Matz; +Cc: Richard Guenther, Steven Bosscher, GCC Patches
On Thu, Apr 21, 2011 at 05:54:28PM +0200, Michael Matz wrote:
> > > In particular, FIELD_DECLs have a size, but they have no RTL associated
> > > with them. Â And LABEL_DECLs have RTL, but no size.
>
> Blaeh. So far about nice clean ideas :) One hacky idea: change my
> proposal to this:
>
> decl_common {} Â # no size, no rtl, no align, no pt_uid
> decl_with_rtl_or_size : decl_common {
> Â # add align, pt_uid
> union {
> rtx rtl;
> tree size;
> } u;
> }
> decl_with_size : decl_with_rtl_or_size {
> Â # add size, size_unit
> }
>
> Use the rtl_or_size struct primarily for the current _with_rtl things that
> don't naturally have a size, but use it also for FIELD_DECLs via the
> union.
I'm not sure I follow this wrt FIELD_DECLs. Before you have:
...lots of decl fields..
tree size;
tree size_unit;
After you have:
...lots of decl fields...
union { rtx rtl; tree size; } u;
tree size;
tree size_unit;
Or did you mean something like:
/* As above. */
decl_with_rtl_or_size
/* Add a size_unit field. */
decl_with_size_unit : decl_with_rtl_or_size /* FIELD_DECL */
/* Add a size field for DECLs that do have RTL. */
decl_with_rtl_and_size : decl_with_size_unit /* VAR_DECL, PARM_DECL, etc. */
which looks just awful. :)
> Alternatively I could also envision making a new tree_ struct for just
> field_decls, that would contain the size and other fields that currently
> are in decl_common just for fields (in particular the off_align) member.
> The various accessors like DECL_SIZE would then need to dispatch based on
> tree code.
You could also do something like:
struct tree_decl_size {
tree size;
tree size_unit;
...
};
struct tree_field_decl {
...
struct tree_decl_size size;
};
struct tree_var_decl {
...
struct tree_decl_size size;
};
static inline tree *
decl_size_1 (tree node)
{
switch (TREE_CODE (node))
{
case FIELD_DECL: return &node->field_decl.size.size;
case VAR_DECL: return &node->var_decl.size.size;
...
default: gcc_unreachable ();
}
}
/* Might also need a HAS_DECL_SIZE_P predicate or similar. */
#define DECL_SIZE(NODE) (*decl_size_1 (NODE))
...
which would make it somewhat more obvious when things have sizes, as
well as letting you remove DECL_SIZE{,_UNIT} from FUNCTION_DECL.
Slimming CONST_DECL and LABEL_DECL like this is useful mostly for code
cleanliness, but eliminating such fields from FUNCTION_DECL would have a
much more noticeable memory size impact.
-Nathan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-20 9:18 ` Richard Guenther
@ 2011-04-21 16:34 ` Michael Matz
2011-04-21 17:19 ` Nathan Froyd
0 siblings, 1 reply; 9+ messages in thread
From: Michael Matz @ 2011-04-21 16:34 UTC (permalink / raw)
To: Nathan Froyd; +Cc: Richard Guenther, Steven Bosscher, GCC Patches
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1679 bytes --]
Hi,
On Wed, 20 Apr 2011, Richard Guenther wrote:
> > I had occasion to try this today; this inheritance structure doesn't
> > work. Â The truncated inheritance tree looks like:
> >
> > * decl_common
> > Â * field_decl
> > Â * const_decl
> > Â * decl_with_rtl
> > Â Â * label_decl
> > Â Â * result_decl
> > Â Â * parm_decl
> > Â Â * decl_with_vis...
> >
> > In particular, FIELD_DECLs have a size, but they have no RTL associated
> > with them. Â And LABEL_DECLs have RTL, but no size.
Blaeh. So far about nice clean ideas :) One hacky idea: change my
proposal to this:
decl_common {} Â # no size, no rtl, no align, no pt_uid
decl_with_rtl_or_size : decl_common {
 # add align, pt_uid
union {
rtx rtl;
tree size;
} u;
}
decl_with_size : decl_with_rtl_or_size {
 # add size, size_unit
}
Use the rtl_or_size struct primarily for the current _with_rtl things that
don't naturally have a size, but use it also for FIELD_DECLs via the
union.
Alternatively I could also envision making a new tree_ struct for just
field_decls, that would contain the size and other fields that currently
are in decl_common just for fields (in particular the off_align) member.
The various accessors like DECL_SIZE would then need to dispatch based on
tree code.
Also doesn't sound terribly sexy.
FWIW I'm usually against on the side mappings A->B if most As will most of
the time be associated with a B. A size _is_ associated with the entity
always (for entities where it makes sense to talk about sizes), so that's
exactly where I would find on the side tables strange. For DECL_RTL it's
less clear.
Ciao,
Michael.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-19 22:31 ` Nathan Froyd
@ 2011-04-20 9:18 ` Richard Guenther
2011-04-21 16:34 ` Michael Matz
0 siblings, 1 reply; 9+ messages in thread
From: Richard Guenther @ 2011-04-20 9:18 UTC (permalink / raw)
To: Nathan Froyd; +Cc: Michael Matz, Steven Bosscher, GCC Patches
On Wed, Apr 20, 2011 at 12:00 AM, Nathan Froyd <froydnj@codesourcery.com> wrote:
> On Tue, Apr 05, 2011 at 05:55:33PM +0200, Michael Matz wrote:
>> I have a preference in having just one DECL_RTL field for conceptual
>> reasons:
>>
>> Most DECLs are actually objects (there are some prominent exceptions, but
>> those always would be better described with something like NAMED_ENTITY,
>> if we had something like that, namespaces and translation_unit would
>> qualify). All these have a RTL representation, so one field for them
>> seems appropriate. That some of those don't have a size (either because
>> size makes no sense or is always available via type size) hints towards a
>> problem in the inheritance. I would think it should look like so:
>>
>> decl_common {} # no size, no rtl, no align, no pt_uid
>> decl_with_rtl : decl_common {
>> # add rtl, align, pt_uid
>> }
>> decl_with_size : decl_with_rtl {
>> # add size, size_unit
>> }
>>
>> Then decl_common can still be used for
>> imported_decl/namespace/translation_unit; objects
>> are at least decl_with_rtl, and some objects will be decl_with_size.
>
> I had occasion to try this today; this inheritance structure doesn't
> work. The truncated inheritance tree looks like:
>
> * decl_common
> * field_decl
> * const_decl
> * decl_with_rtl
> * label_decl
> * result_decl
> * parm_decl
> * decl_with_vis...
>
> In particular, FIELD_DECLs have a size, but they have no RTL associated
> with them. And LABEL_DECLs have RTL, but no size. So if you went with
> the above, FIELD_DECLs would grow by one (useless) word. And the
> reverse is the situation we have today, where CONST_DECLs and
> LABEL_DECLs (at least) have a pointless DECL_SIZE. Ideally, we could
> fix things like FUNCTION_DECLs having a size, too...
>
> And I didn't check the C++ FE to see if there are problematic cases
> there, either.
>
> What do you think is the next step? To address this issue, we could
> just give LABEL_DECL its own rtx field as in the original patch, and
> that would resolve that. But maybe we should go further, say by making
> DECL_SIZE{,_UNIT} and/or DECL_RTL into actual (out-of-line function)
> accessors; these accessors can then access structure-specific bits of
> data. Then we don't have to worry about the inheritance structure, and
> maybe could adopt alternate storage schemes for different DECLs, such as
> the off-to-the-side table that Steven suggested.
Another option is to change nothing ;)
Conceptually I'd say not storing DECL_RTL in the decls themselves but
on the side would make sense, at least from a stylish view. I'm not sure
it'll work out very well though in terms of cost & benefit.
What we could do is, if we ever can dispose of DECL/TYPE_LANG_SPECIFIC
after lowering to gimple, overload that field with a DECL/TYPE_RTL_SPECIFIC
field ...
Richard.
> -Nathan
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-05 15:55 ` Michael Matz
2011-04-05 16:21 ` Nathan Froyd
@ 2011-04-19 22:31 ` Nathan Froyd
2011-04-20 9:18 ` Richard Guenther
1 sibling, 1 reply; 9+ messages in thread
From: Nathan Froyd @ 2011-04-19 22:31 UTC (permalink / raw)
To: Michael Matz; +Cc: Steven Bosscher, GCC Patches
On Tue, Apr 05, 2011 at 05:55:33PM +0200, Michael Matz wrote:
> I have a preference in having just one DECL_RTL field for conceptual
> reasons:
>
> Most DECLs are actually objects (there are some prominent exceptions, but
> those always would be better described with something like NAMED_ENTITY,
> if we had something like that, namespaces and translation_unit would
> qualify). All these have a RTL representation, so one field for them
> seems appropriate. That some of those don't have a size (either because
> size makes no sense or is always available via type size) hints towards a
> problem in the inheritance. I would think it should look like so:
>
> decl_common {} # no size, no rtl, no align, no pt_uid
> decl_with_rtl : decl_common {
> # add rtl, align, pt_uid
> }
> decl_with_size : decl_with_rtl {
> # add size, size_unit
> }
>
> Then decl_common can still be used for
> imported_decl/namespace/translation_unit; objects
> are at least decl_with_rtl, and some objects will be decl_with_size.
I had occasion to try this today; this inheritance structure doesn't
work. The truncated inheritance tree looks like:
* decl_common
* field_decl
* const_decl
* decl_with_rtl
* label_decl
* result_decl
* parm_decl
* decl_with_vis...
In particular, FIELD_DECLs have a size, but they have no RTL associated
with them. And LABEL_DECLs have RTL, but no size. So if you went with
the above, FIELD_DECLs would grow by one (useless) word. And the
reverse is the situation we have today, where CONST_DECLs and
LABEL_DECLs (at least) have a pointless DECL_SIZE. Ideally, we could
fix things like FUNCTION_DECLs having a size, too...
And I didn't check the C++ FE to see if there are problematic cases
there, either.
What do you think is the next step? To address this issue, we could
just give LABEL_DECL its own rtx field as in the original patch, and
that would resolve that. But maybe we should go further, say by making
DECL_SIZE{,_UNIT} and/or DECL_RTL into actual (out-of-line function)
accessors; these accessors can then access structure-specific bits of
data. Then we don't have to worry about the inheritance structure, and
maybe could adopt alternate storage schemes for different DECLs, such as
the off-to-the-side table that Steven suggested.
-Nathan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-05 15:55 ` Michael Matz
@ 2011-04-05 16:21 ` Nathan Froyd
2011-04-19 22:31 ` Nathan Froyd
1 sibling, 0 replies; 9+ messages in thread
From: Nathan Froyd @ 2011-04-05 16:21 UTC (permalink / raw)
To: Michael Matz; +Cc: Steven Bosscher, GCC Patches
On Tue, Apr 05, 2011 at 05:55:33PM +0200, Michael Matz wrote:
> I have a preference in having just one DECL_RTL field for conceptual
> reasons:
>
> Most DECLs are actually objects (there are some prominent exceptions, but
> those always would be better described with something like NAMED_ENTITY,
> if we had something like that, namespaces and translation_unit would
> qualify). All these have a RTL representation, so one field for them
> seems appropriate. That some of those don't have a size (either because
> size makes no sense or is always available via type size) hints towards a
> problem in the inheritance. I would think it should look like so:
>
> decl_common {} # no size, no rtl, no align, no pt_uid
> decl_with_rtl : decl_common {
> # add rtl, align, pt_uid
> }
> decl_with_size : decl_with_rtl {
> # add size, size_unit
> }
>
> Then decl_common can still be used for
> imported_decl/namespace/translation_unit; objects
> are at least decl_with_rtl, and some objects will be decl_with_size.
This is what I was heading for, but I hadn't fully worked out how to
switch around the inheritance structure. Thanks!
Consider this patch dropped, then; I'll work towards something like the
above instead.
-Nathan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-04 16:00 ` Nathan Froyd
@ 2011-04-05 15:55 ` Michael Matz
2011-04-05 16:21 ` Nathan Froyd
2011-04-19 22:31 ` Nathan Froyd
0 siblings, 2 replies; 9+ messages in thread
From: Michael Matz @ 2011-04-05 15:55 UTC (permalink / raw)
To: Nathan Froyd; +Cc: Steven Bosscher, GCC Patches
Hi,
On Mon, 4 Apr 2011, Nathan Froyd wrote:
> On Mon, Apr 04, 2011 at 05:52:00PM +0200, Steven Bosscher wrote:
> > Have you looked into maybe putting the CODE_LABEL for a LABEL_DECL in
> > an on-the-side structure (hash table, whatever)? It looks like it is
> > only used during expansion of SWITCH statements.
>
> I haven't, though it'd be easy enough once all accesses go through
> label_rtx. I'd be equally happy doing that instead of pushing DECL_RTX
> down.
I have a preference in having just one DECL_RTL field for conceptual
reasons:
Most DECLs are actually objects (there are some prominent exceptions, but
those always would be better described with something like NAMED_ENTITY,
if we had something like that, namespaces and translation_unit would
qualify). All these have a RTL representation, so one field for them
seems appropriate. That some of those don't have a size (either because
size makes no sense or is always available via type size) hints towards a
problem in the inheritance. I would think it should look like so:
decl_common {} # no size, no rtl, no align, no pt_uid
decl_with_rtl : decl_common {
# add rtl, align, pt_uid
}
decl_with_size : decl_with_rtl {
# add size, size_unit
}
Then decl_common can still be used for
imported_decl/namespace/translation_unit; objects
are at least decl_with_rtl, and some objects will be decl_with_size.
Ciao,
Michael.
5B
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
2011-04-04 15:52 Steven Bosscher
@ 2011-04-04 16:00 ` Nathan Froyd
2011-04-05 15:55 ` Michael Matz
0 siblings, 1 reply; 9+ messages in thread
From: Nathan Froyd @ 2011-04-04 16:00 UTC (permalink / raw)
To: Steven Bosscher; +Cc: GCC Patches
On Mon, Apr 04, 2011 at 05:52:00PM +0200, Steven Bosscher wrote:
> Have you looked into maybe putting the CODE_LABEL for a LABEL_DECL in
> an on-the-side structure (hash table, whatever)? It looks like it is
> only used during expansion of SWITCH statements.
I haven't, though it'd be easy enough once all accesses go through
label_rtx. I'd be equally happy doing that instead of pushing DECL_RTX
down.
-Nathan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL
@ 2011-04-04 15:52 Steven Bosscher
2011-04-04 16:00 ` Nathan Froyd
0 siblings, 1 reply; 9+ messages in thread
From: Steven Bosscher @ 2011-04-04 15:52 UTC (permalink / raw)
To: Nathan Froyd, GCC Patches
Hi Nathan,
Have you looked into maybe putting the CODE_LABEL for a LABEL_DECL in
an on-the-side structure (hash table, whatever)? It looks like it is
only used during expansion of SWITCH statements.
Ciao!
Steven
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-04-21 16:33 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-04 1:59 [PATCH] make LABEL_DECL has its own rtx field for its associated CODE_LABEL Nathan Froyd
2011-04-04 15:52 Steven Bosscher
2011-04-04 16:00 ` Nathan Froyd
2011-04-05 15:55 ` Michael Matz
2011-04-05 16:21 ` Nathan Froyd
2011-04-19 22:31 ` Nathan Froyd
2011-04-20 9:18 ` Richard Guenther
2011-04-21 16:34 ` Michael Matz
2011-04-21 17:19 ` Nathan Froyd
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).