mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-28 22:00:30 +00:00
[Loads] Require Align in isSafeToLoadUnconditionally() (NFC)
Now that load/store have required alignment, accept Align here. This also avoids uses of getPointerElementType(), which is incompatible with opaque pointers.
This commit is contained in:
parent
028966e9eb
commit
ae237c94a0
@ -59,7 +59,7 @@ bool isDereferenceableAndAlignedPointer(const Value *V, Align Alignment,
|
||||
/// If it is not obviously safe to load from the specified pointer, we do a
|
||||
/// quick local scan of the basic block containing ScanFrom, to determine if
|
||||
/// the address is already accessed.
|
||||
bool isSafeToLoadUnconditionally(Value *V, MaybeAlign Alignment, APInt &Size,
|
||||
bool isSafeToLoadUnconditionally(Value *V, Align Alignment, APInt &Size,
|
||||
const DataLayout &DL,
|
||||
Instruction *ScanFrom = nullptr,
|
||||
const DominatorTree *DT = nullptr);
|
||||
@ -83,7 +83,7 @@ bool isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L,
|
||||
/// If it is not obviously safe to load from the specified pointer, we do a
|
||||
/// quick local scan of the basic block containing ScanFrom, to determine if
|
||||
/// the address is already accessed.
|
||||
bool isSafeToLoadUnconditionally(Value *V, Type *Ty, MaybeAlign Alignment,
|
||||
bool isSafeToLoadUnconditionally(Value *V, Type *Ty, Align Alignment,
|
||||
const DataLayout &DL,
|
||||
Instruction *ScanFrom = nullptr,
|
||||
const DominatorTree *DT = nullptr);
|
||||
|
@ -266,14 +266,10 @@ bool llvm::isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L,
|
||||
///
|
||||
/// This uses the pointee type to determine how many bytes need to be safe to
|
||||
/// load from the pointer.
|
||||
bool llvm::isSafeToLoadUnconditionally(Value *V, MaybeAlign MA, APInt &Size,
|
||||
bool llvm::isSafeToLoadUnconditionally(Value *V, Align Alignment, APInt &Size,
|
||||
const DataLayout &DL,
|
||||
Instruction *ScanFrom,
|
||||
const DominatorTree *DT) {
|
||||
// Zero alignment means that the load has the ABI alignment for the target
|
||||
const Align Alignment =
|
||||
DL.getValueOrABITypeAlignment(MA, V->getType()->getPointerElementType());
|
||||
|
||||
// If DT is not specified we can't make context-sensitive query
|
||||
const Instruction* CtxI = DT ? ScanFrom : nullptr;
|
||||
if (isDereferenceableAndAlignedPointer(V, Alignment, Size, DL, CtxI, DT))
|
||||
@ -308,7 +304,8 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, MaybeAlign MA, APInt &Size,
|
||||
return false;
|
||||
|
||||
Value *AccessedPtr;
|
||||
MaybeAlign MaybeAccessedAlign;
|
||||
Type *AccessedTy;
|
||||
Align AccessedAlign;
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
|
||||
// Ignore volatile loads. The execution of a volatile load cannot
|
||||
// be used to prove an address is backed by regular memory; it can,
|
||||
@ -316,20 +313,18 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, MaybeAlign MA, APInt &Size,
|
||||
if (LI->isVolatile())
|
||||
continue;
|
||||
AccessedPtr = LI->getPointerOperand();
|
||||
MaybeAccessedAlign = MaybeAlign(LI->getAlignment());
|
||||
AccessedTy = LI->getType();
|
||||
AccessedAlign = LI->getAlign();
|
||||
} else if (StoreInst *SI = dyn_cast<StoreInst>(BBI)) {
|
||||
// Ignore volatile stores (see comment for loads).
|
||||
if (SI->isVolatile())
|
||||
continue;
|
||||
AccessedPtr = SI->getPointerOperand();
|
||||
MaybeAccessedAlign = MaybeAlign(SI->getAlignment());
|
||||
AccessedTy = SI->getValueOperand()->getType();
|
||||
AccessedAlign = SI->getAlign();
|
||||
} else
|
||||
continue;
|
||||
|
||||
Type *AccessedTy = AccessedPtr->getType()->getPointerElementType();
|
||||
|
||||
const Align AccessedAlign =
|
||||
DL.getValueOrABITypeAlignment(MaybeAccessedAlign, AccessedTy);
|
||||
if (AccessedAlign < Alignment)
|
||||
continue;
|
||||
|
||||
@ -345,7 +340,7 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, MaybeAlign MA, APInt &Size,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool llvm::isSafeToLoadUnconditionally(Value *V, Type *Ty, MaybeAlign Alignment,
|
||||
bool llvm::isSafeToLoadUnconditionally(Value *V, Type *Ty, Align Alignment,
|
||||
const DataLayout &DL,
|
||||
Instruction *ScanFrom,
|
||||
const DominatorTree *DT) {
|
||||
|
@ -1202,7 +1202,7 @@ static bool isSafePHIToSpeculate(PHINode &PN) {
|
||||
// TODO: Allow recursive phi users.
|
||||
// TODO: Allow stores.
|
||||
BasicBlock *BB = PN.getParent();
|
||||
MaybeAlign MaxAlign;
|
||||
Align MaxAlign;
|
||||
uint64_t APWidth = DL.getIndexTypeSizeInBits(PN.getType());
|
||||
APInt MaxSize(APWidth, 0);
|
||||
bool HaveLoad = false;
|
||||
@ -1224,7 +1224,7 @@ static bool isSafePHIToSpeculate(PHINode &PN) {
|
||||
return false;
|
||||
|
||||
uint64_t Size = DL.getTypeStoreSize(LI->getType()).getFixedSize();
|
||||
MaxAlign = std::max(MaxAlign, MaybeAlign(LI->getAlignment()));
|
||||
MaxAlign = std::max(MaxAlign, LI->getAlign());
|
||||
MaxSize = MaxSize.ult(Size) ? APInt(APWidth, Size) : MaxSize;
|
||||
HaveLoad = true;
|
||||
}
|
||||
@ -1343,10 +1343,10 @@ static bool isSafeSelectToSpeculate(SelectInst &SI) {
|
||||
// absolutely (e.g. allocas) or at this point because we can see other
|
||||
// accesses to it.
|
||||
if (!isSafeToLoadUnconditionally(TValue, LI->getType(),
|
||||
MaybeAlign(LI->getAlignment()), DL, LI))
|
||||
LI->getAlign(), DL, LI))
|
||||
return false;
|
||||
if (!isSafeToLoadUnconditionally(FValue, LI->getType(),
|
||||
MaybeAlign(LI->getAlignment()), DL, LI))
|
||||
LI->getAlign(), DL, LI))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -341,7 +341,7 @@ static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA) {
|
||||
const DataLayout &DL = L->getModule()->getDataLayout();
|
||||
if (isModSet(AA->getModRefInfo(CI, MemoryLocation::get(L))) ||
|
||||
!isSafeToLoadUnconditionally(L->getPointerOperand(), L->getType(),
|
||||
MaybeAlign(L->getAlignment()), DL, L))
|
||||
L->getAlign(), DL, L))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user