Thorin 1.9.0
The Higher ORder INtermediate representation
Loading...
Searching...
No Matches
thorin::plug::affine::LowerFor Class Reference

Lowers the for axiom to actual control flow in CPS. More...

#include <thorin/plug/affine/pass/lower_for.h>

Inheritance diagram for thorin::plug::affine::LowerFor:
[legend]

Public Member Functions

 LowerFor (PassMan &man)
 
Ref rewrite (Ref) override
 
- Public Member Functions inherited from thorin::RWPass< LowerFor, Lam >
 RWPass (PassMan &man, std::string_view name)
 
bool inspect () const override
 Should the PassMan even consider this pass?
 
Lamcurr_mut () const
 
- Public Member Functions inherited from thorin::Pass
 Pass (PassMan &, std::string_view name)
 
virtual ~Pass ()=default
 
Worldworld ()
 
PassManman ()
 
const PassManman () const
 
std::string_view name () const
 
size_t index () const
 
virtual Ref rewrite (const Var *var)
 
virtual Ref rewrite (const Proxy *proxy)
 
virtual undo_t analyze (Ref)
 
virtual undo_t analyze (const Var *)
 
virtual undo_t analyze (const Proxy *)
 
virtual bool fixed_point () const
 
virtual void enter ()
 Invoked just before Pass::rewriteing PassMan::curr_mut's body.
 
virtual void prepare ()
 Invoked once before entering the main rewrite loop.
 
const Proxyproxy (Ref type, Defs ops, u32 tag=0)
 
const Proxyisa_proxy (Ref def, u32 tag=0)
 Check whether given def is a Proxy whose Proxy::pass matches this Pass's IPass::index.
 
const Proxyas_proxy (Ref def, u32 tag=0)
 

Detailed Description

Lowers the for axiom to actual control flow in CPS.

It basically mimics this implementation:

.con %affine.For_impl
(m: .Nat , n: .Nat , Ts: «n; *»)
(begin: .Idx m, end: .Idx m, step: .Idx m, init: «i: n; Ts#i»,
body: .Cn [iter: .Idx m, acc: «i: n; Ts#i», yield: .Cn [«i: n; Ts#i»]],
exit: .Cn [«i: n; Ts#i»]
) =
.con head(iter: .Idx m, acc: «i: n; Ts#i») =
.con new_body() = body (iter, acc, .cn acc: «i: n; Ts#i» =
.let `iter = %core.wrap.add %core.mode.nsuw (iter, step);
head (iter, acc));
.con new_exit() = exit (acc);
(new_exit, new_body)#(%core.icmp.ul (iter, end)) ();
head(begin, init);
A built-in constant of type .Nat -> *.
Definition def.h:745
The core Plugin
Definition core.h:8

However, we merge init/acc into the signature, as it may contain a mem. In this case we have to equip new_body/new_exit with a mem as well.

Todo:
We probably want to have phases which fix such things so we don't have to do this in C++.

Definition at line 29 of file lower_for.h.

Constructor & Destructor Documentation

◆ LowerFor()

thorin::plug::affine::LowerFor::LowerFor ( PassMan man)
inline

Definition at line 31 of file lower_for.h.

Member Function Documentation

◆ rewrite()


The documentation for this class was generated from the following files: