aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-08 00:43:05 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-10 23:26:23 +0100
commit0d92426b4e15d7565e1a1d45cb41e06059ed2043 (patch)
tree9c78041877d62a13ddd384feea0b13e6bb23cb21
parent5d02fb958506ba44d85b449bef68883c68d6ecfa (diff)
downloadsparse-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.c10
-rw-r--r--validation/expand/cost-deref-nested.c1
2 files changed, 5 insertions, 6 deletions
diff --git a/expand.c b/expand.c
index cd348bf5..36612c86 100644
--- a/expand.c
+++ b/expand.c
@@ -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