mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
Implement PR1201 and test/Transforms/InstCombine/malloc-free-delete.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35981 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
58de64650d
commit
6fe5541003
@ -8367,13 +8367,6 @@ Instruction *InstCombiner::visitAllocationInst(AllocationInst &AI) {
|
|||||||
Instruction *InstCombiner::visitFreeInst(FreeInst &FI) {
|
Instruction *InstCombiner::visitFreeInst(FreeInst &FI) {
|
||||||
Value *Op = FI.getOperand(0);
|
Value *Op = FI.getOperand(0);
|
||||||
|
|
||||||
// Change free <ty>* (cast <ty2>* X to <ty>*) into free <ty2>* X
|
|
||||||
if (CastInst *CI = dyn_cast<CastInst>(Op))
|
|
||||||
if (isa<PointerType>(CI->getOperand(0)->getType())) {
|
|
||||||
FI.setOperand(0, CI->getOperand(0));
|
|
||||||
return &FI;
|
|
||||||
}
|
|
||||||
|
|
||||||
// free undef -> unreachable.
|
// free undef -> unreachable.
|
||||||
if (isa<UndefValue>(Op)) {
|
if (isa<UndefValue>(Op)) {
|
||||||
// Insert a new store to null because we cannot modify the CFG here.
|
// Insert a new store to null because we cannot modify the CFG here.
|
||||||
@ -8381,11 +8374,33 @@ Instruction *InstCombiner::visitFreeInst(FreeInst &FI) {
|
|||||||
UndefValue::get(PointerType::get(Type::Int1Ty)), &FI);
|
UndefValue::get(PointerType::get(Type::Int1Ty)), &FI);
|
||||||
return EraseInstFromFunction(FI);
|
return EraseInstFromFunction(FI);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have 'free null' delete the instruction. This can happen in stl code
|
// If we have 'free null' delete the instruction. This can happen in stl code
|
||||||
// when lots of inlining happens.
|
// when lots of inlining happens.
|
||||||
if (isa<ConstantPointerNull>(Op))
|
if (isa<ConstantPointerNull>(Op))
|
||||||
return EraseInstFromFunction(FI);
|
return EraseInstFromFunction(FI);
|
||||||
|
|
||||||
|
// Change free <ty>* (cast <ty2>* X to <ty>*) into free <ty2>* X
|
||||||
|
if (BitCastInst *CI = dyn_cast<BitCastInst>(Op)) {
|
||||||
|
FI.setOperand(0, CI->getOperand(0));
|
||||||
|
return &FI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change free (gep X, 0,0,0,0) into free(X)
|
||||||
|
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
|
||||||
|
if (GEPI->hasAllZeroIndices()) {
|
||||||
|
AddToWorkList(GEPI);
|
||||||
|
FI.setOperand(0, GEPI->getOperand(0));
|
||||||
|
return &FI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change free(malloc) into nothing, if the malloc has a single use.
|
||||||
|
if (MallocInst *MI = dyn_cast<MallocInst>(Op))
|
||||||
|
if (MI->hasOneUse()) {
|
||||||
|
EraseInstFromFunction(FI);
|
||||||
|
return EraseInstFromFunction(*MI);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user