|
@@ -48,22 +48,12 @@ struct GotoVariable : FlagTag {
|
|
|
u32 index;
|
|
u32 index;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-struct LoopSafetyVariable {
|
|
|
|
|
- LoopSafetyVariable() = default;
|
|
|
|
|
- explicit LoopSafetyVariable(u32 index_) : index{index_} {}
|
|
|
|
|
-
|
|
|
|
|
- auto operator<=>(const LoopSafetyVariable&) const noexcept = default;
|
|
|
|
|
-
|
|
|
|
|
- u32 index;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
struct IndirectBranchVariable {
|
|
struct IndirectBranchVariable {
|
|
|
auto operator<=>(const IndirectBranchVariable&) const noexcept = default;
|
|
auto operator<=>(const IndirectBranchVariable&) const noexcept = default;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-using Variant =
|
|
|
|
|
- std::variant<IR::Reg, IR::Pred, ZeroFlagTag, SignFlagTag, CarryFlagTag, OverflowFlagTag,
|
|
|
|
|
- GotoVariable, LoopSafetyVariable, IndirectBranchVariable>;
|
|
|
|
|
|
|
+using Variant = std::variant<IR::Reg, IR::Pred, ZeroFlagTag, SignFlagTag, CarryFlagTag,
|
|
|
|
|
+ OverflowFlagTag, GotoVariable, IndirectBranchVariable>;
|
|
|
using ValueMap = boost::container::flat_map<IR::Block*, IR::Value>;
|
|
using ValueMap = boost::container::flat_map<IR::Block*, IR::Value>;
|
|
|
|
|
|
|
|
struct DefTable {
|
|
struct DefTable {
|
|
@@ -88,13 +78,6 @@ struct DefTable {
|
|
|
goto_vars[variable.index].insert_or_assign(block, value);
|
|
goto_vars[variable.index].insert_or_assign(block, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const IR::Value& Def(IR::Block* block, LoopSafetyVariable variable) {
|
|
|
|
|
- return loop_safety_vars[variable.index][block];
|
|
|
|
|
- }
|
|
|
|
|
- void SetDef(IR::Block* block, LoopSafetyVariable variable, const IR::Value& value) {
|
|
|
|
|
- loop_safety_vars[variable.index].insert_or_assign(block, value);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
const IR::Value& Def(IR::Block* block, IndirectBranchVariable) {
|
|
const IR::Value& Def(IR::Block* block, IndirectBranchVariable) {
|
|
|
return indirect_branch_var[block];
|
|
return indirect_branch_var[block];
|
|
|
}
|
|
}
|
|
@@ -132,7 +115,6 @@ struct DefTable {
|
|
|
|
|
|
|
|
std::array<ValueMap, IR::NUM_USER_PREDS> preds;
|
|
std::array<ValueMap, IR::NUM_USER_PREDS> preds;
|
|
|
boost::container::flat_map<u32, ValueMap> goto_vars;
|
|
boost::container::flat_map<u32, ValueMap> goto_vars;
|
|
|
- boost::container::flat_map<u32, ValueMap> loop_safety_vars;
|
|
|
|
|
ValueMap indirect_branch_var;
|
|
ValueMap indirect_branch_var;
|
|
|
ValueMap zero_flag;
|
|
ValueMap zero_flag;
|
|
|
ValueMap sign_flag;
|
|
ValueMap sign_flag;
|
|
@@ -152,10 +134,6 @@ IR::Opcode UndefOpcode(const FlagTag&) noexcept {
|
|
|
return IR::Opcode::UndefU1;
|
|
return IR::Opcode::UndefU1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-IR::Opcode UndefOpcode(const LoopSafetyVariable&) noexcept {
|
|
|
|
|
- return IR::Opcode::UndefU32;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
IR::Opcode UndefOpcode(IndirectBranchVariable) noexcept {
|
|
IR::Opcode UndefOpcode(IndirectBranchVariable) noexcept {
|
|
|
return IR::Opcode::UndefU32;
|
|
return IR::Opcode::UndefU32;
|
|
|
}
|
|
}
|
|
@@ -337,9 +315,6 @@ void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
|
|
|
case IR::Opcode::SetGotoVariable:
|
|
case IR::Opcode::SetGotoVariable:
|
|
|
pass.WriteVariable(GotoVariable{inst.Arg(0).U32()}, block, inst.Arg(1));
|
|
pass.WriteVariable(GotoVariable{inst.Arg(0).U32()}, block, inst.Arg(1));
|
|
|
break;
|
|
break;
|
|
|
- case IR::Opcode::SetLoopSafetyVariable:
|
|
|
|
|
- pass.WriteVariable(LoopSafetyVariable{inst.Arg(0).U32()}, block, inst.Arg(1));
|
|
|
|
|
- break;
|
|
|
|
|
case IR::Opcode::SetIndirectBranchVariable:
|
|
case IR::Opcode::SetIndirectBranchVariable:
|
|
|
pass.WriteVariable(IndirectBranchVariable{}, block, inst.Arg(0));
|
|
pass.WriteVariable(IndirectBranchVariable{}, block, inst.Arg(0));
|
|
|
break;
|
|
break;
|
|
@@ -368,9 +343,6 @@ void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
|
|
|
case IR::Opcode::GetGotoVariable:
|
|
case IR::Opcode::GetGotoVariable:
|
|
|
inst.ReplaceUsesWith(pass.ReadVariable(GotoVariable{inst.Arg(0).U32()}, block));
|
|
inst.ReplaceUsesWith(pass.ReadVariable(GotoVariable{inst.Arg(0).U32()}, block));
|
|
|
break;
|
|
break;
|
|
|
- case IR::Opcode::GetLoopSafetyVariable:
|
|
|
|
|
- inst.ReplaceUsesWith(pass.ReadVariable(LoopSafetyVariable{inst.Arg(0).U32()}, block));
|
|
|
|
|
- break;
|
|
|
|
|
case IR::Opcode::GetIndirectBranchVariable:
|
|
case IR::Opcode::GetIndirectBranchVariable:
|
|
|
inst.ReplaceUsesWith(pass.ReadVariable(IndirectBranchVariable{}, block));
|
|
inst.ReplaceUsesWith(pass.ReadVariable(IndirectBranchVariable{}, block));
|
|
|
break;
|
|
break;
|