It is safe to speculate load from GOT. This fixes performance regression caused by...
authorDevang Patel <dpatel@apple.com>
Mon, 17 Oct 2011 17:35:01 +0000 (17:35 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 17 Oct 2011 17:35:01 +0000 (17:35 +0000)
Radar 10281206.

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

lib/CodeGen/MachineLICM.cpp

index a1f80d5282e0cc9aac7ce90e2c191f6d4c9880f3..8f7a8ebb264c4a24424deb06661c89c4f50559fe 100644 (file)
@@ -762,6 +762,21 @@ void MachineLICM::UpdateRegPressure(const MachineInstr *MI) {
   }
 }
 
+/// isLoadFromGOT - Return true if this machine instruction loads from
+/// global offset table.
+static bool isLoadFromGOT(MachineInstr &MI) {
+  assert (MI.getDesc().mayLoad() && "Expected MI that loads!");
+  for (MachineInstr::mmo_iterator I = MI.memoperands_begin(),
+        E = MI.memoperands_end(); I != E; ++I) {
+    if (const Value *V = (*I)->getValue()) {
+      if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V))
+        if (PSV == PSV->getGOT())
+         return true;
+    }
+  }
+  return false;
+}
+
 /// IsLICMCandidate - Returns true if the instruction may be a suitable
 /// candidate for LICM. e.g. If the instruction is a call, then it's obviously
 /// not safe to hoist it.
@@ -775,7 +790,8 @@ bool MachineLICM::IsLICMCandidate(MachineInstr &I) {
   // it dominates all exiting blocks. If it doesn't, then there is a path out of
   // the loop which does not execute this load, so we can't hoist it.
   // Stores and side effects are already checked by isSafeToMove.
-  if (I.getDesc().mayLoad() && !IsGuaranteedToExecute(I.getParent()))
+  if (I.getDesc().mayLoad() && !isLoadFromGOT(I) && 
+      !IsGuaranteedToExecute(I.getParent()))
     return false;
 
   return true;