Thorin 1.9.0
The Higher ORder INtermediate representation
Loading...
Searching...
No Matches
normalize.h
Go to the documentation of this file.
1#pragma once
2
3#include "thorin/def.h"
4
5namespace thorin {
6
7/// Utility class when folding constants in normalizers.
8class Res {
9public:
11 : data_{} {}
12 template<class T>
13 Res(T val)
14 : data_(thorin::bitcast<u64>(val)) {}
15
16 constexpr const u64& operator*() const& { return *data_; }
17 constexpr u64& operator*() & { return *data_; }
18 explicit operator bool() const { return data_.has_value(); }
19
20private:
21 std::optional<u64> data_;
22};
23
24/// Swap Lit to left - or smaller Def::gid, if no lit present.
25inline void commute(const Def*& a, const Def*& b) {
26 if (b->isa<Lit>() || (a->gid() > b->gid() && !a->isa<Lit>())) std::swap(a, b);
27}
28
29} // namespace thorin
Base class for all Defs.
Definition def.h:222
u32 gid() const
Definition def.h:238
Utility class when folding constants in normalizers.
Definition normalize.h:8
Res(T val)
Definition normalize.h:13
constexpr const u64 & operator*() const &
Definition normalize.h:16
constexpr u64 & operator*() &
Definition normalize.h:17
Definition cfg.h:11
uint64_t u64
Definition types.h:35
D bitcast(const S &src)
A bitcast from src of type S to D.
Definition util.h:26
void commute(const Def *&a, const Def *&b)
Swap Lit to left - or smaller Def::gid, if no lit present.
Definition normalize.h:25