@@ -22,8 +22,8 @@ void ssa::optimize(const std::unique_ptr<furlang::ir::function>& func) {
|
|||||||
block_map_t predecessors;
|
block_map_t predecessors;
|
||||||
block_map_t successors;
|
block_map_t successors;
|
||||||
|
|
||||||
std::unordered_map<furlang::ir::register_operand, std::unordered_set<furlang::ir::block_index>> regSites;
|
std::unordered_map<furlang::ir::register_t, std::unordered_set<furlang::ir::block_index>> regSites;
|
||||||
std::unordered_map<furlang::ir::block_index, std::unordered_set<furlang::ir::register_operand>> regUses;
|
std::unordered_map<furlang::ir::block_index, std::unordered_set<furlang::ir::register_t>> regUses;
|
||||||
|
|
||||||
std::unordered_map<furlang::ir::block_index, furlang::ir::block_index> idoms;
|
std::unordered_map<furlang::ir::block_index, furlang::ir::block_index> idoms;
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ void ssa::optimize(const std::unique_ptr<furlang::ir::function>& func) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unordered_map<furlang::ir::block_index, std::unordered_set<furlang::ir::register_operand>> phis;
|
std::unordered_map<furlang::ir::block_index, std::unordered_set<furlang::ir::register_t>> phis;
|
||||||
|
|
||||||
for (const auto& [reg, blocks] : regSites) {
|
for (const auto& [reg, blocks] : regSites) {
|
||||||
std::vector<furlang::ir::block_index> worklist(blocks.begin(), blocks.end());
|
std::vector<furlang::ir::block_index> worklist(blocks.begin(), blocks.end());
|
||||||
|
|||||||
@@ -19,11 +19,33 @@ enum class operand_t {
|
|||||||
String, /**< String */
|
String, /**< String */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Alias to a register type.
|
||||||
|
*/
|
||||||
|
using register_t = std::uint32_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Register operand alias.
|
* @brief Register operand alias.
|
||||||
* @see operand_t::Register
|
* @see operand_t::Register
|
||||||
*/
|
*/
|
||||||
using register_operand = std::uint32_t;
|
struct register_operand {
|
||||||
|
register_t reg;
|
||||||
|
std::uint32_t ver = 0;
|
||||||
|
|
||||||
|
register_operand(register_t reg)
|
||||||
|
: reg(reg) {}
|
||||||
|
|
||||||
|
register_operand(register_t reg, std::uint32_t ver)
|
||||||
|
: reg(reg), ver(ver) {}
|
||||||
|
|
||||||
|
operator std::uint32_t&() { return reg; }
|
||||||
|
operator const std::uint32_t&() const { return reg; }
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& os, const register_operand& op) {
|
||||||
|
return os << op.reg << '_' << op.ver;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Variable operand alias.
|
* @brief Variable operand alias.
|
||||||
* @see operand_t::Variable
|
* @see operand_t::Variable
|
||||||
@@ -108,10 +130,10 @@ public:
|
|||||||
* @param value Value of the new register operand.
|
* @param value Value of the new register operand.
|
||||||
* @return The register operand.
|
* @return The register operand.
|
||||||
*/
|
*/
|
||||||
static operand new_reg(register_operand value) {
|
static operand new_reg(register_t value) {
|
||||||
operand operand;
|
operand operand;
|
||||||
operand.m_type = operand_t::Register;
|
operand.m_type = operand_t::Register;
|
||||||
operand.m_value.reg = value;
|
operand.m_value.reg = { value, 0 };
|
||||||
return operand;
|
return operand;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,4 +250,4 @@ private:
|
|||||||
} // namespace ir
|
} // namespace ir
|
||||||
} // namespace furlang
|
} // namespace furlang
|
||||||
|
|
||||||
#endif // FURLANG_IR_OPERAND_HPP
|
#endif // FURLANG_IR_OPERAND_HPP
|
||||||
|
|||||||
Reference in New Issue
Block a user