Lower stpcpy_chk when possible.
[oota-llvm.git] / lib / Transforms / InstCombine / InstCombineCalls.cpp
index c62155ed02d864b67621ee145706e7b917013a2a..43ff58d8ff15bc40112c779e16b908f1eb74d1b4 100644 (file)
@@ -838,6 +838,19 @@ Instruction *InstCombiner::tryOptimizeCall(CallInst *CI, const TargetData *TD) {
 
   // 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);
+      return ReplaceInstUsesWith(*CI, Ret);
+    }
     return 0;
   }