diff --git a/src/Expr.h b/src/Expr.h index cb1644404b..d0560942e1 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -752,7 +752,7 @@ public: // Optimization-related: ExprPtr Duplicate() override; - bool WillTransform(Reducer* c) const override { return true; } + bool WillTransform(Reducer* c) const override; bool WillTransformInConditional(Reducer* c) const override; ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override; diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index f347006762..6a55a57112 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -1054,9 +1054,20 @@ ExprPtr BoolExpr::Duplicate() return SetSucc(new BoolExpr(tag, op1_d, op2_d)); } +bool BoolExpr::WillTransform(Reducer* c) const + { + if ( op1->IsConst() || (op1->HasNoSideEffects() && op2->IsConst()) ) + return true; + + if ( IsVector(op1->GetType()->Tag()) ) + return false; + + return WillTransformInConditional(c); + } + bool BoolExpr::WillTransformInConditional(Reducer* c) const { - IDPtr common_id = nullptr; + IDPtr common_id; std::vector patterns; ExprPtr e_ptr = {NewRef{}, (Expr*) this}; @@ -1119,6 +1130,14 @@ ExprPtr BoolExpr::Reduce(Reducer* c, StmtPtr& red_stmt) } } + if ( IsVector(op1->GetType()->Tag()) ) + { + if ( c->Optimizing() ) + return ThisPtr(); + else + return AssignToTemporary(c, red_stmt); + } + auto else_val = is_and ? val_mgr->False() : val_mgr->True(); ExprPtr else_e = make_intrusive(else_val);