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:
Philip Reames 2015-12-07 21:41:29 +00:00
parent 17567d2360
commit 4b5634af44
1 changed files with 44 additions and 45 deletions

View File

@ -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.