xref: /llvm-project/llvm/test/Transforms/InstCombine/remquo.ll (revision 9d45b450f26a1ad669d4ceaac2c36aff4b80bfde)
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
4define float @remquo_f32(ptr %quo) {
5; CHECK-LABEL: define float @remquo_f32(
6; CHECK-SAME: ptr [[QUO:%.*]]) {
7; CHECK-NEXT:  [[ENTRY:.*:]]
8; CHECK-NEXT:    store i32 -2, ptr [[QUO]], align 4
9; CHECK-NEXT:    ret float 1.000000e+00
10;
11entry:
12  %call = call float @remquof(float -5.000000e+00, float 3.000000e+00, ptr %quo)
13  ret float %call
14}
15
16define float @remquo_f32_quo_sign(ptr %quo) {
17; CHECK-LABEL: define float @remquo_f32_quo_sign(
18; CHECK-SAME: ptr [[QUO:%.*]]) {
19; CHECK-NEXT:  [[ENTRY:.*:]]
20; CHECK-NEXT:    store i32 2, ptr [[QUO]], align 4
21; CHECK-NEXT:    ret float -1.000000e+00
22;
23entry:
24  %call = call float @remquof(float 5.000000e+00, float 3.000000e+00, ptr %quo)
25  ret float %call
26}
27
28define float @remquo_f32_round(ptr %quo) {
29; CHECK-LABEL: define float @remquo_f32_round(
30; CHECK-SAME: ptr [[QUO:%.*]]) {
31; CHECK-NEXT:  [[ENTRY:.*:]]
32; CHECK-NEXT:    store i32 -6, ptr [[QUO]], align 4
33; CHECK-NEXT:    ret float 0xBFC9999900000000
34;
35entry:
36  %call = call float @remquof(float -5.000000e+00, float 0x3FE99999A0000000, ptr %quo)
37  ret float %call
38}
39
40define double @remquo_f64(ptr %quo) {
41; CHECK-LABEL: define double @remquo_f64(
42; CHECK-SAME: ptr [[QUO:%.*]]) {
43; CHECK-NEXT:  [[ENTRY:.*:]]
44; CHECK-NEXT:    store i32 -5, ptr [[QUO]], align 4
45; CHECK-NEXT:    ret double -0.000000e+00
46;
47entry:
48  %call = call double @remquo(double -5.000000e+00, double 1.000000e+00, ptr %quo)
49  ret double %call
50}
51
52; Negative tests
53
54define float @remquo_f32_inf_x(ptr %quo) {
55; CHECK-LABEL: define float @remquo_f32_inf_x(
56; CHECK-SAME: ptr [[QUO:%.*]]) {
57; CHECK-NEXT:  [[ENTRY:.*:]]
58; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float 0x7FF0000000000000, float 1.000000e+00, ptr [[QUO]])
59; CHECK-NEXT:    ret float [[CALL]]
60;
61entry:
62  %call = call float @remquof(float 0x7FF0000000000000, float 1.000000e+00, ptr %quo)
63  ret float %call
64}
65
66define float @remquo_f32_zero_y(ptr %quo) {
67; CHECK-LABEL: define float @remquo_f32_zero_y(
68; CHECK-SAME: ptr [[QUO:%.*]]) {
69; CHECK-NEXT:  [[ENTRY:.*:]]
70; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr [[QUO]])
71; CHECK-NEXT:    ret float [[CALL]]
72;
73entry:
74  %call = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr %quo)
75  ret float %call
76}
77
78define float @remquo_f32_nzero_y(ptr %quo) {
79; CHECK-LABEL: define float @remquo_f32_nzero_y(
80; CHECK-SAME: ptr [[QUO:%.*]]) {
81; CHECK-NEXT:  [[ENTRY:.*:]]
82; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float -0.000000e+00, ptr [[QUO]])
83; CHECK-NEXT:    ret float [[CALL]]
84;
85entry:
86  %call = call float @remquof(float -5.000000e+00, float -0.000000e+00, ptr %quo)
87  ret float %call
88}
89
90define float @remquo_f32_nan_x(ptr %quo) {
91; CHECK-LABEL: define float @remquo_f32_nan_x(
92; CHECK-SAME: ptr [[QUO:%.*]]) {
93; CHECK-NEXT:  [[ENTRY:.*:]]
94; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float 0x7FF8000000000000, float 1.000000e+00, ptr [[QUO]])
95; CHECK-NEXT:    ret float [[CALL]]
96;
97entry:
98  %call = call float @remquof(float 0x7FF8000000000000, float 1.000000e+00, ptr %quo)
99  ret float %call
100}
101
102define float @remquo_f32_nan_y(ptr %quo) {
103; CHECK-LABEL: define float @remquo_f32_nan_y(
104; CHECK-SAME: ptr [[QUO:%.*]]) {
105; CHECK-NEXT:  [[ENTRY:.*:]]
106; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float 1.000000e+00, float 0x7FF8000000000000, ptr [[QUO]])
107; CHECK-NEXT:    ret float [[CALL]]
108;
109entry:
110  %call = call float @remquof(float 1.000000e+00, float 0x7FF8000000000000, ptr %quo)
111  ret float %call
112}
113
114define float @remquo_f32_strictfp(ptr %quo) strictfp {
115; CHECK-LABEL: define float @remquo_f32_strictfp(
116; CHECK-SAME: ptr [[QUO:%.*]]) #[[ATTR0:[0-9]+]] {
117; CHECK-NEXT:  [[ENTRY:.*:]]
118; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float 3.000000e+00, ptr [[QUO]]) #[[ATTR0]]
119; CHECK-NEXT:    ret float [[CALL]]
120;
121entry:
122  %call = call float @remquof(float -5.000000e+00, float 3.000000e+00, ptr %quo) strictfp
123  ret float %call
124}
125
126define float @remquo_f32_zero_y_strictfp(ptr %quo) strictfp {
127; CHECK-LABEL: define float @remquo_f32_zero_y_strictfp(
128; CHECK-SAME: ptr [[QUO:%.*]]) #[[ATTR0]] {
129; CHECK-NEXT:  [[ENTRY:.*:]]
130; CHECK-NEXT:    [[CALL:%.*]] = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr [[QUO]]) #[[ATTR0]]
131; CHECK-NEXT:    ret float [[CALL]]
132;
133entry:
134  %call = call float @remquof(float -5.000000e+00, float 0.000000e+00, ptr %quo) strictfp
135  ret float %call
136}
137
138declare float @remquof(float, float, ptr)
139declare double @remquo(double, double, ptr)
140