unify functionality across EqExpr and RelExpr classes

This commit is contained in:
Vern Paxson 2024-04-08 18:19:27 -04:00 committed by Tim Wojtulewicz
parent 1b838ca91d
commit d15d4a6e08
3 changed files with 138 additions and 48 deletions

View file

@ -822,14 +822,28 @@ public:
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
};
class EqExpr final : public BinaryExpr {
// Intermediary class for comparison operators. Not directly instantiated.
class CmpExpr : public BinaryExpr {
protected:
CmpExpr(ExprTag tag, ExprPtr op1, ExprPtr op2);
void Canonicalize() override;
bool WillTransform(Reducer* c) const override;
bool WillTransformInConditional(Reducer* c) const override;
bool IsReduced(Reducer* c) const override;
ExprPtr TransformToConditional(Reducer* c, StmtPtr& red_stmt) override;
bool IsHasElementsTest() const;
ExprPtr BuildHasElementsTest() const;
};
class EqExpr final : public CmpExpr {
public:
EqExpr(ExprTag tag, ExprPtr op1, ExprPtr op2);
void Canonicalize() override;
// Optimization-related:
ExprPtr Duplicate() override;
bool WillTransform(Reducer* c) const override;
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
bool InvertSense() override;
@ -837,14 +851,12 @@ protected:
ValPtr Fold(Val* v1, Val* v2) const override;
};
class RelExpr final : public BinaryExpr {
class RelExpr final : public CmpExpr {
public:
RelExpr(ExprTag tag, ExprPtr op1, ExprPtr op2);
void Canonicalize() override;
// Optimization-related:
ExprPtr Duplicate() override;
bool WillTransform(Reducer* c) const override;
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
bool InvertSense() override;
};