diff options
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 |