Author: baldrick Date: Thu Nov 22 15:40:06 2007 New Revision: 44278 URL: http://llvm.org/viewvc/llvm-project?rev=44278&view=rev Log: Readonly/readnone functions are allowed to throw exceptions, so don't turn invokes of them into calls.
Modified: llvm/trunk/lib/Transforms/Scalar/ADCE.cpp llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll Modified: llvm/trunk/lib/Transforms/Scalar/ADCE.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ADCE.cpp?rev=44278&r1=44277&r2=44278&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/ADCE.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/ADCE.cpp Thu Nov 22 15:40:06 2007 @@ -34,7 +34,7 @@ STATISTIC(NumBlockRemoved, "Number of basic blocks removed"); STATISTIC(NumInstRemoved , "Number of instructions removed"); -STATISTIC(NumCallRemoved , "Number of calls and invokes removed"); +STATISTIC(NumCallRemoved , "Number of calls removed"); namespace { //===----------------------------------------------------------------------===// @@ -184,32 +184,6 @@ AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); - - // Iterate over all invokes in the function, turning invokes into calls if - // they cannot throw. - for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB) - if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) - if (Function *F = II->getCalledFunction()) - if (AA.onlyReadsMemory(F)) { - // The function cannot unwind. Convert it to a call with a branch - // after it to the normal destination. - SmallVector<Value*, 8> Args(II->op_begin()+3, II->op_end()); - CallInst *NewCall = new CallInst(F, Args.begin(), Args.end(), "", II); - NewCall->takeName(II); - NewCall->setCallingConv(II->getCallingConv()); - II->replaceAllUsesWith(NewCall); - new BranchInst(II->getNormalDest(), II); - - // Update PHI nodes in the unwind destination - II->getUnwindDest()->removePredecessor(BB); - BB->getInstList().erase(II); - - if (NewCall->use_empty()) { - BB->getInstList().erase(NewCall); - ++NumCallRemoved; - } - } - // Iterate over all of the instructions in the function, eliminating trivially // dead instructions, and marking instructions live that are known to be // needed. Perform the walk in depth first order so that we avoid marking any Modified: llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll?rev=44278&r1=44277&r2=44278&view=diff ============================================================================== --- llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll (original) +++ llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll Thu Nov 22 15:40:06 2007 @@ -1,13 +1,15 @@ -; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | not grep null +; RUN: llvm-as < %s | opt -adce | llvm-dis | grep null -declare int %strlen(sbyte*) +declare i32 @strlen(i8*) readnone -int %test() { - ;; Dead call should be deleted! - invoke int %strlen(sbyte *null) to label %Cont unwind label %Other -Cont: - ret int 0 -Other: - ret int 1 -} +define i32 @test() { + ; invoke of pure function should not be deleted! + invoke i32 @strlen( i8* null ) readnone + to label %Cont unwind label %Other ; <i32>:1 [#uses=0] + +Cont: ; preds = %0 + ret i32 0 +Other: ; preds = %0 + ret i32 1 +} _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits