ScheduleDAGEmit.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //===---- ScheduleDAGEmit.cpp - Emit routines for the ScheduleDAG class ---===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This implements the Emit routines for the ScheduleDAG class, which creates
  11. // MachineInstrs according to the computed schedule.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #define DEBUG_TYPE "pre-RA-sched"
  15. #include "llvm/CodeGen/ScheduleDAG.h"
  16. #include "llvm/CodeGen/MachineConstantPool.h"
  17. #include "llvm/CodeGen/MachineFunction.h"
  18. #include "llvm/CodeGen/MachineInstrBuilder.h"
  19. #include "llvm/CodeGen/MachineRegisterInfo.h"
  20. #include "llvm/Target/TargetData.h"
  21. #include "llvm/Target/TargetMachine.h"
  22. #include "llvm/Target/TargetInstrInfo.h"
  23. #include "llvm/Target/TargetLowering.h"
  24. #include "llvm/ADT/Statistic.h"
  25. #include "llvm/Support/CommandLine.h"
  26. #include "llvm/Support/Debug.h"
  27. #include "llvm/Support/MathExtras.h"
  28. using namespace llvm;
  29. void ScheduleDAG::AddMemOperand(MachineInstr *MI, const MachineMemOperand &MO) {
  30. MI->addMemOperand(*MF, MO);
  31. }
  32. void ScheduleDAG::EmitNoop() {
  33. TII->insertNoop(*BB, BB->end());
  34. }
  35. void ScheduleDAG::EmitCrossRCCopy(SUnit *SU,
  36. DenseMap<SUnit*, unsigned> &VRBaseMap) {
  37. for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
  38. I != E; ++I) {
  39. if (I->isCtrl()) continue; // ignore chain preds
  40. if (I->getSUnit()->CopyDstRC) {
  41. // Copy to physical register.
  42. DenseMap<SUnit*, unsigned>::iterator VRI = VRBaseMap.find(I->getSUnit());
  43. assert(VRI != VRBaseMap.end() && "Node emitted out of order - late");
  44. // Find the destination physical register.
  45. unsigned Reg = 0;
  46. for (SUnit::const_succ_iterator II = SU->Succs.begin(),
  47. EE = SU->Succs.end(); II != EE; ++II) {
  48. if (I->getReg()) {
  49. Reg = I->getReg();
  50. break;
  51. }
  52. }
  53. assert(I->getReg() && "Unknown physical register!");
  54. TII->copyRegToReg(*BB, BB->end(), Reg, VRI->second,
  55. SU->CopyDstRC, SU->CopySrcRC);
  56. } else {
  57. // Copy from physical register.
  58. assert(I->getReg() && "Unknown physical register!");
  59. unsigned VRBase = MRI.createVirtualRegister(SU->CopyDstRC);
  60. bool isNew = VRBaseMap.insert(std::make_pair(SU, VRBase)).second;
  61. isNew = isNew; // Silence compiler warning.
  62. assert(isNew && "Node emitted out of order - early");
  63. TII->copyRegToReg(*BB, BB->end(), VRBase, I->getReg(),
  64. SU->CopyDstRC, SU->CopySrcRC);
  65. }
  66. break;
  67. }
  68. }