mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-26 05:25:47 +00:00
DataLayout is mandatory, update the API to reflect it with references.
Summary: Now that the DataLayout is a mandatory part of the module, let's start cleaning the codebase. This patch is a first attempt at doing that. This patch is not exactly NFC as for instance some places were passing a nullptr instead of the DataLayout, possibly just because there was a default value on the DataLayout argument to many functions in the API. Even though it is not purely NFC, there is no change in the validation. I turned as many pointer to DataLayout to references, this helped figuring out all the places where a nullptr could come up. I had initially a local version of this patch broken into over 30 independant, commits but some later commit were cleaning the API and touching part of the code modified in the previous commits, so it seemed cleaner without the intermediate state. Test Plan: Reviewers: echristo Subscribers: llvm-commits From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231740 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -229,10 +229,6 @@ static void ComputeUnsignedMinMaxValuesFromKnownBits(const APInt &KnownZero,
|
||||
Instruction *InstCombiner::
|
||||
FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
CmpInst &ICI, ConstantInt *AndCst) {
|
||||
// We need TD information to know the pointer size unless this is inbounds.
|
||||
if (!GEP->isInBounds() && !DL)
|
||||
return nullptr;
|
||||
|
||||
Constant *Init = GV->getInitializer();
|
||||
if (!isa<ConstantArray>(Init) && !isa<ConstantDataArray>(Init))
|
||||
return nullptr;
|
||||
@@ -303,7 +299,6 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
// the array, this will fully represent all the comparison results.
|
||||
uint64_t MagicBitvector = 0;
|
||||
|
||||
|
||||
// Scan the array and see if one of our patterns matches.
|
||||
Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
|
||||
for (unsigned i = 0, e = ArrayElementCount; i != e; ++i) {
|
||||
@@ -398,7 +393,7 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
// index down like the GEP would do implicitly. We don't have to do this for
|
||||
// an inbounds GEP because the index can't be out of range.
|
||||
if (!GEP->isInBounds()) {
|
||||
Type *IntPtrTy = DL->getIntPtrType(GEP->getType());
|
||||
Type *IntPtrTy = DL.getIntPtrType(GEP->getType());
|
||||
unsigned PtrSize = IntPtrTy->getIntegerBitWidth();
|
||||
if (Idx->getType()->getPrimitiveSizeInBits() > PtrSize)
|
||||
Idx = Builder->CreateTrunc(Idx, IntPtrTy);
|
||||
@@ -487,10 +482,8 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
// - Default to i32
|
||||
if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
|
||||
Ty = Idx->getType();
|
||||
else if (DL)
|
||||
Ty = DL->getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
|
||||
else if (ArrayElementCount <= 32)
|
||||
Ty = Type::getInt32Ty(Init->getContext());
|
||||
else
|
||||
Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
|
||||
|
||||
if (Ty) {
|
||||
Value *V = Builder->CreateIntCast(Idx, Ty, false);
|
||||
@@ -514,8 +507,8 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
///
|
||||
/// If we can't emit an optimized form for this expression, this returns null.
|
||||
///
|
||||
static Value *EvaluateGEPOffsetExpression(User *GEP, InstCombiner &IC) {
|
||||
const DataLayout &DL = *IC.getDataLayout();
|
||||
static Value *EvaluateGEPOffsetExpression(User *GEP, InstCombiner &IC,
|
||||
const DataLayout &DL) {
|
||||
gep_type_iterator GTI = gep_type_begin(GEP);
|
||||
|
||||
// Check to see if this gep only has a single variable index. If so, and if
|
||||
@@ -628,12 +621,12 @@ Instruction *InstCombiner::FoldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
|
||||
RHS = RHS->stripPointerCasts();
|
||||
|
||||
Value *PtrBase = GEPLHS->getOperand(0);
|
||||
if (DL && PtrBase == RHS && GEPLHS->isInBounds()) {
|
||||
if (PtrBase == RHS && GEPLHS->isInBounds()) {
|
||||
// ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
|
||||
// This transformation (ignoring the base and scales) is valid because we
|
||||
// know pointers can't overflow since the gep is inbounds. See if we can
|
||||
// output an optimized form.
|
||||
Value *Offset = EvaluateGEPOffsetExpression(GEPLHS, *this);
|
||||
Value *Offset = EvaluateGEPOffsetExpression(GEPLHS, *this, DL);
|
||||
|
||||
// If not, synthesize the offset the hard way.
|
||||
if (!Offset)
|
||||
@@ -661,11 +654,11 @@ Instruction *InstCombiner::FoldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
|
||||
// If we're comparing GEPs with two base pointers that only differ in type
|
||||
// and both GEPs have only constant indices or just one use, then fold
|
||||
// the compare with the adjusted indices.
|
||||
if (DL && GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
|
||||
if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
|
||||
(GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
|
||||
(GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
|
||||
PtrBase->stripPointerCasts() ==
|
||||
GEPRHS->getOperand(0)->stripPointerCasts()) {
|
||||
GEPRHS->getOperand(0)->stripPointerCasts()) {
|
||||
Value *LOffset = EmitGEPOffset(GEPLHS);
|
||||
Value *ROffset = EmitGEPOffset(GEPRHS);
|
||||
|
||||
@@ -733,9 +726,7 @@ Instruction *InstCombiner::FoldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
|
||||
|
||||
// Only lower this if the icmp is the only user of the GEP or if we expect
|
||||
// the result to fold to a constant!
|
||||
if (DL &&
|
||||
GEPsInBounds &&
|
||||
(isa<ConstantExpr>(GEPLHS) || GEPLHS->hasOneUse()) &&
|
||||
if (GEPsInBounds && (isa<ConstantExpr>(GEPLHS) || GEPLHS->hasOneUse()) &&
|
||||
(isa<ConstantExpr>(GEPRHS) || GEPRHS->hasOneUse())) {
|
||||
// ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
|
||||
Value *L = EmitGEPOffset(GEPLHS);
|
||||
@@ -1928,8 +1919,8 @@ Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) {
|
||||
|
||||
// Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
|
||||
// integer type is the same size as the pointer type.
|
||||
if (DL && LHSCI->getOpcode() == Instruction::PtrToInt &&
|
||||
DL->getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth()) {
|
||||
if (LHSCI->getOpcode() == Instruction::PtrToInt &&
|
||||
DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth()) {
|
||||
Value *RHSOp = nullptr;
|
||||
if (PtrToIntOperator *RHSC = dyn_cast<PtrToIntOperator>(ICI.getOperand(1))) {
|
||||
Value *RHSCIOp = RHSC->getOperand(0);
|
||||
@@ -2660,8 +2651,8 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
unsigned BitWidth = 0;
|
||||
if (Ty->isIntOrIntVectorTy())
|
||||
BitWidth = Ty->getScalarSizeInBits();
|
||||
else if (DL) // Pointers require DL info to get their size.
|
||||
BitWidth = DL->getTypeSizeInBits(Ty->getScalarType());
|
||||
else // Get pointer size.
|
||||
BitWidth = DL.getTypeSizeInBits(Ty->getScalarType());
|
||||
|
||||
bool isSignBit = false;
|
||||
|
||||
@@ -2774,8 +2765,8 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
Op0KnownZero, Op0KnownOne, 0))
|
||||
return &I;
|
||||
if (SimplifyDemandedBits(I.getOperandUse(1),
|
||||
APInt::getAllOnesValue(BitWidth),
|
||||
Op1KnownZero, Op1KnownOne, 0))
|
||||
APInt::getAllOnesValue(BitWidth), Op1KnownZero,
|
||||
Op1KnownOne, 0))
|
||||
return &I;
|
||||
|
||||
// Given the known and unknown bits, compute a range that the LHS could be
|
||||
@@ -3094,9 +3085,8 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
}
|
||||
case Instruction::IntToPtr:
|
||||
// icmp pred inttoptr(X), null -> icmp pred X, 0
|
||||
if (RHSC->isNullValue() && DL &&
|
||||
DL->getIntPtrType(RHSC->getType()) ==
|
||||
LHSI->getOperand(0)->getType())
|
||||
if (RHSC->isNullValue() &&
|
||||
DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
|
||||
return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
|
||||
Constant::getNullValue(LHSI->getOperand(0)->getType()));
|
||||
break;
|
||||
@@ -3428,7 +3418,7 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
// if A is a power of 2.
|
||||
if (match(Op0, m_And(m_Value(A), m_Not(m_Value(B)))) &&
|
||||
match(Op1, m_Zero()) &&
|
||||
isKnownToBeAPowerOfTwo(A, false, 0, AC, &I, DT) && I.isEquality())
|
||||
isKnownToBeAPowerOfTwo(A, DL, false, 0, AC, &I, DT) && I.isEquality())
|
||||
return new ICmpInst(I.getInversePredicate(),
|
||||
Builder->CreateAnd(A, B),
|
||||
Op1);
|
||||
|
Reference in New Issue
Block a user