Skip to content

Commit d3a709e

Browse files
committed
[ConstraintElim] Decompose sext-like insts for signed predicates
1 parent 5c3ddf9 commit d3a709e

File tree

3 files changed

+18
-16
lines changed

3 files changed

+18
-16
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,8 @@ static Decomposition decompose(Value *V,
499499
if (!Ty->isIntegerTy() || Ty->getIntegerBitWidth() > 64)
500500
return V;
501501

502+
bool IsKnownNonNegative = false;
503+
502504
// Decompose \p V used with a signed predicate.
503505
if (IsSigned) {
504506
if (auto *CI = dyn_cast<ConstantInt>(V)) {
@@ -507,6 +509,14 @@ static Decomposition decompose(Value *V,
507509
}
508510
Value *Op0;
509511
Value *Op1;
512+
513+
if (match(V, m_SExt(m_Value(Op0))))
514+
V = Op0;
515+
else if (match(V, m_NNegZExt(m_Value(Op0)))) {
516+
V = Op0;
517+
IsKnownNonNegative = true;
518+
}
519+
510520
if (match(V, m_NSWAdd(m_Value(Op0), m_Value(Op1))))
511521
return MergeResults(Op0, Op1, IsSigned);
512522

@@ -529,7 +539,7 @@ static Decomposition decompose(Value *V,
529539
}
530540
}
531541

532-
return V;
542+
return {V, IsKnownNonNegative};
533543
}
534544

535545
if (auto *CI = dyn_cast<ConstantInt>(V)) {
@@ -539,7 +549,6 @@ static Decomposition decompose(Value *V,
539549
}
540550

541551
Value *Op0;
542-
bool IsKnownNonNegative = false;
543552
if (match(V, m_ZExt(m_Value(Op0)))) {
544553
IsKnownNonNegative = true;
545554
V = Op0;

llvm/test/Transforms/ConstraintElimination/minmax.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -611,8 +611,7 @@ define i64 @pr82271(i32 %a, i32 %b){
611611
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
612612
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
613613
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
614-
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
615-
; CHECK-NEXT: ret i64 [[SMAX]]
614+
; CHECK-NEXT: ret i64 [[SB]]
616615
; CHECK: else:
617616
; CHECK-NEXT: ret i64 0
618617
;
@@ -641,8 +640,7 @@ define i64 @pr82271_sext_zext_nneg(i32 %a, i32 %b){
641640
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
642641
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
643642
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
644-
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
645-
; CHECK-NEXT: ret i64 [[SMAX]]
643+
; CHECK-NEXT: ret i64 [[SB]]
646644
; CHECK: else:
647645
; CHECK-NEXT: ret i64 0
648646
;
@@ -671,8 +669,7 @@ define i64 @pr82271_zext_nneg(i32 %a, i32 %b){
671669
; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64
672670
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
673671
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
674-
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
675-
; CHECK-NEXT: ret i64 [[SMAX]]
672+
; CHECK-NEXT: ret i64 [[SB]]
676673
; CHECK: else:
677674
; CHECK-NEXT: ret i64 0
678675
;

llvm/test/Transforms/ConstraintElimination/sext.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ define i1 @cmp_sext(i32 %a, i32 %b){
1111
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
1212
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
1313
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
14-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
15-
; CHECK-NEXT: ret i1 [[CMP2]]
14+
; CHECK-NEXT: ret i1 true
1615
; CHECK: else:
1716
; CHECK-NEXT: ret i1 false
1817
;
@@ -43,8 +42,7 @@ define i1 @cmp_sext_add(i32 %a, i32 %b){
4342
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A1]] to i64
4443
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B1]] to i64
4544
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
46-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
47-
; CHECK-NEXT: ret i1 [[CMP2]]
45+
; CHECK-NEXT: ret i1 true
4846
; CHECK: else:
4947
; CHECK-NEXT: ret i1 false
5048
;
@@ -77,8 +75,7 @@ define i1 @cmp_sext_dynamic_increment(i32 %a, i32 %b, i64 %c){
7775
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
7876
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
7977
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
80-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
81-
; CHECK-NEXT: ret i1 [[CMP2]]
78+
; CHECK-NEXT: ret i1 true
8279
; CHECK: else:
8380
; CHECK-NEXT: ret i1 false
8481
;
@@ -109,8 +106,7 @@ define i1 @cmp_zext_nneg(i32 %a, i32 %b){
109106
; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64
110107
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
111108
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
112-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
113-
; CHECK-NEXT: ret i1 [[CMP2]]
109+
; CHECK-NEXT: ret i1 true
114110
; CHECK: else:
115111
; CHECK-NEXT: ret i1 false
116112
;

0 commit comments

Comments
 (0)