diff options
author | Chris Lattner <sabre@nondot.org> | 2012-01-31 04:39:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-01-31 04:39:22 +0000 |
commit | 4a6facbc574c37ec81380d31d8f1372ea10ebf29 (patch) | |
tree | 1d57bc4f931965205c71ba5113808e98b2a6e81f | |
parent | c63352f6336ab67cdba6d4702dc2bed5fdca1091 (diff) | |
download | external_llvm-4a6facbc574c37ec81380d31d8f1372ea10ebf29.zip external_llvm-4a6facbc574c37ec81380d31d8f1372ea10ebf29.tar.gz external_llvm-4a6facbc574c37ec81380d31d8f1372ea10ebf29.tar.bz2 |
rework this logic to not depend on the last argument to GetConstantStringInfo,
which is going away.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149348 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 18de13d..6b6f7bf 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -3323,7 +3323,10 @@ static SDValue getMemsetStringVal(EVT VT, DebugLoc dl, SelectionDAG &DAG, if (TLI.isLittleEndian()) Offset = Offset + MSB - 1; for (unsigned i = 0; i != MSB; ++i) { - Val = (Val << 8) | (unsigned char)Str[Offset]; + Val = (Val << 8); + + if (Offset < Str.size()) + Val |= (unsigned char)Str[Offset]; Offset += TLI.isLittleEndian() ? -1 : 1; } return DAG.getConstant(Val, VT); @@ -3354,9 +3357,12 @@ static bool isMemSrcFromString(SDValue Src, std::string &Str) { if (!G) return false; - const GlobalVariable *GV = dyn_cast<GlobalVariable>(G->getGlobal()); - if (GV && GetConstantStringInfo(GV, Str, SrcDelta, false)) - return true; + if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(G->getGlobal())) + if (GetConstantStringInfo(GV, Str, SrcDelta)) { + // The nul can also be read. + Str.push_back(0); + return true; + } return false; } |