riccibruno added a comment.

In https://reviews.llvm.org/D53717#1276388, @rsmith wrote:

> In https://reviews.llvm.org/D53717#1276245, @rsmith wrote:
>
> > Do you have evidence that this complexity is worthwhile? (I wouldn't 
> > imagine we have very many `ForStmt`s per translation unit, so saving 16 
> > bytes for each of them seems unlikely to matter.)
>
>
> Strikes me that some data would be useful here, to help prioritize. Here's a 
> histogram of occurrence counts for a libc++ module:
>
>   Count    # Bits     b/Rec   % Abv  Record Kind
>   43731   5471391     125.1   87.46  EXPR_DECL_REF
>   35751    822273      23.0          DECL_OMP_DECLARE_REDUCTION
>   29734   3431612     115.4          TYPE_TEMPLATE_SPECIALIZATION
>   25750   7472591     290.2   55.89  DECL_PARM_VAR
>   14986    651081      43.4   98.81  EXPR_IMPLICIT_CAST
>   14847   1620549     109.1          EXPR_CALL
>   13153   1968371     149.7          TYPE_FUNCTION_PROTO
>   12605   3797017     301.2  100.00  DECL_CONTEXT_LEXICAL
>   12515    715141      57.1          TYPE_TEMPLATE_TYPE_PARM
>   12480   2608644     209.0          DECL_TEMPLATE_TYPE_PARM
>   10571   1200811     113.6          EXPR_BINARY_OPERATOR
>   10300    955610      92.8          STMT_COMPOUND
>   10254   9421030     918.8   17.66  DECL_CXX_METHOD
>   10220   2252926     220.4          EXPR_CXX_DEPENDENT_SCOPE_MEMBER
>   10083    231909      23.0          STMT_NULL_PTR
>    9731   5196865     534.1          EXPR_CXX_UNRESOLVED_LOOKUP
>    8015    580911      72.5   87.16  EXPR_INTEGER_LITERAL
>    7935   3298497     415.7          EXPR_CXX_DEPENDENT_SCOPE_DECL_REF
>    7934   3379054     425.9          DECL_CXX_RECORD
>    7790    946360     121.5          EXPR_CXX_THIS
>    7508    350806      46.7          LOCAL_REDECLARATIONS
>    7155   1239819     173.3          EXPR_MEMBER
>    6754   1264508     187.2          EXPR_CXX_OPERATOR_CALL
>    6607   5819360     880.8  100.00  DECL_CONTEXT_VISIBLE
>    6461    736861     114.0          EXPR_UNARY_OPERATOR
>    6117    284391      46.5          TYPE_LVALUE_REFERENCE
>    6081    372753      61.3          STMT_RETURN
>    6066   1964810     323.9   99.64  DECL_TYPEDEF
>    5659    249455      44.1          TYPE_RECORD
>    5252   4884856     930.1          DECL_CLASS_TEMPLATE_SPECIALIZATION
>    5196    313722      60.4          TYPE_SUBST_TEMPLATE_TYPE_PARM
>    5189    532009     102.5          TYPE_DEPENDENT_NAME
>    5083   2145083     422.0    1.65  DECL_VAR
>    4886    296440      60.7          TYPE_TYPEDEF
>    4340    473950     109.2          STMT_DECL
>    4314   4078644     945.4          DECL_FUNCTION
>    4150   1436618     346.2          DECL_FUNCTION_TEMPLATE
>    3686    343246      93.1          TYPE_ELABORATED
>    3629    144649      39.9          TYPE_POINTER
>    3435   2907387     846.4          DECL_CXX_CONSTRUCTOR
>    3341    896701     268.4          DECL_CXX_BASE_SPECIFIERS
>    2847    376713     132.3          EXPR_PAREN
>    2684    271156     101.0          EXPR_CXX_BOOL_LITERAL
>    2651    208771      78.8          STMT_IF
>    2053    550511     268.1          EXPR_CXX_UNRESOLVED_CONSTRUCT
>    1938    268044     138.3          DECL_ACCESS_SPEC
>    1725    472401     273.9          DECL_NON_TYPE_TEMPLATE_PARM
>    1647    224673     136.4          EXPR_PAREN_LIST
>    1610     64624      40.1          TYPE_RVALUE_REFERENCE
>    1542    380997     247.1   48.57  DECL_FIELD
>    1446    392676     271.6          EXPR_CXX_UNRESOLVED_MEMBER
>    1411    283553     201.0          DECL_USING_SHADOW
>    1411     87833      62.2          TYPE_INJECTED_CLASS_NAME
>    1339    164195     122.6          EXPR_SUBST_NON_TYPE_TEMPLATE_PARM
>    1226    311278     253.9          DECL_CXX_CTOR_INITIALIZERS
>    1110    215604     194.2          EXPR_SIZEOF_PACK
>    1054    476456     452.0          DECL_CLASS_TEMPLATE
>     987    112161     113.6          EXPR_CXX_MEMBER_CALL
>     943    195005     206.8          EXPR_CXX_CONSTRUCT
>     941    271069     288.1          EXPR_CXX_STATIC_CAST
>     879    171231     194.8          EXPR_TYPE_TRAIT
>     771     40707      52.8          TYPE_PACK_EXPANSION
>     727    106103     145.9          DECL_IMPORT
>     696    146286     210.2          DECL_FRIEND
>     678    136788     201.8          EXPR_CSTYLE_CAST
>     664     70292     105.9          EXPR_ARRAY_SUBSCRIPT
>     628     67550     107.6          EXPR_PACK_EXPANSION
>     601     84473     140.6          EXPR_COMPOUND_ASSIGN_OPERATOR
>     564     71760     127.2          STMT_FOR
>     557     57643     103.5          EXPR_CXX_NULL_PTR_LITERAL
>     545    350959     644.0          DECL_CXX_DESTRUCTOR
>     523    867947    1659.6          
> DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
>     495    120219     242.9          DECL_USING
>     476     87196     183.2          EXPR_SIZEOF_ALIGN_OF
>     447    292917     655.3          EXPR_STRING_LITERAL
>     434     32634      75.2  100.00  EXPR_CHARACTER_LITERAL
>     432     57714     133.6          EXPR_CONDITIONAL_OPERATOR
>     428     79870     186.6          DECL_ENUM_CONSTANT
>     418     38972      93.2          EXPR_MATERIALIZE_TEMPORARY
>     372     13302      35.8          TYPE_DECLTYPE
>     358     82004     229.1          EXPR_CXX_FUNCTIONAL_CAST
>     352     31172      88.6          EXPR_EXPR_WITH_CLEANUPS
>     342     49746     145.5          DECL_STATIC_ASSERT
>     334    168164     503.5          DECL_TYPEALIAS
>     315     76503     242.9          DECL_NAMESPACE
>     277     15299      55.2          STMT_BREAK
>     263     26857     102.1          STMT_CASE
>     234     75990     324.7          DECL_TYPE_ALIAS_TEMPLATE
>     225     13455      59.8          STMT_WHILE
>     217     21383      98.5          EXPR_CXX_BIND_TEMPORARY
>     217     34247     157.8          EXPR_INIT_LIST
>     191     68275     357.5          EXPR_CXX_TEMPORARY_OBJECT
>     172     22736     132.2          EXPR_CXX_NOEXCEPT
>     156     10176      65.2          TYPE_CONSTANT_ARRAY
>     153      7167      46.8          TYPE_PAREN
>     142     50666     356.8          EXPR_CXX_NEW
>     137     18637     136.0          EXPR_CXX_DEFAULT_ARG
>     116      6952      59.9          STMT_CXX_TRY
>     116      6952      59.9          STMT_CXX_CATCH
>     115     20981     182.4          EXPR_FLOATING_LITERAL
>     112     18062     161.3          DECL_LINKAGE_SPEC
>     108      6792      62.9          TYPE_MEMBER_POINTER
>   
>
> So, this patch would save about 8KB of memory when parsing all of libc++. 
> That's not completely irrelevant as part of a patch series applying this more 
> broadly, but it does suggest that your time might be better spent if you 
> prioritize more common AST nodes for your improvements.


