xref: /llvm-project/llvm/test/Transforms/InstCombine/fcmp-fadd-select.ll (revision 76a4c4593ba9f8cad894d80ea75687cd86be3cdd)
1ef2d6dafSRajat Bajpai; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2ef2d6dafSRajat Bajpai; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3ef2d6dafSRajat Bajpai
4ef2d6dafSRajat Bajpai; fcmp OGT + fadd + sel => fcmp OGT + sel => fmaxnum
5ef2d6dafSRajat Bajpai
6ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_constant(float %in) {
7ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_constant(
8ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
9de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
10ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
11ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
12ef2d6dafSRajat Bajpai;
13ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
14ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
15ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
16ef2d6dafSRajat Bajpai  ret float %sel
17ef2d6dafSRajat Bajpai}
18ef2d6dafSRajat Bajpai
19ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_constant_swapped(float %in) {
20ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_constant_swapped(
21ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
22*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
23ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
24ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
25ef2d6dafSRajat Bajpai;
26ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
27ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
28ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
29ef2d6dafSRajat Bajpai  ret float %sel
30ef2d6dafSRajat Bajpai}
31ef2d6dafSRajat Bajpai
32ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_neg_constant(float %in) {
33ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_neg_constant(
34ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
35de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
36ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
37ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
38ef2d6dafSRajat Bajpai;
39ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, -0.000000e+00
40ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
41ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
42ef2d6dafSRajat Bajpai  ret float %sel
43ef2d6dafSRajat Bajpai}
44ef2d6dafSRajat Bajpai
45ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_fastmath_preserve(float %in) {
46ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_fastmath_preserve(
47ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
48de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
49ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
50ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
51ef2d6dafSRajat Bajpai;
52ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
53ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
54ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
55ef2d6dafSRajat Bajpai  ret float %sel
56ef2d6dafSRajat Bajpai}
57ef2d6dafSRajat Bajpai
58ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ogt_fadd_select_constant_vectors(<2 x float> %in) {
59ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ogt_fadd_select_constant_vectors(
60ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
61de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)
62bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
63ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
64ef2d6dafSRajat Bajpai;
65ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
66ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
67ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
68ef2d6dafSRajat Bajpai  ret <2 x float> %sel
69ef2d6dafSRajat Bajpai}
70ef2d6dafSRajat Bajpai
71ef2d6dafSRajat Bajpai
72ef2d6dafSRajat Bajpai; fcmp OLT + fadd + sel => fcmp OLT + sel => fminnum
73ef2d6dafSRajat Bajpai
74ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_constant(float %in) {
75ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_constant(
76ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
77de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
78ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
79ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
80ef2d6dafSRajat Bajpai;
81ef2d6dafSRajat Bajpai  %cmp1 = fcmp olt float %in, 0.000000e+00
82ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
83ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
84ef2d6dafSRajat Bajpai  ret float %sel
85ef2d6dafSRajat Bajpai}
86ef2d6dafSRajat Bajpai
87ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_constant_swapped(float %in) {
88ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_constant_swapped(
89ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
90*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
91ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
92ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
93ef2d6dafSRajat Bajpai;
94ef2d6dafSRajat Bajpai  %cmp1 = fcmp olt float %in, 0.000000e+00
95ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
96ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
97ef2d6dafSRajat Bajpai  ret float %sel
98ef2d6dafSRajat Bajpai}
99ef2d6dafSRajat Bajpai
100ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_neg_constant(float %in) {
101ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_neg_constant(
102ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
103de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
104ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
105ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
106ef2d6dafSRajat Bajpai;
107ef2d6dafSRajat Bajpai  %cmp1 = fcmp olt float %in, -0.000000e+00
108ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
109ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
110ef2d6dafSRajat Bajpai  ret float %sel
111ef2d6dafSRajat Bajpai}
112ef2d6dafSRajat Bajpai
113ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_fastmath_preserve(float %in) {
114ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_fastmath_preserve(
115ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
116de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
117ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
118ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
119ef2d6dafSRajat Bajpai;
120ef2d6dafSRajat Bajpai  %cmp1 = fcmp olt float %in, 0.000000e+00
121ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
122ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
123ef2d6dafSRajat Bajpai  ret float %sel
124ef2d6dafSRajat Bajpai}
125ef2d6dafSRajat Bajpai
126ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_olt_fadd_select_constant_vectors(<2 x float> %in) {
127ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_olt_fadd_select_constant_vectors(
128ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
129de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)
130bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
131ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
132ef2d6dafSRajat Bajpai;
133ef2d6dafSRajat Bajpai  %cmp1 = fcmp olt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
134ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
135ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
136ef2d6dafSRajat Bajpai  ret <2 x float> %sel
137ef2d6dafSRajat Bajpai}
138ef2d6dafSRajat Bajpai
139ef2d6dafSRajat Bajpai
140ef2d6dafSRajat Bajpai; fcmp OGE + fadd + sel => fcmp OGE + sel => fmaxnum
141ef2d6dafSRajat Bajpai
142ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_constant(float %in) {
143ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_constant(
144ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
145de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
146ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
147ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
148ef2d6dafSRajat Bajpai;
149ef2d6dafSRajat Bajpai  %cmp1 = fcmp oge float %in, 0.000000e+00
150ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
151ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
152ef2d6dafSRajat Bajpai  ret float %sel
153ef2d6dafSRajat Bajpai}
154ef2d6dafSRajat Bajpai
155ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_constant_swapped(float %in) {
156ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_constant_swapped(
157ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
158*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
159ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
160ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
161ef2d6dafSRajat Bajpai;
162ef2d6dafSRajat Bajpai  %cmp1 = fcmp oge float %in, 0.000000e+00
163ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
164ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
165ef2d6dafSRajat Bajpai  ret float %sel
166ef2d6dafSRajat Bajpai}
167ef2d6dafSRajat Bajpai
168ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_neg_constant(float %in) {
169ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_neg_constant(
170ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
171de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
172ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
173ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
174ef2d6dafSRajat Bajpai;
175ef2d6dafSRajat Bajpai  %cmp1 = fcmp oge float %in, -0.000000e+00
176ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
177ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
178ef2d6dafSRajat Bajpai  ret float %sel
179ef2d6dafSRajat Bajpai}
180ef2d6dafSRajat Bajpai
181ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_fastmath_preserve(float %in) {
182ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_fastmath_preserve(
183ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
184de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
185ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
186ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
187ef2d6dafSRajat Bajpai;
188ef2d6dafSRajat Bajpai  %cmp1 = fcmp oge float %in, 0.000000e+00
189ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
190ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
191ef2d6dafSRajat Bajpai  ret float %sel
192ef2d6dafSRajat Bajpai}
193ef2d6dafSRajat Bajpai
194ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_oge_fadd_select_constant_vectors(<2 x float> %in) {
195ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_oge_fadd_select_constant_vectors(
196ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
197de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)
198bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
199ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
200ef2d6dafSRajat Bajpai;
201ef2d6dafSRajat Bajpai  %cmp1 = fcmp oge <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
202ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
203ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
204ef2d6dafSRajat Bajpai  ret <2 x float> %sel
205ef2d6dafSRajat Bajpai}
206ef2d6dafSRajat Bajpai
207ef2d6dafSRajat Bajpai
208ef2d6dafSRajat Bajpai; fcmp OLE + fadd + sel => fcmp OLE + sel => fminnum
209ef2d6dafSRajat Bajpai
210ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_constant(float %in) {
211ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_constant(
212ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
213de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
214ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
215ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
216ef2d6dafSRajat Bajpai;
217ef2d6dafSRajat Bajpai  %cmp1 = fcmp ole float %in, 0.000000e+00
218ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
219ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
220ef2d6dafSRajat Bajpai  ret float %sel
221ef2d6dafSRajat Bajpai}
222ef2d6dafSRajat Bajpai
223ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_constant_swapped(float %in) {
224ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_constant_swapped(
225ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
226*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
227ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
228ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
229ef2d6dafSRajat Bajpai;
230ef2d6dafSRajat Bajpai  %cmp1 = fcmp ole float %in, 0.000000e+00
231ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
232ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
233ef2d6dafSRajat Bajpai  ret float %sel
234ef2d6dafSRajat Bajpai}
235ef2d6dafSRajat Bajpai
236ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_neg_constant(float %in) {
237ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_neg_constant(
238ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
239de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
240ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
241ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
242ef2d6dafSRajat Bajpai;
243ef2d6dafSRajat Bajpai  %cmp1 = fcmp ole float %in, -0.000000e+00
244ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
245ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
246ef2d6dafSRajat Bajpai  ret float %sel
247ef2d6dafSRajat Bajpai}
248ef2d6dafSRajat Bajpai
249ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_fastmath_preserve(float %in) {
250ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_fastmath_preserve(
251ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
252de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)
253ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
254ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
255ef2d6dafSRajat Bajpai;
256ef2d6dafSRajat Bajpai  %cmp1 = fcmp ole float %in, 0.000000e+00
257ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
258ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
259ef2d6dafSRajat Bajpai  ret float %sel
260ef2d6dafSRajat Bajpai}
261ef2d6dafSRajat Bajpai
262ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ole_fadd_select_constant_vectors(<2 x float> %in) {
263ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ole_fadd_select_constant_vectors(
264ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
265de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)
266bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
267ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
268ef2d6dafSRajat Bajpai;
269ef2d6dafSRajat Bajpai  %cmp1 = fcmp ole <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
270ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
271ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
272ef2d6dafSRajat Bajpai  ret <2 x float> %sel
273ef2d6dafSRajat Bajpai}
274ef2d6dafSRajat Bajpai
275ef2d6dafSRajat Bajpai
276ef2d6dafSRajat Bajpai; fcmp UGT + fadd + sel => fcmp UGT + sel => fcmp OLE + sel
277ef2d6dafSRajat Bajpai
278ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_constant(float %in) {
279ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_constant(
280ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
281ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00
282ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
283ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
284ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
285ef2d6dafSRajat Bajpai;
286ef2d6dafSRajat Bajpai  %cmp1 = fcmp ugt float %in, 0.000000e+00
287ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
288ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
289ef2d6dafSRajat Bajpai  ret float %sel
290ef2d6dafSRajat Bajpai}
291ef2d6dafSRajat Bajpai
292ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_constant_swapped(float %in) {
293ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_constant_swapped(
294ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
295ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00
296*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00
297ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
298ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
299ef2d6dafSRajat Bajpai;
300ef2d6dafSRajat Bajpai  %cmp1 = fcmp ugt float %in, 0.000000e+00
301ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
302ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
303ef2d6dafSRajat Bajpai  ret float %sel
304ef2d6dafSRajat Bajpai}
305ef2d6dafSRajat Bajpai
306ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_neg_constant(float %in) {
307ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_neg_constant(
308ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
309ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00
310ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
311ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
312ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
313ef2d6dafSRajat Bajpai;
314ef2d6dafSRajat Bajpai  %cmp1 = fcmp ugt float %in, -0.000000e+00
315ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
316ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
317ef2d6dafSRajat Bajpai  ret float %sel
318ef2d6dafSRajat Bajpai}
319ef2d6dafSRajat Bajpai
320ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_fastmath_preserve(float %in) {
321ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_fastmath_preserve(
322ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
323ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00
324ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
325ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
326ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
327ef2d6dafSRajat Bajpai;
328ef2d6dafSRajat Bajpai  %cmp1 = fcmp ugt float %in, 0.000000e+00
329ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
330ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
331ef2d6dafSRajat Bajpai  ret float %sel
332ef2d6dafSRajat Bajpai}
333ef2d6dafSRajat Bajpai
334ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ugt_fadd_select_constant_vectors(<2 x float> %in) {
335ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ugt_fadd_select_constant_vectors(
336ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
337ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ole <2 x float> [[IN]], zeroinitializer
338ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]]
339bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
340ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
341ef2d6dafSRajat Bajpai;
342ef2d6dafSRajat Bajpai  %cmp1 = fcmp ugt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
343ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
344ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
345ef2d6dafSRajat Bajpai  ret <2 x float> %sel
346ef2d6dafSRajat Bajpai}
347ef2d6dafSRajat Bajpai
348ef2d6dafSRajat Bajpai
349ef2d6dafSRajat Bajpai; fcmp UGE + fadd + sel => fcmp UGE + sel => fcmp olt + sel
350ef2d6dafSRajat Bajpai
351ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_constant(float %in) {
352ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_constant(
353ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
354ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00
355ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
356ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
357ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
358ef2d6dafSRajat Bajpai;
359ef2d6dafSRajat Bajpai  %cmp1 = fcmp uge float %in, 0.000000e+00
360ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
361ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
362ef2d6dafSRajat Bajpai  ret float %sel
363ef2d6dafSRajat Bajpai}
364ef2d6dafSRajat Bajpai
365ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_constant_swapped(float %in) {
366ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_constant_swapped(
367ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
368ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00
369*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00
370ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
371ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
372ef2d6dafSRajat Bajpai;
373ef2d6dafSRajat Bajpai  %cmp1 = fcmp uge float %in, 0.000000e+00
374ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
375ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
376ef2d6dafSRajat Bajpai  ret float %sel
377ef2d6dafSRajat Bajpai}
378ef2d6dafSRajat Bajpai
379ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_neg_constant(float %in) {
380ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_neg_constant(
381ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
382ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00
383ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
384ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
385ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
386ef2d6dafSRajat Bajpai;
387ef2d6dafSRajat Bajpai  %cmp1 = fcmp uge float %in, -0.000000e+00
388ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
389ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
390ef2d6dafSRajat Bajpai  ret float %sel
391ef2d6dafSRajat Bajpai}
392ef2d6dafSRajat Bajpai
393ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_fastmath_preserve(float %in) {
394ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_fastmath_preserve(
395ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
396ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00
397ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
398ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
399ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
400ef2d6dafSRajat Bajpai;
401ef2d6dafSRajat Bajpai  %cmp1 = fcmp uge float %in, 0.000000e+00
402ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
403ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
404ef2d6dafSRajat Bajpai  ret float %sel
405ef2d6dafSRajat Bajpai}
406ef2d6dafSRajat Bajpai
407ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_uge_fadd_select_constant_vectors(<2 x float> %in) {
408ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_uge_fadd_select_constant_vectors(
409ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
410ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp olt <2 x float> [[IN]], zeroinitializer
411ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]]
412bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
413ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
414ef2d6dafSRajat Bajpai;
415ef2d6dafSRajat Bajpai  %cmp1 = fcmp uge <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
416ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
417ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
418ef2d6dafSRajat Bajpai  ret <2 x float> %sel
419ef2d6dafSRajat Bajpai}
420ef2d6dafSRajat Bajpai
421ef2d6dafSRajat Bajpai
422ef2d6dafSRajat Bajpai; fcmp ULT + fadd + sel => fcmp ULT + sel => fcmp OGE + sel
423ef2d6dafSRajat Bajpai
424ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_constant(float %in) {
425ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_constant(
426ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
427ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00
428ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
429ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
430ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
431ef2d6dafSRajat Bajpai;
432ef2d6dafSRajat Bajpai  %cmp1 = fcmp ult float %in, 0.000000e+00
433ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
434ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
435ef2d6dafSRajat Bajpai  ret float %sel
436ef2d6dafSRajat Bajpai}
437ef2d6dafSRajat Bajpai
438ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_constant_swapped(float %in) {
439ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_constant_swapped(
440ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
441ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00
442*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00
443ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
444ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
445ef2d6dafSRajat Bajpai;
446ef2d6dafSRajat Bajpai  %cmp1 = fcmp ult float %in, 0.000000e+00
447ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
448ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
449ef2d6dafSRajat Bajpai  ret float %sel
450ef2d6dafSRajat Bajpai}
451ef2d6dafSRajat Bajpai
452ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_neg_constant(float %in) {
453ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_neg_constant(
454ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
455ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00
456ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
457ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
458ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
459ef2d6dafSRajat Bajpai;
460ef2d6dafSRajat Bajpai  %cmp1 = fcmp ult float %in, -0.000000e+00
461ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
462ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
463ef2d6dafSRajat Bajpai  ret float %sel
464ef2d6dafSRajat Bajpai}
465ef2d6dafSRajat Bajpai
466ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_fastmath_preserve(float %in) {
467ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_fastmath_preserve(
468ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
469ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00
470ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
471ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
472ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
473ef2d6dafSRajat Bajpai;
474ef2d6dafSRajat Bajpai  %cmp1 = fcmp ult float %in, 0.000000e+00
475ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
476ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
477ef2d6dafSRajat Bajpai  ret float %sel
478ef2d6dafSRajat Bajpai}
479ef2d6dafSRajat Bajpai
480ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ult_fadd_select_constant_vectors(<2 x float> %in) {
481ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ult_fadd_select_constant_vectors(
482ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
483ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp oge <2 x float> [[IN]], zeroinitializer
484ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]]
485bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
486ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
487ef2d6dafSRajat Bajpai;
488ef2d6dafSRajat Bajpai  %cmp1 = fcmp ult <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
489ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
490ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
491ef2d6dafSRajat Bajpai  ret <2 x float> %sel
492ef2d6dafSRajat Bajpai}
493ef2d6dafSRajat Bajpai
494ef2d6dafSRajat Bajpai
495ef2d6dafSRajat Bajpai; fcmp ULE + fadd + sel => fcmp ULE + sel => fcmp OGT + sel
496ef2d6dafSRajat Bajpai
497ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_constant(float %in) {
498ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_constant(
499ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
500ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00
501ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
502ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
503ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
504ef2d6dafSRajat Bajpai;
505ef2d6dafSRajat Bajpai  %cmp1 = fcmp ule float %in, 0.000000e+00
506ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
507ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
508ef2d6dafSRajat Bajpai  ret float %sel
509ef2d6dafSRajat Bajpai}
510ef2d6dafSRajat Bajpai
511ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_constant_swapped(float %in) {
512ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_constant_swapped(
513ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
514ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00
515*76a4c459SRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00
516ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
517ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
518ef2d6dafSRajat Bajpai;
519ef2d6dafSRajat Bajpai  %cmp1 = fcmp ule float %in, 0.000000e+00
520ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
521ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add
522ef2d6dafSRajat Bajpai  ret float %sel
523ef2d6dafSRajat Bajpai}
524ef2d6dafSRajat Bajpai
525ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_neg_constant(float %in) {
526ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_neg_constant(
527ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
528ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00
529ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
530ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
531ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
532ef2d6dafSRajat Bajpai;
533ef2d6dafSRajat Bajpai  %cmp1 = fcmp ule float %in, -0.000000e+00
534ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
535ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
536ef2d6dafSRajat Bajpai  ret float %sel
537ef2d6dafSRajat Bajpai}
538ef2d6dafSRajat Bajpai
539ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_fastmath_preserve(float %in) {
540ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_fastmath_preserve(
541ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
542ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00
543ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]]
544ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
545ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
546ef2d6dafSRajat Bajpai;
547ef2d6dafSRajat Bajpai  %cmp1 = fcmp ule float %in, 0.000000e+00
548ef2d6dafSRajat Bajpai  %add = fadd nnan float %in, 1.000000e+00
549ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
550ef2d6dafSRajat Bajpai  ret float %sel
551ef2d6dafSRajat Bajpai}
552ef2d6dafSRajat Bajpai
553ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ule_fadd_select_constant_vectors(<2 x float> %in) {
554ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ule_fadd_select_constant_vectors(
555ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) {
556ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp ogt <2 x float> [[IN]], zeroinitializer
557ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]]
558bf1c86ceSMatt Arsenault; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)
559ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret <2 x float> [[ADD_NEW]]
560ef2d6dafSRajat Bajpai;
561ef2d6dafSRajat Bajpai  %cmp1 = fcmp ule <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>
562ef2d6dafSRajat Bajpai  %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>
563ef2d6dafSRajat Bajpai  %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>
564ef2d6dafSRajat Bajpai  ret <2 x float> %sel
565ef2d6dafSRajat Bajpai}
566ef2d6dafSRajat Bajpai
567ef2d6dafSRajat Bajpai
568ef2d6dafSRajat Bajpai; Negative scenarios
569ef2d6dafSRajat Bajpai
570ef2d6dafSRajat Bajpai; select instruction doesn't give nnan and nsz guarantees.
571ef2d6dafSRajat Bajpaidefine float @test_select_without_nnan_nsz(float %in) {
572ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_select_without_nnan_nsz(
573ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
574ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[IN]], 0.000000e+00
575ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00
576ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP1]], float [[ADD]], float 1.000000e+00
577ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[SEL]]
578ef2d6dafSRajat Bajpai;
579ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
580ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
581ef2d6dafSRajat Bajpai  %sel = select i1 %cmp1, float %add, float 1.000000e+00
582ef2d6dafSRajat Bajpai  ret float %sel
583ef2d6dafSRajat Bajpai}
584ef2d6dafSRajat Bajpai
585ef2d6dafSRajat Bajpai; fcmp arg doesn't match with fadd's. This won't be converted to maxnum/minnum.
586ef2d6dafSRajat Bajpaidefine float @test_fcmp_fadd_arg_mismatch(float %in, float %in2) {
587ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_fadd_arg_mismatch(
588ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]], float [[IN2:%.*]]) {
589ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[IN2]], 0.000000e+00
590ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00
591ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00
592ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[SEL]]
593ef2d6dafSRajat Bajpai;
594ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in2, 0.000000e+00
595ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
596ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
597ef2d6dafSRajat Bajpai  ret float %sel
598ef2d6dafSRajat Bajpai}
599ef2d6dafSRajat Bajpai
600ef2d6dafSRajat Bajpai; It won't be converted to maxnum/minnum because constant arg in fcmp isn't zero.
601ef2d6dafSRajat Bajpaidefine float @test_fcmp_arg_non_zero(float %in) {
602ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_arg_non_zero(
603ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
604ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[IN]], 1.000000e+00
605ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00
606ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00
607ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[SEL]]
608ef2d6dafSRajat Bajpai;
609ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 1.000000e+00
610ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
611ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
612ef2d6dafSRajat Bajpai  ret float %sel
613ef2d6dafSRajat Bajpai}
614ef2d6dafSRajat Bajpai
615ef2d6dafSRajat Bajpai; fcmp has more than one use.
616ef2d6dafSRajat Bajpaidefine float @test_fcmp_multiple_uses(float %in) {
617ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_multiple_uses(
618ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
619ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[CMP1:%.*]] = fcmp ogt float [[IN]], 0.000000e+00
620ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00
621ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_2:%.*]] = fadd float [[IN]], 1.000000e+00
622ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_1:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00
623ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_2:%.*]] = select nnan nsz i1 [[CMP1]], float 2.000000e+00, float [[ADD_2]]
624ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[RES:%.*]] = fadd float [[SEL_1]], [[SEL_2]]
625ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[RES]]
626ef2d6dafSRajat Bajpai;
627ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
628ef2d6dafSRajat Bajpai  %add = fadd float %in, 1.000000e+00
629ef2d6dafSRajat Bajpai  %add.2 = fadd float %in, 1.000000e+00
630ef2d6dafSRajat Bajpai  %sel.1 = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
631ef2d6dafSRajat Bajpai  %sel.2 = select nnan nsz i1 %cmp1, float 2.000000e+00, float %add.2
632ef2d6dafSRajat Bajpai  %res = fadd float %sel.1, %sel.2
633ef2d6dafSRajat Bajpai  ret float %res
634ef2d6dafSRajat Bajpai}
635ef2d6dafSRajat Bajpai
636ef2d6dafSRajat Bajpai; Rewrite-based flags propagation
637ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_rewrite_flags1(float %in) {
638ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_flags1(
639ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
640de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call reassoc nsz arcp contract afn float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
641ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd reassoc nnan nsz arcp contract afn float [[SEL_NEW]], 1.000000e+00
642ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
643ef2d6dafSRajat Bajpai;
644ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
645ef2d6dafSRajat Bajpai  %add = fadd reassoc afn arcp contract float %in, 1.000000e+00
646ef2d6dafSRajat Bajpai  %sel = select nnan nsz reassoc afn arcp contract i1 %cmp1, float %add, float 1.000000e+00
647ef2d6dafSRajat Bajpai  ret float %sel
648ef2d6dafSRajat Bajpai}
649ef2d6dafSRajat Bajpai
650ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_rewrite_flags2(float %in) {
651ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_flags2(
652ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
653de415fbbSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
654ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00
655ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
656ef2d6dafSRajat Bajpai;
657ef2d6dafSRajat Bajpai  %cmp1 = fcmp ogt float %in, 0.000000e+00
658ef2d6dafSRajat Bajpai  %add = fadd reassoc float %in, 1.000000e+00
659ef2d6dafSRajat Bajpai  %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00
660ef2d6dafSRajat Bajpai  ret float %sel
661ef2d6dafSRajat Bajpai}
662ef2d6dafSRajat Bajpai
663ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_rewrite_and_fastmath(float %in) {
664ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_and_fastmath(
665ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) {
666ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[SEL_NEW:%.*]] = call fast float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)
667ef2d6dafSRajat Bajpai; CHECK-NEXT:    [[ADD_NEW:%.*]] = fadd fast float [[SEL_NEW]], 1.000000e+00
668ef2d6dafSRajat Bajpai; CHECK-NEXT:    ret float [[ADD_NEW]]
669ef2d6dafSRajat Bajpai;
670de415fbbSRajat Bajpai  %cmp1 = fcmp nnan ogt float %in, 0.000000e+00
671ef2d6dafSRajat Bajpai  %add = fadd fast reassoc float %in, 1.000000e+00
672ef2d6dafSRajat Bajpai  %sel = select fast i1 %cmp1, float %add, float 1.000000e+00
673ef2d6dafSRajat Bajpai  ret float %sel
674ef2d6dafSRajat Bajpai}
675