mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-13 15:37:24 +00:00
Ignore instructions that are in trivially dead functions. This allows us
to constify 14 globals instead of 4 in a trivial C++ testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15027 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d43b9fd1ae
commit
9ce300013d
@ -39,6 +39,16 @@ namespace {
|
||||
|
||||
Pass *llvm::createGlobalConstifierPass() { return new Constifier(); }
|
||||
|
||||
/// A lot of global constants are stored only in trivially dead setter
|
||||
/// functions. Because we don't want to cycle between globaldce and this pass,
|
||||
/// just do a simple check to catch the common case.
|
||||
static bool ContainingFunctionIsTriviallyDead(Instruction *I) {
|
||||
Function *F = I->getParent()->getParent();
|
||||
if (!F->hasInternalLinkage()) return false;
|
||||
F->removeDeadConstantUsers();
|
||||
return F->use_empty();
|
||||
}
|
||||
|
||||
/// isStoredThrough - Return false if the specified pointer is provably never
|
||||
/// stored through. If we can't tell, we must conservatively assume it might.
|
||||
///
|
||||
@ -48,10 +58,13 @@ static bool isStoredThrough(Value *V) {
|
||||
if (isStoredThrough(CE))
|
||||
return true;
|
||||
} else if (Instruction *I = dyn_cast<Instruction>(*UI)) {
|
||||
if (I->getOpcode() == Instruction::GetElementPtr) {
|
||||
if (isStoredThrough(I)) return true;
|
||||
} else if (!isa<LoadInst>(*UI) && !isa<SetCondInst>(*UI))
|
||||
return true; // Any other non-load instruction might store!
|
||||
if (!ContainingFunctionIsTriviallyDead(I)) {
|
||||
if (I->getOpcode() == Instruction::GetElementPtr) {
|
||||
if (isStoredThrough(I)) return true;
|
||||
} else if (!isa<LoadInst>(*UI) && !isa<SetCondInst>(*UI)) {
|
||||
return true; // Any other non-load instruction might store!
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Otherwise must be a global or some other user.
|
||||
return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user