|
| DoStrengthReduction (bool enableSubConstToAddTransform) |
|
const IR::Node * | postorder (IR::Add *expr) override |
|
const IR::Node * | postorder (IR::ArrayIndex *expr) override |
|
const IR::Node * | postorder (IR::BAnd *expr) override |
|
const IR::Node * | postorder (IR::BOr *expr) override |
|
const IR::Node * | postorder (IR::BXor *expr) override |
|
const IR::Node * | postorder (IR::Cmpl *expr) override |
|
const IR::Node * | postorder (IR::Concat *expr) override |
|
const IR::Node * | postorder (IR::Div *expr) override |
|
const IR::Node * | postorder (IR::Equ *expr) override |
|
const IR::Node * | postorder (IR::LAnd *expr) override |
|
const IR::Node * | postorder (IR::LNot *expr) override |
|
const IR::Node * | postorder (IR::LOr *expr) override |
|
const IR::Node * | postorder (IR::Mask *expr) override |
|
const IR::Node * | postorder (IR::Mod *expr) override |
|
const IR::Node * | postorder (IR::Mul *expr) override |
|
const IR::Node * | postorder (IR::Mux *expr) override |
|
const IR::Node * | postorder (IR::Neq *expr) override |
|
virtual const IR::Node * | postorder (IR::Node *n) |
|
const IR::Node * | postorder (IR::PlusSlice *expr) override |
|
const IR::Node * | postorder (IR::Range *expr) override |
|
const IR::Node * | postorder (IR::Shl *expr) override |
|
const IR::Node * | postorder (IR::Shr *expr) override |
|
const IR::Node * | postorder (IR::Slice *expr) override |
|
const IR::Node * | postorder (IR::Sub *expr) override |
|
const IR::Node * | postorder (IR::UPlus *expr) override |
|
const IR::BlockStatement * | preorder (IR::BlockStatement *bs) override |
|
const IR::Node * | apply_visitor (const IR::Node *, const char *name=0) override |
|
profile_t | init_apply (const IR::Node *root) override |
|
virtual void | loop_revisit (const IR::Node *) |
|
virtual const IR::Node * | preorder (IR::Node *n) |
|
void | prune () |
|
virtual void | revisit (const IR::Node *, const IR::Node *) |
|
void | revisit_visited () |
|
bool | visit_in_progress (const IR::Node *) const |
|
void | visitAgain () const override |
|
void | visitOnce () const override |
|
virtual bool | check_global (cstring) |
|
virtual void | clear_globals () |
|
virtual Visitor * | clone () const |
|
virtual ControlFlowVisitor * | controlFlowVisitor () |
|
virtual void | end_apply () |
|
virtual void | end_apply (const IR::Node *root) |
|
virtual void | erase_global (cstring) |
|
template<class T > |
const T * | findContext () const |
|
template<class T > |
const T * | findContext (const Context *&c) const |
|
template<class T > |
const T * | findOrigCtxt () const |
|
template<class T > |
const T * | findOrigCtxt (const Context *&c) const |
|
virtual Visitor & | flow_clone () |
|
virtual void | flow_merge (Visitor &) |
|
virtual bool | flow_merge_closure (Visitor &) |
|
virtual void | flow_merge_global_from (cstring) |
|
virtual void | flow_merge_global_to (cstring) |
|
const Context * | getChildContext () const |
|
int | getChildrenVisited () const |
|
const Context * | getContext () const |
|
int | getContextDepth () const |
|
const IR::Node * | getCurrentNode () const |
|
template<class T > |
const T * | getCurrentNode () const |
|
const IR::Node * | getOriginal () const |
|
template<class T > |
const T * | getOriginal () const |
|
template<class T > |
const T * | getParent () const |
|
virtual bool | has_flow_joins () const |
|
profile_t | init_apply (const IR::Node *root, const Context *parent_context) |
|
bool | isInContext (const IR::Node *n) const |
|
virtual const char * | name () const |
|
template<class T > |
void | parallel_visit (const IR::Vector< T > &v, const char *name, int cidx) |
|
template<class T > |
void | parallel_visit (const IR::Vector< T > &v, const char *name=0) |
|
template<class T > |
void | parallel_visit (IR::Vector< T > &v, const char *name, int cidx) |
|
template<class T > |
void | parallel_visit (IR::Vector< T > &v, const char *name=0) |
|
void | print_context () const |
|
const Visitor & | setCalledBy (const Visitor *visitor) |
|
void | setName (const char *name) |
|
void | visit (const IR::Node &n, const char *name, int cidx) |
|
void | visit (const IR::Node &n, const char *name=0) |
|
void | visit (const IR::Node *&n, const char *name, int cidx) |
|
void | visit (const IR::Node *&n, const char *name=0) |
|
void | visit (const IR::Node *const &n, const char *name, int cidx) |
|
void | visit (const IR::Node *const &n, const char *name=0) |
|
void | visit (IR::Node &n, const char *name, int cidx) |
|
void | visit (IR::Node &n, const char *name=0) |
|
void | visit (IR::Node *&, const char *=0, int=0) |
|
template<class T , typename = std::enable_if_t<Util::has_SourceInfo_v<T> && !std::is_pointer_v<T>>, class... Args> |
void | warn (const int kind, const char *format, const T &node, Args &&...args) |
| The const ref variant of the above.
|
|
template<class T , typename = std::enable_if_t<Util::has_SourceInfo_v<T>>, class... Args> |
void | warn (const int kind, const char *format, const T *node, Args &&...args) |
|
bool | warning_enabled (int warning_kind) const |
|
Implements a pass that replaces expensive arithmetic and boolean operations with cheaper ones – i.e., strength reduction
Specifically, it provides:
- A collection of helper methods that determine whether a given expression is
0
, 1
, true
, or false
, or a power of 2
- A visitor that transforms arithmetic and boolean expressions
- Precondition
- : None
- Postcondition
- : Ensure that
- most arithmetic and boolean expressions are simplified
- division and modulus by
0