Preserve tail marker

llvm-svn: 21737
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 5114116..72b4531 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -4232,6 +4232,8 @@
                         Args, Caller->getName(), Caller);
   } else {
     NC = new CallInst(Callee, Args, Caller->getName(), Caller);
+    if (cast<CallInst>(Caller)->isTailCall())
+      cast<CallInst>(NC)->setTailCall();
   }
 
   // Insert a cast of the return type as necessary...
diff --git a/llvm/lib/Transforms/Scalar/LowerAllocations.cpp b/llvm/lib/Transforms/Scalar/LowerAllocations.cpp
index 71b45fd..1502fab 100644
--- a/llvm/lib/Transforms/Scalar/LowerAllocations.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerAllocations.cpp
@@ -150,6 +150,7 @@
 
       // Create the call to Malloc...
       CallInst *MCall = new CallInst(MallocFunc, MallocArgs, "", I);
+      MCall->setTailCall();
 
       // Create a cast instruction to convert to the right type...
       Value *MCast;
@@ -180,7 +181,7 @@
        FreeArgs.push_back(Constant::getNullValue(FreeFTy->getParamType(i)));
 
       // Insert a call to the free function...
-      new CallInst(FreeFunc, FreeArgs, "", I);
+      (new CallInst(FreeFunc, FreeArgs, "", I))->setTailCall();
 
       // Delete the old free instruction
       I = --BBIL.erase(I);
diff --git a/llvm/lib/Transforms/Scalar/LowerInvoke.cpp b/llvm/lib/Transforms/Scalar/LowerInvoke.cpp
index fee18aa..b751bc0 100644
--- a/llvm/lib/Transforms/Scalar/LowerInvoke.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerInvoke.cpp
@@ -195,7 +195,7 @@
         Args[i] = ConstantExpr::getCast(cast<Constant>(Args[i]),
                                         FT->getParamType(i));
 
-    new CallInst(WriteFn, Args, "", IB);
+    (new CallInst(WriteFn, Args, "", IB))->setTailCall();
   }
 }
 
@@ -225,7 +225,7 @@
       writeAbortMessage(UI);
 
       // Insert a call to abort()
-      new CallInst(AbortFn, std::vector<Value*>(), "", UI);
+      (new CallInst(AbortFn, std::vector<Value*>(), "", UI))->setTailCall();
 
       // Insert a return instruction.  This really should be a "barrier", as it
       // is unreachable.
@@ -375,7 +375,7 @@
     writeAbortMessage(RI);
 
     // Insert a call to abort()
-    new CallInst(AbortFn, std::vector<Value*>(), "", RI);
+    (new CallInst(AbortFn, std::vector<Value*>(), "", RI))->setTailCall();
   }
 
   return Changed;