[llvm-commits] [llvm] r80887 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/SimplifyLibCalls/ExitInMain.ll

Chris Lattner sabre at nondot.org
Wed Sep 2 22:19:59 PDT 2009


Author: lattner
Date: Thu Sep  3 00:19:59 2009
New Revision: 80887

URL: http://llvm.org/viewvc/llvm-project?rev=80887&view=rev
Log:
In C++, code is not allowed to call main.  In C it is, this
simplifylibcalls optimization is thus valid for C++ but not C.
It's not important enough to worry about for C++ apps, so just
remove it.

rdar://7191924


Removed:
    llvm/trunk/test/Transforms/SimplifyLibCalls/ExitInMain.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp?rev=80887&r1=80886&r2=80887&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Thu Sep  3 00:19:59 2009
@@ -9,11 +9,9 @@
 //
 // This file implements a simple pass that applies a variety of small
 // optimizations for calls to specific well-known function calls (e.g. runtime
-// library functions). For example, a call to the function "exit(3)" that
-// occurs within the main() function can be transformed into a simple "return 3"
-// instruction. Any optimization that takes this form (replace call to library
-// function with simpler code that provides the same result) belongs in this
-// file.
+// library functions).   Any optimization that takes the very simple form
+// "replace call to library function with simpler code that provides the same
+// result" belongs in this file.
 //
 //===----------------------------------------------------------------------===//
 
@@ -499,58 +497,12 @@
 }
 
 //===----------------------------------------------------------------------===//
-// Miscellaneous LibCall Optimizations
-//===----------------------------------------------------------------------===//
-
-namespace {
-//===---------------------------------------===//
-// 'exit' Optimizations
-
-/// ExitOpt - int main() { exit(4); } --> int main() { return 4; }
-struct ExitOpt : public LibCallOptimization {
-  virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
-    // Verify we have a reasonable prototype for exit.
-    if (Callee->arg_size() == 0 || !CI->use_empty())
-      return 0;
-
-    // Verify the caller is main, and that the result type of main matches the
-    // argument type of exit.
-    if (Caller->getName() != "main" || !Caller->hasExternalLinkage() ||
-        Caller->getReturnType() != CI->getOperand(1)->getType())
-      return 0;
-
-    TerminatorInst *OldTI = CI->getParent()->getTerminator();
-
-    // Drop all successor phi node entries.
-    for (unsigned i = 0, e = OldTI->getNumSuccessors(); i != e; ++i)
-      OldTI->getSuccessor(i)->removePredecessor(CI->getParent());
-
-    // Remove all instructions after the exit.
-    BasicBlock::iterator Dead = CI, E = OldTI; ++Dead;
-    while (Dead != E) {
-      BasicBlock::iterator Next = next(Dead);
-      if (Dead->getType() != Type::getVoidTy(*Context))
-        Dead->replaceAllUsesWith(UndefValue::get(Dead->getType()));
-      Dead->eraseFromParent();
-      Dead = Next;
-    }
-
-    // Insert a return instruction.
-    OldTI->eraseFromParent();
-    B.SetInsertPoint(B.GetInsertBlock());
-    B.CreateRet(CI->getOperand(1));
-
-    return CI;
-  }
-};
-
-//===----------------------------------------------------------------------===//
 // String and Memory LibCall Optimizations
 //===----------------------------------------------------------------------===//
 
 //===---------------------------------------===//
 // 'strcat' Optimizations
-
+namespace {
 struct StrCatOpt : public LibCallOptimization {
   virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
     // Verify the "strcat" function prototype.
@@ -1554,8 +1506,6 @@
   ///
   class SimplifyLibCalls : public FunctionPass {
     StringMap<LibCallOptimization*> Optimizations;
-    // Miscellaneous LibCall Optimizations
-    ExitOpt Exit; 
     // String and Memory LibCall Optimizations
     StrCatOpt StrCat; StrNCatOpt StrNCat; StrChrOpt StrChr; StrCmpOpt StrCmp;
     StrNCmpOpt StrNCmp; StrCpyOpt StrCpy; StrNCpyOpt StrNCpy; StrLenOpt StrLen;
@@ -1602,9 +1552,6 @@
 /// Optimizations - Populate the Optimizations map with all the optimizations
 /// we know.
 void SimplifyLibCalls::InitOptimizations() {
-  // Miscellaneous LibCall Optimizations
-  Optimizations["exit"] = &Exit;
-  
   // String and Memory LibCall Optimizations
   Optimizations["strcat"] = &StrCat;
   Optimizations["strncat"] = &StrNCat;

Removed: llvm/trunk/test/Transforms/SimplifyLibCalls/ExitInMain.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/ExitInMain.ll?rev=80886&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/SimplifyLibCalls/ExitInMain.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyLibCalls/ExitInMain.ll (removed)
@@ -1,15 +0,0 @@
-; Test that the ExitInMainOptimization pass works correctly
-; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | \
-; RUN:    grep {ret i32 3} | count 1
-; END.
-
-declare void @exit(i32)
-
-declare void @exitonly(i32)
-
-define i32 @main() {
-	call void @exitonly( i32 3 )
-	call void @exit( i32 3 )
-	ret i32 0
-}
-





More information about the llvm-commits mailing list