mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
Opaque Pointer Types: GEP API migrations to specify the gep type explicitly
The changes to InstCombine (& SCEV) do seem a bit silly - it doesn't make anything obviously better to have the caller access the pointers element type (the thing I'm trying to remove) than the GEP itself, but it's a helpful migration step. This will allow me to more obviously lock down GEP (& Load, etc) API usage, then fix all the code that accesses pointer element types except the places that need to be removed (most of the InstCombines) anyway - at which point I'll need to just remove all that code because it won't be meaningful anymore (there will be no pointer types, so no bitcasts to combine) SCEV looks like it'll need some restructuring - we'll have to do a bit more work for GEP canonicalization, since it'll depend on how it's used if we can even manage to canonicalize it to a non-ugly GEP. I guess we can do some fun stuff like voting (do 2 out of 3 load from the GEP with a certain type that gives a pretty GEP? Does every typed use of the GEP use either a specific type or a generic type (i8*, etc)?) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233131 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
28b71b1917
commit
4e933df738
@ -374,7 +374,8 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
|
||||
PointerType *PTy,
|
||||
Type *Ty,
|
||||
Value *V) {
|
||||
Type *ElTy = PTy->getElementType();
|
||||
Type *OriginalElTy = PTy->getElementType();
|
||||
Type *ElTy = OriginalElTy;
|
||||
SmallVector<Value *, 4> GepIndices;
|
||||
SmallVector<const SCEV *, 8> Ops(op_begin, op_end);
|
||||
bool AnyNonZeroIndices = false;
|
||||
@ -558,7 +559,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
|
||||
Value *Casted = V;
|
||||
if (V->getType() != PTy)
|
||||
Casted = InsertNoopCastOfTo(Casted, PTy);
|
||||
Value *GEP = Builder.CreateGEP(Casted,
|
||||
Value *GEP = Builder.CreateGEP(OriginalElTy, Casted,
|
||||
GepIndices,
|
||||
"scevgep");
|
||||
Ops.push_back(SE.getUnknown(GEP));
|
||||
|
@ -343,6 +343,7 @@ Value *GenericToNVVM::remapConstantExpr(Module *M, Function *F, ConstantExpr *C,
|
||||
// GetElementPtrConstantExpr
|
||||
return cast<GEPOperator>(C)->isInBounds()
|
||||
? Builder.CreateGEP(
|
||||
cast<GEPOperator>(C)->getSourceElementType(),
|
||||
NewOperands[0],
|
||||
makeArrayRef(&NewOperands[1], NumOperands - 1))
|
||||
: Builder.CreateInBoundsGEP(
|
||||
|
@ -295,9 +295,9 @@ void AMDGPUPromoteAlloca::visitAlloca(AllocaInst &I) {
|
||||
DEBUG(dbgs() << "Promoting alloca to local memory\n");
|
||||
LocalMemAvailable -= AllocaSize;
|
||||
|
||||
Type *GVTy = ArrayType::get(I.getAllocatedType(), 256);
|
||||
GlobalVariable *GV = new GlobalVariable(
|
||||
*Mod, ArrayType::get(I.getAllocatedType(), 256), false,
|
||||
GlobalValue::ExternalLinkage, 0, I.getName(), 0,
|
||||
*Mod, GVTy, false, GlobalValue::ExternalLinkage, 0, I.getName(), 0,
|
||||
GlobalVariable::NotThreadLocal, AMDGPUAS::LOCAL_ADDRESS);
|
||||
|
||||
FunctionType *FTy = FunctionType::get(
|
||||
@ -333,7 +333,7 @@ void AMDGPUPromoteAlloca::visitAlloca(AllocaInst &I) {
|
||||
Indices.push_back(Constant::getNullValue(Type::getInt32Ty(Mod->getContext())));
|
||||
Indices.push_back(TID);
|
||||
|
||||
Value *Offset = Builder.CreateGEP(GV, Indices);
|
||||
Value *Offset = Builder.CreateGEP(GVTy, GV, Indices);
|
||||
I.mutateType(Offset->getType());
|
||||
I.replaceAllUsesWith(Offset);
|
||||
I.eraseFromParent();
|
||||
|
@ -1473,9 +1473,11 @@ Instruction *InstCombiner::commonPointerCastTransforms(CastInst &CI) {
|
||||
// If we were able to index down into an element, create the GEP
|
||||
// and bitcast the result. This eliminates one bitcast, potentially
|
||||
// two.
|
||||
Value *NGEP = cast<GEPOperator>(GEP)->isInBounds() ?
|
||||
Builder->CreateInBoundsGEP(OrigBase, NewIndices) :
|
||||
Builder->CreateGEP(OrigBase, NewIndices);
|
||||
Value *NGEP = cast<GEPOperator>(GEP)->isInBounds()
|
||||
? Builder->CreateInBoundsGEP(OrigBase, NewIndices)
|
||||
: Builder->CreateGEP(
|
||||
OrigBase->getType()->getPointerElementType(),
|
||||
OrigBase, NewIndices);
|
||||
NGEP->takeName(GEP);
|
||||
|
||||
if (isa<BitCastInst>(CI))
|
||||
|
@ -35,7 +35,7 @@ protected:
|
||||
SwitchCase2BB = BasicBlock::Create(Ctx, "switch.case.2", F);
|
||||
ExitBB = BasicBlock::Create(Ctx, "exit", F);
|
||||
|
||||
ArrayType *AT = ArrayType::get(Type::getInt8PtrTy(Ctx), 3);
|
||||
AT = ArrayType::get(Type::getInt8PtrTy(Ctx), 3);
|
||||
|
||||
GV = new GlobalVariable(*M.get(), AT, false /*=isConstant*/,
|
||||
GlobalValue::InternalLinkage, nullptr,"switch.bas");
|
||||
@ -61,6 +61,7 @@ protected:
|
||||
LLVMContext Ctx;
|
||||
std::unique_ptr<Module> M;
|
||||
Function *F;
|
||||
ArrayType *AT;
|
||||
GlobalVariable *GV;
|
||||
BasicBlock *EntryBB;
|
||||
BasicBlock *SwitchCase1BB;
|
||||
@ -75,7 +76,7 @@ TEST_F(LinkModuleTest, BlockAddress) {
|
||||
GEPIndices.push_back(ConstantInt::get(Type::getInt32Ty(Ctx), 0));
|
||||
GEPIndices.push_back(F->arg_begin());
|
||||
|
||||
Value *GEP = Builder.CreateGEP(GV, GEPIndices, "switch.gep");
|
||||
Value *GEP = Builder.CreateGEP(AT, GV, GEPIndices, "switch.gep");
|
||||
Value *Load = Builder.CreateLoad(GEP, "switch.load");
|
||||
|
||||
Builder.CreateRet(Load);
|
||||
|
Loading…
x
Reference in New Issue
Block a user