- /* 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 */
+ /* try constant folding away the condition */
+ if ((fold = fold_cond_ifthen(condval, func, self)) != -1)
+ return fold;