Yes indeed the result of saving a pointer in each `ForStmt` is under the noise, 
but it adds up in the aggregate.
Your data seems to mirror roughly the benchmark I am using (all of Boost). I 
went through all of the expression
and C++ expression classes and it seems that it would be possible to cut the 
space used by all
statements/expressions by ~11% just by moving some data to the bit-fields of 
`Stmt`.

Some cases which stands out in particular:

1. Move the `SourceLocation` in `DeclRefExpr` to the bit-fields of `Stmt`. 
Would save 8 bytes.
2. Move some of the data in `BinaryOperator` to the bit-fields of `Stmt`. Would 
save 8 bytes.

But there is a long tail of statements/expressions which can be packed tighter.

The reason I dealt with `ForStmt` first is only because I did similar 
modification to the
other basic statements. For example the size of `IfStmt`can be cut by up to 3 
pointers
+ 1 `SourceLocation`. (https://reviews.llvm.org/D53607).

For reference here are the other patches which are in review
`IfStmt` (https://reviews.llvm.org/D53607), `CaseStmt` 
(https://reviews.llvm.org/D53609), `ReturnStmt` 
(https://reviews.llvm.org/D53716),
`WhileStmt` (https://reviews.llvm.org/D53715), `SwitchStmt` 
(https://reviews.llvm.org/D53714) and `PredefinedExpr` 
(https://reviews.llvm.org/D53605).



================
Comment at: include/clang/AST/Stmt.h:1863
+  Expr *getCond() {
+    return reinterpret_cast<Expr *>(getTrailingObjects<Stmt 
*>()[condOffset()]);
+  }
----------------
rsmith wrote:
> Please `static_cast` rather than `reinterpret_cast` throughout. (If the 
> `Stmt` base class weren't at offset 0 within `Expr`, we'd want to apply the 
> adjustment.)
I would gladly get rid of these ugly `reinterpret_cast`,
but unfortunately the definition of `Expr` is not available in `Stmt.h`.

As you say these `reinterpret_cast` only work now because of the layout.

A solution would be to move `Expr` and `Stmt` to something like `StmtBase.h`
and include this in `Stmt.h`. This would allow us to get of these casts between
`Stmt` and `Expr`. Of the 91 `reinterpret_cast` in all of the `Stmt*.h` it 
seems that
at least 2/3 of them could be removed.


================
Comment at: include/clang/AST/Stmt.h:1871
+  void setCond(Expr *Cond) {
+    getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt 
*>(Cond);
+  }
----------------
rsmith wrote:
> No need for an explicit cast from `Expr` to base class `Stmt`.
same


================
Comment at: test/Import/for-stmt/test.cpp:8
-// CHECK-NEXT: <<NULL>>
 // CHECK-NEXT: NullStmt
 
----------------
Yes indeed this is a good point. The same can be said of the other similar
modifications to `IfStmt`, `SwitchStmt`, `CaseStmt` and `WhileStmt` which
are in review. I will take a look at how these statements are dumped and add
some indication of which sub-statement is present.


Repository:
  rC Clang

https://reviews.llvm.org/D53717



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to