mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Fix a minor bug where we set a var to initialized on malloc, not on store.
This doesn't fix anything that I'm aware of, just noticed it by inspection git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18417 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cda35f824b
commit
bc965b97ad
@ -670,9 +670,13 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
|
||||
|
||||
// If there is a comparison against null, we will insert a global bool to
|
||||
// keep track of whether the global was initialized yet or not.
|
||||
GlobalVariable *InitBool = 0;
|
||||
GlobalVariable *InitBool =
|
||||
new GlobalVariable(Type::BoolTy, false, GlobalValue::InternalLinkage,
|
||||
ConstantBool::False, GV->getName()+".init");
|
||||
bool InitBoolUsed = false;
|
||||
|
||||
// Loop over all uses of GV, processing them in turn.
|
||||
std::vector<StoreInst*> Stores;
|
||||
while (!GV->use_empty())
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(GV->use_back())) {
|
||||
while (!LI->use_empty()) {
|
||||
@ -681,18 +685,10 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
|
||||
if (!isa<SetCondInst>(LoadUse.getUser()))
|
||||
LoadUse = RepValue;
|
||||
else {
|
||||
if (InitBool == 0) {
|
||||
InitBool = new GlobalVariable(Type::BoolTy, false,
|
||||
GlobalValue::InternalLinkage,
|
||||
ConstantBool::False,
|
||||
GV->getName()+".init");
|
||||
GV->getParent()->getGlobalList().insert(GV, InitBool);
|
||||
// The global is initialized when the malloc is run.
|
||||
new StoreInst(ConstantBool::True, InitBool, MI);
|
||||
}
|
||||
// Replace the setcc X, 0 with a use of the bool value.
|
||||
SetCondInst *SCI = cast<SetCondInst>(LoadUse.getUser());
|
||||
Value *LV = new LoadInst(InitBool, InitBool->getName()+".val", SCI);
|
||||
InitBoolUsed = true;
|
||||
switch (SCI->getOpcode()) {
|
||||
default: assert(0 && "Unknown opcode!");
|
||||
case Instruction::SetLT:
|
||||
@ -714,9 +710,20 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
|
||||
LI->eraseFromParent();
|
||||
} else {
|
||||
StoreInst *SI = cast<StoreInst>(GV->use_back());
|
||||
// The global is initialized when the store to it occurs.
|
||||
new StoreInst(ConstantBool::True, InitBool, SI);
|
||||
SI->eraseFromParent();
|
||||
}
|
||||
|
||||
// If the initialization boolean was used, insert it, otherwise delete it.
|
||||
if (!InitBoolUsed) {
|
||||
while (!InitBool->use_empty()) // Delete initializations
|
||||
cast<Instruction>(InitBool->use_back())->eraseFromParent();
|
||||
delete InitBool;
|
||||
} else
|
||||
GV->getParent()->getGlobalList().insert(GV, InitBool);
|
||||
|
||||
|
||||
// Now the GV is dead, nuke it and the malloc.
|
||||
GV->eraseFromParent();
|
||||
MI->eraseFromParent();
|
||||
|
Loading…
Reference in New Issue
Block a user