Disabled const folding of ternary op when select is undef

This commit is contained in:
Clifford Wolf 2013-11-07 18:18:16 +01:00
parent 947bd9b96b
commit 02f4f89fdb
1 changed files with 14 additions and 2 deletions

View File

@ -1058,8 +1058,20 @@ skip_dynamic_range_lvalue_expansion:;
break; break;
case AST_TERNARY: case AST_TERNARY:
if (children[0]->type == AST_CONSTANT) { if (children[0]->type == AST_CONSTANT) {
AstNode *choice = children[children[0]->integer ? 1 : 2]; bool found_sure_true = false;
if (choice->type == AST_CONSTANT) { bool found_maybe_true = false;
for (auto &bit : children[0]->bits) {
if (bit == RTLIL::State::S1)
found_sure_true = true;
if (bit > RTLIL::State::S1)
found_maybe_true = true;
}
AstNode *choice = NULL;
if (found_sure_true)
choice = children[1];
else if (!found_maybe_true)
choice = children[2];
if (choice != NULL && choice->type == AST_CONSTANT) {
RTLIL::Const y = choice->bitsAsConst(width_hint, sign_hint); RTLIL::Const y = choice->bitsAsConst(width_hint, sign_hint);
newNode = mkconst_bits(y.bits, sign_hint); newNode = mkconst_bits(y.bits, sign_hint);
} }