#pragma once #include "ir/op.hpp" #include "prelude/linkedlist.hpp" namespace IR { class Optimizer { public: virtual bool Apply(DoubleLinkedList& ops) = 0; }; class AllocOptimizer : public Optimizer { public: bool Apply(DoubleLinkedList& ops) override { for (ListNode* cur = ops.Begin(); cur != nullptr; ) { auto op = cur->value; if (op->GetType() == OpType::ALLOCATE) { auto tmp = cur; cur = cur->next; ops.SpliceFront(tmp); } else { cur = cur->next; } } return true; } }; }