[llvm] c78aef4 - [SLP] Support vectorizing ptrtoaddr (#216902)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 16:00:07 PDT 2026
Author: Thurston Dang
Date: 2026-08-18T16:00:02-07:00
New Revision: c78aef469bf678122cda1e8a9c89cce050a73720
URL: https://github.com/llvm/llvm-project/commit/c78aef469bf678122cda1e8a9c89cce050a73720
DIFF: https://github.com/llvm/llvm-project/commit/c78aef469bf678122cda1e8a9c89cce050a73720.diff
LOG: [SLP] Support vectorizing ptrtoaddr (#216902)
Currently, SLP Vectorizer handles ptrtoint but not ptrtoaddr (as
observed in an ASan test:
https://github.com/llvm/llvm-project/pull/216827#issuecomment-5322231318).
ptrtoaddr “is different from ptrtoint in that it only operates on the
index bits of the pointer and ignores all other bits, and does not
capture the provenance of the pointer"
(https://llvm.org/docs/LangRef.html#i-ptrtoaddr), which is immaterial to
its vectorizability.
This patch handles ptrtoaddr in a similar way to ptrtoint.
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index baaa265cadd6b..df14bbe334425 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -7802,6 +7802,7 @@ bool BoUpSLP::isProfitableToReorder() const {
getRootNode().getOpcode() == Instruction::PHI ||
(getRootNode().getVectorFactor() <= TinyVF &&
(getRootNode().getOpcode() == Instruction::PtrToInt ||
+ getRootNode().getOpcode() == Instruction::PtrToAddr ||
getRootNode().getOpcode() == Instruction::ICmp))) &&
getRootNode().ReorderIndices.empty()) {
// Check if the tree has only single store and single (unordered) load node,
@@ -10316,6 +10317,7 @@ BoUpSLP::TreeEntry::EntryState BoUpSLP::getScalarsVectorizationState(
case Instruction::FPToSI:
case Instruction::FPExt:
case Instruction::PtrToInt:
+ case Instruction::PtrToAddr:
case Instruction::IntToPtr:
case Instruction::SIToFP:
case Instruction::UIToFP:
@@ -11378,6 +11380,7 @@ class InstructionsCompatibilityAnalysis {
case Instruction::FPToSI:
case Instruction::FPExt:
case Instruction::PtrToInt:
+ case Instruction::PtrToAddr:
case Instruction::IntToPtr:
case Instruction::SIToFP:
case Instruction::UIToFP:
@@ -13090,6 +13093,7 @@ void BoUpSLP::buildTreeRec(ArrayRef<Value *> VLRef, unsigned Depth,
case Instruction::FPToSI:
case Instruction::FPExt:
case Instruction::PtrToInt:
+ case Instruction::PtrToAddr:
case Instruction::IntToPtr:
case Instruction::SIToFP:
case Instruction::UIToFP:
@@ -17197,6 +17201,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
case Instruction::FPToSI:
case Instruction::FPExt:
case Instruction::PtrToInt:
+ case Instruction::PtrToAddr:
case Instruction::IntToPtr:
case Instruction::SIToFP:
case Instruction::UIToFP:
@@ -23696,6 +23701,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
case Instruction::FPToSI:
case Instruction::FPExt:
case Instruction::PtrToInt:
+ case Instruction::PtrToAddr:
case Instruction::IntToPtr:
case Instruction::SIToFP:
case Instruction::UIToFP:
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr.ll b/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr.ll
index 53d655c91910f..c734ed0bd1480 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/opaque-ptr.ll
@@ -78,13 +78,12 @@ define void @test2(ptr %a, ptr %b) {
define void @test3(ptr %a, ptr %b) {
; CHECK-LABEL: @test3(
-; CHECK-NEXT: [[A1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 1
-; CHECK-NEXT: [[I1:%.*]] = ptrtoaddr ptr [[A1]] to i64
-; CHECK-NEXT: [[B3:%.*]] = getelementptr inbounds i64, ptr [[B:%.*]], i64 3
-; CHECK-NEXT: [[I2:%.*]] = ptrtoaddr ptr [[B3]] to i64
+; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x ptr> poison, ptr [[A:%.*]], i64 0
+; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x ptr> [[TMP1]], ptr [[B:%.*]], i64 1
+; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, <2 x ptr> [[TMP2]], <2 x i64> <i64 1, i64 3>
+; CHECK-NEXT: [[A1:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 1
+; CHECK-NEXT: [[TMP4:%.*]] = ptrtoaddr <2 x ptr> [[TMP3]] to <2 x i64>
; CHECK-NEXT: [[TMP5:%.*]] = load <2 x i64>, ptr [[A1]], align 8
-; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[I1]], i64 0
-; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[I2]], i64 1
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP4]], [[TMP5]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[A1]], align 8
; CHECK-NEXT: ret void
More information about the llvm-commits
mailing list