Skip to content

Commit 268f757

Browse files
committed
[ConstraintElim] Add support for trunc nsw/nuw
1 parent b16a5e4 commit 268f757

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,9 @@ static Decomposition decompose(Value *V,
521521
else if (match(V, m_NNegZExt(m_Value(Op0)))) {
522522
V = Op0;
523523
IsKnownNonNegative = true;
524+
} else if (match(V, m_NSWTrunc(m_Value(Op0)))) {
525+
if (Op0->getType()->getScalarSizeInBits() <= 64)
526+
V = Op0;
524527
}
525528

526529
if (match(V, m_NSWAdd(m_Value(Op0), m_Value(Op1))))
@@ -558,12 +561,19 @@ static Decomposition decompose(Value *V,
558561
if (match(V, m_ZExt(m_Value(Op0)))) {
559562
IsKnownNonNegative = true;
560563
V = Op0;
561-
}
562-
563-
if (match(V, m_SExt(m_Value(Op0)))) {
564+
} else if (match(V, m_SExt(m_Value(Op0)))) {
564565
V = Op0;
565566
Preconditions.emplace_back(CmpInst::ICMP_SGE, Op0,
566567
ConstantInt::get(Op0->getType(), 0));
568+
} else if (auto *Trunc = dyn_cast<TruncInst>(V)) {
569+
if (Trunc->getSrcTy()->getScalarSizeInBits() <= 64) {
570+
if (Trunc->hasNoUnsignedWrap() || Trunc->hasNoSignedWrap()) {
571+
V = Trunc->getOperand(0);
572+
if (!Trunc->hasNoUnsignedWrap())
573+
Preconditions.emplace_back(CmpInst::ICMP_SGE, V,
574+
ConstantInt::get(V->getType(), 0));
575+
}
576+
}
567577
}
568578

569579
Value *Op1;

llvm/test/Transforms/ConstraintElimination/trunc.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ define i1 @test_icmp_ult_zext_icmp_trunc_nuw(i16 %x, i32 %y) {
99
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
1010
; CHECK: [[IF_THEN]]:
1111
; CHECK-NEXT: [[CONV:%.*]] = trunc nuw i32 [[Y]] to i16
12-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]]
13-
; CHECK-NEXT: ret i1 [[CMP]]
12+
; CHECK-NEXT: ret i1 false
1413
; CHECK: [[IF_ELSE]]:
1514
; CHECK-NEXT: ret i1 false
1615
;
@@ -35,8 +34,7 @@ define i1 @test_icmp_slt_sext_icmp_trunc_nsw(i16 %x, i32 %y) {
3534
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
3635
; CHECK: [[IF_THEN]]:
3736
; CHECK-NEXT: [[CONV:%.*]] = trunc nsw i32 [[Y]] to i16
38-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[X]], [[CONV]]
39-
; CHECK-NEXT: ret i1 [[CMP]]
37+
; CHECK-NEXT: ret i1 false
4038
; CHECK: [[IF_ELSE]]:
4139
; CHECK-NEXT: ret i1 false
4240
;
@@ -63,8 +61,7 @@ define i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw(i64 %x, i32 %y) {
6361
; CHECK-NEXT: br i1 [[AND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
6462
; CHECK: [[IF_THEN]]:
6563
; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[Y]] to i64
66-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[X]], [[CONV]]
67-
; CHECK-NEXT: ret i1 [[CMP]]
64+
; CHECK-NEXT: ret i1 false
6865
; CHECK: [[IF_ELSE]]:
6966
; CHECK-NEXT: ret i1 false
7067
;
@@ -102,8 +99,7 @@ define i1 @test2(i32 %n) {
10299
; CHECK-NEXT: br i1 [[COND2]], label %[[FOR_BODY]], label %[[FOR_END:.*]]
103100
; CHECK: [[FOR_END]]:
104101
; CHECK-NEXT: [[TRUNC:%.*]] = trunc nsw i64 [[INDVAR_NEXT]] to i32
105-
; CHECK-NEXT: [[RES:%.*]] = icmp sgt i32 [[N]], [[TRUNC]]
106-
; CHECK-NEXT: ret i1 [[RES]]
102+
; CHECK-NEXT: ret i1 true
107103
; CHECK: [[IF_ELSE]]:
108104
; CHECK-NEXT: ret i1 false
109105
;

0 commit comments

Comments
 (0)