Skip to content

Commit efe07d8

Browse files
committed
[InstSimplify] Provide information about the range of values that UCMP/SCMP can produce to fold some comparisons
1 parent 57ff233 commit efe07d8

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9393,6 +9393,10 @@ static ConstantRange getRangeForIntrinsic(const IntrinsicInst &II) {
93939393
if (!II.getParent() || !II.getFunction())
93949394
break;
93959395
return getVScaleRange(II.getFunction(), Width);
9396+
case Intrinsic::scmp:
9397+
case Intrinsic::ucmp:
9398+
return ConstantRange::getNonEmpty(APInt::getAllOnes(Width),
9399+
APInt::getOneBitSet(Width, 0));
93969400
default:
93979401
break;
93989402
}

llvm/test/Transforms/InstSimplify/uscmp.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,7 @@ define <4 x i8> @ucmp_with_addition_vec(<4 x i32> %x) {
232232
define i1 @scmp_eq_4(i32 %x, i32 %y) {
233233
; CHECK-LABEL: define i1 @scmp_eq_4(
234234
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
235-
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[X]], i32 [[Y]])
236-
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 4
237-
; CHECK-NEXT: ret i1 [[TMP2]]
235+
; CHECK-NEXT: ret i1 false
238236
;
239237
%1 = call i8 @llvm.scmp(i32 %x, i32 %y)
240238
%2 = icmp eq i8 %1, 4
@@ -244,9 +242,7 @@ define i1 @scmp_eq_4(i32 %x, i32 %y) {
244242
define i1 @ucmp_ne_negative_2(i32 %x, i32 %y) {
245243
; CHECK-LABEL: define i1 @ucmp_ne_negative_2(
246244
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
247-
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[X]], i32 [[Y]])
248-
; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], -2
249-
; CHECK-NEXT: ret i1 [[TMP2]]
245+
; CHECK-NEXT: ret i1 true
250246
;
251247
%1 = call i8 @llvm.ucmp(i32 %x, i32 %y)
252248
%2 = icmp ne i8 %1, -2

0 commit comments

Comments
 (0)