diff mbox series

[15/17] fix cost of dereference of symbols with complex type

Message ID 20191210225921.94897-16-luc.vanoostenryck@gmail.com (mailing list archive)
State Mainlined, archived
Headers show
Series improve expansion of constant symbols | expand

Commit Message

Luc Van Oostenryck Dec. 10, 2019, 10:59 p.m. UTC
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>
---
 expand.c                              | 10 +++++-----
 validation/expand/cost-deref-nested.c |  1 -
 2 files changed, 5 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/expand.c b/expand.c
index cd348bf5833e..36612c8672dd 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 b09602b6acc6..d6b623961378 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