Attacking quadratic behaviors associated with SWITCH_EXPR

Zdenek Dvorak rakdver@atrey.karlin.mff.cuni.cz
Sun Oct 24 19:17:00 GMT 2004


Hello,

> First, I am thinking about improving "CASE_LABEL_EXPR -> edge" as
> follows.
> 
> 1. add "edge e;" to stmt_ann_d
> 
> 2. allocate stmt_ann for each CASE_LABEL_EXPR
> 
> 3. stop using CASE_LABEL of CASE_LABEL_EXPR after CFG is created.  In
>    fact, we should probably put null in CASE_LABEL so that people
>    won't mistakenly use it.
> 
> Then we should be able to do
> 
>   stmt_ann (switch_stmt)->e
> 
> to get an edge equivalent to find_edge (label_to_block (CASE_LABEL ()))
> in constant time.  Now the obvious concern is memory consumption
> arising from having edge for every statement with stmt_ann.  I need
> come clever ideas here.  Maybe a hash table mapping CASE_LABEL_EXPR to
> edge?

statement annotations are huge, so this would indeed be a bad idea.
I think it would be better to avoid using tree for CASE_LABEL_EXPR
inside switch statement completely.  I.e. TREE_OPERAND (switch, 2)
would no longer be a TREE_VEC of CASE_LABEL_EXPRs, but instead
a wrapper tree node (of type tcc_exceptional) containing
a VEC(case_label_type), where case_label_type would contain just the
fields necessary for the case label.  This should also save some
memory over the current approach, since it is a bit less bloated
representation.

Zdenek



More information about the Gcc mailing list