Skip to content

Commit f201752

Browse files
committed
[InstCombine] Avoid breaking SPF by foldICmpUsingKnownBits
1 parent ababa96 commit f201752

File tree

4 files changed

+36
-39
lines changed

4 files changed

+36
-39
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7034,9 +7034,6 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
70347034
if (Instruction *Res = foldICmpUsingBoolRange(I))
70357035
return Res;
70367036

7037-
if (Instruction *Res = foldICmpUsingKnownBits(I))
7038-
return Res;
7039-
70407037
if (Instruction *Res = foldICmpTruncWithTruncOrExt(I, Q))
70417038
return Res;
70427039

@@ -7057,6 +7054,9 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
70577054
return nullptr;
70587055
}
70597056

7057+
if (Instruction *Res = foldICmpUsingKnownBits(I))
7058+
return Res;
7059+
70607060
// Do this after checking for min/max to prevent infinite looping.
70617061
if (Instruction *Res = foldICmpWithZero(I))
70627062
return Res;

llvm/test/Transforms/InstCombine/minmax-fold.ll

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,7 @@ define i32 @test73(i32 %x) {
316316
; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75)
317317
define i32 @test74(i32 %x) {
318318
; CHECK-LABEL: @test74(
319-
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 36)
320-
; CHECK-NEXT: [[RETVAL:%.*]] = call i32 @llvm.umax.i32(i32 [[COND]], i32 75)
319+
; CHECK-NEXT: [[RETVAL:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 75)
321320
; CHECK-NEXT: ret i32 [[RETVAL]]
322321
;
323322
%cmp = icmp slt i32 %x, 36
@@ -499,10 +498,9 @@ define i32 @clamp_check_for_no_infinite_loop3(i32 %i) {
499498
; CHECK-LABEL: @clamp_check_for_no_infinite_loop3(
500499
; CHECK-NEXT: br i1 true, label [[TRUELABEL:%.*]], label [[FALSELABEL:%.*]]
501500
; CHECK: truelabel:
502-
; CHECK-NEXT: [[I3:%.*]] = call i32 @llvm.smax.i32(i32 [[I:%.*]], i32 1)
503-
; CHECK-NEXT: [[I6:%.*]] = call i32 @llvm.umin.i32(i32 [[I3]], i32 2)
504-
; CHECK-NEXT: [[I7:%.*]] = shl nuw nsw i32 [[I6]], 2
505-
; CHECK-NEXT: ret i32 [[I7]]
501+
; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[I:%.*]], 2
502+
; CHECK-NEXT: [[I6:%.*]] = select i1 [[TMP1]], i32 4, i32 8
503+
; CHECK-NEXT: ret i32 [[I6]]
506504
; CHECK: falselabel:
507505
; CHECK-NEXT: ret i32 0
508506
;
@@ -1391,8 +1389,8 @@ entry:
13911389
define i32 @twoway_clamp_gt(i32 %num) {
13921390
; CHECK-LABEL: @twoway_clamp_gt(
13931391
; CHECK-NEXT: entry:
1394-
; CHECK-NEXT: [[S1:%.*]] = call i32 @llvm.smax.i32(i32 [[NUM:%.*]], i32 13767)
1395-
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.umin.i32(i32 [[S1]], i32 13768)
1392+
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 [[NUM:%.*]], 13768
1393+
; CHECK-NEXT: [[R:%.*]] = select i1 [[TMP0]], i32 13767, i32 13768
13961394
; CHECK-NEXT: ret i32 [[R]]
13971395
;
13981396
entry:

llvm/test/Transforms/InstCombine/sadd_sat.ll

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ define i32 @sadd_sat32_zext(i32 %a, i32 %b) {
624624
; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[A:%.*]] to i64
625625
; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[B:%.*]] to i64
626626
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV1]], [[CONV]]
627-
; CHECK-NEXT: [[SPEC_STORE_SELECT:%.*]] = call i64 @llvm.umin.i64(i64 [[ADD]], i64 2147483647)
627+
; CHECK-NEXT: [[SPEC_STORE_SELECT:%.*]] = call i64 @llvm.smin.i64(i64 [[ADD]], i64 2147483647)
628628
; CHECK-NEXT: [[CONV7:%.*]] = trunc i64 [[SPEC_STORE_SELECT]] to i32
629629
; CHECK-NEXT: ret i32 [[CONV7]]
630630
;
@@ -679,10 +679,10 @@ entry:
679679
define i32 @ashrA(i64 %a, i32 %b) {
680680
; CHECK-LABEL: @ashrA(
681681
; CHECK-NEXT: entry:
682-
; CHECK-NEXT: [[TMP0:%.*]] = lshr i64 [[A:%.*]], 32
683-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[TMP0]] to i32
684-
; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP1]], i32 [[B:%.*]])
685-
; CHECK-NEXT: ret i32 [[TMP2]]
682+
; CHECK-NEXT: [[CONV:%.*]] = lshr i64 [[A:%.*]], 32
683+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i64 [[CONV]] to i32
684+
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 [[B:%.*]])
685+
; CHECK-NEXT: ret i32 [[TMP1]]
686686
;
687687
entry:
688688
%conv = ashr i64 %a, 32
@@ -697,10 +697,10 @@ entry:
697697
define i32 @ashrB(i32 %a, i64 %b) {
698698
; CHECK-LABEL: @ashrB(
699699
; CHECK-NEXT: entry:
700-
; CHECK-NEXT: [[TMP0:%.*]] = lshr i64 [[B:%.*]], 32
701-
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[TMP0]] to i32
702-
; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP1]], i32 [[A:%.*]])
703-
; CHECK-NEXT: ret i32 [[TMP2]]
700+
; CHECK-NEXT: [[CONV1:%.*]] = lshr i64 [[B:%.*]], 32
701+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i64 [[CONV1]] to i32
702+
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 [[A:%.*]])
703+
; CHECK-NEXT: ret i32 [[TMP1]]
704704
;
705705
entry:
706706
%conv = sext i32 %a to i64
@@ -717,12 +717,12 @@ entry:
717717
define i32 @ashrAB(i64 %a, i64 %b) {
718718
; CHECK-LABEL: @ashrAB(
719719
; CHECK-NEXT: entry:
720-
; CHECK-NEXT: [[TMP0:%.*]] = lshr i64 [[A:%.*]], 32
721-
; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[B:%.*]], 32
722-
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i32
723-
; CHECK-NEXT: [[TMP3:%.*]] = trunc i64 [[TMP0]] to i32
724-
; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP2]], i32 [[TMP3]])
725-
; CHECK-NEXT: ret i32 [[TMP4]]
720+
; CHECK-NEXT: [[CONV:%.*]] = lshr i64 [[A:%.*]], 32
721+
; CHECK-NEXT: [[CONV1:%.*]] = lshr i64 [[B:%.*]], 32
722+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i64 [[CONV1]] to i32
723+
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[CONV]] to i32
724+
; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 [[TMP1]])
725+
; CHECK-NEXT: ret i32 [[TMP2]]
726726
;
727727
entry:
728728
%conv = ashr i64 %a, 32
@@ -805,10 +805,10 @@ entry:
805805
define <2 x i8> @ashrv2i8_s(<2 x i16> %a, <2 x i8> %b) {
806806
; CHECK-LABEL: @ashrv2i8_s(
807807
; CHECK-NEXT: entry:
808-
; CHECK-NEXT: [[TMP0:%.*]] = lshr <2 x i16> [[A:%.*]], <i16 8, i16 8>
809-
; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i16> [[TMP0]] to <2 x i8>
810-
; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> [[TMP1]], <2 x i8> [[B:%.*]])
811-
; CHECK-NEXT: ret <2 x i8> [[TMP2]]
808+
; CHECK-NEXT: [[CONV:%.*]] = lshr <2 x i16> [[A:%.*]], <i16 8, i16 8>
809+
; CHECK-NEXT: [[TMP0:%.*]] = trunc <2 x i16> [[CONV]] to <2 x i8>
810+
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> [[TMP0]], <2 x i8> [[B:%.*]])
811+
; CHECK-NEXT: ret <2 x i8> [[TMP1]]
812812
;
813813
entry:
814814
%conv = ashr <2 x i16> %a, <i16 8, i16 8>

