[llvm] 80e0bd1 - [SVE][IR] Fix Binary op matching in PatternMatch::m_VScale
Dylan Fleming via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 23 03:40:16 PDT 2021
Author: Dylan Fleming
Date: 2021-07-23T11:39:13+01:00
New Revision: 80e0bd149661e6e1735b453e44a5bd00545a9e59
URL: https://github.com/llvm/llvm-project/commit/80e0bd149661e6e1735b453e44a5bd00545a9e59
DIFF: https://github.com/llvm/llvm-project/commit/80e0bd149661e6e1735b453e44a5bd00545a9e59.diff
LOG: [SVE][IR] Fix Binary op matching in PatternMatch::m_VScale
Reviewed By: sdesmalen
Differential Revision: https://reviews.llvm.org/D105978
Added:
Modified:
llvm/include/llvm/IR/PatternMatch.h
llvm/unittests/IR/PatternMatch.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h
index 6efeeb0da958..a036bba7533d 100644
--- a/llvm/include/llvm/IR/PatternMatch.h
+++ b/llvm/include/llvm/IR/PatternMatch.h
@@ -2421,14 +2421,6 @@ inline InsertValue_match<Ind, Val_t, Elt_t> m_InsertValue(const Val_t &Val,
/// `ptrtoint(gep <vscale x 1 x i8>, <vscale x 1 x i8>* null, i32 1>`
/// under the right conditions determined by DataLayout.
struct VScaleVal_match {
-private:
- template <typename Base, typename Offset>
- inline BinaryOp_match<Base, Offset, Instruction::GetElementPtr>
- m_OffsetGep(const Base &B, const Offset &O) {
- return BinaryOp_match<Base, Offset, Instruction::GetElementPtr>(B, O);
- }
-
-public:
const DataLayout &DL;
VScaleVal_match(const DataLayout &DL) : DL(DL) {}
@@ -2436,12 +2428,16 @@ struct VScaleVal_match {
if (m_Intrinsic<Intrinsic::vscale>().match(V))
return true;
- if (m_PtrToInt(m_OffsetGep(m_Zero(), m_SpecificInt(1))).match(V)) {
- auto *GEP = cast<GEPOperator>(cast<Operator>(V)->getOperand(0));
- auto *DerefTy = GEP->getSourceElementType();
- if (isa<ScalableVectorType>(DerefTy) &&
- DL.getTypeAllocSizeInBits(DerefTy).getKnownMinSize() == 8)
- return true;
+ Value *Ptr;
+ if (m_PtrToInt(m_Value(Ptr)).match(V)) {
+ if (auto *GEP = dyn_cast<GEPOperator>(Ptr)) {
+ auto *DerefTy = GEP->getSourceElementType();
+ if (GEP->getNumIndices() == 1 && isa<ScalableVectorType>(DerefTy) &&
+ m_Zero().match(GEP->getPointerOperand()) &&
+ m_SpecificInt(1).match(GEP->idx_begin()->get()) &&
+ DL.getTypeAllocSizeInBits(DerefTy).getKnownMinSize() == 8)
+ return true;
+ }
}
return false;
diff --git a/llvm/unittests/IR/PatternMatch.cpp b/llvm/unittests/IR/PatternMatch.cpp
index 0430a0db03a5..3406807fc25f 100644
--- a/llvm/unittests/IR/PatternMatch.cpp
+++ b/llvm/unittests/IR/PatternMatch.cpp
@@ -1636,6 +1636,26 @@ TEST_F(PatternMatchTest, InsertValue) {
EXPECT_FALSE(match(IRB.getInt64(99), m_InsertValue<0>(m_Value(), m_Value())));
}
+TEST_F(PatternMatchTest, VScale) {
+ DataLayout DL = M->getDataLayout();
+
+ Type *VecTy = ScalableVectorType::get(IRB.getInt8Ty(), 1);
+ Type *VecPtrTy = VecTy->getPointerTo();
+ Value *NullPtrVec = Constant::getNullValue(VecPtrTy);
+ Value *GEP = IRB.CreateGEP(VecTy, NullPtrVec, IRB.getInt64(1));
+ Value *PtrToInt = IRB.CreatePtrToInt(GEP, DL.getIntPtrType(GEP->getType()));
+ EXPECT_TRUE(match(PtrToInt, m_VScale(DL)));
+
+ // Prior to this patch, this case would cause assertion failures when attempting to match m_VScale
+ Type *VecTy2 = ScalableVectorType::get(IRB.getInt8Ty(), 2);
+ Value *NullPtrVec2 = Constant::getNullValue(VecTy2->getPointerTo());
+ Value *BitCast = IRB.CreateBitCast(NullPtrVec2, VecPtrTy);
+ Value *GEP2 = IRB.CreateGEP(VecTy, BitCast, IRB.getInt64(1));
+ Value *PtrToInt2 =
+ IRB.CreatePtrToInt(GEP2, DL.getIntPtrType(GEP2->getType()));
+ EXPECT_FALSE(match(PtrToInt2, m_VScale(DL)));
+}
+
template <typename T> struct MutableConstTest : PatternMatchTest { };
typedef ::testing::Types<std::tuple<Value*, Instruction*>,
More information about the llvm-commits
mailing list