Skip to content

Commit 45303ed

Browse files
committed
handle range attribute in isKnownNonZero
1 parent af88034 commit 45303ed

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,6 +2893,18 @@ bool isKnownNonZero(const Value *V, const APInt &DemandedElts, unsigned Depth,
28932893
}
28942894
}
28952895

2896+
std::optional<ConstantRange> Range;
2897+
if (const CallBase *CB = dyn_cast<CallBase>(V))
2898+
Range = CB->getRange();
2899+
else if (const Argument *A = dyn_cast<Argument>(V))
2900+
Range = A->getRange();
2901+
2902+
if (Range) {
2903+
const APInt ZeroValue(Range->getBitWidth(), 0);
2904+
if (!Range->contains(ZeroValue))
2905+
return true;
2906+
}
2907+
28962908
if (!isa<Constant>(V) && isKnownNonZeroFromAssume(V, Q))
28972909
return true;
28982910

llvm/test/Transforms/InstSimplify/icmp-constant.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,8 +1143,7 @@ define <2 x i1> @heterogeneous_constvector(<2 x i8> %x) {
11431143

11441144
define i1 @icmp_eq_non_zero_range_attr(i8 range(i8 1, 0) %i) {
11451145
; CHECK-LABEL: @icmp_eq_non_zero_range_attr(
1146-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 0
1147-
; CHECK-NEXT: ret i1 [[CMP]]
1146+
; CHECK-NEXT: ret i1 false
11481147
;
11491148
%cmp = icmp eq i8 %i, 0
11501149
ret i1 %cmp
@@ -1165,8 +1164,7 @@ declare range(i8 -1, 1) i8 @returns_contain_zero_range_helper()
11651164
define i1 @icmp_eq_non_zero_range_return() {
11661165
; CHECK-LABEL: @icmp_eq_non_zero_range_return(
11671166
; CHECK-NEXT: [[I:%.*]] = call i8 @returns_non_zero_range_helper()
1168-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1169-
; CHECK-NEXT: ret i1 [[CMP]]
1167+
; CHECK-NEXT: ret i1 false
11701168
;
11711169
%i = call i8 @returns_non_zero_range_helper()
11721170
%cmp = icmp eq i8 %i, 0
@@ -1189,8 +1187,7 @@ declare i8 @returns_i8_helper()
11891187
define i1 @icmp_eq_non_zero_range_call() {
11901188
; CHECK-LABEL: @icmp_eq_non_zero_range_call(
11911189
; CHECK-NEXT: [[I:%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
1192-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1193-
; CHECK-NEXT: ret i1 [[CMP]]
1190+
; CHECK-NEXT: ret i1 false
11941191
;
11951192
%i = call range(i8 1, 0) i8 @returns_i8_helper()
11961193
%cmp = icmp eq i8 %i, 0
@@ -1210,8 +1207,7 @@ define i1 @neg_icmp_eq_non_zero_range_call() {
12101207

12111208
define <2 x i1> @icmp_eq_non_zero_range_attr_vec(<2 x i8> range(i8 1, 0) %i) {
12121209
; CHECK-LABEL: @icmp_eq_non_zero_range_attr_vec(
1213-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], zeroinitializer
1214-
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1210+
; CHECK-NEXT: ret <2 x i1> zeroinitializer
12151211
;
12161212
%cmp = icmp eq <2 x i8> %i, <i8 0, i8 0>
12171213
ret <2 x i1> %cmp
@@ -1232,8 +1228,7 @@ declare range(i8 -1, 1) <2 x i8> @returns_contain_zero_range_helper_vec()
12321228
define <2 x i1> @icmp_eq_non_zero_range_return_vec() {
12331229
; CHECK-LABEL: @icmp_eq_non_zero_range_return_vec(
12341230
; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_non_zero_range_helper_vec()
1235-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], zeroinitializer
1236-
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1231+
; CHECK-NEXT: ret <2 x i1> zeroinitializer
12371232
;
12381233
%i = call <2 x i8> @returns_non_zero_range_helper_vec()
12391234
%cmp = icmp eq <2 x i8> %i, <i8 0, i8 0>
@@ -1256,8 +1251,7 @@ declare <2 x i8> @returns_i8_helper_vec()
12561251
define <2 x i1> @icmp_eq_non_zero_range_call_vec() {
12571252
; CHECK-LABEL: @icmp_eq_non_zero_range_call_vec(
12581253
; CHECK-NEXT: [[I:%.*]] = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()
1259-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], zeroinitializer
1260-
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1254+
; CHECK-NEXT: ret <2 x i1> zeroinitializer
12611255
;
12621256
%i = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()
12631257
%cmp = icmp eq <2 x i8> %i, <i8 0, i8 0>

0 commit comments

Comments
 (0)