Reduce the number of pointless copies inserted due to constant pointer refs.
Also, make an assertion actually fireable!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11713 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp
index 4aced20..b887328 100644
--- a/lib/Target/X86/InstSelectSimple.cpp
+++ b/lib/Target/X86/InstSelectSimple.cpp
@@ -461,8 +461,7 @@
     // Copy zero (null pointer) to the register.
     BMI(MBB, IP, X86::MOVri32, 1, R).addZImm(0);
   } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)) {
-    unsigned SrcReg = getReg(CPR->getValue(), MBB, IP);
-    BMI(MBB, IP, X86::MOVrr32, 1, R).addReg(SrcReg);
+    BMI(MBB, IP, X86::MOVri32, 1, R).addGlobalAddress(CPR->getValue());
   } else {
     std::cerr << "Offending constant: " << C << "\n";
     assert(0 && "Type not handled yet!");
@@ -2048,7 +2047,7 @@
       break;
     }
     case Type::ULongTyID:
-      assert("FIXME: not implemented: cast ulong X to fp type!");
+      assert(0 && "FIXME: not implemented: cast ulong X to fp type!");
     default:  // No promotion needed...
       break;
     }
@@ -2212,6 +2211,9 @@
                             User::op_iterator IdxEnd, unsigned TargetReg) {
   const TargetData &TD = TM.getTargetData();
 
+  if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(Src))
+    Src = CPR->getValue();
+
   std::vector<Value*> GEPOps;
   GEPOps.resize(IdxEnd-IdxBegin+1);
   GEPOps[0] = Src;
@@ -2229,9 +2231,13 @@
       // The getGEPIndex operation didn't want to build an LEA.  Check to see if
       // all operands are consumed but the base pointer.  If so, just load it
       // into the register.
-      unsigned BaseReg = getReg(GEPOps[0], MBB, IP);
-      BMI(MBB, IP, X86::MOVrr32, 1, TargetReg).addReg(BaseReg);
-      return;                // we are now done
+      if (GlobalValue *GV = dyn_cast<GlobalValue>(GEPOps[0])) {
+        BMI(MBB, IP, X86::MOVri32, 1, TargetReg).addGlobalAddress(GV);
+      } else {
+        unsigned BaseReg = getReg(GEPOps[0], MBB, IP);
+        BMI(MBB, IP, X86::MOVrr32, 1, TargetReg).addReg(BaseReg);
+      }
+      break;                // we are now done
     } else if (const StructType *StTy = dyn_cast<StructType>(GEPTypes.back())) {
       // It's a struct access.  CUI is the index into the structure,
       // which names the field. This index must have unsigned type.