diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /llvm/lib/Transforms/Scalar/GVNSink.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/Transforms/Scalar/GVNSink.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVNSink.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVNSink.cpp b/llvm/lib/Transforms/Scalar/GVNSink.cpp index 6d0a4975e266..dfb4b7e038ba 100644 --- a/llvm/lib/Transforms/Scalar/GVNSink.cpp +++ b/llvm/lib/Transforms/Scalar/GVNSink.cpp @@ -350,6 +350,7 @@ using ModelledPHISet = DenseSet<ModelledPHI, DenseMapInfo<ModelledPHI>>; class InstructionUseExpr : public GVNExpression::BasicExpression { unsigned MemoryUseOrder = -1; bool Volatile = false; + ArrayRef<int> ShuffleMask; public: InstructionUseExpr(Instruction *I, ArrayRecycler<Value *> &R, @@ -359,6 +360,9 @@ public: setOpcode(I->getOpcode()); setType(I->getType()); + if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I)) + ShuffleMask = SVI->getShuffleMask().copy(A); + for (auto &U : I->uses()) op_push_back(U.getUser()); llvm::sort(op_begin(), op_end()); @@ -369,12 +373,12 @@ public: hash_code getHashValue() const override { return hash_combine(GVNExpression::BasicExpression::getHashValue(), - MemoryUseOrder, Volatile); + MemoryUseOrder, Volatile, ShuffleMask); } template <typename Function> hash_code getHashValue(Function MapFn) { - hash_code H = - hash_combine(getOpcode(), getType(), MemoryUseOrder, Volatile); + hash_code H = hash_combine(getOpcode(), getType(), MemoryUseOrder, Volatile, + ShuffleMask); for (auto *V : operands()) H = hash_combine(H, MapFn(V)); return H; @@ -475,6 +479,7 @@ public: case Instruction::PtrToInt: case Instruction::IntToPtr: case Instruction::BitCast: + case Instruction::AddrSpaceCast: case Instruction::Select: case Instruction::ExtractElement: case Instruction::InsertElement: @@ -576,7 +581,7 @@ public: private: ValueTable VN; - bool isInstructionBlacklisted(Instruction *I) { + bool shouldAvoidSinkingInstruction(Instruction *I) { // These instructions may change or break semantics if moved. if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) || I->getType()->isTokenTy()) @@ -668,7 +673,7 @@ Optional<SinkingInstructionCandidate> GVNSink::analyzeInstructionForSinking( NewInsts.push_back(I); } for (auto *I : NewInsts) - if (isInstructionBlacklisted(I)) + if (shouldAvoidSinkingInstruction(I)) return None; // If we've restricted the incoming blocks, restrict all needed PHIs also |