Skip to content

Commit 9cae511

Browse files
committed
[InstCombine] Add additional test coverage for D123374
More basic test coverage for the fold: (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit
1 parent 315d792 commit 9cae511

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
;
5+
; (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit
6+
;
7+
8+
define i32 @add_mask_sign_i32(i32 %x) {
9+
; CHECK-LABEL: @add_mask_sign_i32(
10+
; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X:%.*]], 31
11+
; CHECK-NEXT: [[M:%.*]] = and i32 [[A]], 8
12+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[M]], [[A]]
13+
; CHECK-NEXT: ret i32 [[R]]
14+
;
15+
%a = ashr i32 %x, 31
16+
%m = and i32 %a, 8
17+
%r = add i32 %m, %a
18+
ret i32 %r
19+
}
20+
21+
define i32 @add_mask_sign_commute_i32(i32 %x) {
22+
; CHECK-LABEL: @add_mask_sign_commute_i32(
23+
; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X:%.*]], 31
24+
; CHECK-NEXT: [[M:%.*]] = and i32 [[A]], 8
25+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[A]], [[M]]
26+
; CHECK-NEXT: ret i32 [[R]]
27+
;
28+
%a = ashr i32 %x, 31
29+
%m = and i32 %a, 8
30+
%r = add i32 %a, %m
31+
ret i32 %r
32+
}
33+
34+
define <2 x i32> @add_mask_sign_v2i32(<2 x i32> %x) {
35+
; CHECK-LABEL: @add_mask_sign_v2i32(
36+
; CHECK-NEXT: [[A:%.*]] = ashr <2 x i32> [[X:%.*]], <i32 31, i32 31>
37+
; CHECK-NEXT: [[M:%.*]] = and <2 x i32> [[A]], <i32 8, i32 8>
38+
; CHECK-NEXT: [[R:%.*]] = add nsw <2 x i32> [[M]], [[A]]
39+
; CHECK-NEXT: ret <2 x i32> [[R]]
40+
;
41+
%a = ashr <2 x i32> %x, <i32 31, i32 31>
42+
%m = and <2 x i32> %a, <i32 8, i32 8>
43+
%r = add <2 x i32> %m, %a
44+
ret <2 x i32> %r
45+
}
46+
47+
define <2 x i32> @add_mask_sign_v2i32_nonuniform(<2 x i32> %x) {
48+
; CHECK-LABEL: @add_mask_sign_v2i32_nonuniform(
49+
; CHECK-NEXT: [[A:%.*]] = ashr <2 x i32> [[X:%.*]], <i32 30, i32 31>
50+
; CHECK-NEXT: [[M:%.*]] = and <2 x i32> [[A]], <i32 8, i32 16>
51+
; CHECK-NEXT: [[R:%.*]] = add <2 x i32> [[M]], [[A]]
52+
; CHECK-NEXT: ret <2 x i32> [[R]]
53+
;
54+
%a = ashr <2 x i32> %x, <i32 30, i32 31>
55+
%m = and <2 x i32> %a, <i32 8, i32 16>
56+
%r = add <2 x i32> %m, %a
57+
ret <2 x i32> %r
58+
}
59+
60+
define i32 @add_mask_ashr28_i32(i32 %x) {
61+
; CHECK-LABEL: @add_mask_ashr28_i32(
62+
; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X:%.*]], 28
63+
; CHECK-NEXT: [[M:%.*]] = and i32 [[A]], 8
64+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[M]], [[A]]
65+
; CHECK-NEXT: ret i32 [[R]]
66+
;
67+
%a = ashr i32 %x, 28
68+
%m = and i32 %a, 8
69+
%r = add i32 %m, %a
70+
ret i32 %r
71+
}
72+
73+
; negative case - insufficient sign bits
74+
define i32 @add_mask_ashr27_i32(i32 %x) {
75+
; CHECK-LABEL: @add_mask_ashr27_i32(
76+
; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X:%.*]], 27
77+
; CHECK-NEXT: [[M:%.*]] = and i32 [[A]], 8
78+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[M]], [[A]]
79+
; CHECK-NEXT: ret i32 [[R]]
80+
;
81+
%a = ashr i32 %x, 27
82+
%m = and i32 %a, 8
83+
%r = add i32 %m, %a
84+
ret i32 %r
85+
}

0 commit comments

Comments
 (0)