[PATCH] D102082: [Constant] Allow ConstantAggregateZero a scalable element count
Fraser Cormack via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 7 10:12:40 PDT 2021
frasercrmck created this revision.
frasercrmck added reviewers: RKSimon, aqjune, nikic, fhahn.
Herald added subscribers: dexonsmith, hiraditya.
frasercrmck requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
A ConstantAggregateZero may be created from a scalable vector type.
However, it still assumed fixed number of elements when queried for
them. This patch changes ConstantAggregateZero to correctly report its
element count.
This change fixes a couple of issues. Firstly, it fixes a crash in
Constant::getUniqueValue when called on a scalable-vector
zeroinitializer constant.
Secondly, it fixes a latent bug in GlobalISel's IRTranslator in which
translating a scalable-vector zeroinitializer would hit the assertion in
ConstantAggregateZero::getNumElements when casting to a FixedVectorType,
rather than reporting an error more gracefully. This is currently
hypothetical as the IRTranslator has deeper issues preventing the use of
scalable vector types.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D102082
Files:
llvm/include/llvm/IR/Constants.h
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
llvm/lib/IR/Constants.cpp
llvm/test/Transforms/InstCombine/scalable-select.ll
Index: llvm/test/Transforms/InstCombine/scalable-select.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/scalable-select.ll
@@ -0,0 +1,17 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -instcombine -S < %s | FileCheck %s
+
+; This test checks a regression in the select operand folding combine, in which
+; Constant::getUniqueInteger would crash for a scalable-vector zeroinitializer.
+define <vscale x 1 x i32> @select_opt(<vscale x 1 x i32> %b, <vscale x 1 x i1> %m) {
+; CHECK-LABEL: @select_opt(
+; CHECK-NEXT: [[C:%.*]] = add nsw <vscale x 1 x i32> [[B:%.*]], shufflevector (<vscale x 1 x i32> insertelement (<vscale x 1 x i32> undef, i32 2, i32 0), <vscale x 1 x i32> undef, <vscale x 1 x i32> zeroinitializer)
+; CHECK-NEXT: [[D:%.*]] = select <vscale x 1 x i1> [[M:%.*]], <vscale x 1 x i32> [[C]], <vscale x 1 x i32> [[B]]
+; CHECK-NEXT: ret <vscale x 1 x i32> [[D]]
+;
+ %head = insertelement <vscale x 1 x i32> undef, i32 2, i32 0
+ %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> undef, <vscale x 1 x i32> zeroinitializer
+ %c = add nsw <vscale x 1 x i32> %b, %splat
+ %d = select <vscale x 1 x i1> %m, <vscale x 1 x i32> %c, <vscale x 1 x i32> %b
+ ret <vscale x 1 x i32> %d
+}
Index: llvm/lib/IR/Constants.cpp
===================================================================
--- llvm/lib/IR/Constants.cpp
+++ llvm/lib/IR/Constants.cpp
@@ -425,13 +425,15 @@
if (const auto *CC = dyn_cast<ConstantAggregate>(this))
return Elt < CC->getNumOperands() ? CC->getOperand(Elt) : nullptr;
+ if (const auto *CAZ = dyn_cast<ConstantAggregateZero>(this))
+ return Elt < CAZ->getElementCount().getKnownMinValue()
+ ? CAZ->getElementValue(Elt)
+ : nullptr;
+
// FIXME: getNumElements() will fail for non-fixed vector types.
if (isa<ScalableVectorType>(getType()))
return nullptr;
- if (const auto *CAZ = dyn_cast<ConstantAggregateZero>(this))
- return Elt < CAZ->getNumElements() ? CAZ->getElementValue(Elt) : nullptr;
-
if (const auto *PV = dyn_cast<PoisonValue>(this))
return Elt < PV->getNumElements() ? PV->getElementValue(Elt) : nullptr;
@@ -1088,13 +1090,13 @@
return getStructElement(Idx);
}
-unsigned ConstantAggregateZero::getNumElements() const {
+ElementCount ConstantAggregateZero::getElementCount() const {
Type *Ty = getType();
if (auto *AT = dyn_cast<ArrayType>(Ty))
- return AT->getNumElements();
+ return ElementCount::getFixed(AT->getNumElements());
if (auto *VT = dyn_cast<VectorType>(Ty))
- return cast<FixedVectorType>(VT)->getNumElements();
- return Ty->getStructNumElements();
+ return cast<VectorType>(VT)->getElementCount();
+ return ElementCount::getFixed(Ty->getStructNumElements());
}
//===----------------------------------------------------------------------===//
Index: llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -2876,13 +2876,14 @@
else if (auto GV = dyn_cast<GlobalValue>(&C))
EntryBuilder->buildGlobalValue(Reg, GV);
else if (auto CAZ = dyn_cast<ConstantAggregateZero>(&C)) {
- if (!CAZ->getType()->isVectorTy())
+ if (!isa<FixedVectorType>(CAZ->getType()))
return false;
// Return the scalar if it is a <1 x Ty> vector.
- if (CAZ->getNumElements() == 1)
+ unsigned NumElts = CAZ->getElementCount().getFixedValue();
+ if (NumElts == 1)
return translateCopy(C, *CAZ->getElementValue(0u), *EntryBuilder.get());
SmallVector<Register, 4> Ops;
- for (unsigned i = 0; i < CAZ->getNumElements(); ++i) {
+ for (unsigned i = 0; i < NumElts; ++i) {
Constant &Elt = *CAZ->getElementValue(i);
Ops.push_back(getOrCreateVReg(Elt));
}
Index: llvm/include/llvm/IR/Constants.h
===================================================================
--- llvm/include/llvm/IR/Constants.h
+++ llvm/include/llvm/IR/Constants.h
@@ -360,7 +360,7 @@
Constant *getElementValue(unsigned Idx) const;
/// Return the number of elements in the array, vector, or struct.
- unsigned getNumElements() const;
+ ElementCount getElementCount() const;
/// Methods for support type inquiry through isa, cast, and dyn_cast:
///
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102082.343711.patch
Type: text/x-patch
Size: 4438 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210507/a24d9094/attachment.bin>
More information about the llvm-commits
mailing list