fix for reducing operations on boolean vectors

This commit is contained in:
Vern Paxson 2021-02-27 10:57:25 -08:00
parent c7234713b1
commit 56ab0ddcf1
2 changed files with 21 additions and 2 deletions

View file

@ -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;

View file

@ -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<ConstExprPtr> 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<ConstExpr>(else_val);