@@ -138,25 +138,28 @@ class CastLonglong2IntMutator : public ir::IRMutator<> {
138138 }
139139 void Visit (const ir::Min* op, Expr* expr) override {
140140 auto node = expr->As <ir::Min>();
141- if (node->a ().is_index () && node->b ().is_index ()) {
142- if ((node->a ().is_var () && node->a ().as_var ()->is_symbolic_constant ) ||
143- (node->b ().is_var () && node->b ().as_var ()->is_symbolic_constant )) {
144- ir::ElevateInt64ToInt32_ ((*expr)->operands );
145- }
141+ // min(min(S0, 1ll), 1ll) ==> min(min(S0, 1), 1)
142+ // min(V[S0, S1], 1ll) ==> min(V[S0, S1], 1ll)
143+ // min(S0 + 1ll, 1ll) ==> max(S0 + 1, 1)
144+ // IndexType::kValid means expr only has +-*/%, Const, Symbol, Min, Max.
145+ // IsDynamic == true means expr has Symbol.
146+ if (optim::VerifyIndex (*expr) == ir::IndexExpr::IndexType::kValid &&
147+ expr->as_index ().IsDynamic ()) {
148+ ir::ElevateInt64ToInt32_ ((*expr)->operands );
149+ } else {
150+ ir::IRMutator<>::Visit (&node->a (), &node->a ());
151+ ir::IRMutator<>::Visit (&node->b (), &node->b ());
146152 }
147- ir::IRMutator<>::Visit (&node->a (), &node->a ());
148- ir::IRMutator<>::Visit (&node->b (), &node->b ());
149153 }
150154 void Visit (const ir::Max* op, Expr* expr) override {
151155 auto node = expr->As <ir::Max>();
152- if (node->a ().is_index () && node->b ().is_index ()) {
153- if ((node->a ().is_var () && node->a ().as_var ()->is_symbolic_constant ) ||
154- (node->b ().is_var () && node->b ().as_var ()->is_symbolic_constant )) {
155- ir::ElevateInt64ToInt32_ ((*expr)->operands );
156- }
156+ if (optim::VerifyIndex (*expr) == ir::IndexExpr::IndexType::kValid &&
157+ expr->as_index ().IsDynamic ()) {
158+ ir::ElevateInt64ToInt32_ ((*expr)->operands );
159+ } else {
160+ ir::IRMutator<>::Visit (&node->a (), &node->a ());
161+ ir::IRMutator<>::Visit (&node->b (), &node->b ());
157162 }
158- ir::IRMutator<>::Visit (&node->a (), &node->a ());
159- ir::IRMutator<>::Visit (&node->b (), &node->b ());
160163 }
161164};
162165
0 commit comments