Skip to content

Commit 0df6432

Browse files
committed
[InstCombine] Pre-commit tests
1 parent 9d5e144 commit 0df6432

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
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 double @fmul_tan_cos(double %a) {
5+
; CHECK-LABEL: define double @fmul_tan_cos(
6+
; CHECK-SAME: double [[A:%.*]]) {
7+
; CHECK-NEXT: [[TAN:%.*]] = call double @llvm.tan.f64(double [[A]])
8+
; CHECK-NEXT: [[COS:%.*]] = call double @llvm.cos.f64(double [[A]])
9+
; CHECK-NEXT: [[RES:%.*]] = fmul double [[TAN]], [[COS]]
10+
; CHECK-NEXT: ret double [[RES]]
11+
;
12+
%tan = call double @llvm.tan.f64(double %a)
13+
%cos = call double @llvm.cos.f64(double %a)
14+
%res = fmul double %tan, %cos
15+
ret double %res
16+
}
17+
18+
define double @fmul_strict_tan_strict_cos_contract(double %a) {
19+
; CHECK-LABEL: define double @fmul_strict_tan_strict_cos_contract(
20+
; CHECK-SAME: double [[A:%.*]]) {
21+
; CHECK-NEXT: [[TAN:%.*]] = call double @llvm.tan.f64(double [[A]])
22+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])
23+
; CHECK-NEXT: [[RES:%.*]] = fmul double [[TAN]], [[COS]]
24+
; CHECK-NEXT: ret double [[RES]]
25+
;
26+
%tan = call double @llvm.tan.f64(double %a)
27+
%cos = call contract double @llvm.cos.f64(double %a)
28+
%res = fmul double %tan, %cos
29+
ret double %res
30+
}
31+
32+
define double @fmul_contract_tan_strict_cos_strict(double %a) {
33+
; CHECK-LABEL: define double @fmul_contract_tan_strict_cos_strict(
34+
; CHECK-SAME: double [[A:%.*]]) {
35+
; CHECK-NEXT: [[TAN:%.*]] = call double @llvm.tan.f64(double [[A]])
36+
; CHECK-NEXT: [[COS:%.*]] = call double @llvm.cos.f64(double [[A]])
37+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]
38+
; CHECK-NEXT: ret double [[RES]]
39+
;
40+
%tan = call double @llvm.tan.f64(double %a)
41+
%cos = call double @llvm.cos.f64(double %a)
42+
%res = fmul contract double %tan, %cos
43+
ret double %res
44+
}
45+
46+
define double @fmul_contract_tan_contract_cos_strict(double %a) {
47+
; CHECK-LABEL: define double @fmul_contract_tan_contract_cos_strict(
48+
; CHECK-SAME: double [[A:%.*]]) {
49+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
50+
; CHECK-NEXT: [[COS:%.*]] = call double @llvm.cos.f64(double [[A]])
51+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]
52+
; CHECK-NEXT: ret double [[RES]]
53+
;
54+
%tan = call contract double @llvm.tan.f64(double %a)
55+
%cos = call double @llvm.cos.f64(double %a)
56+
%res = fmul contract double %tan, %cos
57+
ret double %res
58+
}
59+
60+
define double @fmul_tan_cos_contract_multiple_uses(double %a) {
61+
; CHECK-LABEL: define double @fmul_tan_cos_contract_multiple_uses(
62+
; CHECK-SAME: double [[A:%.*]]) {
63+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
64+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])
65+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]
66+
; CHECK-NEXT: call void @use(double [[COS]])
67+
; CHECK-NEXT: ret double [[RES]]
68+
;
69+
%tan = call contract double @llvm.tan.f64(double %a)
70+
%cos = call contract double @llvm.cos.f64(double %a)
71+
%res = fmul contract double %tan, %cos
72+
call void @use(double %cos)
73+
ret double %res
74+
}
75+
76+
define double @fmul_tan_cos_contract(double %a) {
77+
; CHECK-LABEL: define double @fmul_tan_cos_contract(
78+
; CHECK-SAME: double [[A:%.*]]) {
79+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
80+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])
81+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]
82+
; CHECK-NEXT: ret double [[RES]]
83+
;
84+
%tan = call contract double @llvm.tan.f64(double %a)
85+
%cos = call contract double @llvm.cos.f64(double %a)
86+
%res = fmul contract double %tan, %cos
87+
ret double %res
88+
}
89+
90+
define float @fmul_tanf_cosf_contract(float %a) {
91+
; CHECK-LABEL: define float @fmul_tanf_cosf_contract(
92+
; CHECK-SAME: float [[A:%.*]]) {
93+
; CHECK-NEXT: [[TAN:%.*]] = call contract float @llvm.tan.f32(float [[A]])
94+
; CHECK-NEXT: [[COS:%.*]] = call contract float @llvm.cos.f32(float [[A]])
95+
; CHECK-NEXT: [[RES:%.*]] = fmul contract float [[TAN]], [[COS]]
96+
; CHECK-NEXT: ret float [[RES]]
97+
;
98+
%tan = call contract float @llvm.tan.f32(float %a)
99+
%cos = call contract float @llvm.cos.f32(float %a)
100+
%res = fmul contract float %tan, %cos
101+
ret float %res
102+
}
103+
104+
define fp128 @fmul_tanfp128_cosfp128_contract(fp128 %a) {
105+
; CHECK-LABEL: define fp128 @fmul_tanfp128_cosfp128_contract(
106+
; CHECK-SAME: fp128 [[A:%.*]]) {
107+
; CHECK-NEXT: [[TAN:%.*]] = call contract fp128 @llvm.tan.f128(fp128 [[A]])
108+
; CHECK-NEXT: [[COS:%.*]] = call contract fp128 @llvm.cos.f128(fp128 [[A]])
109+
; CHECK-NEXT: [[RES:%.*]] = fmul contract fp128 [[TAN]], [[COS]]
110+
; CHECK-NEXT: ret fp128 [[RES]]
111+
;
112+
%tan = call contract fp128 @llvm.tan.fp128(fp128 %a)
113+
%cos = call contract fp128 @llvm.cos.fp128(fp128 %a)
114+
%res = fmul contract fp128 %tan, %cos
115+
ret fp128 %res
116+
}
117+
118+
119+
define double @commutativity_cos_tan(double %a) {
120+
; CHECK-LABEL: define double @commutativity_cos_tan(
121+
; CHECK-SAME: double [[A:%.*]]) {
122+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])
123+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
124+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[COS]], [[TAN]]
125+
; CHECK-NEXT: ret double [[RES]]
126+
;
127+
%cos = call contract double @llvm.cos.f64(double %a)
128+
%tan = call contract double @llvm.tan.f64(double %a)
129+
%res = fmul contract double %cos, %tan
130+
ret double %res
131+
}
132+
133+
134+
define double @tan_cos_value_mismatch(double %a, double %b) {
135+
; CHECK-LABEL: define double @tan_cos_value_mismatch(
136+
; CHECK-SAME: double [[A:%.*]], double [[B:%.*]]) {
137+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
138+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[B]])
139+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[TAN]], [[COS]]
140+
; CHECK-NEXT: ret double [[RES]]
141+
;
142+
%tan = call contract double @llvm.tan.f64(double %a)
143+
%cos = call contract double @llvm.cos.f64(double %b)
144+
%res = fmul contract double %tan, %cos
145+
ret double %res
146+
}
147+
148+
149+
define <2 x double> @fmul_tan_cos_vector(<2 x double> %a) {
150+
; CHECK-LABEL: define <2 x double> @fmul_tan_cos_vector(
151+
; CHECK-SAME: <2 x double> [[A:%.*]]) {
152+
; CHECK-NEXT: [[TAN:%.*]] = call contract <2 x double> @llvm.tan.v2f64(<2 x double> [[A]])
153+
; CHECK-NEXT: [[COS:%.*]] = call contract <2 x double> @llvm.cos.v2f64(<2 x double> [[A]])
154+
; CHECK-NEXT: [[RES:%.*]] = fmul contract <2 x double> [[TAN]], [[COS]]
155+
; CHECK-NEXT: ret <2 x double> [[RES]]
156+
;
157+
%tan = call contract <2 x double> @llvm.tan.v2f64(<2 x double> %a)
158+
%cos = call contract <2 x double> @llvm.cos.v2f64(<2 x double> %a)
159+
%res = fmul contract <2 x double> %tan, %cos
160+
ret <2 x double> %res
161+
}
162+
163+
164+
define double @fmul_tan_cos_nnan_preservation(double %a) {
165+
; CHECK-LABEL: define double @fmul_tan_cos_nnan_preservation(
166+
; CHECK-SAME: double [[A:%.*]]) {
167+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
168+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])
169+
; CHECK-NEXT: [[RES:%.*]] = fmul nnan contract double [[TAN]], [[COS]]
170+
; CHECK-NEXT: ret double [[RES]]
171+
;
172+
%tan = call contract double @llvm.tan.f64(double %a)
173+
%cos = call contract double @llvm.cos.f64(double %a)
174+
%res = fmul contract nnan double %tan, %cos
175+
ret double %res
176+
}
177+
178+
179+
define double @fmul_tan_cos_fpmath_metadata_preservation(double %a) {
180+
; CHECK-LABEL: define double @fmul_tan_cos_fpmath_metadata_preservation(
181+
; CHECK-SAME: double [[A:%.*]]) {
182+
; CHECK-NEXT: [[TAN:%.*]] = call contract double @llvm.tan.f64(double [[A]])
183+
; CHECK-NEXT: [[COS:%.*]] = call contract double @llvm.cos.f64(double [[A]])
184+
; CHECK-NEXT: [[RES:%.*]] = fmul contract double [[TAN]], [[COS]], !fpmath [[META0:![0-9]+]]
185+
; CHECK-NEXT: ret double [[RES]]
186+
;
187+
%tan = call contract double @llvm.tan.f64(double %a)
188+
%cos = call contract double @llvm.cos.f64(double %a)
189+
%res = fmul contract double %tan, %cos, !fpmath !0
190+
ret double %res
191+
}
192+
193+
declare void @use(double)
194+
195+
!0 = !{ float 2.5 }
196+
197+
198+
;.
199+
; CHECK: [[META0]] = !{float 2.500000e+00}
200+
;.

0 commit comments

Comments
 (0)