[InstCombine] fold adds of constants separated by sext/zext · llvm/llvm-project@4a47f5f (original) (raw)

`@@ -396,9 +396,8 @@ define i8 @add_nuw_signbit(i8 %x) {

`

396

396

``

397

397

`define i32 @add_nsw_sext_add(i8 %x) {

`

398

398

`; CHECK-LABEL: @add_nsw_sext_add(

`

399

``

`-

; CHECK-NEXT: [[ADD:%.]] = add nsw i8 [[X:%.]], 42

`

400

``

`-

; CHECK-NEXT: [[EXT:%.*]] = sext i8 [[ADD]] to i32

`

401

``

`-

; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[EXT]], 356

`

``

399

`+

; CHECK-NEXT: [[TMP1:%.]] = sext i8 [[X:%.]] to i32

`

``

400

`+

; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[TMP1]], 398

`

402

401

`; CHECK-NEXT: ret i32 [[R]]

`

403

402

`;

`

404

403

`%add = add nsw i8 %x, 42

`

`@@ -407,6 +406,8 @@ define i32 @add_nsw_sext_add(i8 %x) {

`

407

406

`ret i32 %r

`

408

407

`}

`

409

408

``

``

409

`+

; Negative test - extra use of the sext means increase of instructions.

`

``

410

+

410

411

`define i32 @add_nsw_sext_add_extra_use_1(i8 %x, i32* %p) {

`

411

412

`; CHECK-LABEL: @add_nsw_sext_add_extra_use_1(

`

412

413

`; CHECK-NEXT: [[ADD:%.]] = add nsw i8 [[X:%.]], 42

`

`@@ -426,8 +427,8 @@ define <2 x i32> @add_nsw_sext_add_vec_extra_use_2(<2 x i8> %x, <2 x i8>* %p) {

`

426

427

`; CHECK-LABEL: @add_nsw_sext_add_vec_extra_use_2(

`

427

428

`; CHECK-NEXT: [[ADD:%.]] = add nsw <2 x i8> [[X:%.]], <i8 42, i8 -5>

`

428

429

`; CHECK-NEXT: store <2 x i8> [[ADD]], <2 x i8>* [[P:%.*]], align 2

`

429

``

`-

; CHECK-NEXT: [[EXT:%.*]] = sext <2 x i8> [[ADD]] to <2 x i32>

`

430

``

`-

; CHECK-NEXT: [[R:%.*]] = add nsw <2 x i32> [[EXT]], <i32 356, i32 12>

`

``

430

`+

; CHECK-NEXT: [[TMP1:%.*]] = sext <2 x i8> [[X]] to <2 x i32>

`

``

431

`+

; CHECK-NEXT: [[R:%.*]] = add nsw <2 x i32> [[TMP1]], <i32 398, i32 7>

`

431

432

`; CHECK-NEXT: ret <2 x i32> [[R]]

`

432

433

`;

`

433

434

`%add = add nsw <2 x i8> %x, <i8 42, i8 -5>

`

`@@ -439,9 +440,8 @@ define <2 x i32> @add_nsw_sext_add_vec_extra_use_2(<2 x i8> %x, <2 x i8>* %p) {

`

439

440

``

440

441

`define <2 x i32> @add_nuw_zext_add_vec(<2 x i16> %x) {

`

441

442

`; CHECK-LABEL: @add_nuw_zext_add_vec(

`

442

``

`-

; CHECK-NEXT: [[ADD:%.]] = add nuw <2 x i16> [[X:%.]], <i16 -42, i16 5>

`

443

``

`-

; CHECK-NEXT: [[EXT:%.*]] = zext <2 x i16> [[ADD]] to <2 x i32>

`

444

``

`-

; CHECK-NEXT: [[R:%.*]] = add nsw <2 x i32> [[EXT]], <i32 356, i32 -12>

`

``

443

`+

; CHECK-NEXT: [[TMP1:%.]] = zext <2 x i16> [[X:%.]] to <2 x i32>

`

``

444

`+

; CHECK-NEXT: [[R:%.*]] = add nsw <2 x i32> [[TMP1]], <i32 65850, i32 -7>

`

445

445

`; CHECK-NEXT: ret <2 x i32> [[R]]

`

446

446

`;

`

447

447

`%add = add nuw <2 x i16> %x, <i16 -42, i16 5>

`

`@@ -450,6 +450,8 @@ define <2 x i32> @add_nuw_zext_add_vec(<2 x i16> %x) {

`

450

450

`ret <2 x i32> %r

`

451

451

`}

`

452

452

``

``

453

`+

; Negative test - extra use of the zext means increase of instructions.

`

``

454

+

453

455

`define i64 @add_nuw_zext_add_extra_use_1(i8 %x, i64* %p) {

`

454

456

`; CHECK-LABEL: @add_nuw_zext_add_extra_use_1(

`

455

457

`; CHECK-NEXT: [[ADD:%.]] = add nuw i8 [[X:%.]], 42

`

`@@ -469,8 +471,8 @@ define i64 @add_nuw_zext_add_extra_use_2(i8 %x, i8* %p) {

`

469

471

`; CHECK-LABEL: @add_nuw_zext_add_extra_use_2(

`

470

472

`; CHECK-NEXT: [[ADD:%.]] = add nuw i8 [[X:%.]], 42

`

471

473

`; CHECK-NEXT: store i8 [[ADD]], i8* [[P:%.*]], align 1

`

472

``

`-

; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[ADD]] to i64

`

473

``

`-

; CHECK-NEXT: [[R:%.*]] = add nuw nsw i64 [[EXT]], -356

`

``

474

`+

; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[X]] to i64

`

``

475

`+

; CHECK-NEXT: [[R:%.*]] = add nuw nsw i64 [[TMP1]], -314

`

474

476

`; CHECK-NEXT: ret i64 [[R]]

`

475

477

`;

`

476

478

`%add = add nuw i8 %x, 42

`