mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
[ValueTracking] Factor our common speculation suppression logic [NFC]
Expose a utility function so that all places which want to suppress speculation (when otherwise legal) due to ordering and/or sanitizer interaction can do so. llvm-svn: 371556
This commit is contained in:
parent
6de21dfa20
commit
5e61658cdf
@ -384,6 +384,13 @@ class Value;
|
||||
/// Return true if the only users of this pointer are lifetime markers.
|
||||
bool onlyUsedByLifetimeMarkers(const Value *V);
|
||||
|
||||
/// Return true if speculation of the given load must be suppressed to avoid
|
||||
/// ordering or interfering with an active sanitizer. If not suppressed,
|
||||
/// dereferenceability and alignment must be proven separately. Note: This
|
||||
/// is only needed for raw reasoning; if you use the interface below
|
||||
/// (isSafeToSpeculativelyExecute), this is handled internally.
|
||||
bool mustSuppressSpeculation(const LoadInst &LI);
|
||||
|
||||
/// Return true if the instruction does not have any effects besides
|
||||
/// calculating the result and does not have undefined behavior.
|
||||
///
|
||||
|
@ -3877,6 +3877,18 @@ bool llvm::onlyUsedByLifetimeMarkers(const Value *V) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool llvm::mustSuppressSpeculation(const LoadInst &LI) {
|
||||
if (!LI.isUnordered())
|
||||
return true;
|
||||
const Function &F = *LI.getFunction();
|
||||
// Speculative load may create a race that did not exist in the source.
|
||||
return F.hasFnAttribute(Attribute::SanitizeThread) ||
|
||||
// Speculative load may load data from dirty regions.
|
||||
F.hasFnAttribute(Attribute::SanitizeAddress) ||
|
||||
F.hasFnAttribute(Attribute::SanitizeHWAddress);
|
||||
}
|
||||
|
||||
|
||||
bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
||||
const Instruction *CtxI,
|
||||
const DominatorTree *DT) {
|
||||
@ -3921,12 +3933,7 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
||||
}
|
||||
case Instruction::Load: {
|
||||
const LoadInst *LI = cast<LoadInst>(Inst);
|
||||
if (!LI->isUnordered() ||
|
||||
// Speculative load may create a race that did not exist in the source.
|
||||
LI->getFunction()->hasFnAttribute(Attribute::SanitizeThread) ||
|
||||
// Speculative load may load data from dirty regions.
|
||||
LI->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
|
||||
LI->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress))
|
||||
if (mustSuppressSpeculation(*LI))
|
||||
return false;
|
||||
const DataLayout &DL = LI->getModule()->getDataLayout();
|
||||
return isDereferenceableAndAlignedPointer(LI->getPointerOperand(),
|
||||
|
@ -969,21 +969,6 @@ static bool isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L,
|
||||
DL, HeaderFirstNonPHI, &DT);
|
||||
}
|
||||
|
||||
/// Return true if speculation of the given load must be suppressed for
|
||||
/// correctness reasons. If not suppressed, dereferenceability and alignment
|
||||
/// must be proven.
|
||||
/// TODO: Move to ValueTracking.h/cpp in a separate change
|
||||
static bool mustSuppressSpeculation(const LoadInst &LI) {
|
||||
if (!LI.isUnordered())
|
||||
return true;
|
||||
const Function &F = *LI.getFunction();
|
||||
// Speculative load may create a race that did not exist in the source.
|
||||
return F.hasFnAttribute(Attribute::SanitizeThread) ||
|
||||
// Speculative load may load data from dirty regions.
|
||||
F.hasFnAttribute(Attribute::SanitizeAddress) ||
|
||||
F.hasFnAttribute(Attribute::SanitizeHWAddress);
|
||||
}
|
||||
|
||||
bool LoopVectorizationLegality::canVectorizeWithIfConvert() {
|
||||
if (!EnableIfConversion) {
|
||||
reportVectorizationFailure("If-conversion is disabled",
|
||||
|
Loading…
Reference in New Issue
Block a user