'likely' hint for IFs

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-11-21 17:35:11 +01:00
parent ca2b414c7c
commit b1425dfcf1
3 changed files with 15 additions and 0 deletions

2
ast.c
View file

@ -1538,6 +1538,8 @@ bool ast_binary_codegen(ast_binary *self, ast_function *func, bool lvalue, ir_va
if (!ir_block_create_if(func->curblock, left, merge, other))
return false;
}
/* use the unlikely flag */
vec_last(func->curblock->instr)->likely = false;
func->curblock = other;
cgen = self->right->expression.codegen;

10
ir.c
View file

@ -654,6 +654,8 @@ ir_instr* ir_instr_new(ir_block* owner, int op)
self->params = NULL;
self->eid = 0;
self->likely = true;
return self;
}
@ -2501,6 +2503,13 @@ tailcall:
}
/* neither ontrue nor onfalse exist */
stmt.opcode = INSTR_IFNOT;
if (!instr->likely) {
/* Honor the likelyhood hint */
ir_block *tmp = onfalse;
stmt.opcode = INSTR_IF;
onfalse = ontrue;
ontrue = tmp;
}
stidx = vec_size(code_statements);
vec_push(code_statements, stmt);
/* on false we jump, so add ontrue-path */
@ -2512,6 +2521,7 @@ tailcall:
if (onfalse->generated) {
/* fixup the jump address */
code_statements[stidx].o2.s1 = (onfalse->code_start) - (stidx);
stmt.opcode = vec_last(code_statements).opcode;
/* may have been generated in the previous recursive call */
stmt.opcode = INSTR_GOTO;
stmt.o1.s1 = (onfalse->code_start) - vec_size(code_statements);

3
ir.h
View file

@ -133,6 +133,9 @@ typedef struct ir_instr_s
/* For the temp-allocation */
size_t eid;
/* For IFs */
bool likely;
struct ir_block_s *owner;
} ir_instr;