Skip to content

Commit f060d21

Browse files
[ConstantHoisting] Add AArch64 tests for divide like operations.
1 parent 142e567 commit f060d21

File tree

1 file changed

+120
-9
lines changed

1 file changed

+120
-9
lines changed
Lines changed: 120 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,138 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
12
; RUN: opt -mtriple=arm64-darwin-unknown -S -passes=consthoist < %s | FileCheck %s
23

3-
define i128 @test1(i128 %a) nounwind {
4-
; CHECK-LABEL: test1
5-
; CHECK: %const = bitcast i128 12297829382473034410122878 to i128
4+
define i128 @test1(i128 %a) {
5+
; CHECK-LABEL: define i128 @test1(
6+
; CHECK-SAME: i128 [[A:%.*]]) {
7+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i128 12297829382473034410122878 to i128
8+
; CHECK-NEXT: [[TMP1:%.*]] = add i128 [[A]], [[CONST]]
9+
; CHECK-NEXT: [[TMP2:%.*]] = add i128 [[TMP1]], [[CONST]]
10+
; CHECK-NEXT: ret i128 [[TMP2]]
11+
;
612
%1 = add i128 %a, 12297829382473034410122878
713
%2 = add i128 %1, 12297829382473034410122878
814
ret i128 %2
915
}
1016

1117
; Check that we don't hoist large, but cheap constants
12-
define i512 @test2(i512 %a) nounwind {
13-
; CHECK-LABEL: test2
14-
; CHECK-NOT: %const = bitcast i512 7 to i512
18+
define i512 @test2(i512 %a) {
19+
; CHECK-LABEL: define i512 @test2(
20+
; CHECK-SAME: i512 [[A:%.*]]) {
21+
; CHECK-NEXT: [[TMP1:%.*]] = and i512 [[A]], 7
22+
; CHECK-NEXT: [[TMP2:%.*]] = or i512 [[TMP1]], 7
23+
; CHECK-NEXT: ret i512 [[TMP2]]
24+
;
1525
%1 = and i512 %a, 7
1626
%2 = or i512 %1, 7
1727
ret i512 %2
1828
}
1929

2030
; Check that we don't hoist the shift value of a shift instruction.
21-
define i512 @test3(i512 %a) nounwind {
22-
; CHECK-LABEL: test3
23-
; CHECK-NOT: %const = bitcast i512 504 to i512
31+
define i512 @test3(i512 %a) {
32+
; CHECK-LABEL: define i512 @test3(
33+
; CHECK-SAME: i512 [[A:%.*]]) {
34+
; CHECK-NEXT: [[TMP1:%.*]] = shl i512 [[A]], 504
35+
; CHECK-NEXT: [[TMP2:%.*]] = ashr i512 [[TMP1]], 504
36+
; CHECK-NEXT: ret i512 [[TMP2]]
37+
;
2438
%1 = shl i512 %a, 504
2539
%2 = ashr i512 %1, 504
2640
ret i512 %2
2741
}
42+
43+
; Ensure the code generator has the information necessary to simply sdiv.
44+
define i64 @sdiv(i64 %a) {
45+
; CHECK-LABEL: define i64 @sdiv(
46+
; CHECK-SAME: i64 [[A:%.*]]) {
47+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i64 4294967087 to i64
48+
; CHECK-NEXT: [[TMP1:%.*]] = sdiv i64 [[A]], [[CONST]]
49+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[CONST]]
50+
; CHECK-NEXT: ret i64 [[TMP2]]
51+
;
52+
%1 = sdiv i64 %a, 4294967087
53+
%2 = add i64 %1, 4294967087
54+
ret i64 %2
55+
}
56+
57+
; Ensure the code generator has the information necessary to simply srem.
58+
define i64 @srem(i64 %a) {
59+
; CHECK-LABEL: define i64 @srem(
60+
; CHECK-SAME: i64 [[A:%.*]]) {
61+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i64 4294967087 to i64
62+
; CHECK-NEXT: [[TMP1:%.*]] = srem i64 [[A]], [[CONST]]
63+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[CONST]]
64+
; CHECK-NEXT: ret i64 [[TMP2]]
65+
;
66+
%1 = srem i64 %a, 4294967087
67+
%2 = add i64 %1, 4294967087
68+
ret i64 %2
69+
}
70+
71+
; Ensure the code generator has the information necessary to simply udiv.
72+
define i64 @udiv(i64 %a) {
73+
; CHECK-LABEL: define i64 @udiv(
74+
; CHECK-SAME: i64 [[A:%.*]]) {
75+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i64 4294967087 to i64
76+
; CHECK-NEXT: [[TMP1:%.*]] = udiv i64 [[A]], [[CONST]]
77+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[CONST]]
78+
; CHECK-NEXT: ret i64 [[TMP2]]
79+
;
80+
%1 = udiv i64 %a, 4294967087
81+
%2 = add i64 %1, 4294967087
82+
ret i64 %2
83+
}
84+
85+
; Ensure the code generator has the information necessary to simply urem.
86+
define i64 @urem(i64 %a) {
87+
; CHECK-LABEL: define i64 @urem(
88+
; CHECK-SAME: i64 [[A:%.*]]) {
89+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i64 4294967087 to i64
90+
; CHECK-NEXT: [[TMP1:%.*]] = urem i64 [[A]], [[CONST]]
91+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[CONST]]
92+
; CHECK-NEXT: ret i64 [[TMP2]]
93+
;
94+
%1 = urem i64 %a, 4294967087
95+
%2 = add i64 %1, 4294967087
96+
ret i64 %2
97+
}
98+
99+
; Code generator will not decompose divide like operations when the divisor is
100+
; no a constant.
101+
define i64 @sdiv_non_const_divisor(i64 %a) {
102+
; CHECK-LABEL: define i64 @sdiv_non_const_divisor(
103+
; CHECK-SAME: i64 [[A:%.*]]) {
104+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i64 4294967087 to i64
105+
; CHECK-NEXT: [[TMP1:%.*]] = sdiv i64 [[CONST]], [[A]]
106+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[CONST]]
107+
; CHECK-NEXT: ret i64 [[TMP2]]
108+
;
109+
%1 = sdiv i64 4294967087, %a
110+
%2 = add i64 %1, 4294967087
111+
ret i64 %2
112+
}
113+
114+
; Code generator emits divide instructions when optimising for size.
115+
define i64 @sdiv_minsize(i64 %a) minsize {
116+
; CHECK-LABEL: define i64 @sdiv_minsize(
117+
; CHECK-SAME: i64 [[A:%.*]]) #[[ATTR0:[0-9]+]] {
118+
; CHECK-NEXT: [[CONST:%.*]] = bitcast i64 4294967087 to i64
119+
; CHECK-NEXT: [[TMP1:%.*]] = sdiv i64 [[A]], [[CONST]]
120+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[CONST]]
121+
; CHECK-NEXT: ret i64 [[TMP2]]
122+
;
123+
%1 = sdiv i64 %a, 4294967087
124+
%2 = add i64 %1, 4294967087
125+
ret i64 %2
126+
}
127+
128+
define <2 x i64> @sdiv_v2i64(<2 x i64> %a) {
129+
; CHECK-LABEL: define <2 x i64> @sdiv_v2i64(
130+
; CHECK-SAME: <2 x i64> [[A:%.*]]) {
131+
; CHECK-NEXT: [[TMP1:%.*]] = sdiv <2 x i64> [[A]], <i64 4294967087, i64 4294967087>
132+
; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i64> [[TMP1]], <i64 4294967087, i64 4294967087>
133+
; CHECK-NEXT: ret <2 x i64> [[TMP2]]
134+
;
135+
%1 = sdiv <2 x i64> %a, <i64 4294967087, i64 4294967087>
136+
%2 = add <2 x i64> %1, <i64 4294967087, i64 4294967087>
137+
ret <2 x i64> %2
138+
}

0 commit comments

Comments
 (0)