← index
cplusplus2x.Examples/C++20/scanner/ETL/ir_opt.hpp
Source: cplusplus2x.Examples/C++20/scanner/ETL/ir_opt.hpp
#ifndef _IR_OP_H_

#define _IR_OP_H_


#include "ir.hpp"

#include <unordered_map>

#include <unordered_set>


namespace ir {

    class IROptimizer {
      public:
        IRCode optimize(const IRCode &originalCode) {
            IRCode optimizedCode;
            std::unordered_map<std::string, std::string> lastValueMapping;

            for (const auto &instr : originalCode) {
                switch (instr.type) {
                case InstructionType::LOAD_CONST:
                    lastValueMapping[instr.dest] = instr.op1;
                    optimizedCode.push_back(instr);
                    break;

                case InstructionType::ASSIGN:
                    if (lastValueMapping[instr.dest] == instr.op1) {
                        continue;
                    }
                    lastValueMapping[instr.dest] = instr.op1;
                    optimizedCode.push_back(instr);
                    break;

                case InstructionType::ADD:
                case InstructionType::SUB:
                case InstructionType::MUL:
                case InstructionType::DIV:
                case InstructionType::NEG:
                case InstructionType::CONCAT:
                    lastValueMapping[instr.dest] = instr.dest;
                    optimizedCode.push_back(instr);
                    break;

                case InstructionType::CALL:
                    for (const auto &arg : instr.args) {
                        lastValueMapping[arg].clear();
                    }
                    lastValueMapping[instr.dest] = instr.dest;
                    optimizedCode.push_back(instr);
                    break;

                case InstructionType::RETURN:
                case InstructionType::LABEL:
                    lastValueMapping.clear();
                    optimizedCode.push_back(instr);
                    break;

                default:
                    optimizedCode.push_back(instr);
                    break;
                }
            }

            return optimizedCode;
        }
    };

} // namespace ir


#endif