mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-26 14:16:12 +00:00
NFC: Pass DataLayout into isBytewiseValue
Summary: We will need to handle IntToPtr which I will submit in a separate patch as it's not going to be NFC. Reviewers: eugenis, pcc Reviewed By: eugenis Subscribers: hiraditya, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D63940 llvm-svn: 365709
This commit is contained in:
parent
19b3b28976
commit
4d595bf761
@ -224,7 +224,7 @@ class Value;
|
||||
/// 0.0 etc. If the value can't be handled with a repeated byte store (e.g.
|
||||
/// i16 0x1234), return null. If the value is entirely undef and padding,
|
||||
/// return undef.
|
||||
Value *isBytewiseValue(Value *V);
|
||||
Value *isBytewiseValue(Value *V, const DataLayout &DL);
|
||||
|
||||
/// Given an aggregrate and an sequence of indices, see if the scalar value
|
||||
/// indexed is already around as a register, for example if it were inserted
|
||||
|
@ -3166,7 +3166,7 @@ bool llvm::isKnownNeverNaN(const Value *V, const TargetLibraryInfo *TLI,
|
||||
return true;
|
||||
}
|
||||
|
||||
Value *llvm::isBytewiseValue(Value *V) {
|
||||
Value *llvm::isBytewiseValue(Value *V, const DataLayout &DL) {
|
||||
|
||||
// All byte-wide stores are splatable, even of arbitrary variables.
|
||||
if (V->getType()->isIntegerTy(8))
|
||||
@ -3205,7 +3205,8 @@ Value *llvm::isBytewiseValue(Value *V) {
|
||||
else if (CFP->getType()->isDoubleTy())
|
||||
Ty = Type::getInt64Ty(Ctx);
|
||||
// Don't handle long double formats, which have strange constraints.
|
||||
return Ty ? isBytewiseValue(ConstantExpr::getBitCast(CFP, Ty)) : nullptr;
|
||||
return Ty ? isBytewiseValue(ConstantExpr::getBitCast(CFP, Ty), DL)
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
// We can handle constant integers that are multiple of 8 bits.
|
||||
@ -3233,20 +3234,20 @@ Value *llvm::isBytewiseValue(Value *V) {
|
||||
if (ConstantDataSequential *CA = dyn_cast<ConstantDataSequential>(C)) {
|
||||
Value *Val = UndefInt8;
|
||||
for (unsigned I = 0, E = CA->getNumElements(); I != E; ++I)
|
||||
if (!(Val = Merge(Val, isBytewiseValue(CA->getElementAsConstant(I)))))
|
||||
if (!(Val = Merge(Val, isBytewiseValue(CA->getElementAsConstant(I), DL))))
|
||||
return nullptr;
|
||||
return Val;
|
||||
}
|
||||
|
||||
if (isa<ConstantVector>(C)) {
|
||||
Constant *Splat = cast<ConstantVector>(C)->getSplatValue();
|
||||
return Splat ? isBytewiseValue(Splat) : nullptr;
|
||||
return Splat ? isBytewiseValue(Splat, DL) : nullptr;
|
||||
}
|
||||
|
||||
if (isa<ConstantArray>(C) || isa<ConstantStruct>(C)) {
|
||||
Value *Val = UndefInt8;
|
||||
for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I)
|
||||
if (!(Val = Merge(Val, isBytewiseValue(C->getOperand(I)))))
|
||||
if (!(Val = Merge(Val, isBytewiseValue(C->getOperand(I), DL))))
|
||||
return nullptr;
|
||||
return Val;
|
||||
}
|
||||
|
@ -450,7 +450,7 @@ LoopIdiomRecognize::isLegalStore(StoreInst *SI) {
|
||||
// turned into a memset of i8 -1, assuming that all the consecutive bytes
|
||||
// are stored. A store of i32 0x01020304 can never be turned into a memset,
|
||||
// but it can be turned into memset_pattern if the target supports it.
|
||||
Value *SplatValue = isBytewiseValue(StoredVal);
|
||||
Value *SplatValue = isBytewiseValue(StoredVal, *DL);
|
||||
Constant *PatternValue = nullptr;
|
||||
|
||||
// Note: memset and memset_pattern on unordered-atomic is yet not supported
|
||||
@ -627,7 +627,7 @@ bool LoopIdiomRecognize::processLoopStores(SmallVectorImpl<StoreInst *> &SL,
|
||||
Constant *FirstPatternValue = nullptr;
|
||||
|
||||
if (For == ForMemset::Yes)
|
||||
FirstSplatValue = isBytewiseValue(FirstStoredVal);
|
||||
FirstSplatValue = isBytewiseValue(FirstStoredVal, *DL);
|
||||
else
|
||||
FirstPatternValue = getMemSetPatternValue(FirstStoredVal, DL);
|
||||
|
||||
@ -660,7 +660,7 @@ bool LoopIdiomRecognize::processLoopStores(SmallVectorImpl<StoreInst *> &SL,
|
||||
Constant *SecondPatternValue = nullptr;
|
||||
|
||||
if (For == ForMemset::Yes)
|
||||
SecondSplatValue = isBytewiseValue(SecondStoredVal);
|
||||
SecondSplatValue = isBytewiseValue(SecondStoredVal, *DL);
|
||||
else
|
||||
SecondPatternValue = getMemSetPatternValue(SecondStoredVal, DL);
|
||||
|
||||
@ -880,7 +880,7 @@ bool LoopIdiomRecognize::processLoopStridedStore(
|
||||
Value *StoredVal, Instruction *TheStore,
|
||||
SmallPtrSetImpl<Instruction *> &Stores, const SCEVAddRecExpr *Ev,
|
||||
const SCEV *BECount, bool NegStride, bool IsLoopMemset) {
|
||||
Value *SplatValue = isBytewiseValue(StoredVal);
|
||||
Value *SplatValue = isBytewiseValue(StoredVal, *DL);
|
||||
Constant *PatternValue = nullptr;
|
||||
|
||||
if (!SplatValue)
|
||||
|
@ -412,7 +412,7 @@ Instruction *MemCpyOptPass::tryMergingIntoMemset(Instruction *StartInst,
|
||||
if (!NextStore->isSimple()) break;
|
||||
|
||||
// Check to see if this stored value is of the same byte-splattable value.
|
||||
Value *StoredByte = isBytewiseValue(NextStore->getOperand(0));
|
||||
Value *StoredByte = isBytewiseValue(NextStore->getOperand(0), DL);
|
||||
if (isa<UndefValue>(ByteVal) && StoredByte)
|
||||
ByteVal = StoredByte;
|
||||
if (ByteVal != StoredByte)
|
||||
@ -749,7 +749,7 @@ bool MemCpyOptPass::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
|
||||
// byte at a time like "0" or "-1" or any width, as well as things like
|
||||
// 0xA0A0A0A0 and 0.0.
|
||||
auto *V = SI->getOperand(0);
|
||||
if (Value *ByteVal = isBytewiseValue(V)) {
|
||||
if (Value *ByteVal = isBytewiseValue(V, DL)) {
|
||||
if (Instruction *I = tryMergingIntoMemset(SI, SI->getPointerOperand(),
|
||||
ByteVal)) {
|
||||
BBI = I->getIterator(); // Don't invalidate iterator.
|
||||
@ -1229,7 +1229,8 @@ bool MemCpyOptPass::processMemCpy(MemCpyInst *M) {
|
||||
// If copying from a constant, try to turn the memcpy into a memset.
|
||||
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(M->getSource()))
|
||||
if (GV->isConstant() && GV->hasDefinitiveInitializer())
|
||||
if (Value *ByteVal = isBytewiseValue(GV->getInitializer())) {
|
||||
if (Value *ByteVal = isBytewiseValue(GV->getInitializer(),
|
||||
M->getModule()->getDataLayout())) {
|
||||
IRBuilder<> Builder(M);
|
||||
Builder.CreateMemSet(M->getRawDest(), ByteVal, M->getLength(),
|
||||
M->getDestAlignment(), false);
|
||||
|
Loading…
x
Reference in New Issue
Block a user