Skip to content

Commit 87528bf

Browse files
committed
[ValueTracking] Add support for shufflevector in isKnownNonZero
Shuffles don't modify the data, so if all elements that end up in the destination are non-zero the result is non-zero. Closes llvm#87702
1 parent c1d3f39 commit 87528bf

File tree

2 files changed

+20
-21
lines changed

2 files changed

+20
-21
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2777,6 +2777,21 @@ static bool isKnownNonZeroFromOperator(const Operator *I,
27772777
}
27782778
}
27792779
break;
2780+
case Instruction::ShuffleVector: {
2781+
auto *Shuf = dyn_cast<ShuffleVectorInst>(I);
2782+
if (!Shuf)
2783+
break;
2784+
APInt DemandedLHS, DemandedRHS;
2785+
// For undef elements, we don't know anything about the common state of
2786+
// the shuffle result.
2787+
if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
2788+
break;
2789+
// If demanded elements for both vecs are non-zero, the shuffle is non-zero.
2790+
return (DemandedRHS.isZero() ||
2791+
isKnownNonZero(Shuf->getOperand(1), DemandedRHS, Depth, Q)) &&
2792+
(DemandedLHS.isZero() ||
2793+
isKnownNonZero(Shuf->getOperand(0), DemandedLHS, Depth, Q));
2794+
}
27802795
case Instruction::Freeze:
27812796
return isKnownNonZero(I->getOperand(0), Depth, Q) &&
27822797
isGuaranteedNotToBePoison(I->getOperand(0), Q.AC, Q.CxtI, Q.DT,

llvm/test/Transforms/InstSimplify/known-non-zero.ll

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,7 @@ define i1 @smax_non_zero(i8 %xx, i8 %y) {
180180

181181
define <4 x i1> @shuf_nonzero_both(<4 x i8> %xx, <4 x i8> %yy) {
182182
; CHECK-LABEL: @shuf_nonzero_both(
183-
; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 1, i8 1, i8 1>
184-
; CHECK-NEXT: [[Y:%.*]] = add nuw <4 x i8> [[YY:%.*]], <i8 1, i8 1, i8 1, i8 1>
185-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[Y]], <4 x i32> <i32 0, i32 4, i32 7, i32 2>
186-
; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
187-
; CHECK-NEXT: ret <4 x i1> [[R]]
183+
; CHECK-NEXT: ret <4 x i1> zeroinitializer
188184
;
189185
%x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
190186
%y = add nuw <4 x i8> %yy, <i8 1, i8 1, i8 1, i8 1>
@@ -228,10 +224,7 @@ define <4 x i1> @shuf_nonzero_both_fail2(<4 x i8> %xx, <4 x i8> %yy) {
228224

229225
define <4 x i1> @shuf_nonzero_lhs(<4 x i8> %xx) {
230226
; CHECK-LABEL: @shuf_nonzero_lhs(
231-
; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 1, i8 1, i8 1>
232-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> poison, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
233-
; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
234-
; CHECK-NEXT: ret <4 x i1> [[R]]
227+
; CHECK-NEXT: ret <4 x i1> zeroinitializer
235228
;
236229
%x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
237230

@@ -242,10 +235,7 @@ define <4 x i1> @shuf_nonzero_lhs(<4 x i8> %xx) {
242235

243236
define <4 x i1> @shuf_nonzero_lhs2(<4 x i8> %xx) {
244237
; CHECK-LABEL: @shuf_nonzero_lhs2(
245-
; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 1, i8 1, i8 0>
246-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> poison, <4 x i32> <i32 2, i32 0, i32 1, i32 1>
247-
; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
248-
; CHECK-NEXT: ret <4 x i1> [[R]]
238+
; CHECK-NEXT: ret <4 x i1> zeroinitializer
249239
;
250240
%x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 0>
251241

@@ -270,10 +260,7 @@ define <4 x i1> @shuf_nonzero_lhs2_fail(<4 x i8> %xx) {
270260

271261
define <4 x i1> @shuf_nonzero_rhs(<4 x i8> %xx) {
272262
; CHECK-LABEL: @shuf_nonzero_rhs(
273-
; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 1, i8 1, i8 1>
274-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> poison, <4 x i8> [[X]], <4 x i32> <i32 6, i32 7, i32 5, i32 4>
275-
; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
276-
; CHECK-NEXT: ret <4 x i1> [[R]]
263+
; CHECK-NEXT: ret <4 x i1> zeroinitializer
277264
;
278265
%x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>
279266

@@ -284,10 +271,7 @@ define <4 x i1> @shuf_nonzero_rhs(<4 x i8> %xx) {
284271

285272
define <4 x i1> @shuf_nonzero_rhs2(<4 x i8> %xx) {
286273
; CHECK-LABEL: @shuf_nonzero_rhs2(
287-
; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 0, i8 0, i8 1, i8 1>
288-
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> poison, <4 x i8> [[X]], <4 x i32> <i32 6, i32 7, i32 7, i32 6>
289-
; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[SHUF]], zeroinitializer
290-
; CHECK-NEXT: ret <4 x i1> [[R]]
274+
; CHECK-NEXT: ret <4 x i1> zeroinitializer
291275
;
292276
%x = add nuw <4 x i8> %xx, <i8 0, i8 0, i8 1, i8 1>
293277

0 commit comments

Comments
 (0)