diff options
Diffstat (limited to 'llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp b/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp index aa9a715718bf..05b95d8b7314 100644 --- a/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp +++ b/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp @@ -379,6 +379,7 @@ namespace { using AssignmentMap = std::map<ExtenderInit, IndexList>; using LocDefList = std::vector<std::pair<Loc, IndexList>>; + const HexagonSubtarget *HST = nullptr; const HexagonInstrInfo *HII = nullptr; const HexagonRegisterInfo *HRI = nullptr; MachineDominatorTree *MDT = nullptr; @@ -1562,13 +1563,31 @@ HCE::Register HCE::insertInitializer(Loc DefL, const ExtenderInit &ExtI) { .add(ExtOp); } } else { - unsigned NewOpc = Ex.Neg ? Hexagon::S4_subi_asl_ri - : Hexagon::S4_addi_asl_ri; - // DefR = add(##EV,asl(Rb,S)) - InitI = BuildMI(MBB, At, dl, HII->get(NewOpc), DefR) - .add(ExtOp) - .add(MachineOperand(Ex.Rs)) - .addImm(Ex.S); + if (HST->useCompound()) { + unsigned NewOpc = Ex.Neg ? Hexagon::S4_subi_asl_ri + : Hexagon::S4_addi_asl_ri; + // DefR = add(##EV,asl(Rb,S)) + InitI = BuildMI(MBB, At, dl, HII->get(NewOpc), DefR) + .add(ExtOp) + .add(MachineOperand(Ex.Rs)) + .addImm(Ex.S); + } else { + // No compounds are available. It is not clear whether we should + // even process such extenders where the initializer cannot be + // a single instruction, but do it for now. + unsigned TmpR = MRI->createVirtualRegister(&Hexagon::IntRegsRegClass); + BuildMI(MBB, At, dl, HII->get(Hexagon::S2_asl_i_r), TmpR) + .add(MachineOperand(Ex.Rs)) + .addImm(Ex.S); + if (Ex.Neg) + InitI = BuildMI(MBB, At, dl, HII->get(Hexagon::A2_subri), DefR) + .add(ExtOp) + .add(MachineOperand(Register(TmpR, 0))); + else + InitI = BuildMI(MBB, At, dl, HII->get(Hexagon::A2_addi), DefR) + .add(MachineOperand(Register(TmpR, 0))) + .add(ExtOp); + } } } @@ -1952,8 +1971,9 @@ bool HCE::runOnMachineFunction(MachineFunction &MF) { } LLVM_DEBUG(MF.print(dbgs() << "Before " << getPassName() << '\n', nullptr)); - HII = MF.getSubtarget<HexagonSubtarget>().getInstrInfo(); - HRI = MF.getSubtarget<HexagonSubtarget>().getRegisterInfo(); + HST = &MF.getSubtarget<HexagonSubtarget>(); + HII = HST->getInstrInfo(); + HRI = HST->getRegisterInfo(); MDT = &getAnalysis<MachineDominatorTree>(); MRI = &MF.getRegInfo(); AssignmentMap IMap; |