Identify unconditional gotos and generate a page sel instructions before them.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Thu, 25 Jun 2009 11:03:14 +0000 (11:03 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Thu, 25 Jun 2009 11:03:14 +0000 (11:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74172 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineInstrBuilder.h
lib/Target/PIC16/PIC16MemSelOpt.cpp

index 4adb84604440c86e523fe344bcc9858cdcff641c..2705565a85b8b1bb5e5714f065b5e102c85155e6 100644 (file)
@@ -133,6 +133,8 @@ public:
     if (MO.isGlobal())
       return addGlobalAddress(MO.getGlobal(), MO.getOffset(),
                               MO.getTargetFlags());
+    if (MO.isMBB())
+      return addMBB(MO.getMBB());
     if (MO.isCPI())
       return addConstantPoolIndex(MO.getIndex(), MO.getOffset(),
                                   MO.getTargetFlags());
index 20f926def398d0bfaf707bd5350f00f2bee266af..43d47ae5292f897257fef3b00c53cc9bd268b56e 100644 (file)
@@ -109,7 +109,7 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) {
 
   // If this insn is not going to access any memory, return.
   const TargetInstrDesc &TID = TII->get(MI->getOpcode());
-  if (! (TID.isCall() || TID.mayLoad() || TID.mayStore()))
+  if (!(TID.isBranch() || TID.isCall() || TID.mayLoad() || TID.mayStore()))
     return false;
 
   // Scan for the memory address operand.
@@ -119,8 +119,9 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) {
   for (unsigned i = 0; i < NumOperands; i++) {
     MachineOperand Op = MI->getOperand(i);
     if (Op.getType() ==  MachineOperand::MO_GlobalAddress ||
-        Op.getType() ==  MachineOperand::MO_ExternalSymbol) {
-      // We found one mem operand. Next one should be BS.
+        Op.getType() ==  MachineOperand::MO_ExternalSymbol || 
+        Op.getType() ==  MachineOperand::MO_MachineBasicBlock) {
+      // We found one mem operand. Next one may be BS.
       MemOpPos = i;
       break;
     }
@@ -133,7 +134,8 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) {
   MachineOperand &Op = MI->getOperand(MemOpPos);
 
   // If this is a pagesel material, handle it first.
-  if (MI->getOpcode() == PIC16::CALL) {
+  if (MI->getOpcode() == PIC16::CALL ||
+      MI->getOpcode() == PIC16::br_uncond) {
     DebugLoc dl = MI->getDebugLoc();
     BuildMI(*MBB, MI, dl, TII->get(PIC16::pagesel)).
       addOperand(Op);