if (!FunctionContainsEscapingAllocas)
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
- if (CallInst *CI = dyn_cast<CallInst>(I)) {
- CI->setTailCall();
- MadeChange = true;
- }
+ if (CallInst *CI = dyn_cast<CallInst>(I))
+ if (!CI->doesNotReturn()) {
+ CI->setTailCall();
+ MadeChange = true;
+ }
return MadeChange;
}
--- /dev/null
+; RUN: opt < %s -tailcallelim -S | FileCheck %s
+
+define void @t() nounwind ssp {
+entry:
+; CHECK: entry:
+; CHECK: %0 = call i32 @foo()
+; CHECK: ret void
+ %0 = call i32 @foo() nounwind noreturn
+ ret void
+}
+
+declare i32 @foo()