From b6f08e7fb1bbe347bbc8de38f6e5af924cfd7c6b Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Mon, 30 Sep 2013 14:32:21 -0400 Subject: [PATCH] Fix negation type for VINSTR_NEG_V. Source operand for optimization instead of the expression (to handle double negation elision properly.) --- ast.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) 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]); } -- 2.39.2