1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4; fsub -0.0, (fsub -0.0, X) ==> X
5define float @fsub_-0_-0_x(float %a) {
6; CHECK-LABEL: @fsub_-0_-0_x(
7; CHECK-NEXT:    ret float %a
8;
9  %t1 = fsub float -0.0, %a
10  %ret = fsub float -0.0, %t1
11  ret float %ret
12}
13
14; fsub 0.0, (fsub -0.0, X) != X
15define float @fsub_0_-0_x(float %a) {
16; CHECK-LABEL: @fsub_0_-0_x(
17; CHECK-NEXT:    [[T1:%.*]] = fsub float 0.000000e+00, %a
18; CHECK-NEXT:    [[RET:%.*]] = fsub float -0.000000e+00, [[T1]]
19; CHECK-NEXT:    ret float [[RET]]
20;
21  %t1 = fsub float 0.0, %a
22  %ret = fsub float -0.0, %t1
23  ret float %ret
24}
25
26; fsub -0.0, (fsub 0.0, X) != X
27define float @fsub_-0_0_x(float %a) {
28; CHECK-LABEL: @fsub_-0_0_x(
29; CHECK-NEXT:    [[T1:%.*]] = fsub float -0.000000e+00, %a
30; CHECK-NEXT:    [[RET:%.*]] = fsub float 0.000000e+00, [[T1]]
31; CHECK-NEXT:    ret float [[RET]]
32;
33  %t1 = fsub float -0.0, %a
34  %ret = fsub float 0.0, %t1
35  ret float %ret
36}
37
38; fsub X, 0 ==> X
39define float @fsub_x_0(float %a) {
40; CHECK-LABEL: @fsub_x_0(
41; CHECK-NEXT:    ret float %a
42;
43  %ret = fsub float %a, 0.0
44  ret float %ret
45}
46
47; fadd X, -0 ==> X
48define float @fadd_x_n0(float %a) {
49; CHECK-LABEL: @fadd_x_n0(
50; CHECK-NEXT:    ret float %a
51;
52  %ret = fadd float %a, -0.0
53  ret float %ret
54}
55
56; fmul X, 1.0 ==> X
57define double @fmul_X_1(double %a) {
58; CHECK-LABEL: @fmul_X_1(
59; CHECK-NEXT:    ret double %a
60;
61  %b = fmul double 1.000000e+00, %a
62  ret double %b
63}
64
65; fdiv X, 1.0 ==> X
66define float @fdiv_x_1(float %a) {
67; CHECK-LABEL: @fdiv_x_1(
68; CHECK-NEXT:    ret float %a
69;
70  %ret = fdiv float %a, 1.0
71  ret float %ret
72}
73
74; We can't optimize away the fadd in this test because the input
75; value to the function and subsequently to the fadd may be -0.0.
76; In that one special case, the result of the fadd should be +0.0
77; rather than the first parameter of the fadd.
78
79; Fragile test warning: We need 6 sqrt calls to trigger the bug
80; because the internal logic has a magic recursion limit of 6.
81; This is presented without any explanation or ability to customize.
82
83declare float @sqrtf(float)
84
85define float @PR22688(float %x) {
86; CHECK-LABEL: @PR22688(
87; CHECK-NEXT:    [[TMP1:%.*]] = call float @sqrtf(float %x)
88; CHECK-NEXT:    [[TMP2:%.*]] = call float @sqrtf(float [[TMP1]])
89; CHECK-NEXT:    [[TMP3:%.*]] = call float @sqrtf(float [[TMP2]])
90; CHECK-NEXT:    [[TMP4:%.*]] = call float @sqrtf(float [[TMP3]])
91; CHECK-NEXT:    [[TMP5:%.*]] = call float @sqrtf(float [[TMP4]])
92; CHECK-NEXT:    [[TMP6:%.*]] = call float @sqrtf(float [[TMP5]])
93; CHECK-NEXT:    [[TMP7:%.*]] = fadd float [[TMP6]], 0.000000e+00
94; CHECK-NEXT:    ret float [[TMP7]]
95;
96  %1 = call float @sqrtf(float %x)
97  %2 = call float @sqrtf(float %1)
98  %3 = call float @sqrtf(float %2)
99  %4 = call float @sqrtf(float %3)
100  %5 = call float @sqrtf(float %4)
101  %6 = call float @sqrtf(float %5)
102  %7 = fadd float %6, 0.0
103  ret float %7
104}
105
106declare float @llvm.fabs.f32(float)
107
108; CHECK-LABEL: @fabs_select_positive_constants(
109; CHECK: %select = select i1 %cmp, float 1.000000e+00, float 2.000000e+00
110; CHECK-NEXT: ret float %select
111define float @fabs_select_positive_constants(i32 %c) {
112  %cmp = icmp eq i32 %c, 0
113  %select = select i1 %cmp, float 1.0, float 2.0
114  %fabs = call float @llvm.fabs.f32(float %select)
115  ret float %fabs
116}
117
118; CHECK-LABEL: @fabs_select_constant_variable(
119; CHECK: %select = select i1 %cmp, float 1.000000e+00, float %x
120; CHECK-NEXT: %fabs = call float @llvm.fabs.f32(float %select)
121define float @fabs_select_constant_variable(i32 %c, float %x) {
122  %cmp = icmp eq i32 %c, 0
123  %select = select i1 %cmp, float 1.0, float %x
124  %fabs = call float @llvm.fabs.f32(float %select)
125  ret float %fabs
126}
127
128; CHECK-LABEL: @fabs_select_neg0_pos0(
129; CHECK: %select = select i1 %cmp, float -0.000000e+00, float 0.000000e+00
130; CHECK: %fabs = call float @llvm.fabs.f32(float %select)
131; CHECK-NEXT: ret float %fabs
132define float @fabs_select_neg0_pos0(float addrspace(1)* %out, i32 %c) {
133  %cmp = icmp eq i32 %c, 0
134  %select = select i1 %cmp, float -0.0, float 0.0
135  %fabs = call float @llvm.fabs.f32(float %select)
136  ret float %fabs
137}
138
139; CHECK-LABEL: @fabs_select_neg0_neg1(
140; CHECK: %select = select i1 %cmp, float -0.000000e+00, float -1.000000e+00
141; CHECK: %fabs = call float @llvm.fabs.f32(float %select)
142define float @fabs_select_neg0_neg1(float addrspace(1)* %out, i32 %c) {
143  %cmp = icmp eq i32 %c, 0
144  %select = select i1 %cmp, float -0.0, float -1.0
145  %fabs = call float @llvm.fabs.f32(float %select)
146  ret float %fabs
147}
148
149; CHECK-LABEL: @fabs_select_nan_nan(
150; CHECK: %select = select i1 %cmp, float 0x7FF8000000000000, float 0x7FF8000100000000
151; CHECK-NEXT: ret float %select
152define float @fabs_select_nan_nan(float addrspace(1)* %out, i32 %c) {
153  %cmp = icmp eq i32 %c, 0
154  %select = select i1 %cmp, float 0x7FF8000000000000, float 0x7FF8000100000000
155  %fabs = call float @llvm.fabs.f32(float %select)
156  ret float %fabs
157}
158
159; CHECK-LABEL: @fabs_select_negnan_nan(
160; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000000000000
161; CHECK: %fabs = call float @llvm.fabs.f32(float %select)
162define float @fabs_select_negnan_nan(float addrspace(1)* %out, i32 %c) {
163  %cmp = icmp eq i32 %c, 0
164  %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000000000000
165  %fabs = call float @llvm.fabs.f32(float %select)
166  ret float %fabs
167}
168
169; CHECK-LABEL: @fabs_select_negnan_negnan(
170; CHECK:  %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000100000000
171; CHECK: %fabs = call float @llvm.fabs.f32(float %select)
172define float @fabs_select_negnan_negnan(float addrspace(1)* %out, i32 %c) {
173  %cmp = icmp eq i32 %c, 0
174  %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000100000000
175  %fabs = call float @llvm.fabs.f32(float %select)
176  ret float %fabs
177}
178
179; CHECK-LABEL: @fabs_select_negnan_negzero(
180; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float -0.000000e+00
181; CHECK: %fabs = call float @llvm.fabs.f32(float %select)
182define float @fabs_select_negnan_negzero(float addrspace(1)* %out, i32 %c) {
183  %cmp = icmp eq i32 %c, 0
184  %select = select i1 %cmp, float 0xFFF8000000000000, float -0.0
185  %fabs = call float @llvm.fabs.f32(float %select)
186  ret float %fabs
187}
188
189; CHECK-LABEL: @fabs_select_negnan_zero(
190; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float 0.000000e+00
191; CHECK: %fabs = call float @llvm.fabs.f32(float %select)
192define float @fabs_select_negnan_zero(float addrspace(1)* %out, i32 %c) {
193  %cmp = icmp eq i32 %c, 0
194  %select = select i1 %cmp, float 0xFFF8000000000000, float 0.0
195  %fabs = call float @llvm.fabs.f32(float %select)
196  ret float %fabs
197}
198