feat: first prototype of optimizers + alloca optimizer
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
#pragma once
|
||||
#include "prelude/string.hpp"
|
||||
#include "parser/nodes.hpp"
|
||||
#include "ir/value.hpp"
|
||||
#include "ir/op.hpp"
|
||||
#include "ir/block.hpp"
|
||||
@@ -21,7 +20,7 @@ namespace IR
|
||||
{
|
||||
StringBuilder sb;
|
||||
sb.AppendIndent(indent);
|
||||
sb << "EXTRN " << m_symbol.c_str();
|
||||
sb << "extern " << m_symbol.c_str();
|
||||
return sb.view();
|
||||
}
|
||||
|
||||
@@ -46,7 +45,7 @@ namespace IR
|
||||
{
|
||||
StringBuilder sb;
|
||||
sb.AppendIndent(indent);
|
||||
sb << "LABEL " << m_name.c_str() << ':' << '\n';
|
||||
sb << "label " << m_name.c_str() << ':' << '\n';
|
||||
sb << m_body.Format(indent);
|
||||
return sb.view();
|
||||
}
|
||||
@@ -79,7 +78,7 @@ namespace IR
|
||||
{
|
||||
StringBuilder sb;
|
||||
sb.AppendIndent(indent);
|
||||
sb << result()->Format() << " = ALLOCATE " << m_typ->Format();
|
||||
sb << result()->Format() << " = allocate " << m_typ->Format();
|
||||
return sb.view();
|
||||
}
|
||||
|
||||
@@ -90,8 +89,8 @@ namespace IR
|
||||
class LoadOp : public OpValued
|
||||
{
|
||||
public:
|
||||
LoadOp(ValueHandle *dest, StringView addr)
|
||||
: OpValued(dest), m_addr(addr) {}
|
||||
LoadOp(ValueHandle *dest, Pointer *ptr)
|
||||
: OpValued(dest), m_ptr(ptr) {}
|
||||
~LoadOp() {}
|
||||
|
||||
OP_TYPE(LOAD)
|
||||
@@ -100,15 +99,12 @@ namespace IR
|
||||
{
|
||||
StringBuilder sb;
|
||||
sb.AppendIndent(indent);
|
||||
sb << result()->Format() << " = LOAD \"" << m_addr.c_str() << "\"";
|
||||
sb << result()->Format() << " = load " << m_ptr->Format();
|
||||
return sb.view();
|
||||
}
|
||||
|
||||
public:
|
||||
const StringView &addr() const { return m_addr; }
|
||||
|
||||
private:
|
||||
StringView m_addr;
|
||||
Pointer* m_ptr;
|
||||
};
|
||||
|
||||
class StoreOp : public Op
|
||||
@@ -124,7 +120,7 @@ namespace IR
|
||||
{
|
||||
StringBuilder sb;
|
||||
sb.AppendIndent(indent);
|
||||
sb << "STORE " << src()->Format() << ", " << dst()->Format();
|
||||
sb << "store " << src()->Format() << ", " << dst()->Format();
|
||||
return sb.view();
|
||||
}
|
||||
|
||||
@@ -152,13 +148,14 @@ namespace IR
|
||||
switch (m_typ)
|
||||
{
|
||||
case OpType::ADD:
|
||||
return StringView("ADD");
|
||||
return StringView("add");
|
||||
case OpType::MUL:
|
||||
return StringView("MUL");
|
||||
return StringView("mul");
|
||||
case OpType::SUB:
|
||||
return StringView("SUB");
|
||||
return StringView("sub");
|
||||
case OpType::DIV:
|
||||
return StringView("DIV");
|
||||
return StringView("div");
|
||||
default: break;
|
||||
}
|
||||
|
||||
assert(false && "unreachable");
|
||||
@@ -198,10 +195,10 @@ namespace IR
|
||||
for (size_t i = 0; i < m_args.size; ++i)
|
||||
{
|
||||
sb.AppendIndent(indent);
|
||||
sb << "PARAM " << m_args.data[i]->Format() << '\n';
|
||||
sb << "param " << m_args.data[i]->Format() << '\n';
|
||||
}
|
||||
sb.AppendIndent(indent);
|
||||
sb << result()->Format() << " = CALL " << m_callee.c_str();
|
||||
sb << result()->Format() << " = call " << m_callee.c_str();
|
||||
return sb.view();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user