[llvm] [LSV] Merge contiguous chains across scalar types (PR #154069)
Drew Kersnar via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 2 10:48:38 PST 2025
================
@@ -468,6 +488,88 @@ bool Vectorizer::run() {
return Changed;
}
+Value *Vectorizer::insertCast(Value *Val, Type *DstTy) {
+ if (DL.getTypeSizeInBits(Val->getType()) == DL.getTypeSizeInBits(DstTy)) {
+ return Builder.CreateBitOrPointerCast(Val, DstTy, Val->getName() + ".bc");
+ }
+
+ // If the types are of different sizes and both are integers, we can use
+ // zext or sext to cast.
+ if (Val->getType()->isIntegerTy() && DstTy->isIntegerTy()) {
+ if (DL.getTypeSizeInBits(Val->getType()) < DL.getTypeSizeInBits(DstTy)) {
+ return Builder.CreateZExt(Val, DstTy, Val->getName() + ".bc");
+ }
+ return Builder.CreateTrunc(Val, DstTy, Val->getName() + ".bc");
+ }
+
+ return nullptr;
+}
+
+std::optional<APInt> Vectorizer::computeLeaderDelta(Instruction *I1,
+ Instruction *I2) {
+ assert(((isa<LoadInst>(I1) && isa<LoadInst>(I2)) ||
+ (isa<StoreInst>(I1) && isa<StoreInst>(I2))) &&
+ "computeLeaderDelta must be called with two load or two store "
+ "instructions");
+ Instruction *CtxInst = I1->comesBefore(I2) ? I2 : I1;
+ const Value *Ptr1 = getLoadStorePointerOperand(I1);
+ const Value *Ptr2 = getLoadStorePointerOperand(I2);
+ return getConstantOffset(const_cast<Value *>(Ptr1), const_cast<Value *>(Ptr2),
+ CtxInst);
+}
+
+bool Vectorizer::chainsOverlapAfterRebase(const Chain &A, const Chain &B,
+ const APInt &Delta) const {
+ ConstantRange ARange(
+ A.front().OffsetFromLeader,
+ A.back().OffsetFromLeader +
+ DL.getTypeStoreSize(getLoadStoreType(A.back().Inst)));
+ ConstantRange BRange(
+ B.front().OffsetFromLeader + Delta,
+ B.back().OffsetFromLeader + Delta +
+ DL.getTypeStoreSize(getLoadStoreType(B.back().Inst)));
+ return !ARange.intersectWith(BRange).isEmptySet();
+}
----------------
dakersnar wrote:
@gandhi56 This contains a bug. After https://github.com/llvm/llvm-project/pull/168135, the last element of the chain is not necessarily the furthest reading element of the chain.
For example, we can have a chain that looks like this:
...other loads...
%l1 = load <2 x i32> ptr %a
%l2 = load i32 ptr %a
%l2 is the back of the chain, but %l1 extends further than %l2. So checking for overlap using %l1 would be wrong.
https://github.com/llvm/llvm-project/pull/154069
More information about the llvm-commits
mailing list