fixes for script optimization of coerce-to-any expressions

This commit is contained in:
Vern Paxson 2024-08-05 09:21:13 +01:00 committed by Tim Wojtulewicz
parent f693f22192
commit 10d5ca5948
4 changed files with 23 additions and 2 deletions

View file

@ -1642,6 +1642,9 @@ class CoerceToAnyExpr : public UnaryExpr {
public: public:
CoerceToAnyExpr(ExprPtr op); CoerceToAnyExpr(ExprPtr op);
bool IsReduced(Reducer* c) const override;
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
protected: protected:
ValPtr Fold(Val* v) const override; ValPtr Fold(Val* v) const override;

View file

@ -1849,7 +1849,8 @@ void WhenInfo::Build(StmtPtr ws) {
auto else_branch = timeout_s ? timeout_s : empty; auto else_branch = timeout_s ? timeout_s : empty;
auto do_bodies = make_intrusive<IfStmt>(two_test, s, else_branch); auto do_bodies = make_intrusive<IfStmt>(two_test, s, else_branch);
auto dummy_return = make_intrusive<ReturnStmt>(true_const); auto any_true_const = make_intrusive<CoerceToAnyExpr>(true_const);
auto dummy_return = make_intrusive<ReturnStmt>(any_true_const);
auto shebang = make_intrusive<StmtList>(do_test, do_bodies, dummy_return); auto shebang = make_intrusive<StmtList>(do_test, do_bodies, dummy_return);

View file

@ -3094,6 +3094,23 @@ CoerceToAnyExpr::CoerceToAnyExpr(ExprPtr arg_op) : UnaryExpr(EXPR_TO_ANY_COERCE,
type = base_type(TYPE_ANY); type = base_type(TYPE_ANY);
} }
bool CoerceToAnyExpr::IsReduced(Reducer* c) const { return HasReducedOps(c); }
ExprPtr CoerceToAnyExpr::Reduce(Reducer* c, StmtPtr& red_stmt) {
if ( c->Optimizing() )
op = c->UpdateExpr(op);
red_stmt = nullptr;
if ( ! op->IsSingleton(c) )
op = op->ReduceToSingleton(c, red_stmt);
if ( c->Optimizing() )
return ThisPtr();
else
return AssignToTemporary(c, red_stmt);
}
ValPtr CoerceToAnyExpr::Fold(Val* v) const { return {NewRef{}, v}; } ValPtr CoerceToAnyExpr::Fold(Val* v) const { return {NewRef{}, v}; }
ExprPtr CoerceToAnyExpr::Duplicate() { return SetSucc(new CoerceToAnyExpr(op->Duplicate())); } ExprPtr CoerceToAnyExpr::Duplicate() { return SetSucc(new CoerceToAnyExpr(op->Duplicate())); }

View file

@ -1567,7 +1567,7 @@ unary-expr-op To-Any-Coerce
op-type X op-type X
set-type $1 set-type $1
eval auto orig_lhs = frame[z.v1]; /* hold in case z.v1 = z.v2 */ eval auto orig_lhs = frame[z.v1]; /* hold in case z.v1 = z.v2 */
AssignV1(ZVal(frame[z.v2].ToVal(z.t), ZAM::any_base_type)) frame[z.v1] = ZVal($1.ToVal(z.t), ZAM::any_base_type);
ZVal::DeleteManagedType(orig_lhs); ZVal::DeleteManagedType(orig_lhs);
unary-expr-op From-Any-Coerce unary-expr-op From-Any-Coerce