mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-06 17:47:37 +00:00
Fix PR4645 which was fallout from the fix for PR4641.
- Call RAUW to delete all instructions (this is a patch from Nick Lewycky). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77512 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5316bf0252
commit
473955f439
@ -29,6 +29,7 @@
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -518,18 +519,24 @@ struct VISIBILITY_HIDDEN ExitOpt : public LibCallOptimization {
|
||||
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());
|
||||
|
||||
// Split the basic block after the call to exit.
|
||||
BasicBlock::iterator FirstDead = CI; ++FirstDead;
|
||||
CI->getParent()->splitBasicBlock(FirstDead);
|
||||
B.SetInsertPoint(B.GetInsertBlock());
|
||||
|
||||
// Remove the branch that splitBB created and insert a return instead.
|
||||
CI->getParent()->getTerminator()->eraseFromParent();
|
||||
// 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::VoidTy)
|
||||
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;
|
||||
|
24
test/Transforms/SimplifyLibCalls/2009-07-29-Exit2.ll
Normal file
24
test/Transforms/SimplifyLibCalls/2009-07-29-Exit2.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llvm-as < %s | opt -simplify-libcalls -disable-output
|
||||
; PR4645
|
||||
|
||||
define i32 @main() {
|
||||
entry:
|
||||
br label %if.then
|
||||
|
||||
lor.lhs.false: ; preds = %while.body
|
||||
br i1 undef, label %if.then, label %for.cond
|
||||
|
||||
if.then: ; preds = %lor.lhs.false, %while.body
|
||||
call void @exit(i32 1)
|
||||
br label %for.cond
|
||||
|
||||
for.cond: ; preds = %for.end, %if.then, %lor.lhs.false
|
||||
%j.0 = phi i32 [ %inc47, %for.end ], [ 0, %if.then ], [ 0, %lor.lhs.false ] ; <i32> [#uses=1]
|
||||
unreachable
|
||||
|
||||
for.end: ; preds = %for.cond20
|
||||
%inc47 = add i32 %j.0, 1 ; <i32> [#uses=1]
|
||||
br label %for.cond
|
||||
}
|
||||
|
||||
declare void @exit(i32)
|
Loading…
x
Reference in New Issue
Block a user