forked from OSchip/llvm-project
[ConstantFolding] Accept offset in ConstantFoldLoadFromConstPtr (NFCI)
As this API is now internally offset-based, we can accept a starting offset and remove the need to create a temporary bitcast+gep sequence to perform an offset load. The API now mirrors the ConstantFoldLoadFromConst() API.
This commit is contained in:
parent
d8e4170b0a
commit
710596a1e1
|
@ -138,10 +138,15 @@ Constant *ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset,
|
|||
Constant *ConstantFoldLoadFromConst(Constant *C, Type *Ty,
|
||||
const DataLayout &DL);
|
||||
|
||||
/// ConstantFoldLoadFromConstPtr - Return the value that a load from C would
|
||||
/// produce if it is constant and determinable. If this is not determinable,
|
||||
/// return null.
|
||||
Constant *ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, const DataLayout &DL);
|
||||
/// Return the value that a load from C with offset Offset would produce if it
|
||||
/// is constant and determinable. If this is not determinable, return null.
|
||||
Constant *ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset,
|
||||
const DataLayout &DL);
|
||||
|
||||
/// Return the value that a load from C would produce if it is constant and
|
||||
/// determinable. If this is not determinable, return null.
|
||||
Constant *ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty,
|
||||
const DataLayout &DL);
|
||||
|
||||
/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a
|
||||
/// getelementptr constantexpr, return the constant value being addressed by the
|
||||
|
|
|
@ -690,8 +690,8 @@ Constant *llvm::ConstantFoldLoadFromConst(Constant *C, Type *Ty,
|
|||
}
|
||||
|
||||
Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty,
|
||||
APInt Offset,
|
||||
const DataLayout &DL) {
|
||||
APInt Offset(DL.getIndexTypeSizeInBits(C->getType()), 0);
|
||||
C = cast<Constant>(C->stripAndAccumulateConstantOffsets(
|
||||
DL, Offset, /* AllowNonInbounds */ true));
|
||||
|
||||
|
@ -715,6 +715,12 @@ Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty,
|
||||
const DataLayout &DL) {
|
||||
APInt Offset(DL.getIndexTypeSizeInBits(C->getType()), 0);
|
||||
return ConstantFoldLoadFromConstPtr(C, Ty, Offset, DL);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/// One of Op0/Op1 is a constant expression.
|
||||
|
|
|
@ -403,19 +403,10 @@ int analyzeLoadFromClobberingMemInst(Type *LoadTy, Value *LoadPtr,
|
|||
if (Offset == -1)
|
||||
return Offset;
|
||||
|
||||
unsigned AS = Src->getType()->getPointerAddressSpace();
|
||||
// Otherwise, see if we can constant fold a load from the constant with the
|
||||
// offset applied as appropriate.
|
||||
if (Offset) {
|
||||
Src = ConstantExpr::getBitCast(Src,
|
||||
Type::getInt8PtrTy(Src->getContext(), AS));
|
||||
Constant *OffsetCst =
|
||||
ConstantInt::get(Type::getInt64Ty(Src->getContext()), (unsigned)Offset);
|
||||
Src = ConstantExpr::getGetElementPtr(Type::getInt8Ty(Src->getContext()),
|
||||
Src, OffsetCst);
|
||||
}
|
||||
Src = ConstantExpr::getBitCast(Src, PointerType::get(LoadTy, AS));
|
||||
if (ConstantFoldLoadFromConstPtr(Src, LoadTy, DL))
|
||||
unsigned IndexSize = DL.getIndexTypeSizeInBits(Src->getType());
|
||||
if (ConstantFoldLoadFromConstPtr(Src, LoadTy, APInt(IndexSize, Offset), DL))
|
||||
return Offset;
|
||||
return -1;
|
||||
}
|
||||
|
@ -584,19 +575,11 @@ T *getMemInstValueForLoadHelper(MemIntrinsic *SrcInst, unsigned Offset,
|
|||
MemTransferInst *MTI = cast<MemTransferInst>(SrcInst);
|
||||
Constant *Src = cast<Constant>(MTI->getSource());
|
||||
|
||||
unsigned AS = Src->getType()->getPointerAddressSpace();
|
||||
// Otherwise, see if we can constant fold a load from the constant with the
|
||||
// offset applied as appropriate.
|
||||
if (Offset) {
|
||||
Src = ConstantExpr::getBitCast(Src,
|
||||
Type::getInt8PtrTy(Src->getContext(), AS));
|
||||
Constant *OffsetCst =
|
||||
ConstantInt::get(Type::getInt64Ty(Src->getContext()), (unsigned)Offset);
|
||||
Src = ConstantExpr::getGetElementPtr(Type::getInt8Ty(Src->getContext()),
|
||||
Src, OffsetCst);
|
||||
}
|
||||
Src = ConstantExpr::getBitCast(Src, PointerType::get(LoadTy, AS));
|
||||
return ConstantFoldLoadFromConstPtr(Src, LoadTy, DL);
|
||||
unsigned IndexSize = DL.getIndexTypeSizeInBits(Src->getType());
|
||||
return ConstantFoldLoadFromConstPtr(
|
||||
Src, LoadTy, APInt(IndexSize, Offset), DL);
|
||||
}
|
||||
|
||||
/// This function is called when we have a
|
||||
|
|
Loading…
Reference in New Issue