llvm/test/Transforms/InstCombine/select_meta.ll

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ define i32 @test72(i32 %x) {
171171
; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75)
172172
define i32 @test74(i32 %x) {
173173
; CHECK-LABEL: @test74(
174-
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 36)
175-
; CHECK-NEXT: [[RETVAL:%.*]] = call i32 @llvm.umax.i32(i32 [[COND]], i32 75)
174+
; CHECK-NEXT: [[RETVAL:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 75)
176175
; CHECK-NEXT: ret i32 [[RETVAL]]
177176
;
178177
%cmp = icmp slt i32 %x, 36
@@ -317,7 +316,7 @@ define <2 x i32> @not_cond_vec_undef(<2 x i1> %c, <2 x i32> %tv, <2 x i32> %fv)
317316

318317
define i64 @select_add(i1 %cond, i64 %x, i64 %y) {
319318
; CHECK-LABEL: @select_add(
320-
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], i64 [[Y:%.*]], i64 0, !prof [[PROF0]], !unpredictable !2
319+
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], i64 [[Y:%.*]], i64 0, !prof [[PROF0]], !unpredictable [[META2:![0-9]+]]
321320
; CHECK-NEXT: [[RET:%.*]] = add i64 [[OP]], [[X:%.*]]
322321
; CHECK-NEXT: ret i64 [[RET]]
323322
;
@@ -328,7 +327,7 @@ define i64 @select_add(i1 %cond, i64 %x, i64 %y) {
328327

329328
define <2 x i32> @select_or(<2 x i1> %cond, <2 x i32> %x, <2 x i32> %y) {
330329
; CHECK-LABEL: @select_or(
331-
; CHECK-NEXT: [[OP:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> zeroinitializer, !prof [[PROF0]], !unpredictable !2
330+
; CHECK-NEXT: [[OP:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> zeroinitializer, !prof [[PROF0]], !unpredictable [[META2]]
332331
; CHECK-NEXT: [[RET:%.*]] = or <2 x i32> [[OP]], [[X:%.*]]
333332
; CHECK-NEXT: ret <2 x i32> [[RET]]
334333
;
@@ -339,7 +338,7 @@ define <2 x i32> @select_or(<2 x i1> %cond, <2 x i32> %x, <2 x i32> %y) {
339338

340339
define i17 @select_sub(i1 %cond, i17 %x, i17 %y) {
341340
; CHECK-LABEL: @select_sub(
342-
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], i17 [[Y:%.*]], i17 0, !prof [[PROF0]], !unpredictable !2
341+
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], i17 [[Y:%.*]], i17 0, !prof [[PROF0]], !unpredictable [[META2]]
343342
; CHECK-NEXT: [[RET:%.*]] = sub i17 [[X:%.*]], [[OP]]
344343
; CHECK-NEXT: ret i17 [[RET]]
345344
;
@@ -350,7 +349,7 @@ define i17 @select_sub(i1 %cond, i17 %x, i17 %y) {
350349

351350
define i128 @select_ashr(i1 %cond, i128 %x, i128 %y) {
352351
; CHECK-LABEL: @select_ashr(
353-
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], i128 [[Y:%.*]], i128 0, !prof [[PROF0]], !unpredictable !2
352+
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], i128 [[Y:%.*]], i128 0, !prof [[PROF0]], !unpredictable [[META2]]
354353
; CHECK-NEXT: [[RET:%.*]] = ashr i128 [[X:%.*]], [[OP]]
355354
; CHECK-NEXT: ret i128 [[RET]]
356355
;
@@ -361,7 +360,7 @@ define i128 @select_ashr(i1 %cond, i128 %x, i128 %y) {
361360

362361
define double @select_fmul(i1 %cond, double %x, double %y) {
363362
; CHECK-LABEL: @select_fmul(
364-
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], double [[Y:%.*]], double 1.000000e+00, !prof [[PROF0]], !unpredictable !2
363+
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], double [[Y:%.*]], double 1.000000e+00, !prof [[PROF0]], !unpredictable [[META2]]
365364
; CHECK-NEXT: [[RET:%.*]] = fmul double [[OP]], [[X:%.*]]
366365
; CHECK-NEXT: ret double [[RET]]
367366
;
@@ -372,7 +371,7 @@ define double @select_fmul(i1 %cond, double %x, double %y) {
372371

373372
define <2 x float> @select_fdiv(i1 %cond, <2 x float> %x, <2 x float> %y) {
374373
; CHECK-LABEL: @select_fdiv(
375-
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], <2 x float> [[Y:%.*]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, !prof [[PROF0]], !unpredictable !2
374+
; CHECK-NEXT: [[OP:%.*]] = select i1 [[COND:%.*]], <2 x float> [[Y:%.*]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, !prof [[PROF0]], !unpredictable [[META2]]
376375
; CHECK-NEXT: [[RET:%.*]] = fdiv <2 x float> [[X:%.*]], [[OP]]
377376
; CHECK-NEXT: ret <2 x float> [[RET]]
378377
;
@@ -391,5 +390,5 @@ define <2 x float> @select_fdiv(i1 %cond, <2 x float> %x, <2 x float> %y) {
391390
;.
392391
; CHECK: [[PROF0]] = !{!"branch_weights", i32 2, i32 10}
393392
; CHECK: [[PROF1]] = !{!"branch_weights", i32 10, i32 2}
394-
; CHECK: [[META2:![0-9]+]] = !{}
393+
; CHECK: [[META2]] = !{}
395394
;.

0 commit comments

Comments
 (0)