[InstCombine] Preserve signbit semantics of NaN with fold to fabs (#1… · llvm/llvm-project@f4779c3 (original) (raw)

`@@ -256,19 +256,54 @@ define double @select_fcmp_ole_zero(double %x) {

`

256

256

`; CHECK-LABEL: @select_fcmp_ole_zero(

`

257

257

`; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])

`

258

258

`; CHECK-NEXT: ret double [[FABS]]

`

``

259

`+

;

`

``

260

`+

%lezero = fcmp nnan ole double %x, 0.0

`

``

261

`+

%negx = fsub double 0.0, %x

`

``

262

`+

%fabs = select i1 %lezero, double %negx, double %x

`

``

263

`+

ret double %fabs

`

``

264

`+

}

`

``

265

+

``

266

`+

define double @select_fcmp_ole_zero_no_nnan(double %x) {

`

``

267

`+

; CHECK-LABEL: @select_fcmp_ole_zero_no_nnan(

`

``

268

`+

; CHECK-NEXT: [[LEZERO:%.]] = fcmp ole double [[X:%.]], 0.000000e+00

`

``

269

`+

; CHECK-NEXT: [[NEGX:%.*]] = fsub double 0.000000e+00, [[X]]

`

``

270

`+

; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]

`

``

271

`+

; CHECK-NEXT: ret double [[FABS]]

`

259

272

`;

`

260

273

`%lezero = fcmp ole double %x, 0.0

`

261

274

`%negx = fsub double 0.0, %x

`

262

275

`%fabs = select i1 %lezero, double %negx, double %x

`

263

276

`ret double %fabs

`

264

277

`}

`

265

278

``

``

279

`+

define double @select_fcmp_ole_zero_no_nnan_input_nofpclass_nan(double nofpclass(nan) %x) {

`

``

280

`+

; CHECK-LABEL: @select_fcmp_ole_zero_no_nnan_input_nofpclass_nan(

`

``

281

`+

; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])

`

``

282

`+

; CHECK-NEXT: ret double [[FABS]]

`

``

283

`+

;

`

``

284

`+

%lezero = fcmp ole double %x, 0.0

`

``

285

`+

%negx = fsub double 0.0, %x

`

``

286

`+

%fabs = select i1 %lezero, double %negx, double %x

`

``

287

`+

ret double %fabs

`

``

288

`+

}

`

``

289

+

``

290

`+

define double @select_fcmp_ole_zero_select_nnan(double %x) {

`

``

291

`+

; CHECK-LABEL: @select_fcmp_ole_zero_select_nnan(

`

``

292

`+

; CHECK-NEXT: [[FABS:%.]] = call nnan double @llvm.fabs.f64(double [[X:%.]])

`

``

293

`+

; CHECK-NEXT: ret double [[FABS]]

`

``

294

`+

;

`

``

295

`+

%lezero = fcmp ole double %x, 0.0

`

``

296

`+

%negx = fsub double 0.0, %x

`

``

297

`+

%fabs = select nnan i1 %lezero, double %negx, double %x

`

``

298

`+

ret double %fabs

`

``

299

`+

}

`

``

300

+

266

301

`define double @select_fcmp_nnan_ole_zero(double %x) {

`

267

302

`; CHECK-LABEL: @select_fcmp_nnan_ole_zero(

`

268

303

`; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])

`

269

304

`; CHECK-NEXT: ret double [[FABS]]

`

270

305

`;

`

271

``

`-

%lezero = fcmp ole double %x, 0.0

`

``

306

`+

%lezero = fcmp nnan ole double %x, 0.0

`

272

307

`%negx = fsub nnan double 0.0, %x

`

273

308

`%fabs = select i1 %lezero, double %negx, double %x

`

274

309

`ret double %fabs

`

`@@ -279,7 +314,7 @@ define double @select_nnan_fcmp_nnan_ole_zero(double %x) {

`

279

314

`; CHECK-NEXT: [[FABS:%.]] = call nnan double @llvm.fabs.f64(double [[X:%.]])

`

280

315

`; CHECK-NEXT: ret double [[FABS]]

`

281

316

`;

`

282

``

`-

%lezero = fcmp ole double %x, 0.0

`

``

317

`+

%lezero = fcmp nnan ole double %x, 0.0

`

283

318

`%negx = fsub nnan double 0.0, %x

`

284

319

`%fabs = select nnan i1 %lezero, double %negx, double %x

`

285

320

`ret double %fabs

`

`@@ -292,7 +327,7 @@ define double @select_fcmp_nnan_ule_zero(double %x) {

`

292

327

`; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])

`

293

328

`; CHECK-NEXT: ret double [[FABS]]

`

294

329

`;

`

295

``

`-

%lezero = fcmp ule double %x, 0.0

`

``

330

`+

%lezero = fcmp nnan ule double %x, 0.0

`

296

331

`%negx = fsub nnan double 0.0, %x

`

297

332

`%fabs = select i1 %lezero, double %negx, double %x

`

298

333

`ret double %fabs

`

`@@ -320,7 +355,7 @@ define <2 x float> @select_fcmp_nnan_ole_negzero(<2 x float> %x) {

`

320

355

`; CHECK-NEXT: [[FABS:%.]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.]])

`

321

356

`; CHECK-NEXT: ret <2 x float> [[FABS]]

`

322

357

`;

`

323

``

`-

%lezero = fcmp ole <2 x float> %x, <float -0.0, float -0.0>

`

``

358

`+

%lezero = fcmp nnan ole <2 x float> %x, <float -0.0, float -0.0>

`

324

359

`%negx = fsub nnan <2 x float> <float 0.0, float poison>, %x

`

325

360

`%fabs = select <2 x i1> %lezero, <2 x float> %negx, <2 x float> %x

`

326

361

`ret <2 x float> %fabs

`

`@@ -331,7 +366,7 @@ define <2 x float> @select_nnan_fcmp_nnan_ole_negzero(<2 x float> %x) {

`

331

366

`; CHECK-NEXT: [[FABS:%.]] = call nnan <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.]])

`

332

367

`; CHECK-NEXT: ret <2 x float> [[FABS]]

`

333

368

`;

`

334

``

`-

%lezero = fcmp ole <2 x float> %x, <float -0.0, float -0.0>

`

``

369

`+

%lezero = fcmp nnan ole <2 x float> %x, <float -0.0, float -0.0>

`

335

370

`%negx = fsub nnan <2 x float> <float 0.0, float poison>, %x

`

336

371

`%fabs = select nnan <2 x i1> %lezero, <2 x float> %negx, <2 x float> %x

`

337

372

`ret <2 x float> %fabs

`

`@@ -344,7 +379,7 @@ define fp128 @select_fcmp_ogt_zero(fp128 %x) {

`

344

379

`; CHECK-NEXT: [[FABS:%.]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.]])

`

345

380

`; CHECK-NEXT: ret fp128 [[FABS]]

`

346

381

`;

`

347

``

`-

%gtzero = fcmp ogt fp128 %x, zeroinitializer

`

``

382

`+

%gtzero = fcmp nnan ogt fp128 %x, zeroinitializer

`

348

383

`%negx = fsub fp128 zeroinitializer, %x

`

349

384

`%fabs = select i1 %gtzero, fp128 %x, fp128 %negx

`

350

385

`ret fp128 %fabs

`

`@@ -382,7 +417,7 @@ define fp128 @select_fcmp_nnan_ogt_zero(fp128 %x) {

`

382

417

`; CHECK-NEXT: [[FABS:%.]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.]])

`

383

418

`; CHECK-NEXT: ret fp128 [[FABS]]

`

384

419

`;

`

385

``

`-

%gtzero = fcmp ogt fp128 %x, zeroinitializer

`

``

420

`+

%gtzero = fcmp nnan ogt fp128 %x, zeroinitializer

`

386

421

`%negx = fsub nnan fp128 zeroinitializer, %x

`

387

422

`%fabs = select i1 %gtzero, fp128 %x, fp128 %negx

`

388

423

`ret fp128 %fabs

`

`@@ -393,7 +428,7 @@ define fp128 @select_nnan_fcmp_nnan_ogt_zero(fp128 %x) {

`

393

428

`; CHECK-NEXT: [[FABS:%.]] = call nnan fp128 @llvm.fabs.f128(fp128 [[X:%.]])

`

394

429

`; CHECK-NEXT: ret fp128 [[FABS]]

`

395

430

`;

`

396

``

`-

%gtzero = fcmp ogt fp128 %x, zeroinitializer

`

``

431

`+

%gtzero = fcmp nnan ogt fp128 %x, zeroinitializer

`

397

432

`%negx = fsub nnan fp128 zeroinitializer, %x

`

398

433

`%fabs = select nnan i1 %gtzero, fp128 %x, fp128 %negx

`

399

434

`ret fp128 %fabs

`

`@@ -406,7 +441,7 @@ define half @select_fcmp_nnan_ogt_negzero(half %x) {

`

406

441

`; CHECK-NEXT: [[FABS:%.]] = call half @llvm.fabs.f16(half [[X:%.]])

`

407

442

`; CHECK-NEXT: ret half [[FABS]]

`

408

443

`;

`

409

``

`-

%gtzero = fcmp ogt half %x, -0.0

`

``

444

`+

%gtzero = fcmp nnan ogt half %x, -0.0

`

410

445

`%negx = fsub nnan half 0.0, %x

`

411

446

`%fabs = select i1 %gtzero, half %x, half %negx

`

412

447

`ret half %fabs

`

`@@ -417,7 +452,7 @@ define half @select_nnan_fcmp_nnan_ogt_negzero(half %x) {

`

417

452

`; CHECK-NEXT: [[FABS:%.]] = call nnan half @llvm.fabs.f16(half [[X:%.]])

`

418

453

`; CHECK-NEXT: ret half [[FABS]]

`

419

454

`;

`

420

``

`-

%gtzero = fcmp ogt half %x, -0.0

`

``

455

`+

%gtzero = fcmp nnan ogt half %x, -0.0

`

421

456

`%negx = fsub nnan half 0.0, %x

`

422

457

`%fabs = select nnan i1 %gtzero, half %x, half %negx

`

423

458

`ret half %fabs

`

`@@ -430,7 +465,7 @@ define half @select_fcmp_nnan_ugt_negzero(half %x) {

`

430

465

`; CHECK-NEXT: [[FABS:%.]] = call half @llvm.fabs.f16(half [[X:%.]])

`

431

466

`; CHECK-NEXT: ret half [[FABS]]

`

432

467

`;

`

433

``

`-

%gtzero = fcmp ugt half %x, -0.0

`

``

468

`+

%gtzero = fcmp nnan ugt half %x, -0.0

`

434

469

`%negx = fsub nnan half 0.0, %x

`

435

470

`%fabs = select i1 %gtzero, half %x, half %negx

`

436

471

`ret half %fabs

`