Skip to content

Commit 66d601c

Browse files
committed
SILOptimizer: Teach CSE about scalar_pack_index, dynamic_pack_index, tuple_pack_element_addr
1 parent da1b210 commit 66d601c

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

lib/SIL/IR/SILInstruction.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,22 @@ namespace {
881881
return true;
882882
}
883883

884+
bool visitScalarPackIndexInst(const ScalarPackIndexInst *RHS) {
885+
auto *X = cast<ScalarPackIndexInst>(LHS);
886+
return (X->getIndexedPackType() == RHS->getIndexedPackType() &&
887+
X->getComponentIndex() == RHS->getComponentIndex());
888+
}
889+
890+
bool visitDynamicPackIndexInst(const DynamicPackIndexInst *RHS) {
891+
auto *X = cast<DynamicPackIndexInst>(LHS);
892+
return X->getIndexedPackType() == RHS->getIndexedPackType();
893+
}
894+
895+
bool visitTuplePackElementAddrInst(const TuplePackElementAddrInst *RHS) {
896+
auto *X = cast<TuplePackElementAddrInst>(LHS);
897+
return X->getElementType() == RHS->getElementType();
898+
}
899+
884900
private:
885901
const SILInstruction *LHS;
886902
};

lib/SILOptimizer/Transforms/CSE.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,24 @@ class HashVisitor : public SILInstructionVisitor<HashVisitor, llvm::hash_code> {
515515
X->getKind(), tryLookThroughOwnershipInsts(&X->getOperandRef()),
516516
llvm::hash_combine_range(ConformsTo.begin(), ConformsTo.end()));
517517
}
518+
519+
hash_code visitScalarPackIndexInst(ScalarPackIndexInst *X) {
520+
return llvm::hash_combine(
521+
X->getKind(), X->getIndexedPackType(), X->getComponentIndex());
522+
}
523+
524+
hash_code visitDynamicPackIndexInst(DynamicPackIndexInst *X) {
525+
return llvm::hash_combine(
526+
X->getKind(), X->getIndexedPackType(), &X->getOperandRef());
527+
}
528+
529+
hash_code visitTuplePackElementAddrInst(TuplePackElementAddrInst *X) {
530+
OperandValueArrayRef Operands(X->getAllOperands());
531+
return llvm::hash_combine(
532+
X->getKind(),
533+
llvm::hash_combine_range(Operands.begin(), Operands.end()),
534+
X->getElementType());
535+
}
518536
};
519537
} // end anonymous namespace
520538

@@ -1225,6 +1243,9 @@ bool CSE::canHandle(SILInstruction *Inst) {
12251243
case SILInstructionKind::MarkDependenceInst:
12261244
case SILInstructionKind::InitExistentialMetatypeInst:
12271245
case SILInstructionKind::WitnessMethodInst:
1246+
case SILInstructionKind::ScalarPackIndexInst:
1247+
case SILInstructionKind::DynamicPackIndexInst:
1248+
case SILInstructionKind::TuplePackElementAddrInst:
12281249
// Intentionally we don't handle (prev_)dynamic_function_ref.
12291250
// They change at runtime.
12301251
#define LOADABLE_REF_STORAGE(Name, ...) \

0 commit comments

Comments
 (0)