Skip to content

Commit 00085c7

Browse files
committed
[InstCombine][NFC] precommit tests for signed floor division
1 parent 7532958 commit 00085c7

File tree

2 files changed

+180
-0
lines changed

2 files changed

+180
-0
lines changed

llvm/test/Transforms/InstCombine/add.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3018,6 +3018,40 @@ define i32 @floor_sdiv_wrong_op(i32 %x, i32 %y) {
30183018
ret i32 %r
30193019
}
30203020

3021+
define i32 @floor_sdiv_using_srem_by_8(i32 %x) {
3022+
; CHECK-LABEL: @floor_sdiv_using_srem_by_8(
3023+
; CHECK-NEXT: [[D:%.*]] = sdiv i32 [[X:%.*]], 8
3024+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 8
3025+
; CHECK-NEXT: [[I:%.*]] = icmp ugt i32 [[R]], -2147483648
3026+
; CHECK-NEXT: [[S:%.*]] = sext i1 [[I]] to i32
3027+
; CHECK-NEXT: [[F:%.*]] = add nsw i32 [[D]], [[S]]
3028+
; CHECK-NEXT: ret i32 [[F]]
3029+
;
3030+
%d = sdiv i32 %x, 8
3031+
%r = srem i32 %x, 8
3032+
%i = icmp ugt i32 %r, -2147483648
3033+
%s = sext i1 %i to i32
3034+
%f = add i32 %d, %s
3035+
ret i32 %f
3036+
}
3037+
3038+
define i32 @floor_sdiv_using_srem_by_2(i32 %x) {
3039+
; CHECK-LABEL: @floor_sdiv_using_srem_by_2(
3040+
; CHECK-NEXT: [[D:%.*]] = sdiv i32 [[X:%.*]], 2
3041+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 2
3042+
; CHECK-NEXT: [[I:%.*]] = icmp ugt i32 [[R]], -2147483648
3043+
; CHECK-NEXT: [[S:%.*]] = sext i1 [[I]] to i32
3044+
; CHECK-NEXT: [[F:%.*]] = add nsw i32 [[D]], [[S]]
3045+
; CHECK-NEXT: ret i32 [[F]]
3046+
;
3047+
%d = sdiv i32 %x, 2
3048+
%r = srem i32 %x, 2
3049+
%i = icmp ugt i32 %r, -2147483648
3050+
%s = sext i1 %i to i32
3051+
%f = add i32 %d, %s
3052+
ret i32 %f
3053+
}
3054+
30213055
; (X s>> (BW - 1)) + (zext (X s> 0)) --> (X s>> (BW - 1)) | (zext (X != 0))
30223056

30233057
define i8 @signum_i8_i8(i8 %x) {
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
define i1 @icmp_ugt_srem5_smin(i32 %x) {
5+
; CHECK-LABEL: define i1 @icmp_ugt_srem5_smin(
6+
; CHECK-SAME: i32 [[X:%.*]]) {
7+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
8+
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[R]], -2147483648
9+
; CHECK-NEXT: ret i1 [[C]]
10+
;
11+
%r = srem i32 %x, 5
12+
%c = icmp ugt i32 %r, -2147483648
13+
ret i1 %c
14+
}
15+
16+
define i1 @icmp_ugt_srem5_m5(i32 %x) {
17+
; CHECK-LABEL: define i1 @icmp_ugt_srem5_m5(
18+
; CHECK-SAME: i32 [[X:%.*]]) {
19+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
20+
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[R]], -5
21+
; CHECK-NEXT: ret i1 [[C]]
22+
;
23+
%r = srem i32 %x, 5
24+
%c = icmp ugt i32 %r, -5
25+
ret i1 %c
26+
}
27+
28+
define i1 @icmp_ugt_srem5_m4(i32 %x) {
29+
; CHECK-LABEL: define i1 @icmp_ugt_srem5_m4(
30+
; CHECK-SAME: i32 [[X:%.*]]) {
31+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
32+
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[R]], -4
33+
; CHECK-NEXT: ret i1 [[C]]
34+
;
35+
%r = srem i32 %x, 5
36+
%c = icmp ugt i32 %r, -4
37+
ret i1 %c
38+
}
39+
40+
define i1 @icmp_ugt_srem5_3(i32 %x) {
41+
; CHECK-LABEL: define i1 @icmp_ugt_srem5_3(
42+
; CHECK-SAME: i32 [[X:%.*]]) {
43+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
44+
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[R]], 3
45+
; CHECK-NEXT: ret i1 [[C]]
46+
;
47+
%r = srem i32 %x, 5
48+
%c = icmp ugt i32 %r, 3
49+
ret i1 %c
50+
}
51+
52+
define i1 @icmp_ugt_srem5_4(i32 %x) {
53+
; CHECK-LABEL: define i1 @icmp_ugt_srem5_4(
54+
; CHECK-SAME: i32 [[X:%.*]]) {
55+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
56+
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[R]], 4
57+
; CHECK-NEXT: ret i1 [[C]]
58+
;
59+
%r = srem i32 %x, 5
60+
%c = icmp ugt i32 %r, 4
61+
ret i1 %c
62+
}
63+
64+
define i1 @icmp_ugt_srem5_smaxm1(i32 %x) {
65+
; CHECK-LABEL: define i1 @icmp_ugt_srem5_smaxm1(
66+
; CHECK-SAME: i32 [[X:%.*]]) {
67+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
68+
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[R]], 2147483646
69+
; CHECK-NEXT: ret i1 [[C]]
70+
;
71+
%r = srem i32 %x, 5
72+
%c = icmp ugt i32 %r, 2147483646
73+
ret i1 %c
74+
}
75+
76+
define i1 @icmp_ult_srem5_sminp1(i32 %x) {
77+
; CHECK-LABEL: define i1 @icmp_ult_srem5_sminp1(
78+
; CHECK-SAME: i32 [[X:%.*]]) {
79+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
80+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[R]], -2147483647
81+
; CHECK-NEXT: ret i1 [[C]]
82+
;
83+
%r = srem i32 %x, 5
84+
%c = icmp ult i32 %r, -2147483647
85+
ret i1 %c
86+
}
87+
88+
define i1 @icmp_ult_srem5_m4(i32 %x) {
89+
; CHECK-LABEL: define i1 @icmp_ult_srem5_m4(
90+
; CHECK-SAME: i32 [[X:%.*]]) {
91+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
92+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[R]], -4
93+
; CHECK-NEXT: ret i1 [[C]]
94+
;
95+
%r = srem i32 %x, 5
96+
%c = icmp ult i32 %r, -4
97+
ret i1 %c
98+
}
99+
100+
define i1 @icmp_ult_srem5_m3(i32 %x) {
101+
; CHECK-LABEL: define i1 @icmp_ult_srem5_m3(
102+
; CHECK-SAME: i32 [[X:%.*]]) {
103+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
104+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[R]], -3
105+
; CHECK-NEXT: ret i1 [[C]]
106+
;
107+
%r = srem i32 %x, 5
108+
%c = icmp ult i32 %r, -3
109+
ret i1 %c
110+
}
111+
112+
define i1 @icmp_ult_srem5_4(i32 %x) {
113+
; CHECK-LABEL: define i1 @icmp_ult_srem5_4(
114+
; CHECK-SAME: i32 [[X:%.*]]) {
115+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
116+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[R]], 4
117+
; CHECK-NEXT: ret i1 [[C]]
118+
;
119+
%r = srem i32 %x, 5
120+
%c = icmp ult i32 %r, 4
121+
ret i1 %c
122+
}
123+
124+
define i1 @icmp_ult_srem5_5(i32 %x) {
125+
; CHECK-LABEL: define i1 @icmp_ult_srem5_5(
126+
; CHECK-SAME: i32 [[X:%.*]]) {
127+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
128+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[R]], 5
129+
; CHECK-NEXT: ret i1 [[C]]
130+
;
131+
%r = srem i32 %x, 5
132+
%c = icmp ult i32 %r, 5
133+
ret i1 %c
134+
}
135+
136+
define i1 @icmp_ult_srem5_smax(i32 %x) {
137+
; CHECK-LABEL: define i1 @icmp_ult_srem5_smax(
138+
; CHECK-SAME: i32 [[X:%.*]]) {
139+
; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 5
140+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[R]], 2147483647
141+
; CHECK-NEXT: ret i1 [[C]]
142+
;
143+
%r = srem i32 %x, 5
144+
%c = icmp ult i32 %r, 2147483647
145+
ret i1 %c
146+
}

0 commit comments

Comments
 (0)