12const Def* Lower::read_through(
const Def* base,
Defs index) {
22 auto [Tr, in, out] = rep->callee()->as<
App>()->uncurry_args<3>();
23 input = rep->arg(), s_in = in, s_out = out, rank = Tr->proj(2, 1), wraps =
true;
25 auto [in, out, i] = bc->args<3>();
27 input = i, s_in = in, s_out = out, rank =
r, wraps =
false;
34 if (!r || index.size() > *r)
return nullptr;
36 auto new_index =
DefVec(*r);
37 for (
u64 d = 0, i = 0;
d != *
r; ++
d) {
38 auto in_d = s_in->proj(*r, d);
39 auto out_d = s_out->proj(*r, d);
41 auto idx_d =
Lit::isa(out_d) == 1 ?
w.lit_idx(1, 0) : (i < index.size() ?
rewrite(index[i++]) :
nullptr);
42 if (!idx_d)
return nullptr;
47 new_index[
d] =
w.lit_idx(1, 0);
49 new_index[d] =
w.lit_idx(*e, *x % *e);
54 return w.extract(
rewrite(input),
w.tuple(new_index));
61 if (
auto r = index.rank())
62 if (
auto res = read_through(base,
DefVec(*r, [&](
size_t i) {
return index[i]; })))
return res;
67const Def* Lower::fastest_axis_2(
const App* app,
const Def* rank) {
73const Def* Lower::lower_via_impl(
const App* app,
const Def* impl) {
78 for (
const App* h = app; h; h = h->callee()->isa<App>())
84 for (
auto a :
args | std::views::reverse)
85 impl = w.app(impl, a);
110 return lower_via_impl(app, w.app(impl<tensor::product_2d_impl>(), fastest_axis_2(app, w.lit_nat(2))));
112 return lower_via_impl(app, w.app(impl<tensor::bmm_impl>(), fastest_axis_2(app, w.lit_nat(3))));
116 auto groups = app->
callee()->as<
App>()->callee()->as<
App>()->callee()->as<
App>();
118 return lower_via_impl(app, w.app(impl<tensor::dot_product_impl>(), fastest_axis_2(app,
rewrite(r2))));
const Def * callee() const
static const Def * peel(const Def *def)
Peel off all Id Axms from def.
static auto isa(const Def *def)
const Def * proj(nat_t a, nat_t i) const
Similar to World::extract while assuming an arity of a, but also works on Sigmas and Arrays.
static std::optional< T > isa(const Def *def)
const fe::Vector< std::string > & args()
Command-line arguments passed to this Phase's plugin via -X <plugin>:<arg>.
World & new_world()
Create new Defs into this.
const Def * rewrite_imm_App(const App *) override
virtual const Def * rewrite_imm_Extract(const Extract *)
virtual const Def * rewrite(const Def *)
constexpr Shape() noexcept=default
const Def * rewrite_imm_App(const App *) final
const Def * rewrite_imm_Extract(const Extract *) final
fe::View< const Def * > Defs
fe::Vector< const Def * > DefVec