mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-20 16:17:38 +00:00
land David Blaikie's patch to de-constify Type, with a few tweaks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135375 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -281,18 +281,18 @@ static Constant *getAggregateConstantElement(Constant *Agg, Constant *Idx) {
|
||||
} else if (ConstantVector *CP = dyn_cast<ConstantVector>(Agg)) {
|
||||
if (IdxV < CP->getNumOperands()) return CP->getOperand(IdxV);
|
||||
} else if (isa<ConstantAggregateZero>(Agg)) {
|
||||
if (const StructType *STy = dyn_cast<StructType>(Agg->getType())) {
|
||||
if (StructType *STy = dyn_cast<StructType>(Agg->getType())) {
|
||||
if (IdxV < STy->getNumElements())
|
||||
return Constant::getNullValue(STy->getElementType(IdxV));
|
||||
} else if (const SequentialType *STy =
|
||||
} else if (SequentialType *STy =
|
||||
dyn_cast<SequentialType>(Agg->getType())) {
|
||||
return Constant::getNullValue(STy->getElementType());
|
||||
}
|
||||
} else if (isa<UndefValue>(Agg)) {
|
||||
if (const StructType *STy = dyn_cast<StructType>(Agg->getType())) {
|
||||
if (StructType *STy = dyn_cast<StructType>(Agg->getType())) {
|
||||
if (IdxV < STy->getNumElements())
|
||||
return UndefValue::get(STy->getElementType(IdxV));
|
||||
} else if (const SequentialType *STy =
|
||||
} else if (SequentialType *STy =
|
||||
dyn_cast<SequentialType>(Agg->getType())) {
|
||||
return UndefValue::get(STy->getElementType());
|
||||
}
|
||||
@@ -430,7 +430,7 @@ static bool IsUserOfGlobalSafeForSRA(User *U, GlobalValue *GV) {
|
||||
++GEPI; // Skip over the pointer index.
|
||||
|
||||
// If this is a use of an array allocation, do a bit more checking for sanity.
|
||||
if (const ArrayType *AT = dyn_cast<ArrayType>(*GEPI)) {
|
||||
if (ArrayType *AT = dyn_cast<ArrayType>(*GEPI)) {
|
||||
uint64_t NumElements = AT->getNumElements();
|
||||
ConstantInt *Idx = cast<ConstantInt>(U->getOperand(2));
|
||||
|
||||
@@ -451,9 +451,9 @@ static bool IsUserOfGlobalSafeForSRA(User *U, GlobalValue *GV) {
|
||||
GEPI != E;
|
||||
++GEPI) {
|
||||
uint64_t NumElements;
|
||||
if (const ArrayType *SubArrayTy = dyn_cast<ArrayType>(*GEPI))
|
||||
if (ArrayType *SubArrayTy = dyn_cast<ArrayType>(*GEPI))
|
||||
NumElements = SubArrayTy->getNumElements();
|
||||
else if (const VectorType *SubVectorTy = dyn_cast<VectorType>(*GEPI))
|
||||
else if (VectorType *SubVectorTy = dyn_cast<VectorType>(*GEPI))
|
||||
NumElements = SubVectorTy->getNumElements();
|
||||
else {
|
||||
assert((*GEPI)->isStructTy() &&
|
||||
@@ -498,7 +498,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const TargetData &TD) {
|
||||
|
||||
assert(GV->hasLocalLinkage() && !GV->isConstant());
|
||||
Constant *Init = GV->getInitializer();
|
||||
const Type *Ty = Init->getType();
|
||||
Type *Ty = Init->getType();
|
||||
|
||||
std::vector<GlobalVariable*> NewGlobals;
|
||||
Module::GlobalListType &Globals = GV->getParent()->getGlobalList();
|
||||
@@ -508,7 +508,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const TargetData &TD) {
|
||||
if (StartAlignment == 0)
|
||||
StartAlignment = TD.getABITypeAlignment(GV->getType());
|
||||
|
||||
if (const StructType *STy = dyn_cast<StructType>(Ty)) {
|
||||
if (StructType *STy = dyn_cast<StructType>(Ty)) {
|
||||
NewGlobals.reserve(STy->getNumElements());
|
||||
const StructLayout &Layout = *TD.getStructLayout(STy);
|
||||
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
|
||||
@@ -531,9 +531,9 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const TargetData &TD) {
|
||||
if (NewAlign > TD.getABITypeAlignment(STy->getElementType(i)))
|
||||
NGV->setAlignment(NewAlign);
|
||||
}
|
||||
} else if (const SequentialType *STy = dyn_cast<SequentialType>(Ty)) {
|
||||
} else if (SequentialType *STy = dyn_cast<SequentialType>(Ty)) {
|
||||
unsigned NumElements = 0;
|
||||
if (const ArrayType *ATy = dyn_cast<ArrayType>(STy))
|
||||
if (ArrayType *ATy = dyn_cast<ArrayType>(STy))
|
||||
NumElements = ATy->getNumElements();
|
||||
else
|
||||
NumElements = cast<VectorType>(STy)->getNumElements();
|
||||
@@ -846,12 +846,12 @@ static void ConstantPropUsersOf(Value *V) {
|
||||
/// malloc into a global, and any loads of GV as uses of the new global.
|
||||
static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
|
||||
CallInst *CI,
|
||||
const Type *AllocTy,
|
||||
Type *AllocTy,
|
||||
ConstantInt *NElements,
|
||||
TargetData* TD) {
|
||||
DEBUG(errs() << "PROMOTING GLOBAL: " << *GV << " CALL = " << *CI << '\n');
|
||||
|
||||
const Type *GlobalType;
|
||||
Type *GlobalType;
|
||||
if (NElements->getZExtValue() == 1)
|
||||
GlobalType = AllocTy;
|
||||
else
|
||||
@@ -1192,7 +1192,7 @@ static Value *GetHeapSROAValue(Value *V, unsigned FieldNo,
|
||||
} else if (PHINode *PN = dyn_cast<PHINode>(V)) {
|
||||
// PN's type is pointer to struct. Make a new PHI of pointer to struct
|
||||
// field.
|
||||
const StructType *ST =
|
||||
StructType *ST =
|
||||
cast<StructType>(cast<PointerType>(PN->getType())->getElementType());
|
||||
|
||||
PHINode *NewPN =
|
||||
@@ -1298,8 +1298,8 @@ static void RewriteUsesOfLoadForHeapSRoA(LoadInst *Load,
|
||||
static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
|
||||
Value* NElems, TargetData *TD) {
|
||||
DEBUG(dbgs() << "SROA HEAP ALLOC: " << *GV << " MALLOC = " << *CI << '\n');
|
||||
const Type* MAT = getMallocAllocatedType(CI);
|
||||
const StructType *STy = cast<StructType>(MAT);
|
||||
Type* MAT = getMallocAllocatedType(CI);
|
||||
StructType *STy = cast<StructType>(MAT);
|
||||
|
||||
// There is guaranteed to be at least one use of the malloc (storing
|
||||
// it into GV). If there are other uses, change them to be uses of
|
||||
@@ -1313,8 +1313,8 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
|
||||
std::vector<Value*> FieldMallocs;
|
||||
|
||||
for (unsigned FieldNo = 0, e = STy->getNumElements(); FieldNo != e;++FieldNo){
|
||||
const Type *FieldTy = STy->getElementType(FieldNo);
|
||||
const PointerType *PFieldTy = PointerType::getUnqual(FieldTy);
|
||||
Type *FieldTy = STy->getElementType(FieldNo);
|
||||
PointerType *PFieldTy = PointerType::getUnqual(FieldTy);
|
||||
|
||||
GlobalVariable *NGV =
|
||||
new GlobalVariable(*GV->getParent(),
|
||||
@@ -1325,9 +1325,9 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
|
||||
FieldGlobals.push_back(NGV);
|
||||
|
||||
unsigned TypeSize = TD->getTypeAllocSize(FieldTy);
|
||||
if (const StructType *ST = dyn_cast<StructType>(FieldTy))
|
||||
if (StructType *ST = dyn_cast<StructType>(FieldTy))
|
||||
TypeSize = TD->getStructLayout(ST)->getSizeInBytes();
|
||||
const Type *IntPtrTy = TD->getIntPtrType(CI->getContext());
|
||||
Type *IntPtrTy = TD->getIntPtrType(CI->getContext());
|
||||
Value *NMI = CallInst::CreateMalloc(CI, IntPtrTy, FieldTy,
|
||||
ConstantInt::get(IntPtrTy, TypeSize),
|
||||
NElems, 0,
|
||||
@@ -1428,7 +1428,7 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
|
||||
|
||||
// Insert a store of null into each global.
|
||||
for (unsigned i = 0, e = FieldGlobals.size(); i != e; ++i) {
|
||||
const PointerType *PT = cast<PointerType>(FieldGlobals[i]->getType());
|
||||
PointerType *PT = cast<PointerType>(FieldGlobals[i]->getType());
|
||||
Constant *Null = Constant::getNullValue(PT->getElementType());
|
||||
new StoreInst(Null, FieldGlobals[i], SI);
|
||||
}
|
||||
@@ -1485,7 +1485,7 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
|
||||
/// cast of malloc.
|
||||
static bool TryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV,
|
||||
CallInst *CI,
|
||||
const Type *AllocTy,
|
||||
Type *AllocTy,
|
||||
Module::global_iterator &GVI,
|
||||
TargetData *TD) {
|
||||
if (!TD)
|
||||
@@ -1538,10 +1538,10 @@ static bool TryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV,
|
||||
// If this is an allocation of a fixed size array of structs, analyze as a
|
||||
// variable size array. malloc [100 x struct],1 -> malloc struct, 100
|
||||
if (NElems == ConstantInt::get(CI->getArgOperand(0)->getType(), 1))
|
||||
if (const ArrayType *AT = dyn_cast<ArrayType>(AllocTy))
|
||||
if (ArrayType *AT = dyn_cast<ArrayType>(AllocTy))
|
||||
AllocTy = AT->getElementType();
|
||||
|
||||
const StructType *AllocSTy = dyn_cast<StructType>(AllocTy);
|
||||
StructType *AllocSTy = dyn_cast<StructType>(AllocTy);
|
||||
if (!AllocSTy)
|
||||
return false;
|
||||
|
||||
@@ -1552,8 +1552,8 @@ static bool TryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV,
|
||||
|
||||
// If this is a fixed size array, transform the Malloc to be an alloc of
|
||||
// structs. malloc [100 x struct],1 -> malloc struct, 100
|
||||
if (const ArrayType *AT = dyn_cast<ArrayType>(getMallocAllocatedType(CI))) {
|
||||
const Type *IntPtrTy = TD->getIntPtrType(CI->getContext());
|
||||
if (ArrayType *AT = dyn_cast<ArrayType>(getMallocAllocatedType(CI))) {
|
||||
Type *IntPtrTy = TD->getIntPtrType(CI->getContext());
|
||||
unsigned TypeSize = TD->getStructLayout(AllocSTy)->getSizeInBytes();
|
||||
Value *AllocSize = ConstantInt::get(IntPtrTy, TypeSize);
|
||||
Value *NumElements = ConstantInt::get(IntPtrTy, AT->getNumElements());
|
||||
@@ -1596,7 +1596,7 @@ static bool OptimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal,
|
||||
if (OptimizeAwayTrappingUsesOfLoads(GV, SOVC))
|
||||
return true;
|
||||
} else if (CallInst *CI = extractMallocCall(StoredOnceVal)) {
|
||||
const Type* MallocType = getMallocAllocatedType(CI);
|
||||
Type* MallocType = getMallocAllocatedType(CI);
|
||||
if (MallocType && TryToOptimizeStoreOfMallocToGlobal(GV, CI, MallocType,
|
||||
GVI, TD))
|
||||
return true;
|
||||
@@ -1611,7 +1611,7 @@ static bool OptimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal,
|
||||
/// can shrink the global into a boolean and select between the two values
|
||||
/// whenever it is used. This exposes the values to other scalar optimizations.
|
||||
static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) {
|
||||
const Type *GVElType = GV->getType()->getElementType();
|
||||
Type *GVElType = GV->getType()->getElementType();
|
||||
|
||||
// If GVElType is already i1, it is already shrunk. If the type of the GV is
|
||||
// an FP value, pointer or vector, don't do this optimization because a select
|
||||
@@ -1761,7 +1761,7 @@ bool GlobalOpt::ProcessInternalGlobal(GlobalVariable *GV,
|
||||
DEBUG(dbgs() << "LOCALIZING GLOBAL: " << *GV);
|
||||
Instruction& FirstI = const_cast<Instruction&>(*GS.AccessingFunction
|
||||
->getEntryBlock().begin());
|
||||
const Type* ElemTy = GV->getType()->getElementType();
|
||||
Type* ElemTy = GV->getType()->getElementType();
|
||||
// FIXME: Pass Global's alignment when globals have alignment
|
||||
AllocaInst* Alloca = new AllocaInst(ElemTy, NULL, GV->getName(), &FirstI);
|
||||
if (!isa<UndefValue>(GV->getInitializer()))
|
||||
@@ -2003,7 +2003,7 @@ static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
|
||||
CSVals[0] = ConstantInt::get(Type::getInt32Ty(GCL->getContext()), 65535);
|
||||
CSVals[1] = 0;
|
||||
|
||||
const StructType *StructTy =
|
||||
StructType *StructTy =
|
||||
cast <StructType>(
|
||||
cast<ArrayType>(GCL->getType()->getElementType())->getElementType());
|
||||
|
||||
@@ -2013,9 +2013,9 @@ static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL,
|
||||
if (Ctors[i]) {
|
||||
CSVals[1] = Ctors[i];
|
||||
} else {
|
||||
const Type *FTy = FunctionType::get(Type::getVoidTy(GCL->getContext()),
|
||||
Type *FTy = FunctionType::get(Type::getVoidTy(GCL->getContext()),
|
||||
false);
|
||||
const PointerType *PFTy = PointerType::getUnqual(FTy);
|
||||
PointerType *PFTy = PointerType::getUnqual(FTy);
|
||||
CSVals[1] = Constant::getNullValue(PFTy);
|
||||
CSVals[0] = ConstantInt::get(Type::getInt32Ty(GCL->getContext()),
|
||||
0x7fffffff);
|
||||
@@ -2196,7 +2196,7 @@ static Constant *EvaluateStoreInto(Constant *Init, Constant *Val,
|
||||
}
|
||||
|
||||
std::vector<Constant*> Elts;
|
||||
if (const StructType *STy = dyn_cast<StructType>(Init->getType())) {
|
||||
if (StructType *STy = dyn_cast<StructType>(Init->getType())) {
|
||||
|
||||
// Break up the constant into its elements.
|
||||
if (ConstantStruct *CS = dyn_cast<ConstantStruct>(Init)) {
|
||||
@@ -2224,10 +2224,10 @@ static Constant *EvaluateStoreInto(Constant *Init, Constant *Val,
|
||||
}
|
||||
|
||||
ConstantInt *CI = cast<ConstantInt>(Addr->getOperand(OpNo));
|
||||
const SequentialType *InitTy = cast<SequentialType>(Init->getType());
|
||||
SequentialType *InitTy = cast<SequentialType>(Init->getType());
|
||||
|
||||
uint64_t NumElts;
|
||||
if (const ArrayType *ATy = dyn_cast<ArrayType>(InitTy))
|
||||
if (ArrayType *ATy = dyn_cast<ArrayType>(InitTy))
|
||||
NumElts = ATy->getNumElements();
|
||||
else
|
||||
NumElts = cast<VectorType>(InitTy)->getNumElements();
|
||||
@@ -2358,7 +2358,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,
|
||||
// stored value.
|
||||
Ptr = CE->getOperand(0);
|
||||
|
||||
const Type *NewTy=cast<PointerType>(Ptr->getType())->getElementType();
|
||||
Type *NewTy=cast<PointerType>(Ptr->getType())->getElementType();
|
||||
|
||||
// In order to push the bitcast onto the stored value, a bitcast
|
||||
// from NewTy to Val's type must be legal. If it's not, we can try
|
||||
@@ -2367,10 +2367,10 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,
|
||||
// If NewTy is a struct, we can convert the pointer to the struct
|
||||
// into a pointer to its first member.
|
||||
// FIXME: This could be extended to support arrays as well.
|
||||
if (const StructType *STy = dyn_cast<StructType>(NewTy)) {
|
||||
if (StructType *STy = dyn_cast<StructType>(NewTy)) {
|
||||
NewTy = STy->getTypeAtIndex(0U);
|
||||
|
||||
const IntegerType *IdxTy =IntegerType::get(NewTy->getContext(), 32);
|
||||
IntegerType *IdxTy =IntegerType::get(NewTy->getContext(), 32);
|
||||
Constant *IdxZero = ConstantInt::get(IdxTy, 0, false);
|
||||
Constant * const IdxList[] = {IdxZero, IdxZero};
|
||||
|
||||
@@ -2421,7 +2421,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,
|
||||
if (InstResult == 0) return false; // Could not evaluate load.
|
||||
} else if (AllocaInst *AI = dyn_cast<AllocaInst>(CurInst)) {
|
||||
if (AI->isArrayAllocation()) return false; // Cannot handle array allocs.
|
||||
const Type *Ty = AI->getType()->getElementType();
|
||||
Type *Ty = AI->getType()->getElementType();
|
||||
AllocaTmps.push_back(new GlobalVariable(Ty, false,
|
||||
GlobalValue::InternalLinkage,
|
||||
UndefValue::get(Ty),
|
||||
@@ -2711,7 +2711,7 @@ static Function *FindCXAAtExit(Module &M) {
|
||||
if (!Fn)
|
||||
return 0;
|
||||
|
||||
const FunctionType *FTy = Fn->getFunctionType();
|
||||
FunctionType *FTy = Fn->getFunctionType();
|
||||
|
||||
// Checking that the function has the right return type, the right number of
|
||||
// parameters and that they all have pointer types should be enough.
|
||||
|
||||
Reference in New Issue
Block a user