Skip to content

Commit ffec315

Browse files
authored
[InstSimplify] Provide information about the range of possible values that ucmp/scmp can return (#96410)
This makes it possible to fold dumb comparisons like `ucmp(x, y) == 7`.
1 parent 5997e7d commit ffec315

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
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(Width, 2));
93969400
default:
93979401
break;
93989402
}

llvm/test/Transforms/InstSimplify/uscmp.ll

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,26 @@ define <4 x i8> @ucmp_with_addition_vec(<4 x i32> %x) {
229229
ret <4 x i8> %2
230230
}
231231

232+
define i1 @scmp_eq_4(i32 %x, i32 %y) {
233+
; CHECK-LABEL: define i1 @scmp_eq_4(
234+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
235+
; CHECK-NEXT: ret i1 false
236+
;
237+
%1 = call i8 @llvm.scmp(i32 %x, i32 %y)
238+
%2 = icmp eq i8 %1, 4
239+
ret i1 %2
240+
}
241+
242+
define i1 @ucmp_ne_negative_2(i32 %x, i32 %y) {
243+
; CHECK-LABEL: define i1 @ucmp_ne_negative_2(
244+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
245+
; CHECK-NEXT: ret i1 true
246+
;
247+
%1 = call i8 @llvm.ucmp(i32 %x, i32 %y)
248+
%2 = icmp ne i8 %1, -2
249+
ret i1 %2
250+
}
251+
232252
; Negative case: mismatched signedness of predicates
233253
define i8 @scmp_known_ugt(i32 %x, i32 %y) {
234254
; CHECK-LABEL: define i8 @scmp_known_ugt(

0 commit comments

Comments
 (0)