mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Prune the unwind_to labels on BBs that don't need them. Another step in the
removal of invoke, PR1269. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48084 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -32,6 +32,7 @@ using namespace llvm; | |||||||
|  |  | ||||||
| STATISTIC(NumRemoved, "Number of invokes removed"); | STATISTIC(NumRemoved, "Number of invokes removed"); | ||||||
| STATISTIC(NumUnreach, "Number of noreturn calls optimized"); | STATISTIC(NumUnreach, "Number of noreturn calls optimized"); | ||||||
|  | STATISTIC(NumBBUnwind, "Number of unwind_to removed from blocks"); | ||||||
|  |  | ||||||
| namespace { | namespace { | ||||||
|   struct VISIBILITY_HIDDEN PruneEH : public CallGraphSCCPass { |   struct VISIBILITY_HIDDEN PruneEH : public CallGraphSCCPass { | ||||||
| @@ -153,6 +154,8 @@ bool PruneEH::runOnSCC(const std::vector<CallGraphNode *> &SCC) { | |||||||
| bool PruneEH::SimplifyFunction(Function *F) { | bool PruneEH::SimplifyFunction(Function *F) { | ||||||
|   bool MadeChange = false; |   bool MadeChange = false; | ||||||
|   for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { |   for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { | ||||||
|  |     bool couldUnwind = false; | ||||||
|  |  | ||||||
|     if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) |     if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) | ||||||
|       if (II->doesNotThrow()) { |       if (II->doesNotThrow()) { | ||||||
|         SmallVector<Value*, 8> Args(II->op_begin()+3, II->op_end()); |         SmallVector<Value*, 8> Args(II->op_begin()+3, II->op_end()); | ||||||
| @@ -182,10 +185,11 @@ bool PruneEH::SimplifyFunction(Function *F) { | |||||||
|  |  | ||||||
|         ++NumRemoved; |         ++NumRemoved; | ||||||
|         MadeChange = true; |         MadeChange = true; | ||||||
|       } |       } else | ||||||
|  |         couldUnwind = true; | ||||||
|  |  | ||||||
|     for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) |     for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) | ||||||
|       if (CallInst *CI = dyn_cast<CallInst>(I++)) |       if (CallInst *CI = dyn_cast<CallInst>(I++)) { | ||||||
|         if (CI->doesNotReturn() && !isa<UnreachableInst>(I)) { |         if (CI->doesNotReturn() && !isa<UnreachableInst>(I)) { | ||||||
|           // This call calls a function that cannot return.  Insert an |           // This call calls a function that cannot return.  Insert an | ||||||
|           // unreachable instruction after it and simplify the code.  Do this |           // unreachable instruction after it and simplify the code.  Do this | ||||||
| @@ -201,8 +205,17 @@ bool PruneEH::SimplifyFunction(Function *F) { | |||||||
|           MadeChange = true; |           MadeChange = true; | ||||||
|           ++NumUnreach; |           ++NumUnreach; | ||||||
|           break; |           break; | ||||||
|         } |         } else if (!CI->doesNotThrow()) | ||||||
|  |           couldUnwind = true; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |     // Strip 'unwindTo' off of BBs that have no calls/invokes without nounwind. | ||||||
|  |     if (!couldUnwind && BB->getUnwindDest()) { | ||||||
|  |       MadeChange = true; | ||||||
|  |       ++NumBBUnwind; | ||||||
|  |       BB->getUnwindDest()->removePredecessor(BB, false, true); | ||||||
|  |       BB->setUnwindDest(NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   return MadeChange; |   return MadeChange; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								test/Transforms/PruneEH/unwindto.ll
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								test/Transforms/PruneEH/unwindto.ll
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | ; RUN: llvm-as < %s | opt -prune-eh | llvm-dis | not grep unwind_to | ||||||
|  |  | ||||||
|  | define i8 @test7(i1 %b) { | ||||||
|  | entry: unwind_to %cleanup | ||||||
|  |   br i1 %b, label %cond_true, label %cond_false | ||||||
|  | cond_true: unwind_to %cleanup | ||||||
|  |   br label %cleanup | ||||||
|  | cond_false: unwind_to %cleanup | ||||||
|  |   br label %cleanup | ||||||
|  | cleanup: | ||||||
|  |   %x = phi i8 [0, %entry], [1, %cond_true], [1, %cond_true], | ||||||
|  |                            [2, %cond_false], [2, %cond_false] | ||||||
|  |   ret i8 %x | ||||||
|  | } | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user