mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-04 06:09:05 +00:00
[GVN] Use IRBuilder more actively instead of creating instructions manually.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239584 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2bd0221fa4
commit
c70c41a688
@ -852,13 +852,12 @@ static bool CanCoerceMustAliasedValueToLoad(Value *StoredVal,
|
||||
|
||||
/// If we saw a store of a value to memory, and
|
||||
/// then a load from a must-aliased pointer of a different type, try to coerce
|
||||
/// the stored value. LoadedTy is the type of the load we want to replace and
|
||||
/// InsertPt is the place to insert new instructions.
|
||||
/// the stored value. LoadedTy is the type of the load we want to replace.
|
||||
/// IRB is IRBuilder used to insert new instructions.
|
||||
///
|
||||
/// If we can't do it, return null.
|
||||
static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
|
||||
Type *LoadedTy,
|
||||
Instruction *InsertPt,
|
||||
static Value *CoerceAvailableValueToLoadType(Value *StoredVal, Type *LoadedTy,
|
||||
IRBuilder<> &IRB,
|
||||
const DataLayout &DL) {
|
||||
if (!CanCoerceMustAliasedValueToLoad(StoredVal, LoadedTy, DL))
|
||||
return nullptr;
|
||||
@ -874,12 +873,12 @@ static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
|
||||
// Pointer to Pointer -> use bitcast.
|
||||
if (StoredValTy->getScalarType()->isPointerTy() &&
|
||||
LoadedTy->getScalarType()->isPointerTy())
|
||||
return new BitCastInst(StoredVal, LoadedTy, "", InsertPt);
|
||||
return IRB.CreateBitCast(StoredVal, LoadedTy);
|
||||
|
||||
// Convert source pointers to integers, which can be bitcast.
|
||||
if (StoredValTy->getScalarType()->isPointerTy()) {
|
||||
StoredValTy = DL.getIntPtrType(StoredValTy);
|
||||
StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
|
||||
StoredVal = IRB.CreatePtrToInt(StoredVal, StoredValTy);
|
||||
}
|
||||
|
||||
Type *TypeToCastTo = LoadedTy;
|
||||
@ -887,11 +886,11 @@ static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
|
||||
TypeToCastTo = DL.getIntPtrType(TypeToCastTo);
|
||||
|
||||
if (StoredValTy != TypeToCastTo)
|
||||
StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "", InsertPt);
|
||||
StoredVal = IRB.CreateBitCast(StoredVal, TypeToCastTo);
|
||||
|
||||
// Cast to pointer if the load needs a pointer type.
|
||||
if (LoadedTy->getScalarType()->isPointerTy())
|
||||
StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "", InsertPt);
|
||||
StoredVal = IRB.CreateIntToPtr(StoredVal, LoadedTy);
|
||||
|
||||
return StoredVal;
|
||||
}
|
||||
@ -904,35 +903,34 @@ static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
|
||||
// Convert source pointers to integers, which can be manipulated.
|
||||
if (StoredValTy->getScalarType()->isPointerTy()) {
|
||||
StoredValTy = DL.getIntPtrType(StoredValTy);
|
||||
StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
|
||||
StoredVal = IRB.CreatePtrToInt(StoredVal, StoredValTy);
|
||||
}
|
||||
|
||||
// Convert vectors and fp to integer, which can be manipulated.
|
||||
if (!StoredValTy->isIntegerTy()) {
|
||||
StoredValTy = IntegerType::get(StoredValTy->getContext(), StoreSize);
|
||||
StoredVal = new BitCastInst(StoredVal, StoredValTy, "", InsertPt);
|
||||
StoredVal = IRB.CreateBitCast(StoredVal, StoredValTy);
|
||||
}
|
||||
|
||||
// If this is a big-endian system, we need to shift the value down to the low
|
||||
// bits so that a truncate will work.
|
||||
if (DL.isBigEndian()) {
|
||||
Constant *Val = ConstantInt::get(StoredVal->getType(), StoreSize-LoadSize);
|
||||
StoredVal = BinaryOperator::CreateLShr(StoredVal, Val, "tmp", InsertPt);
|
||||
StoredVal = IRB.CreateLShr(StoredVal, StoreSize - LoadSize, "tmp");
|
||||
}
|
||||
|
||||
// Truncate the integer to the right size now.
|
||||
Type *NewIntTy = IntegerType::get(StoredValTy->getContext(), LoadSize);
|
||||
StoredVal = new TruncInst(StoredVal, NewIntTy, "trunc", InsertPt);
|
||||
StoredVal = IRB.CreateTrunc(StoredVal, NewIntTy, "trunc");
|
||||
|
||||
if (LoadedTy == NewIntTy)
|
||||
return StoredVal;
|
||||
|
||||
// If the result is a pointer, inttoptr.
|
||||
if (LoadedTy->getScalarType()->isPointerTy())
|
||||
return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr", InsertPt);
|
||||
return IRB.CreateIntToPtr(StoredVal, LoadedTy, "inttoptr");
|
||||
|
||||
// Otherwise, bitcast.
|
||||
return new BitCastInst(StoredVal, LoadedTy, "bitcast", InsertPt);
|
||||
return IRB.CreateBitCast(StoredVal, LoadedTy, "bitcast");
|
||||
}
|
||||
|
||||
/// This function is called when we have a
|
||||
@ -1145,7 +1143,7 @@ static Value *GetStoreValueForLoad(Value *SrcVal, unsigned Offset,
|
||||
if (LoadSize != StoreSize)
|
||||
SrcVal = Builder.CreateTrunc(SrcVal, IntegerType::get(Ctx, LoadSize*8));
|
||||
|
||||
return CoerceAvailableValueToLoadType(SrcVal, LoadTy, InsertPt, DL);
|
||||
return CoerceAvailableValueToLoadType(SrcVal, LoadTy, Builder, DL);
|
||||
}
|
||||
|
||||
/// This function is called when we have a
|
||||
@ -1248,7 +1246,7 @@ static Value *GetMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset,
|
||||
++NumBytesSet;
|
||||
}
|
||||
|
||||
return CoerceAvailableValueToLoadType(Val, LoadTy, InsertPt, DL);
|
||||
return CoerceAvailableValueToLoadType(Val, LoadTy, Builder, DL);
|
||||
}
|
||||
|
||||
// Otherwise, this is a memcpy/memmove from a constant global.
|
||||
@ -1932,8 +1930,9 @@ bool GVN::processLoad(LoadInst *L) {
|
||||
// actually have the same type. See if we know how to reuse the stored
|
||||
// value (depending on its type).
|
||||
if (StoredVal->getType() != L->getType()) {
|
||||
IRBuilder<> Builder(L);
|
||||
StoredVal =
|
||||
CoerceAvailableValueToLoadType(StoredVal, L->getType(), L, DL);
|
||||
CoerceAvailableValueToLoadType(StoredVal, L->getType(), Builder, DL);
|
||||
if (!StoredVal)
|
||||
return false;
|
||||
|
||||
@ -1957,7 +1956,9 @@ bool GVN::processLoad(LoadInst *L) {
|
||||
// the same type. See if we know how to reuse the previously loaded value
|
||||
// (depending on its type).
|
||||
if (DepLI->getType() != L->getType()) {
|
||||
AvailableVal = CoerceAvailableValueToLoadType(DepLI, L->getType(), L, DL);
|
||||
IRBuilder<> Builder(L);
|
||||
AvailableVal =
|
||||
CoerceAvailableValueToLoadType(DepLI, L->getType(), Builder, DL);
|
||||
if (!AvailableVal)
|
||||
return false;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user