mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-11 23:37:39 +00:00
Update inter-procedural optimizations for atomic load/store.
llvm-svn: 137667
This commit is contained in:
parent
36ef5fd140
commit
fdd5480178
@ -382,7 +382,8 @@ bool ArgPromotion::isSafeToPromoteArgument(Argument *Arg, bool isByVal) const {
|
||||
User *U = *UI;
|
||||
Operands.clear();
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(U)) {
|
||||
if (LI->isVolatile()) return false; // Don't hack volatile loads
|
||||
// Don't hack volatile/atomic loads
|
||||
if (!LI->isSimple()) return false;
|
||||
Loads.push_back(LI);
|
||||
// Direct loads are equivalent to a GEP with a zero index and then a load.
|
||||
Operands.push_back(0);
|
||||
@ -410,7 +411,8 @@ bool ArgPromotion::isSafeToPromoteArgument(Argument *Arg, bool isByVal) const {
|
||||
for (Value::use_iterator UI = GEP->use_begin(), E = GEP->use_end();
|
||||
UI != E; ++UI)
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(*UI)) {
|
||||
if (LI->isVolatile()) return false; // Don't hack volatile loads
|
||||
// Don't hack volatile/atomic loads
|
||||
if (!LI->isSimple()) return false;
|
||||
Loads.push_back(LI);
|
||||
} else {
|
||||
// Other uses than load?
|
||||
|
@ -164,14 +164,14 @@ bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
|
||||
continue;
|
||||
} else if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
|
||||
// Ignore non-volatile loads from local memory.
|
||||
if (!LI->isVolatile()) {
|
||||
if (LI->isUnordered()) {
|
||||
AliasAnalysis::Location Loc = AA->getLocation(LI);
|
||||
if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
|
||||
continue;
|
||||
}
|
||||
} else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
|
||||
// Ignore non-volatile stores to local memory.
|
||||
if (!SI->isVolatile()) {
|
||||
if (SI->isUnordered()) {
|
||||
AliasAnalysis::Location Loc = AA->getLocation(SI);
|
||||
if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
|
||||
continue;
|
||||
|
@ -195,12 +195,12 @@ static bool AnalyzeGlobal(const Value *V, GlobalStatus &GS,
|
||||
}
|
||||
if (const LoadInst *LI = dyn_cast<LoadInst>(I)) {
|
||||
GS.isLoaded = true;
|
||||
if (LI->isVolatile()) return true; // Don't hack on volatile loads.
|
||||
if (!LI->isSimple()) return true; // Don't hack on volatile loads.
|
||||
} else if (const StoreInst *SI = dyn_cast<StoreInst>(I)) {
|
||||
// Don't allow a store OF the address, only stores TO the address.
|
||||
if (SI->getOperand(0) == V) return true;
|
||||
|
||||
if (SI->isVolatile()) return true; // Don't hack on volatile stores.
|
||||
if (!SI->isSimple()) return true; // Don't hack on volatile stores.
|
||||
|
||||
// If this is a direct store to the global (i.e., the global is a scalar
|
||||
// value, not an aggregate), keep more specific information about
|
||||
@ -2333,7 +2333,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,
|
||||
Constant *InstResult = 0;
|
||||
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(CurInst)) {
|
||||
if (SI->isVolatile()) return false; // no volatile accesses.
|
||||
if (!SI->isSimple()) return false; // no volatile accesses.
|
||||
Constant *Ptr = getVal(Values, SI->getOperand(1));
|
||||
if (!isSimpleEnoughPointerToCommit(Ptr))
|
||||
// If this is too complex for us to commit, reject it.
|
||||
@ -2410,7 +2410,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,
|
||||
ConstantExpr::getGetElementPtr(P, GEPOps,
|
||||
cast<GEPOperator>(GEP)->isInBounds());
|
||||
} else if (LoadInst *LI = dyn_cast<LoadInst>(CurInst)) {
|
||||
if (LI->isVolatile()) return false; // no volatile accesses.
|
||||
if (!LI->isSimple()) return false; // no volatile accesses.
|
||||
InstResult = ComputeLoadResult(getVal(Values, LI->getOperand(0)),
|
||||
MutatedMemory);
|
||||
if (InstResult == 0) return false; // Could not evaluate load.
|
||||
|
@ -305,10 +305,14 @@ bool FunctionComparator::isEquivalentOperation(const Instruction *I1,
|
||||
// Check special state that is a part of some instructions.
|
||||
if (const LoadInst *LI = dyn_cast<LoadInst>(I1))
|
||||
return LI->isVolatile() == cast<LoadInst>(I2)->isVolatile() &&
|
||||
LI->getAlignment() == cast<LoadInst>(I2)->getAlignment();
|
||||
LI->getAlignment() == cast<LoadInst>(I2)->getAlignment() &&
|
||||
LI->getOrdering() == cast<LoadInst>(I2)->getOrdering() &&
|
||||
LI->getSynchScope() == cast<LoadInst>(I2)->getSynchScope();
|
||||
if (const StoreInst *SI = dyn_cast<StoreInst>(I1))
|
||||
return SI->isVolatile() == cast<StoreInst>(I2)->isVolatile() &&
|
||||
SI->getAlignment() == cast<StoreInst>(I2)->getAlignment();
|
||||
SI->getAlignment() == cast<StoreInst>(I2)->getAlignment() &&
|
||||
SI->getOrdering() == cast<StoreInst>(I2)->getOrdering() &&
|
||||
SI->getSynchScope() == cast<StoreInst>(I2)->getSynchScope();
|
||||
if (const CmpInst *CI = dyn_cast<CmpInst>(I1))
|
||||
return CI->getPredicate() == cast<CmpInst>(I2)->getPredicate();
|
||||
if (const CallInst *CI = dyn_cast<CallInst>(I1))
|
||||
|
Loading…
x
Reference in New Issue
Block a user