From 0c58cd9067b4718bd3bcaed635a511d286424138 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 19 Jul 2012 10:42:05 +0900 Subject: [PATCH] Generate only one daglabel for value operands. As each value is now unique, their labels can also be unique, which will improve CSE. --- tools/qfcc/include/expr.h | 1 + tools/qfcc/source/dags.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 05e8b07c5..805af9784 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -158,6 +158,7 @@ typedef struct { typedef struct ex_value_s { struct ex_value_s *next; + struct daglabel_s *daglabel;///< dag label for this value etype_t type; union { const char *string_val; ///< string constant diff --git a/tools/qfcc/source/dags.c b/tools/qfcc/source/dags.c index 1500bfc86..a078dc14c 100644 --- a/tools/qfcc/source/dags.c +++ b/tools/qfcc/source/dags.c @@ -89,6 +89,7 @@ operand_label (operand_t *op) { operand_t *o; symbol_t *sym = 0; + ex_value_t *val = 0; daglabel_t *label; if (!op) @@ -108,11 +109,18 @@ operand_label (operand_t *op) label = new_label (); label->op = op; sym->daglabel = label; - } else { - if (o->op_type != op_value && o->op_type != op_pointer) - debug (0, "unexpected operand type: %d", o->op_type); + } else if (o->op_type == op_value) { + val = o->o.value; + if (val->daglabel) + return val->daglabel; label = new_label (); label->op = op; + val->daglabel = label; + } else if (o->op_type == op_pointer) { + label = new_label (); + label->op = op; + } else { + internal_error (0, "unexpected operand type: %d", o->op_type); } return label; }