@@ -44,10 +44,14 @@ define double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) {
4444
4545; Tests with various predicate types.
4646
47+ ; This is not fabs because that could produce a different signbit for a NAN input.
48+ ; PR59279
49+
4750define double @select_nsz_nfabs_ult (double %x ) {
4851; CHECK-LABEL: @select_nsz_nfabs_ult(
49- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
50- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
52+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
53+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
54+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
5155; CHECK-NEXT: ret double [[SEL]]
5256;
5357 %cmp = fcmp ult double %x , 0 .000000e+00
@@ -68,10 +72,14 @@ define double @select_nsz_nnan_nfabs_ult(double %x) {
6872 ret double %sel
6973}
7074
75+ ; This is not fabs because that could produce a different signbit for a NAN input.
76+ ; PR59279
77+
7178define double @select_nsz_nfabs_ole (double %x ) {
7279; CHECK-LABEL: @select_nsz_nfabs_ole(
73- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
74- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
80+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
81+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
82+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
7583; CHECK-NEXT: ret double [[SEL]]
7684;
7785 %cmp = fcmp ole double %x , 0 .000000e+00
@@ -92,10 +100,14 @@ define double @select_nsz_nnan_nfabs_ole(double %x) {
92100 ret double %sel
93101}
94102
103+ ; This is not fabs because that could produce a different signbit for a NAN input.
104+ ; PR59279
105+
95106define double @select_nsz_nfabs_ule (double %x ) {
96107; CHECK-LABEL: @select_nsz_nfabs_ule(
97- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
98- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
108+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
109+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
110+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
99111; CHECK-NEXT: ret double [[SEL]]
100112;
101113 %cmp = fcmp ule double %x , 0 .000000e+00
@@ -157,11 +169,14 @@ define double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) {
157169 ret double %sel
158170}
159171
160- ; Tests with various predicate types.
172+ ; This is not fabs because that could produce a different signbit for a NAN input.
173+ ; PR59279
174+
161175define double @select_nsz_nfabs_ogt (double %x ) {
162176; CHECK-LABEL: @select_nsz_nfabs_ogt(
163- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
164- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
177+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
178+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
179+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
165180; CHECK-NEXT: ret double [[SEL]]
166181;
167182 %cmp = fcmp ogt double %x , 0 .000000e+00
@@ -170,6 +185,8 @@ define double @select_nsz_nfabs_ogt(double %x) {
170185 ret double %sel
171186}
172187
188+ ; Tests with various predicate types.
189+
173190define double @select_nsz_nnan_nfabs_ogt (double %x ) {
174191; CHECK-LABEL: @select_nsz_nnan_nfabs_ogt(
175192; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -182,10 +199,14 @@ define double @select_nsz_nnan_nfabs_ogt(double %x) {
182199 ret double %sel
183200}
184201
202+ ; This is not fabs because that could produce a different signbit for a NAN input.
203+ ; PR59279
204+
185205define double @select_nsz_nfabs_ugt (double %x ) {
186206; CHECK-LABEL: @select_nsz_nfabs_ugt(
187- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
188- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
207+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00
208+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
209+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
189210; CHECK-NEXT: ret double [[SEL]]
190211;
191212 %cmp = fcmp ugt double %x , 0 .000000e+00
@@ -206,10 +227,14 @@ define double @select_nsz_nnan_nfabs_ugt(double %x) {
206227 ret double %sel
207228}
208229
230+ ; This is not fabs because that could produce a different signbit for a NAN input.
231+ ; PR59279
232+
209233define double @select_nsz_nfabs_oge (double %x ) {
210234; CHECK-LABEL: @select_nsz_nfabs_oge(
211- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
212- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
235+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00
236+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
237+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
213238; CHECK-NEXT: ret double [[SEL]]
214239;
215240 %cmp = fcmp oge double %x , 0 .000000e+00
@@ -230,10 +255,14 @@ define double @select_nsz_nnan_nfabs_oge(double %x) {
230255 ret double %sel
231256}
232257
258+ ; This is not fabs because that could produce a different signbit for a NAN input.
259+ ; PR59279
260+
233261define double @select_nsz_nfabs_uge (double %x ) {
234262; CHECK-LABEL: @select_nsz_nfabs_uge(
235- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
236- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
263+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00
264+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
265+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
237266; CHECK-NEXT: ret double [[SEL]]
238267;
239268 %cmp = fcmp uge double %x , 0 .000000e+00
0 commit comments