diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-08 00:43:05 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-10 23:26:23 +0100 |
commit | 0d92426b4e15d7565e1a1d45cb41e06059ed2043 (patch) | |
tree | 9c78041877d62a13ddd384feea0b13e6bb23cb21 | |
parent | 5d02fb958506ba44d85b449bef68883c68d6ecfa (diff) | |
download | sparse-0d92426b4e15d7565e1a1d45cb41e06059ed2043.tar.gz |
fix cost of dereference of symbols with complex type
Currently, in expand_dereference(), the dereference of a symbol with
a complex type is considered as costing as high as a non-symbol
because it's not recognised it's a symbol.
However, both cases should have exactly the same cost since they
address calculation amounts to 'symbol + offset'.
So, instead of taking in account a single level of
symbol + offset
let's use a loop for this in order to handle
symbol [+ offset]*
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | expand.c | 10 | ||||
-rw-r--r-- | validation/expand/cost-deref-nested.c | 1 |
2 files changed, 5 insertions, 6 deletions
@@ -737,12 +737,12 @@ static int expand_dereference(struct expression *expr) * Is it "symbol" or "symbol + offset"? */ offset = 0; - if (unop->type == EXPR_BINOP && unop->op == '+') { + while (unop->type == EXPR_BINOP && unop->op == '+') { struct expression *right = unop->right; - if (right->type == EXPR_VALUE) { - offset = right->value; - unop = unop->left; - } + if (right->type != EXPR_VALUE) + break; + offset += right->value; + unop = unop->left; } if (unop->type == EXPR_SYMBOL) { diff --git a/validation/expand/cost-deref-nested.c b/validation/expand/cost-deref-nested.c index b09602b6..d6b62396 100644 --- a/validation/expand/cost-deref-nested.c +++ b/validation/expand/cost-deref-nested.c @@ -14,7 +14,6 @@ static int foo(int c) /* * check-name: cost-deref-nested * check-command: test-linearize -fdump-ir $file - * check-known-to-fail * * check-output-ignore * check-output-excludes: cbr |