8000
Skip to content

Conversation

@dmed256
Copy link
Member
@dmed256 dmed256 commented Oct 24, 2020

Description

Adds occa::lang::expr to make code transformations easy!

Before

                exprNode *index = call.args[order[dimCount - 1]];
                for (int i = (dimCount - 2); i >= 0; --i) {
                  const int i2 = order[i];
                  token_t *source = call.args[i2]->token;
                  exprNode *indexInParen = index->wrapInParentheses();

                  // Don't delete the initial call.args[...]
                  if (i < (dimCount - 2)) {
                    delete index;
                  }

                  exprNode *dimInParen = dimAttr.args[i2].expr->wrapInParentheses();
                  binaryOpNode mult(source,
                                    op::mult,
                                    *dimInParen,
                                    *indexInParen);
                  delete dimInParen;
                  delete indexInParen;

                  parenthesesNode multInParen(source,
                                              mult);
                  exprNode *argInParen = call.args[i2]->wrapInParentheses();

                  index = new binaryOpNode(source,
                                           op::add,
                                           *argInParen,
                                           multInParen);
                  delete argInParen;
                }

                exprNode *newValue = new subscriptNode(call.token,
                                                       *(call.value),
                                                       *index);
                // Don't delete the initial call.args[...]
                if (dimCount > 1) {
                  delete index;
                }

After

                expr index = call.args[order[dimCount - 1]];
                for (int i = (dimCount - 2); i >= 0; --i) {
                  const int orderIndex = order[i];

                  expr arg = call.args[orderIndex];
                  expr dim = dimAttr.args[orderIndex].expr;

                  index = arg + expr::parens(expr::parens(dim) * expr::parens(index));
                }

                expr expansion = expr(call.value)[index];
                exprNode *newValue = expansion.popExprNode();

@codecov
Copy link
codecov bot commented Oct 24, 2020

Codecov Report

Merging #407 into main will decrease coverage by 0.16%.
The diff coverage is 70.32%.

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #407      +/-   ##
==========================================
- Coverage   76.51%   76.34%   -0.17%     
==========================================
  Files         238      239       +1     
  Lines       18311    18396      +85     
==========================================
+ Hits        14010    14045      +35     
- Misses       4301     4351      +50     
Impacted Files Coverage Δ
src/lang/expr/expr.cpp 51.57% <51.57%> (ø)
src/lang/builtins/attributes/dim.cpp 79.33% <100.00%> (-1.73%) ⬇️
src/lang/builtins/attributes/tile.cpp 92.61% <100.00%> (+0.04%) ⬆️
src/lang/variable.cpp 65.24% <0.00%> (-3.05%) ⬇️
src/lang/specialMacros.cpp 59.48% <0.00%> (+0.86%) ⬆️

@dmed256 dmed256 merged commit de41ca9 into main Oct 24, 2020
@dmed256 dmed256 deleted the lang/add-expr branch October 24, 2020 18:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

0