forked from OSchip/llvm-project
Revert 254950
It's causing test failures on AArch64. Due to a bad build config on my part, I apparently wasn't running the tests I thought I was. llvm-svn: 254954
This commit is contained in:
parent
17567d2360
commit
4b5634af44
|
@ -388,58 +388,57 @@ private:
|
|||
class ParseMemoryInst {
|
||||
public:
|
||||
ParseMemoryInst(Instruction *Inst, const TargetTransformInfo &TTI)
|
||||
: IsTargetMemInst(false), Inst(Inst) {
|
||||
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst))
|
||||
if (TTI.getTgtMemIntrinsic(II, Info) && Info.NumMemRefs == 1)
|
||||
IsTargetMemInst = true;
|
||||
}
|
||||
bool isLoad() const {
|
||||
if (IsTargetMemInst) return Info.ReadMem;
|
||||
return isa<LoadInst>(Inst);
|
||||
}
|
||||
bool isStore() const {
|
||||
if (IsTargetMemInst) return Info.WriteMem;
|
||||
return isa<StoreInst>(Inst);
|
||||
}
|
||||
bool isSimple() const {
|
||||
if (IsTargetMemInst) return Info.IsSimple;
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
|
||||
return LI->isSimple();
|
||||
: Load(false), Store(false), IsSimple(true), MayReadFromMemory(false),
|
||||
MayWriteToMemory(false), MatchingId(-1), Ptr(nullptr) {
|
||||
MayReadFromMemory = Inst->mayReadFromMemory();
|
||||
MayWriteToMemory = Inst->mayWriteToMemory();
|
||||
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
|
||||
MemIntrinsicInfo Info;
|
||||
if (!TTI.getTgtMemIntrinsic(II, Info))
|
||||
return;
|
||||
if (Info.NumMemRefs == 1) {
|
||||
Store = Info.WriteMem;
|
||||
Load = Info.ReadMem;
|
||||
MatchingId = Info.MatchingId;
|
||||
MayReadFromMemory = Info.ReadMem;
|
||||
MayWriteToMemory = Info.WriteMem;
|
||||
IsSimple = Info.IsSimple;
|
||||
Ptr = Info.PtrVal;
|
||||
}
|
||||
} else if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
|
||||
Load = true;
|
||||
IsSimple = LI->isSimple();
|
||||
Ptr = LI->getPointerOperand();
|
||||
} else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
||||
return SI->isSimple();
|
||||
Store = true;
|
||||
IsSimple = SI->isSimple();
|
||||
Ptr = SI->getPointerOperand();
|
||||
}
|
||||
return Inst->isAtomic();
|
||||
}
|
||||
bool isLoad() const { return Load; }
|
||||
bool isStore() const { return Store; }
|
||||
bool isSimple() const { return IsSimple; }
|
||||
bool isMatchingMemLoc(const ParseMemoryInst &Inst) const {
|
||||
return (getPointerOperand() == Inst.getPointerOperand() &&
|
||||
getMatchingId() == Inst.getMatchingId());
|
||||
return Ptr == Inst.Ptr && MatchingId == Inst.MatchingId;
|
||||
}
|
||||
bool isValid() const { return getPointerOperand() != nullptr; }
|
||||
bool isValid() const { return Ptr != nullptr; }
|
||||
int getMatchingId() const { return MatchingId; }
|
||||
Value *getPtr() const { return Ptr; }
|
||||
bool mayReadFromMemory() const { return MayReadFromMemory; }
|
||||
bool mayWriteToMemory() const { return MayWriteToMemory; }
|
||||
|
||||
private:
|
||||
bool Load;
|
||||
bool Store;
|
||||
bool IsSimple;
|
||||
bool MayReadFromMemory;
|
||||
bool MayWriteToMemory;
|
||||
// For regular (non-intrinsic) loads/stores, this is set to -1. For
|
||||
// intrinsic loads/stores, the id is retrieved from the corresponding
|
||||
// field in the MemIntrinsicInfo structure. That field contains
|
||||
// non-negative values only.
|
||||
int getMatchingId() const {
|
||||
if (IsTargetMemInst) return Info.MatchingId;
|
||||
return -1;
|
||||
}
|
||||
Value *getPointerOperand() const {
|
||||
if (IsTargetMemInst) return Info.PtrVal;
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
|
||||
return LI->getPointerOperand();
|
||||
} else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
||||
return SI->getPointerOperand();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
bool mayReadFromMemory() const { return Inst->mayReadFromMemory(); }
|
||||
bool mayWriteToMemory() const { return Inst->mayWriteToMemory(); }
|
||||
|
||||
private:
|
||||
bool IsTargetMemInst;
|
||||
MemIntrinsicInfo Info;
|
||||
Instruction *Inst;
|
||||
int MatchingId;
|
||||
Value *Ptr;
|
||||
};
|
||||
|
||||
bool processNode(DomTreeNode *Node);
|
||||
|
@ -566,7 +565,7 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
|||
|
||||
// If we have an available version of this load, and if it is the right
|
||||
// generation, replace this instruction.
|
||||
LoadValue InVal = AvailableLoads.lookup(MemInst.getPointerOperand());
|
||||
LoadValue InVal = AvailableLoads.lookup(MemInst.getPtr());
|
||||
if (InVal.Data != nullptr && InVal.Generation == CurrentGeneration &&
|
||||
InVal.MatchingId == MemInst.getMatchingId()) {
|
||||
Value *Op = getOrCreateResult(InVal.Data, Inst->getType());
|
||||
|
@ -584,7 +583,7 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
|||
|
||||
// Otherwise, remember that we have this instruction.
|
||||
AvailableLoads.insert(
|
||||
MemInst.getPointerOperand(),
|
||||
MemInst.getPtr(),
|
||||
LoadValue(Inst, CurrentGeneration, MemInst.getMatchingId()));
|
||||
LastStore = nullptr;
|
||||
continue;
|
||||
|
@ -660,7 +659,7 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
|||
// to non-volatile loads, so we don't have to check for volatility of
|
||||
// the store.
|
||||
AvailableLoads.insert(
|
||||
MemInst.getPointerOperand(),
|
||||
MemInst.getPtr(),
|
||||
LoadValue(Inst, CurrentGeneration, MemInst.getMatchingId()));
|
||||
|
||||
// Remember that this was the last normal store we saw for DSE.
|
||||
|
|
Loading…
Reference in New Issue