Dumb bug. Code sees a memcpy from X+c so it increments src offset. But it
authorEvan Cheng <evan.cheng@apple.com>
Thu, 16 Feb 2006 23:11:42 +0000 (23:11 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 16 Feb 2006 23:11:42 +0000 (23:11 +0000)
turns out not to point to a constant string but it forgot change the offset
back.

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

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 78f5623aed9d42ebcc0535fbcbe5387068bd9b5b..0da19dfe57e98c67bcf1f3e427f4bbf823da71b5 100644 (file)
@@ -1658,9 +1658,10 @@ void SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) {
       if (MeetsMaxMemopRequirement(MemOps, TLI.getMaxStoresPerMemcpy(),
                                    Size->getValue(), Align, TLI)) {
         unsigned NumMemOps = MemOps.size();
-        unsigned SrcOff = 0, DstOff = 0;
+        unsigned SrcOff = 0, DstOff = 0, SrcDelta = 0;
         GlobalAddressSDNode *G = NULL;
         std::string Str;
+        bool CopyFromStr = false;
 
         if (Op2.getOpcode() == ISD::GlobalAddress)
           G = cast<GlobalAddressSDNode>(Op2);
@@ -1668,12 +1669,17 @@ void SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) {
                  Op2.getOperand(0).getOpcode() == ISD::GlobalAddress &&
                  Op2.getOperand(1).getOpcode() == ISD::Constant) {
           G = cast<GlobalAddressSDNode>(Op2.getOperand(0));
-          SrcOff += cast<ConstantSDNode>(Op2.getOperand(1))->getValue();
+          SrcDelta = cast<ConstantSDNode>(Op2.getOperand(1))->getValue();
         }
         if (G) {
           GlobalVariable *GV = dyn_cast<GlobalVariable>(G->getGlobal());
-          if (GV)
+          if (GV) {
             Str = getStringValue(GV);
+            if (!Str.empty()) {
+              CopyFromStr = true;
+              SrcOff += SrcDelta;
+            }
+          }
         }
 
         for (unsigned i = 0; i < NumMemOps; i++) {
@@ -1681,7 +1687,7 @@ void SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) {
           unsigned VTSize = getSizeInBits(VT) / 8;
           SDOperand Value, Chain, Store;
 
-          if (!Str.empty()) {
+          if (CopyFromStr) {
             Value = getMemsetStringVal(VT, DAG, TLI, Str, SrcOff);
             Chain = getRoot();
             Store =