mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 00:20:25 +00:00
Add missing check for presence of target data.
This avoids a crash in visitAllocaInst when target data isn't available. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164539 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -264,26 +264,28 @@ Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) {
|
||||
}
|
||||
}
|
||||
|
||||
// Check to see if this allocation is only modified by a memcpy/memmove from
|
||||
// a constant global whose alignment is equal to or exceeds that of the
|
||||
// allocation. If this is the case, we can change all users to use
|
||||
// the constant global instead. This is commonly produced by the CFE by
|
||||
// constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
|
||||
// is only subsequently read.
|
||||
SmallVector<Instruction *, 4> ToDelete;
|
||||
if (MemTransferInst *Copy = isOnlyCopiedFromConstantGlobal(&AI, ToDelete)) {
|
||||
if (AI.getAlignment() <= getPointeeAlignment(Copy->getSource(), *TD)) {
|
||||
DEBUG(dbgs() << "Found alloca equal to global: " << AI << '\n');
|
||||
DEBUG(dbgs() << " memcpy = " << *Copy << '\n');
|
||||
for (unsigned i = 0, e = ToDelete.size(); i != e; ++i)
|
||||
EraseInstFromFunction(*ToDelete[i]);
|
||||
Constant *TheSrc = cast<Constant>(Copy->getSource());
|
||||
Instruction *NewI
|
||||
= ReplaceInstUsesWith(AI, ConstantExpr::getBitCast(TheSrc,
|
||||
AI.getType()));
|
||||
EraseInstFromFunction(*Copy);
|
||||
++NumGlobalCopies;
|
||||
return NewI;
|
||||
if (TD) {
|
||||
// Check to see if this allocation is only modified by a memcpy/memmove from
|
||||
// a constant global whose alignment is equal to or exceeds that of the
|
||||
// allocation. If this is the case, we can change all users to use
|
||||
// the constant global instead. This is commonly produced by the CFE by
|
||||
// constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
|
||||
// is only subsequently read.
|
||||
SmallVector<Instruction *, 4> ToDelete;
|
||||
if (MemTransferInst *Copy = isOnlyCopiedFromConstantGlobal(&AI, ToDelete)) {
|
||||
if (AI.getAlignment() <= getPointeeAlignment(Copy->getSource(), *TD)) {
|
||||
DEBUG(dbgs() << "Found alloca equal to global: " << AI << '\n');
|
||||
DEBUG(dbgs() << " memcpy = " << *Copy << '\n');
|
||||
for (unsigned i = 0, e = ToDelete.size(); i != e; ++i)
|
||||
EraseInstFromFunction(*ToDelete[i]);
|
||||
Constant *TheSrc = cast<Constant>(Copy->getSource());
|
||||
Instruction *NewI
|
||||
= ReplaceInstUsesWith(AI, ConstantExpr::getBitCast(TheSrc,
|
||||
AI.getType()));
|
||||
EraseInstFromFunction(*Copy);
|
||||
++NumGlobalCopies;
|
||||
return NewI;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user