Skip to content

Commit 5918f62

Browse files
authored
[InstCombine] Infer zext nneg flag (#71534)
Use KnownBits to infer the nneg flag on zext instructions. Currently we only set nneg when converting sext -> zext, but don't set it when we have a zext in the first place. If we want to use it in optimizations, we should make sure the flag inference is consistent.
1 parent c468e89 commit 5918f62

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+181
-176
lines changed

clang/test/Headers/wasm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,7 +2183,7 @@ uint32_t test_i64x2_bitmask(v128_t a) {
21832183
// CHECK-NEXT: entry:
21842184
// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
21852185
// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[B:%.*]], 63
2186-
// CHECK-NEXT: [[REM_I:%.*]] = zext i32 [[TMP1]] to i64
2186+
// CHECK-NEXT: [[REM_I:%.*]] = zext nneg i32 [[TMP1]] to i64
21872187
// CHECK-NEXT: [[SPLAT_SPLATINSERT_I:%.*]] = insertelement <2 x i64> poison, i64 [[REM_I]], i64 0
21882188
// CHECK-NEXT: [[SPLAT_SPLAT_I:%.*]] = shufflevector <2 x i64> [[SPLAT_SPLATINSERT_I]], <2 x i64> poison, <2 x i32> zeroinitializer
21892189
// CHECK-NEXT: [[SHL_I:%.*]] = shl <2 x i64> [[TMP0]], [[SPLAT_SPLAT_I]]
@@ -2198,7 +2198,7 @@ v128_t test_i64x2_shl(v128_t a, uint32_t b) {
21982198
// CHECK-NEXT: entry:
21992199
// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
22002200
// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[B:%.*]], 63
2201-
// CHECK-NEXT: [[REM_I:%.*]] = zext i32 [[TMP1]] to i64
2201+
// CHECK-NEXT: [[REM_I:%.*]] = zext nneg i32 [[TMP1]] to i64
22022202
// CHECK-NEXT: [[SPLAT_SPLATINSERT_I:%.*]] = insertelement <2 x i64> poison, i64 [[REM_I]], i64 0
22032203
// CHECK-NEXT: [[SPLAT_SPLAT_I:%.*]] = shufflevector <2 x i64> [[SPLAT_SPLATINSERT_I]], <2 x i64> poison, <2 x i32> zeroinitializer
22042204
// CHECK-NEXT: [[SHR_I:%.*]] = ashr <2 x i64> [[TMP0]], [[SPLAT_SPLAT_I]]
@@ -2213,7 +2213,7 @@ v128_t test_i64x2_shr(v128_t a, uint32_t b) {
22132213
// CHECK-NEXT: entry:
22142214
// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
22152215
// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[B:%.*]], 63
2216-
// CHECK-NEXT: [[REM_I:%.*]] = zext i32 [[TMP1]] to i64
2216+
// CHECK-NEXT: [[REM_I:%.*]] = zext nneg i32 [[TMP1]] to i64
22172217
// CHECK-NEXT: [[SPLAT_SPLATINSERT_I:%.*]] = insertelement <2 x i64> poison, i64 [[REM_I]], i64 0
22182218
// CHECK-NEXT: [[SPLAT_SPLAT_I:%.*]] = shufflevector <2 x i64> [[SPLAT_SPLATINSERT_I]], <2 x i64> poison, <2 x i32> zeroinitializer
22192219
// CHECK-NEXT: [[SHR_I:%.*]] = lshr <2 x i64> [[TMP0]], [[SPLAT_SPLAT_I]]

llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,11 @@ Instruction *InstCombinerImpl::visitZExt(ZExtInst &Zext) {
12211221
}
12221222
}
12231223

1224+
if (!Zext.hasNonNeg() && isKnownNonNegative(Src, DL, 0, &AC, &Zext, &DT)) {
1225+
Zext.setNonNeg();
1226+
return &Zext;
1227+
}
1228+
12241229
return nullptr;
12251230
}
12261231

llvm/test/Transforms/InstCombine/2010-11-01-lshr-mask.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ define i32 @main(i32 %argc) {
88
; CHECK-NEXT: [[T3163:%.*]] = xor i8 [[T3151]], -1
99
; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[T3163]], 5
1010
; CHECK-NEXT: [[T4127:%.*]] = and i8 [[TMP1]], 64
11-
; CHECK-NEXT: [[T4086:%.*]] = zext i8 [[T4127]] to i32
11+
; CHECK-NEXT: [[T4086:%.*]] = zext nneg i8 [[T4127]] to i32
1212
; CHECK-NEXT: ret i32 [[T4086]]
1313
;
1414
%t3151 = trunc i32 %argc to i8

llvm/test/Transforms/InstCombine/X86/x86-vector-shifts-inseltpoison.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,7 +2816,7 @@ define <8 x i32> @avx2_psrai_d_256_masked(<8 x i32> %v, i32 %a) {
28162816
define <8 x i64> @avx512_psrai_q_512_masked(<8 x i64> %v, i32 %a) {
28172817
; CHECK-LABEL: @avx512_psrai_q_512_masked(
28182818
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 63
2819-
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2819+
; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64
28202820
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i64> poison, i64 [[TMP2]], i64 0
28212821
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i64> [[DOTSPLATINSERT]], <8 x i64> poison, <8 x i32> zeroinitializer
28222822
; CHECK-NEXT: [[TMP3:%.*]] = ashr <8 x i64> [[V:%.*]], [[DOTSPLAT]]
@@ -2843,7 +2843,7 @@ define <4 x i32> @sse2_psrli_d_128_masked(<4 x i32> %v, i32 %a) {
28432843
define <4 x i64> @avx2_psrli_q_256_masked(<4 x i64> %v, i32 %a) {
28442844
; CHECK-LABEL: @avx2_psrli_q_256_masked(
28452845
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 63
2846-
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2846+
; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64
28472847
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[TMP2]], i64 0
28482848
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
28492849
; CHECK-NEXT: [[TMP3:%.*]] = lshr <4 x i64> [[V:%.*]], [[DOTSPLAT]]
@@ -2871,7 +2871,7 @@ define <32 x i16> @avx512_psrli_w_512_masked(<32 x i16> %v, i32 %a) {
28712871
define <2 x i64> @sse2_pslli_q_128_masked(<2 x i64> %v, i32 %a) {
28722872
; CHECK-LABEL: @sse2_pslli_q_128_masked(
28732873
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 63
2874-
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2874+
; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64
28752875
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
28762876
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer
28772877
; CHECK-NEXT: [[TMP3:%.*]] = shl <2 x i64> [[V:%.*]], [[DOTSPLAT]]

llvm/test/Transforms/InstCombine/X86/x86-vector-shifts.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2772,8 +2772,8 @@ define <2 x i64> @sse2_psll_q_128_masked_bitcast(<2 x i64> %v, <2 x i64> %a) {
27722772
; CHECK-NEXT: [[I:%.*]] = insertelement <4 x i32> [[M]], i32 0, i64 1
27732773
; CHECK-NEXT: [[SHAMT:%.*]] = bitcast <4 x i32> [[I]] to <2 x i64>
27742774
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i64> [[SHAMT]], <2 x i64> poison, <2 x i32> zeroinitializer
2775-
; CHECK-NEXT: [[TMP2:%.*]] = shl <2 x i64> [[V:%.*]], [[TMP1]]
2776-
; CHECK-NEXT: ret <2 x i64> [[TMP2]]
2775+
; CHECK-NEXT: [[R:%.*]] = shl <2 x i64> [[V:%.*]], [[TMP1]]
2776+
; CHECK-NEXT: ret <2 x i64> [[R]]
27772777
;
27782778
%b = bitcast <2 x i64> %a to <4 x i32>
27792779
%m = and <4 x i32> %b, <i32 31, i32 poison, i32 poison, i32 poison>
@@ -2856,7 +2856,7 @@ define <8 x i32> @avx2_psrai_d_256_masked(<8 x i32> %v, i32 %a) {
28562856
define <8 x i64> @avx512_psrai_q_512_masked(<8 x i64> %v, i32 %a) {
28572857
; CHECK-LABEL: @avx512_psrai_q_512_masked(
28582858
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 63
2859-
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2859+
; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64
28602860
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i64> poison, i64 [[TMP2]], i64 0
28612861
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i64> [[DOTSPLATINSERT]], <8 x i64> poison, <8 x i32> zeroinitializer
28622862
; CHECK-NEXT: [[TMP3:%.*]] = ashr <8 x i64> [[V:%.*]], [[DOTSPLAT]]
@@ -2883,7 +2883,7 @@ define <4 x i32> @sse2_psrli_d_128_masked(<4 x i32> %v, i32 %a) {
28832883
define <4 x i64> @avx2_psrli_q_256_masked(<4 x i64> %v, i32 %a) {
28842884
; CHECK-LABEL: @avx2_psrli_q_256_masked(
28852885
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 63
2886-
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2886+
; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64
28872887
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[TMP2]], i64 0
28882888
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i64> [[DOTSPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
28892889
; CHECK-NEXT: [[TMP3:%.*]] = lshr <4 x i64> [[V:%.*]], [[DOTSPLAT]]
@@ -2911,7 +2911,7 @@ define <32 x i16> @avx512_psrli_w_512_masked(<32 x i16> %v, i32 %a) {
29112911
define <2 x i64> @sse2_pslli_q_128_masked(<2 x i64> %v, i32 %a) {
29122912
; CHECK-LABEL: @sse2_pslli_q_128_masked(
29132913
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 63
2914-
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
2914+
; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64
29152915
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0
29162916
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer
29172917
; CHECK-NEXT: [[TMP3:%.*]] = shl <2 x i64> [[V:%.*]], [[DOTSPLAT]]

llvm/test/Transforms/InstCombine/adjust-for-minmax.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ define <2 x i64> @umax_zext_vec(<2 x i32> %a) {
414414
define i64 @umin_zext(i32 %a) {
415415
; CHECK-LABEL: @umin_zext(
416416
; CHECK-NEXT: [[NARROW:%.*]] = call i32 @llvm.umin.i32(i32 [[A:%.*]], i32 2)
417-
; CHECK-NEXT: [[MIN:%.*]] = zext i32 [[NARROW]] to i64
417+
; CHECK-NEXT: [[MIN:%.*]] = zext nneg i32 [[NARROW]] to i64
418418
; CHECK-NEXT: ret i64 [[MIN]]
419419
;
420420
%a_ext = zext i32 %a to i64
@@ -426,7 +426,7 @@ define i64 @umin_zext(i32 %a) {
426426
define <2 x i64> @umin_zext_vec(<2 x i32> %a) {
427427
; CHECK-LABEL: @umin_zext_vec(
428428
; CHECK-NEXT: [[NARROW:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[A:%.*]], <2 x i32> <i32 2, i32 2>)
429-
; CHECK-NEXT: [[MIN:%.*]] = zext <2 x i32> [[NARROW]] to <2 x i64>
429+
; CHECK-NEXT: [[MIN:%.*]] = zext nneg <2 x i32> [[NARROW]] to <2 x i64>
430430
; CHECK-NEXT: ret <2 x i64> [[MIN]]
431431
;
432432
%a_ext = zext <2 x i32> %a to <2 x i64>

llvm/test/Transforms/InstCombine/and-narrow.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ define i16 @zext_lshr(i8 %x) {
4747
; CHECK-LABEL: @zext_lshr(
4848
; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[X:%.*]], 4
4949
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]]
50-
; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16
50+
; CHECK-NEXT: [[R:%.*]] = zext nneg i8 [[TMP2]] to i16
5151
; CHECK-NEXT: ret i16 [[R]]
5252
;
5353
%z = zext i8 %x to i16
@@ -60,7 +60,7 @@ define i16 @zext_ashr(i8 %x) {
6060
; CHECK-LABEL: @zext_ashr(
6161
; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[X:%.*]], 2
6262
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]]
63-
; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16
63+
; CHECK-NEXT: [[R:%.*]] = zext nneg i8 [[TMP2]] to i16
6464
; CHECK-NEXT: ret i16 [[R]]
6565
;
6666
%z = zext i8 %x to i16
@@ -125,7 +125,7 @@ define <2 x i16> @zext_lshr_vec(<2 x i8> %x) {
125125
; CHECK-LABEL: @zext_lshr_vec(
126126
; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 4, i8 2>
127127
; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]]
128-
; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16>
128+
; CHECK-NEXT: [[R:%.*]] = zext nneg <2 x i8> [[TMP2]] to <2 x i16>
129129
; CHECK-NEXT: ret <2 x i16> [[R]]
130130
;
131131
%z = zext <2 x i8> %x to <2 x i16>
@@ -138,7 +138,7 @@ define <2 x i16> @zext_ashr_vec(<2 x i8> %x) {
138138
; CHECK-LABEL: @zext_ashr_vec(
139139
; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 2, i8 3>
140140
; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], [[X]]
141-
; CHECK-NEXT: [[R:%.*]] = zext <2 x i8> [[TMP2]] to <2 x i16>
141+
; CHECK-NEXT: [[R:%.*]] = zext nneg <2 x i8> [[TMP2]] to <2 x i16>
142142
; CHECK-NEXT: ret <2 x i16> [[R]]
143143
;
144144
%z = zext <2 x i8> %x to <2 x i16>

llvm/test/Transforms/InstCombine/and-xor-or.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4207,7 +4207,7 @@ define i16 @and_zext_zext(i8 %x, i4 %y) {
42074207
; CHECK-SAME: (i8 [[X:%.*]], i4 [[Y:%.*]]) {
42084208
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[Y]] to i8
42094209
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X]]
4210-
; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP2]] to i16
4210+
; CHECK-NEXT: [[R:%.*]] = zext nneg i8 [[TMP2]] to i16
42114211
; CHECK-NEXT: ret i16 [[R]]
42124212
;
42134213
%zx = zext i8 %x to i16

llvm/test/Transforms/InstCombine/and.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ define <2 x i32> @and_demanded_bits_splat_vec(<2 x i32> %x) {
525525
define i32 @and_zext_demanded(i16 %x, i32 %y) {
526526
; CHECK-LABEL: @and_zext_demanded(
527527
; CHECK-NEXT: [[S:%.*]] = lshr i16 [[X:%.*]], 8
528-
; CHECK-NEXT: [[Z:%.*]] = zext i16 [[S]] to i32
528+
; CHECK-NEXT: [[Z:%.*]] = zext nneg i16 [[S]] to i32
529529
; CHECK-NEXT: ret i32 [[Z]]
530530
;
531531
%s = lshr i16 %x, 8
@@ -618,7 +618,7 @@ define i64 @test35(i32 %X) {
618618
; CHECK-LABEL: @test35(
619619
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 0, [[X:%.*]]
620620
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 240
621-
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP2]] to i64
621+
; CHECK-NEXT: [[RES:%.*]] = zext nneg i32 [[TMP2]] to i64
622622
; CHECK-NEXT: ret i64 [[RES]]
623623
;
624624
%zext = zext i32 %X to i64
@@ -631,7 +631,7 @@ define <2 x i64> @test35_uniform(<2 x i32> %X) {
631631
; CHECK-LABEL: @test35_uniform(
632632
; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i32> zeroinitializer, [[X:%.*]]
633633
; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 240, i32 240>
634-
; CHECK-NEXT: [[RES:%.*]] = zext <2 x i32> [[TMP2]] to <2 x i64>
634+
; CHECK-NEXT: [[RES:%.*]] = zext nneg <2 x i32> [[TMP2]] to <2 x i64>
635635
; CHECK-NEXT: ret <2 x i64> [[RES]]
636636
;
637637
%zext = zext <2 x i32> %X to <2 x i64>
@@ -644,7 +644,7 @@ define i64 @test36(i32 %X) {
644644
; CHECK-LABEL: @test36(
645645
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 7
646646
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 240
647-
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP2]] to i64
647+
; CHECK-NEXT: [[RES:%.*]] = zext nneg i32 [[TMP2]] to i64
648648
; CHECK-NEXT: ret i64 [[RES]]
649649
;
650650
%zext = zext i32 %X to i64
@@ -657,7 +657,7 @@ define <2 x i64> @test36_uniform(<2 x i32> %X) {
657657
; CHECK-LABEL: @test36_uniform(
658658
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i32> [[X:%.*]], <i32 7, i32 7>
659659
; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 240, i32 240>
660-
; CHECK-NEXT: [[RES:%.*]] = zext <2 x i32> [[TMP2]] to <2 x i64>
660+
; CHECK-NEXT: [[RES:%.*]] = zext nneg <2 x i32> [[TMP2]] to <2 x i64>
661661
; CHECK-NEXT: ret <2 x i64> [[RES]]
662662
;
663663
%zext = zext <2 x i32> %X to <2 x i64>
@@ -683,7 +683,7 @@ define i64 @test37(i32 %X) {
683683
; CHECK-LABEL: @test37(
684684
; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[X:%.*]], 7
685685
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 240
686-
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP2]] to i64
686+
; CHECK-NEXT: [[RES:%.*]] = zext nneg i32 [[TMP2]] to i64
687687
; CHECK-NEXT: ret i64 [[RES]]
688688
;
689689
%zext = zext i32 %X to i64
@@ -696,7 +696,7 @@ define <2 x i64> @test37_uniform(<2 x i32> %X) {
696696
; CHECK-LABEL: @test37_uniform(
697697
; CHECK-NEXT: [[TMP1:%.*]] = mul <2 x i32> [[X:%.*]], <i32 7, i32 7>
698698
; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 240, i32 240>
699-
; CHECK-NEXT: [[RES:%.*]] = zext <2 x i32> [[TMP2]] to <2 x i64>
699+
; CHECK-NEXT: [[RES:%.*]] = zext nneg <2 x i32> [[TMP2]] to <2 x i64>
700700
; CHECK-NEXT: ret <2 x i64> [[RES]]
701701
;
702702
%zext = zext <2 x i32> %X to <2 x i64>
@@ -721,7 +721,7 @@ define <2 x i64> @test37_nonuniform(<2 x i32> %X) {
721721
define i64 @test38(i32 %X) {
722722
; CHECK-LABEL: @test38(
723723
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 240
724-
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP1]] to i64
724+
; CHECK-NEXT: [[RES:%.*]] = zext nneg i32 [[TMP1]] to i64
725725
; CHECK-NEXT: ret i64 [[RES]]
726726
;
727727
%zext = zext i32 %X to i64
@@ -733,7 +733,7 @@ define i64 @test38(i32 %X) {
733733
define i64 @test39(i32 %X) {
734734
; CHECK-LABEL: @test39(
735735
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 240
736-
; CHECK-NEXT: [[RES:%.*]] = zext i32 [[TMP1]] to i64
736+
; CHECK-NEXT: [[RES:%.*]] = zext nneg i32 [[TMP1]] to i64
737737
; CHECK-NEXT: ret i64 [[RES]]
738738
;
739739
%zext = zext i32 %X to i64

llvm/test/Transforms/InstCombine/assoc-cast-assoc.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ define <2 x i32> @OrZextOrVec(<2 x i2> %a) {
5454
define i5 @AndZextAnd(i3 %a) {
5555
; CHECK-LABEL: @AndZextAnd(
5656
; CHECK-NEXT: [[TMP1:%.*]] = and i3 [[A:%.*]], 2
57-
; CHECK-NEXT: [[OP2:%.*]] = zext i3 [[TMP1]] to i5
57+
; CHECK-NEXT: [[OP2:%.*]] = zext nneg i3 [[TMP1]] to i5
5858
; CHECK-NEXT: ret i5 [[OP2]]
5959
;
6060
%op1 = and i3 %a, 3
@@ -66,7 +66,7 @@ define i5 @AndZextAnd(i3 %a) {
6666
define <2 x i32> @AndZextAndVec(<2 x i8> %a) {
6767
; CHECK-LABEL: @AndZextAndVec(
6868
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> [[A:%.*]], <i8 5, i8 0>
69-
; CHECK-NEXT: [[OP2:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i32>
69+
; CHECK-NEXT: [[OP2:%.*]] = zext nneg <2 x i8> [[TMP1]] to <2 x i32>
7070
; CHECK-NEXT: ret <2 x i32> [[OP2]]
7171
;
7272
%op1 = and <2 x i8> %a, <i8 7, i8 0>

llvm/test/Transforms/InstCombine/binop-cast.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ define i64 @PR63321(ptr %ptr, i64 %c) {
276276
define i64 @and_add_non_bool(ptr %ptr, i64 %c) {
277277
; CHECK-LABEL: @and_add_non_bool(
278278
; CHECK-NEXT: [[VAL:%.*]] = load i8, ptr [[PTR:%.*]], align 1, !range [[RNG1:![0-9]+]]
279-
; CHECK-NEXT: [[RHS:%.*]] = zext i8 [[VAL]] to i64
279+
; CHECK-NEXT: [[RHS:%.*]] = zext nneg i8 [[VAL]] to i64
280280
; CHECK-NEXT: [[MASK:%.*]] = add nsw i64 [[RHS]], -1
281281
; CHECK-NEXT: [[RES:%.*]] = and i64 [[MASK]], [[C:%.*]]
282282
; CHECK-NEXT: ret i64 [[RES]]

llvm/test/Transforms/InstCombine/cast-mul-select.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ define i32 @eval_zext_multi_use_in_one_inst(i32 %x) {
119119
; CHECK-NEXT: [[T:%.*]] = trunc i32 [[X:%.*]] to i16
120120
; CHECK-NEXT: [[A:%.*]] = and i16 [[T]], 5
121121
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i16 [[A]], [[A]]
122-
; CHECK-NEXT: [[R:%.*]] = zext i16 [[M]] to i32
122+
; CHECK-NEXT: [[R:%.*]] = zext nneg i16 [[M]] to i32
123123
; CHECK-NEXT: ret i32 [[R]]
124124
;
125125
; DBGINFO-LABEL: @eval_zext_multi_use_in_one_inst(
@@ -129,7 +129,7 @@ define i32 @eval_zext_multi_use_in_one_inst(i32 %x) {
129129
; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i16 [[A]], metadata [[META66:![0-9]+]], metadata !DIExpression()), !dbg [[DBG70]]
130130
; DBGINFO-NEXT: [[M:%.*]] = mul nuw nsw i16 [[A]], [[A]], !dbg [[DBG71:![0-9]+]]
131131
; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i16 [[M]], metadata [[META67:![0-9]+]], metadata !DIExpression()), !dbg [[DBG71]]
132-
; DBGINFO-NEXT: [[R:%.*]] = zext i16 [[M]] to i32, !dbg [[DBG72:![0-9]+]]
132+
; DBGINFO-NEXT: [[R:%.*]] = zext nneg i16 [[M]] to i32, !dbg [[DBG72:![0-9]+]]
133133
; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i32 [[R]], metadata [[META68:![0-9]+]], metadata !DIExpression()), !dbg [[DBG72]]
134134
; DBGINFO-NEXT: ret i32 [[R]], !dbg [[DBG73:![0-9]+]]
135135
;
@@ -183,13 +183,13 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
183183
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[B:%.*]], 0
184184
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TOBOOL]], i8 0, i8 4
185185
; CHECK-NEXT: switch i3 [[V1:%.*]], label [[EXIT:%.*]] [
186-
; CHECK-NEXT: i3 0, label [[FOR_END:%.*]]
187-
; CHECK-NEXT: i3 -1, label [[FOR_END]]
186+
; CHECK-NEXT: i3 0, label [[FOR_END:%.*]]
187+
; CHECK-NEXT: i3 -1, label [[FOR_END]]
188188
; CHECK-NEXT: ]
189189
; CHECK: for.body3:
190190
; CHECK-NEXT: switch i3 [[V2:%.*]], label [[EXIT]] [
191-
; CHECK-NEXT: i3 0, label [[FOR_END]]
192-
; CHECK-NEXT: i3 -1, label [[FOR_END]]
191+
; CHECK-NEXT: i3 0, label [[FOR_END]]
192+
; CHECK-NEXT: i3 -1, label [[FOR_END]]
193193
; CHECK-NEXT: ]
194194
; CHECK: for.end:
195195
; CHECK-NEXT: [[H:%.*]] = phi i8 [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ 0, [[FOR_BODY3]] ], [ 0, [[FOR_BODY3]] ]
@@ -213,13 +213,13 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
213213
; DBGINFO-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TOBOOL]], i8 0, i8 4, !dbg [[DBG97:![0-9]+]]
214214
; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i8 [[SPEC_SELECT]], metadata [[META90:![0-9]+]], metadata !DIExpression()), !dbg [[DBG97]]
215215
; DBGINFO-NEXT: switch i3 [[V1:%.*]], label [[EXIT:%.*]] [
216-
; DBGINFO-NEXT: i3 0, label [[FOR_END:%.*]]
217-
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
216+
; DBGINFO-NEXT: i3 0, label [[FOR_END:%.*]]
217+
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
218218
; DBGINFO-NEXT: ], !dbg [[DBG98:![0-9]+]]
219219
; DBGINFO: for.body3:
220220
; DBGINFO-NEXT: switch i3 [[V2:%.*]], label [[EXIT]] [
221-
; DBGINFO-NEXT: i3 0, label [[FOR_END]]
222-
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
221+
; DBGINFO-NEXT: i3 0, label [[FOR_END]]
222+
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
223223
; DBGINFO-NEXT: ], !dbg [[DBG99:![0-9]+]]
224224
; DBGINFO: for.end:
225225
; DBGINFO-NEXT: [[H:%.*]] = phi i8 [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ 0, [[FOR_BODY3]] ], [ 0, [[FOR_BODY3]] ], !dbg [[DBG100:![0-9]+]]

0 commit comments

Comments
 (0)