mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-03-25 20:11:24 +00:00
Only optimize (a - (-b)) into (a + b) when the unary operand is a negation. This fixes (a - (!b)) being turned into (a + b).
This commit is contained in:
parent
50f905b821
commit
58cd326d85
1 changed files with 12 additions and 9 deletions
21
ast.c
21
ast.c
|
@ -442,17 +442,20 @@ ast_binary* ast_binary_new(lex_ctx_t ctx, int op,
|
|||
ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_binary_codegen);
|
||||
|
||||
if (ast_istype(right, ast_unary) && OPTS_OPTIMIZATION(OPTIM_PEEPHOLE)) {
|
||||
ast_expression *normal = ((ast_unary*)right)->operand;
|
||||
ast_unary *unary = ((ast_unary*)right);
|
||||
ast_expression *normal = unary->operand;
|
||||
|
||||
/* make a-(-b) => a + b */
|
||||
if (op == INSTR_SUB_F) {
|
||||
op = INSTR_ADD_F;
|
||||
right = normal;
|
||||
++opts_optimizationcount[OPTIM_PEEPHOLE];
|
||||
} else if (op == INSTR_SUB_V) {
|
||||
op = INSTR_ADD_V;
|
||||
right = normal;
|
||||
++opts_optimizationcount[OPTIM_PEEPHOLE];
|
||||
if (unary->op == VINSTR_NEG_F || unary->op == VINSTR_NEG_V) {
|
||||
if (op == INSTR_SUB_F) {
|
||||
op = INSTR_ADD_F;
|
||||
right = normal;
|
||||
++opts_optimizationcount[OPTIM_PEEPHOLE];
|
||||
} else if (op == INSTR_SUB_V) {
|
||||
op = INSTR_ADD_V;
|
||||
right = normal;
|
||||
++opts_optimizationcount[OPTIM_PEEPHOLE];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue