44
55#include " symtab-ir.h"
66
7+ #include < algorithm>
78#include < iterator>
89#include < llvm/CodeGen/MachineFunction.h>
910#include < llvm/CodeGen/MachineModuleInfo.h>
@@ -173,7 +174,8 @@ void materialize_registers(MachineFunction &mf, Function &func, reg2vals &rmap,
173174 ArrayRef<Value *>{const_zero, arr_idx},
174175 rclass.get_name ());
175176 auto sorted_regs = std::set<unsigned >();
176- ranges::copy (rclass, std::inserter (sorted_regs, sorted_regs.end ()));
177+ ranges::transform (rclass, std::inserter (sorted_regs, sorted_regs.end ()),
178+ [](auto &&entry) { return entry.first ; });
177179 for (auto &&[reg_idx, reg] : sorted_regs | views::enumerate) {
178180 auto *array_reg_idx = ConstantInt::get (ctx, APInt (32 , reg_idx));
179181 auto *reg_src_addr = builder.CreateInBoundsGEP (
@@ -186,6 +188,10 @@ void materialize_registers(MachineFunction &mf, Function &func, reg2vals &rmap,
186188 Type::getIntNTy (ctx, rclass.get_register_size ()), reg_src_addr);
187189 builder.CreateStore (reg_val, reg_dst_addr);
188190 rmap.try_emplace (reg, reg_dst_addr);
191+ auto &&subregs = rclass.at (reg);
192+ ranges::for_each (subregs, [&](std::integral auto r) {
193+ rmap.try_emplace (r, reg_dst_addr);
194+ });
189195 }
190196 }
191197}
@@ -430,8 +436,9 @@ void assign_register_classes(const TargetSubtargetInfo &stinfo,
430436 assert (rinfo);
431437 for (auto &&[idx, reg_class] : enumerate(stats)) {
432438 auto found = find_if (rinfo->regclasses (), [®_class](auto &rclass) {
433- return all_of (reg_class,
434- [&rclass](auto reg) { return is_contained (*rclass, reg); });
439+ return all_of (reg_class, [&rclass](auto &®) {
440+ return is_contained (*rclass, reg.first );
441+ });
435442 });
436443 if (found == rinfo->regclass_end ()) {
437444 throw std::runtime_error (
@@ -453,17 +460,48 @@ register_stats collect_register_stats(const instr_impl &instr, Module &m,
453460 throw std::runtime_error (
454461 " register-classes were not specified in input YAML" );
455462 register_stats stats (rclasses.begin (), rclasses.end ());
463+ const MCRegisterInfo *rinfo = nullptr ;
464+ auto *stinfo = mmi.getTarget ().getSubtargetImpl (*m.begin ());
456465 for (auto &f : m) {
457466 auto &mf = mmi.getOrCreateMachineFunction (f);
458467 collect_register_stats_for (mf, mmi.getTarget (), stats);
468+ rinfo = stinfo->getRegisterInfo ();
459469 }
460470 assert (!m.empty ());
461- auto *stinfo = mmi.getTarget ().getSubtargetImpl (*m.begin ());
462471 assert (stinfo);
463472 assign_register_classes (*stinfo, stats);
464473 stats.erase (std::remove_if (stats.begin (), stats.end (),
465474 [](auto &rclass) { return rclass.empty (); }),
466475 stats.end ());
476+ for (auto &&[subregclass, aliasto] : instr.get_subregs ()) {
477+ auto found = ranges::find_if (stats, [&subregclass](auto &rclass) {
478+ return rclass.get_name () == subregclass;
479+ });
480+ if (found != stats.end ()) {
481+ auto found_aliasto = ranges::find_if (stats, [&aliasto](auto &rclass) {
482+ return rclass.get_name () == aliasto;
483+ });
484+ if (found_aliasto != stats.end ()) {
485+ for (auto &&[entry, subreg] : views::zip (*found_aliasto, *found)) {
486+ auto &&[_, subregs] = entry;
487+ subregs.push_back (subreg.first );
488+ }
489+ stats.erase (found);
490+ }
491+ }
492+ }
493+
494+ for (auto &®class : stats) {
495+ std::cerr << " \n REGCLASS: " << regclass.get_name () << ' \n ' ;
496+ for (auto &&r : regclass) {
497+ std::cerr << rinfo->getName (r.first ) << " : [ " ;
498+ for (auto subreg : r.second )
499+ std::cerr << rinfo->getName (subreg) << " " ;
500+ std::cerr << " ]\n " ;
501+ }
502+ std::cerr << ' \n ' ;
503+ }
504+
467505 return stats;
468506}
469507
0 commit comments