Fixed uninitialized stuff inside LegalizeDAG. Fortunately, the only
authorAnton Korobeynikov <asl@math.spbu.ru>
Thu, 1 Feb 2007 08:39:52 +0000 (08:39 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Thu, 1 Feb 2007 08:39:52 +0000 (08:39 +0000)
affected part is codegen of "memove" inside x86 backend. This fixes
PR1144

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

include/llvm/Target/TargetLowering.h
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/Target/X86/X86ISelLowering.cpp

index 51828d97288e3aa389a98aca3b812f339de4b436..bbd888d8d315a9f34cc6ac8cdfc2cb0148fcf1cc 100644 (file)
@@ -732,6 +732,8 @@ public:
     bool isSigned;
     bool isInReg;
     bool isSRet;
+
+    ArgListEntry():isSigned(false), isInReg(false), isSRet(false) { };
   };
   typedef std::vector<ArgListEntry> ArgListTy;
   virtual std::pair<SDOperand, SDOperand>
index bb997609a7cca517d90aa511c2c95779c5ae9e99..42b2ee6521c6a5ce4e4ffb38994e47c1dd336f4c 100644 (file)
@@ -2178,7 +2178,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
       const char *FnName = 0;
       if (Node->getOpcode() == ISD::MEMSET) {
         Entry.Node = Tmp2; Entry.isSigned = false; Entry.Ty = IntPtrTy;
-        Entry.isInReg = false;
+        Entry.isInReg = false; Entry.isSRet = false;
         Args.push_back(Entry);
         // Extend the (previously legalized) ubyte argument to be an int value
         // for the call.
@@ -2187,7 +2187,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
         else
           Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Tmp3);
         Entry.Node = Tmp3; Entry.Ty = Type::Int32Ty; Entry.isSigned = true;
-        Entry.isInReg = false;
+        Entry.isInReg = false; Entry.isSRet = false;
         Args.push_back(Entry);
         Entry.Node = Tmp4; Entry.Ty = IntPtrTy; Entry.isSigned = false;
         Args.push_back(Entry);
@@ -2195,7 +2195,8 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
         FnName = "memset";
       } else if (Node->getOpcode() == ISD::MEMCPY ||
                  Node->getOpcode() == ISD::MEMMOVE) {
-        Entry.Ty = IntPtrTy; Entry.isSigned = false; Entry.isInReg = false;
+        Entry.Ty = IntPtrTy;
+        Entry.isSigned = false; Entry.isInReg = false; Entry.isSRet = false;
         Entry.Node = Tmp2; Args.push_back(Entry);
         Entry.Node = Tmp3; Args.push_back(Entry);
         Entry.Node = Tmp4; Args.push_back(Entry);
@@ -4122,7 +4123,7 @@ SDOperand SelectionDAGLegalize::ExpandLibCall(const char *Name, SDNode *Node,
     MVT::ValueType ArgVT = Node->getOperand(i).getValueType();
     const Type *ArgTy = MVT::getTypeForValueType(ArgVT);
     Entry.Node = Node->getOperand(i); Entry.Ty = ArgTy; 
-    Entry.isSigned = isSigned; Entry.isInReg = false;
+    Entry.isSigned = isSigned; Entry.isInReg = false; Entry.isSRet = false;
     Args.push_back(Entry);
   }
   SDOperand Callee = DAG.getExternalSymbol(Name, TLI.getPointerTy());
index 71cac03150a0b9018ecd1cc79222abbe1b9acc69..49f5cde9bcc1a5468484e2fc293ab66d176a8ac9 100644 (file)
@@ -777,6 +777,10 @@ SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG,
     }
   }
 
+  // Sanity check: we haven't seen NumSRetBytes > 4
+  assert((NumSRetBytes<=4) &&
+         "Too much space for struct-return pointer requested");
+    
   if (!MemOpChains.empty())
     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other,
                         &MemOpChains[0], MemOpChains.size());