[PATCH] D124997: [InstCombine] Fix scalable-vector bitwise select matching
Fraser Cormack via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 6 05:12:12 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGbafab9c09f68: [InstCombine] Fix scalable-vector bitwise select matching (authored by frasercrmck).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124997/new/
https://reviews.llvm.org/D124997
Files:
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/test/Transforms/InstCombine/logical-select.ll
Index: llvm/test/Transforms/InstCombine/logical-select.ll
===================================================================
--- llvm/test/Transforms/InstCombine/logical-select.ll
+++ llvm/test/Transforms/InstCombine/logical-select.ll
@@ -471,6 +471,18 @@
ret <4 x i1> %or
}
+define <vscale x 1 x i1> @vec_of_bools_scalable(<vscale x 1 x i1> %a, <vscale x 1 x i1> %c, <vscale x 1 x i1> %d) {
+; CHECK-LABEL: @vec_of_bools_scalable(
+; CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 1 x i1> [[A:%.*]], <vscale x 1 x i1> [[C:%.*]], <vscale x 1 x i1> [[D:%.*]]
+; CHECK-NEXT: ret <vscale x 1 x i1> [[TMP1]]
+;
+ %b = xor <vscale x 1 x i1> %a, shufflevector (<vscale x 1 x i1> insertelement (<vscale x 1 x i1> poison, i1 true, i32 0), <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer)
+ %t11 = and <vscale x 1 x i1> %a, %c
+ %t12 = and <vscale x 1 x i1> %b, %d
+ %r = or <vscale x 1 x i1> %t11, %t12
+ ret <vscale x 1 x i1> %r
+}
+
define i4 @vec_of_casted_bools(i4 %a, i4 %b, <4 x i1> %c) {
; CHECK-LABEL: @vec_of_casted_bools(
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i4 [[B:%.*]] to <4 x i1>
@@ -488,6 +500,25 @@
ret i4 %or
}
+define <vscale x 1 x i64> @vec_of_casted_bools_scalable(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b, <vscale x 8 x i1> %cond) {
+; CHECK-LABEL: @vec_of_casted_bools_scalable(
+; CHECK-NEXT: [[TMP1:%.*]] = bitcast <vscale x 1 x i64> [[A:%.*]] to <vscale x 8 x i8>
+; CHECK-NEXT: [[TMP2:%.*]] = bitcast <vscale x 1 x i64> [[B:%.*]] to <vscale x 8 x i8>
+; CHECK-NEXT: [[TMP3:%.*]] = select <vscale x 8 x i1> [[COND:%.*]], <vscale x 8 x i8> [[TMP1]], <vscale x 8 x i8> [[TMP2]]
+; CHECK-NEXT: [[TMP4:%.*]] = bitcast <vscale x 8 x i8> [[TMP3]] to <vscale x 1 x i64>
+; CHECK-NEXT: ret <vscale x 1 x i64> [[TMP4]]
+;
+ %scond = sext <vscale x 8 x i1> %cond to <vscale x 8 x i8>
+ %notcond = xor <vscale x 8 x i1> %cond, shufflevector (<vscale x 8 x i1> insertelement (<vscale x 8 x i1> poison, i1 true, i32 0), <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer)
+ %snotcond = sext <vscale x 8 x i1> %notcond to <vscale x 8 x i8>
+ %bc1 = bitcast <vscale x 8 x i8> %scond to <vscale x 1 x i64>
+ %bc2 = bitcast <vscale x 8 x i8> %snotcond to <vscale x 1 x i64>
+ %and1 = and <vscale x 1 x i64> %a, %bc1
+ %and2 = and <vscale x 1 x i64> %bc2, %b
+ %or = or <vscale x 1 x i64> %and1, %and2
+ ret <vscale x 1 x i64> %or
+}
+
; Inverted 'and' constants mean this is a select which is canonicalized to a shuffle.
define <4 x i32> @vec_sel_consts(<4 x i32> %a, <4 x i32> %b) {
Index: llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -2344,8 +2344,12 @@
// not create unnecessary casts if the types already match.
Type *SelTy = A->getType();
if (auto *VecTy = dyn_cast<VectorType>(Cond->getType())) {
+ // For a fixed or scalable vector get N from <{vscale x} N x iM>
unsigned Elts = VecTy->getElementCount().getKnownMinValue();
- Type *EltTy = Builder.getIntNTy(SelTy->getPrimitiveSizeInBits() / Elts);
+ // For a fixed or scalable vector, get the size in bits of N x iM; for a
+ // scalar this is just M.
+ unsigned SelEltSize = SelTy->getPrimitiveSizeInBits().getKnownMinSize();
+ Type *EltTy = Builder.getIntNTy(SelEltSize / Elts);
SelTy = VectorType::get(EltTy, VecTy->getElementCount());
}
Value *BitcastC = Builder.CreateBitCast(C, SelTy);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124997.427602.patch
Type: text/x-patch
Size: 3602 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220506/b2312c06/attachment.bin>
More information about the llvm-commits
mailing list