-
Notifications
You must be signed in to change notification settings - Fork 0
/
constant_fold.cc
91 lines (69 loc) · 2.48 KB
/
constant_fold.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <cstdint>
#include "../graph/builder.hh"
//
#include "opt_passes/constant_fold.hh"
namespace jj_vm::testing {
class FoldingBuilder : public TestBuilder {
protected:
jj_vm::passes::ConstantFold m_pass;
jj_vm::ir::IRBuilder m_builder{};
};
TEST_F(FoldingBuilder, MUL) {
init_test(1);
auto bb0 = get_bb(0);
m_builder.set_insert_point(bb0);
auto *lval = m_builder.create<jj_vm::ir::ConstI64>(32);
auto *rval = m_builder.create<jj_vm::ir::ConstI64>(2);
auto *result = m_builder.create<jj_vm::ir::BinInstr>(jj_vm::ir::Opcode::MUL,
lval, rval);
//
m_pass.run(m_func.get());
ASSERT_EQ(bb0->size(), 3);
const auto &last_instr = bb0->back();
//
ASSERT_EQ(last_instr.opcode(), jj_vm::ir::Opcode::CONST);
ASSERT_EQ(last_instr.type(), jj_vm::ir::TypeId::I64);
const auto &folded_const =
static_cast<const jj_vm::ir::ConstI64&>(last_instr);
ASSERT_EQ(folded_const.val(), 64);
}
TEST_F(FoldingBuilder, SHR) {
init_test(1);
auto bb0 = get_bb(0);
m_builder.set_insert_point(bb0);
auto *lval = m_builder.create<jj_vm::ir::ConstI64>(32);
auto *rval = m_builder.create<jj_vm::ir::ConstI64>(1);
auto *result = m_builder.create<jj_vm::ir::BinInstr>(jj_vm::ir::Opcode::SHR,
lval, rval);
//
m_pass.run(m_func.get());
ASSERT_EQ(bb0->size(), 3);
const auto &last_instr = bb0->back();
//
ASSERT_EQ(last_instr.opcode(), jj_vm::ir::Opcode::CONST);
ASSERT_EQ(last_instr.type(), jj_vm::ir::TypeId::I64);
const auto&folded_const =
static_cast<const jj_vm::ir::ConstI64 &>(last_instr);
ASSERT_EQ(folded_const.val(), 16);
}
TEST_F(FoldingBuilder, XOR) {
init_test(1);
auto bb0 = get_bb(0);
m_builder.set_insert_point(bb0);
auto *lval = m_builder.create<jj_vm::ir::ConstI64>(32);
auto *rval = m_builder.create<jj_vm::ir::ConstI64>(1);
auto *result = m_builder.create<jj_vm::ir::BinInstr>(jj_vm::ir::Opcode::XOR,
lval, rval);
//
m_pass.run(m_func.get());
ASSERT_EQ(bb0->size(), 3);
const auto &last_instr = bb0->back();
//
ASSERT_EQ(last_instr.opcode(), jj_vm::ir::Opcode::CONST);
ASSERT_EQ(last_instr.type(), jj_vm::ir::TypeId::I64);
//
const auto &folded_const =
static_cast<const jj_vm::ir::ConstI64&>(last_instr);
ASSERT_EQ(folded_const.val(), 33);
}
}