Skip to content

Commit 55b525e

Browse files
committed
[InstCombine] Add test coverage for Issue llvm#53610
1 parent 1aeb4c6 commit 55b525e

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
; PR53610 - sub(0,and(lshr(X,C),1)) --> ashr(shl(X,(BW-1)-C),BW-1)
5+
6+
define i8 @neg_mask1_lshr(i8 %a0) {
7+
; CHECK-LABEL: @neg_mask1_lshr(
8+
; CHECK-NEXT: [[SHIFT:%.*]] = lshr i8 [[A0:%.*]], 3
9+
; CHECK-NEXT: [[MASK:%.*]] = and i8 [[SHIFT]], 1
10+
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i8 0, [[MASK]]
11+
; CHECK-NEXT: ret i8 [[NEG]]
12+
;
13+
%shift = lshr i8 %a0, 3
14+
%mask = and i8 %shift, 1
15+
%neg = sub i8 0, %mask
16+
ret i8 %neg
17+
}
18+
19+
define <4 x i32> @neg_mask1_lshr_vector_uniform(<4 x i32> %a0) {
20+
; CHECK-LABEL: @neg_mask1_lshr_vector_uniform(
21+
; CHECK-NEXT: [[SHIFT:%.*]] = lshr <4 x i32> [[A0:%.*]], <i32 3, i32 3, i32 3, i32 3>
22+
; CHECK-NEXT: [[MASK:%.*]] = and <4 x i32> [[SHIFT]], <i32 1, i32 1, i32 1, i32 1>
23+
; CHECK-NEXT: [[NEG:%.*]] = sub nsw <4 x i32> zeroinitializer, [[MASK]]
24+
; CHECK-NEXT: ret <4 x i32> [[NEG]]
25+
;
26+
%shift = lshr <4 x i32> %a0, <i32 3, i32 3, i32 3, i32 3>
27+
%mask = and <4 x i32> %shift, <i32 1, i32 1, i32 1, i32 1>
28+
%neg = sub <4 x i32> zeroinitializer, %mask
29+
ret <4 x i32> %neg
30+
}
31+
32+
define <4 x i32> @neg_mask1_lshr_vector_nonuniform(<4 x i32> %a0) {
33+
; CHECK-LABEL: @neg_mask1_lshr_vector_nonuniform(
34+
; CHECK-NEXT: [[SHIFT:%.*]] = lshr <4 x i32> [[A0:%.*]], <i32 3, i32 4, i32 5, i32 6>
35+
; CHECK-NEXT: [[MASK:%.*]] = and <4 x i32> [[SHIFT]], <i32 1, i32 1, i32 1, i32 1>
36+
; CHECK-NEXT: [[NEG:%.*]] = sub nsw <4 x i32> zeroinitializer, [[MASK]]
37+
; CHECK-NEXT: ret <4 x i32> [[NEG]]
38+
;
39+
%shift = lshr <4 x i32> %a0, <i32 3, i32 4, i32 5, i32 6>
40+
%mask = and <4 x i32> %shift, <i32 1, i32 1, i32 1, i32 1>
41+
%neg = sub <4 x i32> zeroinitializer, %mask
42+
ret <4 x i32> %neg
43+
}
44+
45+
; Negative Test - wrong mask
46+
define i8 @neg_mask2_lshr(i8 %a0) {
47+
; CHECK-LABEL: @neg_mask2_lshr(
48+
; CHECK-NEXT: [[SHIFT:%.*]] = lshr i8 [[A0:%.*]], 3
49+
; CHECK-NEXT: [[MASK:%.*]] = and i8 [[SHIFT]], 2
50+
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i8 0, [[MASK]]
51+
; CHECK-NEXT: ret i8 [[NEG]]
52+
;
53+
%shift = lshr i8 %a0, 3
54+
%mask = and i8 %shift, 2
55+
%neg = sub i8 0, %mask
56+
ret i8 %neg
57+
}
58+
59+
; Negative Test - bad shift amount
60+
define i8 @neg_mask2_lshr_outofbounds(i8 %a0) {
61+
; CHECK-LABEL: @neg_mask2_lshr_outofbounds(
62+
; CHECK-NEXT: ret i8 poison
63+
;
64+
%shift = lshr i8 %a0, 8
65+
%mask = and i8 %shift, 2
66+
%neg = sub i8 0, %mask
67+
ret i8 %neg
68+
}
69+
70+
; Negative Test - non-constant shift amount
71+
define <2 x i32> @neg_mask1_lshr_vector_var(<2 x i32> %a0, <2 x i32> %a1) {
72+
; CHECK-LABEL: @neg_mask1_lshr_vector_var(
73+
; CHECK-NEXT: [[SHIFT:%.*]] = lshr <2 x i32> [[A0:%.*]], [[A1:%.*]]
74+
; CHECK-NEXT: [[MASK:%.*]] = and <2 x i32> [[SHIFT]], <i32 1, i32 1>
75+
; CHECK-NEXT: [[NEG:%.*]] = sub nsw <2 x i32> zeroinitializer, [[MASK]]
76+
; CHECK-NEXT: ret <2 x i32> [[NEG]]
77+
;
78+
%shift = lshr <2 x i32> %a0, %a1
79+
%mask = and <2 x i32> %shift, <i32 1, i32 1>
80+
%neg = sub <2 x i32> zeroinitializer, %mask
81+
ret <2 x i32> %neg
82+
}

0 commit comments

Comments
 (0)