[PATCH] D83001: [SVE] Make cstfp_pred_ty and cst_pred_ty work with scalable splats
Christopher Tetreault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 1 15:09:26 PDT 2020
ctetreau created this revision.
Herald added subscribers: llvm-commits, psnobl, rkruppe, tschuett.
Herald added a reviewer: efriedma.
Herald added a project: LLVM.
ctetreau added a parent revision: D82416: [SVE] Make Constant::getSplatValue work for scalable vector splats.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D83001
Files:
llvm/include/llvm/IR/PatternMatch.h
llvm/test/Transforms/InstCombine/fmul.ll
llvm/test/Transforms/InstCombine/mul.ll
Index: llvm/test/Transforms/InstCombine/mul.ll
===================================================================
--- llvm/test/Transforms/InstCombine/mul.ll
+++ llvm/test/Transforms/InstCombine/mul.ll
@@ -680,3 +680,11 @@
%m = mul <4 x i32> %r, %r
ret <4 x i32> %m
}
+
+define <vscale x 2 x i64> @mul_scalable_splat_zero(<vscale x 2 x i64> %z) {
+; CHECK-LABEL: @mul_scalable_splat_zero(
+; CHECK-NEXT: ret <vscale x 2 x i64> zeroinitializer
+ %shuf = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 0, i32 0), <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer
+ %t3 = mul <vscale x 2 x i64> %shuf, %z
+ ret <vscale x 2 x i64> %t3
+}
Index: llvm/test/Transforms/InstCombine/fmul.ll
===================================================================
--- llvm/test/Transforms/InstCombine/fmul.ll
+++ llvm/test/Transforms/InstCombine/fmul.ll
@@ -1164,3 +1164,12 @@
%mul = fmul fast double %sqr, %sel
ret double %mul
}
+
+; fastmath => z * splat(0) = splat(0), even for scalable vectors
+define <vscale x 2 x float> @mul_scalable_splat_zero(<vscale x 2 x float> %z) {
+; CHECK-LABEL: @mul_scalable_splat_zero(
+; CHECK-NEXT: ret <vscale x 2 x float> zeroinitializer
+ %shuf = shufflevector <vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 0.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer
+ %t3 = fmul fast <vscale x 2 x float> %shuf, %z
+ ret <vscale x 2 x float> %t3
+}
Index: llvm/include/llvm/IR/PatternMatch.h
===================================================================
--- llvm/include/llvm/IR/PatternMatch.h
+++ llvm/include/llvm/IR/PatternMatch.h
@@ -262,18 +262,23 @@
return constantint_match<Val>();
}
-/// This helper class is used to match scalar and fixed width vector integer
-/// constants that satisfy a specified predicate.
-/// For vector constants, undefined elements are ignored.
+/// This helper class is used to match integer constant scalars, vector splats,
+/// and fixed width vectors that satisfy a specified predicate.
+/// For fixed width vector constants, undefined elements are ignored.
template <typename Predicate> struct cst_pred_ty : public Predicate {
template <typename ITy> bool match(ITy *V) {
if (const auto *CI = dyn_cast<ConstantInt>(V))
return this->isValue(CI->getValue());
- if (const auto *FVTy = dyn_cast<FixedVectorType>(V->getType())) {
+ if (const auto *VTy = dyn_cast<VectorType>(V->getType())) {
if (const auto *C = dyn_cast<Constant>(V)) {
if (const auto *CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue()))
return this->isValue(CI->getValue());
+ // Number of elements of a scalable vector unknown at compile time
+ auto *FVTy = dyn_cast<FixedVectorType>(VTy);
+ if (!FVTy)
+ return false;
+
// Non-splat vector constant: check each element for a match.
unsigned NumElts = FVTy->getNumElements();
assert(NumElts != 0 && "Constant vector with no elements?");
@@ -321,25 +326,25 @@
}
};
-/// This helper class is used to match scalar and vector floating-point
-/// constants that satisfy a specified predicate.
-/// For vector constants, undefined elements are ignored.
+/// This helper class is used to match float constant scalars, vector splats,
+/// and fixed width vectors that satisfy a specified predicate.
+/// For fixed width vector constants, undefined elements are ignored.
template <typename Predicate> struct cstfp_pred_ty : public Predicate {
template <typename ITy> bool match(ITy *V) {
if (const auto *CF = dyn_cast<ConstantFP>(V))
return this->isValue(CF->getValueAPF());
- if (V->getType()->isVectorTy()) {
+ if (const auto *VTy = dyn_cast<VectorType>(V->getType())) {
if (const auto *C = dyn_cast<Constant>(V)) {
if (const auto *CF = dyn_cast_or_null<ConstantFP>(C->getSplatValue()))
return this->isValue(CF->getValueAPF());
// Number of elements of a scalable vector unknown at compile time
- if (isa<ScalableVectorType>(V->getType()))
+ auto *FVTy = dyn_cast<FixedVectorType>(VTy);
+ if (!FVTy)
return false;
// Non-splat vector constant: check each element for a match.
- unsigned NumElts =
- cast<FixedVectorType>(V->getType())->getNumElements();
+ unsigned NumElts = FVTy->getNumElements();
assert(NumElts != 0 && "Constant vector with no elements?");
bool HasNonUndefElements = false;
for (unsigned i = 0; i != NumElts; ++i) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83001.274934.patch
Type: text/x-patch
Size: 4603 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200701/c807fb4f/attachment.bin>
More information about the llvm-commits
mailing list