Added phi elimination code
authorRuchira Sasanka <sasanka@students.uiuc.edu>
Mon, 12 Nov 2001 14:45:33 +0000 (14:45 +0000)
committerRuchira Sasanka <sasanka@students.uiuc.edu>
Mon, 12 Nov 2001 14:45:33 +0000 (14:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1265 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9InstrSelection.cpp
lib/Target/SparcV9/SparcV9Internals.h
lib/Target/SparcV9/SparcV9RegInfo.cpp

index 266d42435af7d1b6a88d1d114fa7200c29307e78..533d74c15f91bf3c31f2d003ebf8d8052ee26080 100644 (file)
@@ -943,11 +943,12 @@ ForwardOperand(InstructionNode* treeNode,
 }
 
 
-void
+
+void UltraSparcInstrInfo::
 CreateCopyInstructionsByType(const TargetMachine& target,
                              Value* src,
                              Instruction* dest,
-                             vector<MachineInstr*>& minstrVec)
+                             vector<MachineInstr*>& minstrVec) const
 {
   bool loadConstantToReg = false;
   
@@ -1004,6 +1005,7 @@ CreateCopyInstructionsByType(const TargetMachine& target,
 }
 
 
+
 //******************* Externally Visible Functions *************************/
 
 
@@ -2048,7 +2050,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
       else
         {
           vector<MachineInstr*> minstrVec;
-          CreateCopyInstructionsByType(target,
+          target.getInstrInfo().CreateCopyInstructionsByType(target,
                 subtreeRoot->getInstruction()->getOperand(forwardOperandNum),
                 subtreeRoot->getInstruction(), minstrVec);
           assert(minstrVec.size() > 0);
index 0e48b96a3d131ce47b24e64833655f42a9200d6b..9b8fe177ef2753ca32638582630994477dbb5e65 100644 (file)
@@ -139,6 +139,15 @@ public:
                                            vector<MachineInstr*>& minstrVec,
                                            vector<TmpInstruction*>& tempVec,
                                            TargetMachine& target) const;
+
+ // create copy instruction(s)
+  virtual void
+  CreateCopyInstructionsByType(const TargetMachine& target,
+                             Value* src,
+                             Instruction* dest,
+                             vector<MachineInstr*>& minstrVec) const;
+
+
 };
 
 
@@ -1278,7 +1287,7 @@ private:
   static const int MinStackFrameSize                       = 176;
   static const int NumFixedOutgoingArgs                    =   6;
   static const int SizeOfEachArgOnStack                    =   8;
-  static const int StaticAreaOffsetFromFP                  =   0 + OFFSET;
+  static const int StaticAreaOffsetFromFP                  =  0 + OFFSET;
   static const int FirstIncomingArgOffsetFromFP            = 128 + OFFSET;
   static const int FirstOptionalIncomingArgOffsetFromFP    = 176 + OFFSET;
   static const int FirstOutgoingArgOffsetFromSP            = 128 + OFFSET;
index cb7009d4de0d8ffb640a68d95537b3bf07ecf847..4040b02579d99839fc916093117296eff26bd661 100644 (file)
@@ -893,7 +893,6 @@ void UltraSparcRegInfo::colorRetValue(const  MachineInstr *const RetMI,
 // register number
 //---------------------------------------------------------------------------
 
-
 MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg, 
                                              const unsigned DestReg,
                                              const int RegType) const {
@@ -1040,24 +1039,56 @@ MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
 
 
 
-// Following method is Not needed now
 
-MachineInstr* UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
+//---------------------------------------------------------------------------
+// Generate a copy instruction to copy a value to another. Temporarily
+// used by PhiElimination code.
+//---------------------------------------------------------------------------
+
+
+MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
+
+  int RegType = getRegType( Src );
+
+  assert( (RegType==getRegType(Src))  && "Src & Dest are diff types");
 
   MachineInstr * MI = NULL;
 
-  MI = new MachineInstr(ADD, 3);
-  MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
-  MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
-  MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
-  
+  switch( RegType ) {
+    
+  case IntRegType:
 
-  return MI;
+    MI = new MachineInstr(ADD, 3);
+    MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
+    MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
+    MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
+    break;
 
+  case FPSingleRegType:
+    MI = new MachineInstr(FMOVS, 2);
+    MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
+    MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
+    break;
+
+
+  case FPDoubleRegType:
+    MI = new MachineInstr(FMOVD, 2);
+    MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
+    MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
+    break;
+
+  default:
+    assert(0 && "Unknow RegType in CpValu2Value");
+  }
+
+  return MI;
 }
 
 
 
+
+
+
 //----------------------------------------------------------------------------
 // This method inserts caller saving/restoring instructons before/after
 // a call machine instruction.