mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-30 15:41:12 +00:00
Experimental/Initial try at in-ast constant folding. (for TYPE_FLOAT currently .. since comparisions on UTF8 strings need to be worked out yet ..)
This commit is contained in:
parent
2c975fe48f
commit
d8b931fbcf
1 changed files with 25 additions and 0 deletions
25
ast.c
25
ast.c
|
@ -2531,6 +2531,31 @@ bool ast_ifthen_codegen(ast_ifthen *self, ast_function *func, bool lvalue, ir_va
|
||||||
/* update the block which will get the jump - because short-logic or ternaries may have changed this */
|
/* update the block which will get the jump - because short-logic or ternaries may have changed this */
|
||||||
cond = func->curblock;
|
cond = func->curblock;
|
||||||
|
|
||||||
|
/* eliminate branches if value is constant */
|
||||||
|
if (condval->vtype == TYPE_FLOAT && condval->hasvalue && condval->cvq == CV_CONST) {
|
||||||
|
/* don't generate if statements */
|
||||||
|
if (condval->constval.vfloat == 1.0f && self->on_true) {
|
||||||
|
if (!(ontrue = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "ontrue"))))
|
||||||
|
return false;
|
||||||
|
/* generate */
|
||||||
|
if (!(*(cgen = self->on_true->codegen))((ast_expression*)(self->on_true), func, false, &dummy))
|
||||||
|
return false;
|
||||||
|
if (!ir_block_create_jump(func->curblock, ast_ctx(self), ontrue))
|
||||||
|
return false;
|
||||||
|
func->curblock = ontrue;
|
||||||
|
return true;
|
||||||
|
} else if (condval->constval.vfloat == 0.0f && self->on_false) {
|
||||||
|
if (!(onfalse = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "onfalse"))))
|
||||||
|
return false;
|
||||||
|
/* generate */
|
||||||
|
if (!(*(cgen = self->on_false->codegen))((ast_expression*)(self->on_false), func, false, &dummy))
|
||||||
|
return false;
|
||||||
|
if (!ir_block_create_jump(func->curblock, ast_ctx(self), onfalse))
|
||||||
|
return false;
|
||||||
|
func->curblock = onfalse;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* on-true path */
|
/* on-true path */
|
||||||
|
|
||||||
if (self->on_true) {
|
if (self->on_true) {
|
||||||
|
|
Loading…
Reference in a new issue