Skip to content

Commit 130f0f5

Browse files
committed
[LVI][CVP] Add support for vector comparisons
1 parent f92bfca commit 130f0f5

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

llvm/lib/Analysis/LazyValueInfo.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1784,12 +1784,8 @@ static Constant *getPredicateResult(CmpInst::Predicate Pred, Constant *C,
17841784

17851785
Type *ResTy = CmpInst::makeCmpResultType(C->getType());
17861786
if (Val.isConstantRange()) {
1787-
ConstantInt *CI = dyn_cast<ConstantInt>(C);
1788-
if (!CI)
1789-
return nullptr;
1790-
17911787
const ConstantRange &CR = Val.getConstantRange();
1792-
ConstantRange RHS(CI->getValue());
1788+
ConstantRange RHS = C->toConstantRange();
17931789
if (CR.icmp(Pred, RHS))
17941790
return ConstantInt::getTrue(ResTy);
17951791
if (CR.icmp(CmpInst::getInversePredicate(Pred), RHS))

llvm/test/Transforms/CorrelatedValuePropagation/vectors.ll

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,52 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -S -passes=correlated-propagation < %s | FileCheck %s
33

4-
; TODO: Add support for this.
54
define <2 x i1> @cmp1(<2 x i8> %a) {
65
; CHECK-LABEL: define <2 x i1> @cmp1(
76
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
87
; CHECK-NEXT: [[ADD:%.*]] = add nuw <2 x i8> [[A]], <i8 1, i8 1>
9-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[ADD]], zeroinitializer
10-
; CHECK-NEXT: ret <2 x i1> [[CMP]]
8+
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
119
;
1210
%add = add nuw <2 x i8> %a, splat (i8 1)
1311
%cmp = icmp ne <2 x i8> %add, zeroinitializer
1412
ret <2 x i1> %cmp
1513
}
1614

17-
; TODO: Add support for this.
1815
define <2 x i1> @cmp2(<2 x i8> %a) {
1916
; CHECK-LABEL: define <2 x i1> @cmp2(
2017
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
2118
; CHECK-NEXT: [[ADD:%.*]] = add nuw <2 x i8> [[A]], <i8 5, i8 5>
22-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> [[ADD]], <i8 2, i8 2>
23-
; CHECK-NEXT: ret <2 x i1> [[CMP]]
19+
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
2420
;
2521
%add = add nuw <2 x i8> %a, splat (i8 5)
2622
%cmp = icmp ugt <2 x i8> %add, splat (i8 2)
2723
ret <2 x i1> %cmp
2824
}
2925

26+
define <2 x i1> @cmp_nonsplat(<2 x i8> %a) {
27+
; CHECK-LABEL: define <2 x i1> @cmp_nonsplat(
28+
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
29+
; CHECK-NEXT: [[ADD:%.*]] = add nuw <2 x i8> [[A]], <i8 4, i8 5>
30+
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
31+
;
32+
%add = add nuw <2 x i8> %a, <i8 4, i8 5>
33+
%cmp = icmp ugt <2 x i8> %add, <i8 2, i8 3>
34+
ret <2 x i1> %cmp
35+
}
36+
37+
; Handling this would require keeping track of ranges on a per-element basis.
38+
define <2 x i1> @cmp_nonsplat_fail(<2 x i8> %a) {
39+
; CHECK-LABEL: define <2 x i1> @cmp_nonsplat_fail(
40+
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
41+
; CHECK-NEXT: [[ADD:%.*]] = add nuw <2 x i8> [[A]], <i8 3, i8 4>
42+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> [[ADD]], <i8 2, i8 3>
43+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
44+
;
45+
%add = add nuw <2 x i8> %a, <i8 3, i8 4>
46+
%cmp = icmp ugt <2 x i8> %add, <i8 2, i8 3>
47+
ret <2 x i1> %cmp
48+
}
49+
3050
define <2 x i1> @cmp_signedness(<2 x i8> %a) {
3151
; CHECK-LABEL: define <2 x i1> @cmp_signedness(
3252
; CHECK-SAME: <2 x i8> [[A:%.*]]) {

0 commit comments

Comments
 (0)