Replace X86's CanRematLoadWithDispOperand by calling the target-independent
authorDan Gohman <gohman@apple.com>
Sat, 10 Oct 2009 00:34:18 +0000 (00:34 +0000)
committerDan Gohman <gohman@apple.com>
Sat, 10 Oct 2009 00:34:18 +0000 (00:34 +0000)
MachineInstr::isInvariantLoad instead, which has the benefit of being
more complete.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83696 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetInstrInfo.h
lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h

index 8070c7d08e75eb149e3190110e55b3f49fe4688a..5cd6ff5082e9da9e677418c35abff15ee5ccceb6 100644 (file)
@@ -107,7 +107,7 @@ public:
                                    AliasAnalysis *AA = 0) const {
     return MI->getOpcode() == IMPLICIT_DEF ||
            (MI->getDesc().isRematerializable() &&
-            (isReallyTriviallyReMaterializable(MI) ||
+            (isReallyTriviallyReMaterializable(MI, AA) ||
              isReallyTriviallyReMaterializableGeneric(MI, AA)));
   }
 
@@ -118,7 +118,8 @@ protected:
   /// taking into consideration its operands. This predicate must return false
   /// if the instruction has any side effects other than producing a value, or
   /// if it requres any address registers that are not always available.
-  virtual bool isReallyTriviallyReMaterializable(const MachineInstr *MI) const {
+  virtual bool isReallyTriviallyReMaterializable(const MachineInstr *MI,
+                                                 AliasAnalysis *AA) const {
     return false;
   }
 
index 6558df01421d383cd254998e1763ec858fa443e1..56de6d9ab41205cbd30f793a511bf93a6a746293 100644 (file)
@@ -782,31 +782,9 @@ static bool regIsPICBase(unsigned BaseReg, const MachineRegisterInfo &MRI) {
   return isPICBase;
 }
 
-/// CanRematLoadWithDispOperand - Return true if a load with the specified
-/// operand is a candidate for remat: for this to be true we need to know that
-/// the load will always return the same value, even if moved.
-static bool CanRematLoadWithDispOperand(const MachineOperand &MO,
-                                        X86TargetMachine &TM) {
-  // Loads from constant pool entries can be remat'd.
-  if (MO.isCPI()) return true;
-  
-  // We can remat globals in some cases.
-  if (MO.isGlobal()) {
-    // If this is a load of a stub, not of the global, we can remat it.  This
-    // access will always return the address of the global.
-    if (isGlobalStubReference(MO.getTargetFlags()))
-      return true;
-    
-    // If the global itself is constant, we can remat the load.
-    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(MO.getGlobal()))
-      if (GV->isConstant())
-        return true;
-  }
-  return false;
-}
 bool
-X86InstrInfo::isReallyTriviallyReMaterializable(const MachineInstr *MI) const {
+X86InstrInfo::isReallyTriviallyReMaterializable(const MachineInstr *MI,
+                                                AliasAnalysis *AA) const {
   switch (MI->getOpcode()) {
   default: break;
     case X86::MOV8rm:
@@ -825,7 +803,7 @@ X86InstrInfo::isReallyTriviallyReMaterializable(const MachineInstr *MI) const {
       if (MI->getOperand(1).isReg() &&
           MI->getOperand(2).isImm() &&
           MI->getOperand(3).isReg() && MI->getOperand(3).getReg() == 0 &&
-          CanRematLoadWithDispOperand(MI->getOperand(4), TM)) {
+          MI->isInvariantLoad(AA)) {
         unsigned BaseReg = MI->getOperand(1).getReg();
         if (BaseReg == 0 || BaseReg == X86::RIP)
           return true;
index 83162fb03d5dfa1eb6ba8f045567652a3bbec03d..2237c8be517afa1372b929879da9983a56575f31 100644 (file)
@@ -451,7 +451,8 @@ public:
   unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const;
   unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
 
-  bool isReallyTriviallyReMaterializable(const MachineInstr *MI) const;
+  bool isReallyTriviallyReMaterializable(const MachineInstr *MI,
+                                         AliasAnalysis *AA) const;
   void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
                      unsigned DestReg, unsigned SubIdx,
                      const MachineInstr *Orig) const;