From: Dale Weiler Date: Mon, 30 Sep 2013 18:32:21 +0000 (-0400) Subject: Fix negation type for VINSTR_NEG_V. Source operand for optimization instead of the... X-Git-Tag: 0.3.5~57 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b6f08e7fb1bbe347bbc8de38f6e5af924cfd7c6b;p=xonotic%2Fgmqcc.git Fix negation type for VINSTR_NEG_V. Source operand for optimization instead of the expression (to handle double negation elision properly.) --- diff --git a/ast.c b/ast.c index e1f86a6..dc90019 100644 --- a/ast.c +++ b/ast.c @@ -521,11 +521,12 @@ ast_unary* ast_unary_new(lex_ctx_t ctx, int op, if (ast_istype(expr, ast_unary) && OPTS_OPTIMIZATION(OPTIM_PEEPHOLE)) { ast_unary *prev = (ast_unary*)((ast_unary*)expr)->operand; - ast_unary *cur = (ast_unary*)expr; /* Handle for double negation */ - if (cur->op == op && (op >= VINSTR_NEG_F && op <= VINSTR_NEG_V)) - prev = cur; + if ((((ast_unary*)expr)->op == VINSTR_NEG_V && op == VINSTR_NEG_V) || + (((ast_unary*)expr)->op == VINSTR_NEG_F && op == VINSTR_NEG_F)) { + prev = (ast_unary*)((ast_unary*)expr)->operand; + } if (ast_istype(prev, ast_unary)) { ast_expression_delete((ast_expression*)self); @@ -537,10 +538,10 @@ ast_unary* ast_unary_new(lex_ctx_t ctx, int op, ast_propagate_effects(self, expr); - if (op >= INSTR_NOT_F && op <= INSTR_NOT_FNC) { - self->expression.vtype = TYPE_FLOAT; - } else if (op >= VINSTR_NEG_F && op <= VINSTR_NEG_V) { + if ((op >= INSTR_NOT_F && op <= INSTR_NOT_FNC) || op == VINSTR_NEG_F) { self->expression.vtype = TYPE_FLOAT; + } else if (op == VINSTR_NEG_V) { + self->expression.vtype = TYPE_VECTOR; } else { compile_error(ctx, "cannot determine type of unary operation %s", util_instr_str[op]); }