fix for script optimization of constants of type "opaque"

This commit is contained in:
Vern Paxson 2024-08-13 14:33:00 -07:00
parent 03347e235b
commit 5a3b519fb4
2 changed files with 14 additions and 3 deletions

View file

@ -474,7 +474,16 @@ public:
// Optimization-related: // Optimization-related:
ExprPtr Duplicate() override; ExprPtr Duplicate() override;
ValPtr FoldVal() const override { return val; }
ValPtr FoldVal() const override {
if ( type->Tag() == TYPE_OPAQUE )
// Aggressive constant propagation can lead to the appearance of
// opaque "constants". Don't consider these as foldable because
// they're problematic to generate independently.
return nullptr;
return val;
}
protected: protected:
void ExprDescribe(ODesc* d) const override; void ExprDescribe(ODesc* d) const override;

View file

@ -475,6 +475,7 @@ ExprPtr UnaryExpr::Reduce(Reducer* c, StmtPtr& red_stmt) {
auto op_val = op->FoldVal(); auto op_val = op->FoldVal();
if ( op_val ) { if ( op_val ) {
auto fold = Fold(op_val.get()); auto fold = Fold(op_val.get());
if ( fold->GetType()->Tag() != TYPE_OPAQUE )
return TransformMe(make_intrusive<ConstExpr>(fold), c, red_stmt); return TransformMe(make_intrusive<ConstExpr>(fold), c, red_stmt);
} }
@ -523,6 +524,7 @@ ExprPtr BinaryExpr::Reduce(Reducer* c, StmtPtr& red_stmt) {
auto op2_fold_val = op2->FoldVal(); auto op2_fold_val = op2->FoldVal();
if ( op1_fold_val && op2_fold_val ) { if ( op1_fold_val && op2_fold_val ) {
auto fold = Fold(op1_fold_val.get(), op2_fold_val.get()); auto fold = Fold(op1_fold_val.get(), op2_fold_val.get());
if ( fold->GetType()->Tag() != TYPE_OPAQUE )
return TransformMe(make_intrusive<ConstExpr>(fold), c, red_stmt); return TransformMe(make_intrusive<ConstExpr>(fold), c, red_stmt);
} }