diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2010-03-11 20:45:13 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2010-03-11 20:45:13 +0000 |
commit | 2fc395659c798b834d57ab79809fc4de09bf4191 (patch) | |
tree | 20959284b46f88a802942987c38b7aaa1e649c08 /llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | |
parent | 01bb5ce9323e32327fc86fd29d462813f310f105 (diff) | |
download | bcm5719-llvm-2fc395659c798b834d57ab79809fc4de09bf4191.tar.gz bcm5719-llvm-2fc395659c798b834d57ab79809fc4de09bf4191.zip |
stpcpy is so similar to strcpy, it doesn't deserve a complete copy of the __strcpy_chk -> strcpy code.
llvm-svn: 98284
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 27 |
1 files changed, 5 insertions, 22 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 43ff58d8ff1..4b933f08b13 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -819,36 +819,19 @@ Instruction *InstCombiner::tryOptimizeCall(CallInst *CI, const TargetData *TD) { return 0; } - if (Name == "__strcpy_chk") { + if (Name == "__strcpy_chk" || Name == "__stpcpy_chk") { ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(3)); if (!SizeCI) return 0; // If a) we don't have any length information, or b) we know this will - // fit then just lower to a plain strcpy. Otherwise we'll keep our - // strcpy_chk call which may fail at runtime if the size is too long. + // fit then just lower to a plain st[rp]cpy. Otherwise we'll keep our + // st[rp]cpy_chk call which may fail at runtime if the size is too long. // TODO: It might be nice to get a maximum length out of the possible // string lengths for varying. if (SizeCI->isAllOnesValue() || SizeCI->getZExtValue() >= GetStringLength(CI->getOperand(2))) { - Value *Ret = EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B, TD); - return ReplaceInstUsesWith(*CI, Ret); - } - return 0; - } - - // Should be similar to strcpy. - if (Name == "__stpcpy_chk") { - ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(3)); - if (!SizeCI) - return 0; - // If a) we don't have any length information, or b) we know this will - // fit then just lower to a plain stpcpy. Otherwise we'll keep our - // stpcpy_chk call which may fail at runtime if the size is too long. - // TODO: It might be nice to get a maximum length out of the possible - // string lengths for varying. - if (SizeCI->isAllOnesValue() || - SizeCI->getZExtValue() >= GetStringLength(CI->getOperand(2))) { - Value *Ret = EmitStpCpy(CI->getOperand(1), CI->getOperand(2), B, TD); + Value *Ret = EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B, TD, + Name.substr(2, 6)); return ReplaceInstUsesWith(*CI, Ret); } return 0; |