mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Fix always creating GEP with i32 indices
Use the pointer size if datalayout is available. Use i64 if it's not, which is consistent with what other places do when the pointer size is unknown. The test doesn't really test this in a useful way since it will be transformed to that later anyway, but this now tests it for non-zero arrays and when datalayout isn't available. The cases in visitGetElementPtrInst should save an extra re-visit to the newly created GEP since it won't need to cleanup after itself. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188339 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -180,7 +180,10 @@ Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) {
|
||||
// Now that I is pointing to the first non-allocation-inst in the block,
|
||||
// insert our getelementptr instruction...
|
||||
//
|
||||
Value *NullIdx = Constant::getNullValue(Type::getInt32Ty(AI.getContext()));
|
||||
Type *IdxTy = TD
|
||||
? TD->getIntPtrType(AI.getContext())
|
||||
: Type::getInt64Ty(AI.getContext());
|
||||
Value *NullIdx = Constant::getNullValue(IdxTy);
|
||||
Value *Idx[2] = { NullIdx, NullIdx };
|
||||
Instruction *GEP =
|
||||
GetElementPtrInst::CreateInBounds(New, Idx, New->getName() + ".sub");
|
||||
@@ -300,9 +303,11 @@ static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI,
|
||||
if (ArrayType *ASrcTy = dyn_cast<ArrayType>(SrcPTy))
|
||||
if (Constant *CSrc = dyn_cast<Constant>(CastOp))
|
||||
if (ASrcTy->getNumElements() != 0) {
|
||||
Value *Idxs[2];
|
||||
Idxs[0] = Constant::getNullValue(Type::getInt32Ty(LI.getContext()));
|
||||
Idxs[1] = Idxs[0];
|
||||
Type *IdxTy = TD
|
||||
? TD->getIntPtrType(LI.getContext())
|
||||
: Type::getInt64Ty(LI.getContext());
|
||||
Value *Idx = Constant::getNullValue(IdxTy);
|
||||
Value *Idxs[2] = { Idx, Idx };
|
||||
CastOp = ConstantExpr::getGetElementPtr(CSrc, Idxs);
|
||||
SrcTy = cast<PointerType>(CastOp->getType());
|
||||
SrcPTy = SrcTy->getElementType();
|
||||
|
@@ -1235,9 +1235,8 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
if (TD && SrcElTy->isArrayTy() &&
|
||||
TD->getTypeAllocSize(SrcElTy->getArrayElementType()) ==
|
||||
TD->getTypeAllocSize(ResElTy)) {
|
||||
Value *Idx[2];
|
||||
Idx[0] = Constant::getNullValue(Type::getInt32Ty(GEP.getContext()));
|
||||
Idx[1] = GEP.getOperand(1);
|
||||
Type *IdxType = TD->getIntPtrType(GEP.getContext());
|
||||
Value *Idx[2] = { Constant::getNullValue(IdxType), GEP.getOperand(1) };
|
||||
Value *NewGEP = GEP.isInBounds() ?
|
||||
Builder->CreateInBoundsGEP(StrippedPtr, Idx, GEP.getName()) :
|
||||
Builder->CreateGEP(StrippedPtr, Idx, GEP.getName());
|
||||
@@ -1304,9 +1303,11 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
// Successfully decomposed Idx as NewIdx * Scale, form a new GEP.
|
||||
// If the multiplication NewIdx * Scale may overflow then the new
|
||||
// GEP may not be "inbounds".
|
||||
Value *Off[2];
|
||||
Off[0] = Constant::getNullValue(Type::getInt32Ty(GEP.getContext()));
|
||||
Off[1] = NewIdx;
|
||||
Value *Off[2] = {
|
||||
Constant::getNullValue(TD->getIntPtrType(GEP.getContext())),
|
||||
NewIdx
|
||||
};
|
||||
|
||||
Value *NewGEP = GEP.isInBounds() && NSW ?
|
||||
Builder->CreateInBoundsGEP(StrippedPtr, Off, GEP.getName()) :
|
||||
Builder->CreateGEP(StrippedPtr, Off, GEP.getName());
|
||||
|
Reference in New Issue
Block a user