bool is_negative_const(Expr e) { if (const IntImm *i = e.as<IntImm>()) return i->value < 0; if (const FloatImm *f = e.as<FloatImm>()) return f->value < 0.0f; if (const Cast *c = e.as<Cast>()) { return is_negative_const(c->value); } if (const Ramp *r = e.as<Ramp>()) { // slightly conservative return is_negative_const(r->base) && is_negative_const(r->stride); } if (const Broadcast *b = e.as<Broadcast>()) { return is_negative_const(b->value); } return false; }
bool is_negative_negatable_const(const Expr &e, Type T) { if (const IntImm *i = e.as<IntImm>()) { return (i->value < 0 && !T.is_min(i->value)); } if (const FloatImm *f = e.as<FloatImm>()) return f->value < 0.0f; if (const Cast *c = e.as<Cast>()) { return is_negative_negatable_const(c->value, c->type); } if (const Ramp *r = e.as<Ramp>()) { // slightly conservative return is_negative_negatable_const(r->base) && is_negative_const(r->stride); } if (const Broadcast *b = e.as<Broadcast>()) { return is_negative_negatable_const(b->value); } return false; }