From 02f4f89fdba402a1fa74f2f88291f7e1a37db0f2 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 7 Nov 2013 18:18:16 +0100 Subject: [PATCH] Disabled const folding of ternary op when select is undef --- frontends/ast/simplify.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 7712023c5..7b5ae064c 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -1058,8 +1058,20 @@ skip_dynamic_range_lvalue_expansion:; break; case AST_TERNARY: if (children[0]->type == AST_CONSTANT) { - AstNode *choice = children[children[0]->integer ? 1 : 2]; - if (choice->type == AST_CONSTANT) { + bool found_sure_true = false; + 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); newNode = mkconst_bits(y.bits, sign_hint); }