[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
`