[llvm] [LVI] Support no constant range of cast and freeze value in getEdgeValueLocal. (PR #157614)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 9 12:20:12 PDT 2025
================
@@ -1235,6 +1235,126 @@ define i1 @neg_icmp_eq_range_call() {
ret i1 %cmp
}
+define i16 @return_range_for_edge_value_zext(i8 %a) {
+; CHECK-LABEL: define range(i16 0, 98) i16 @return_range_for_edge_value_zext(
+; CHECK-SAME: i8 [[A:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[B:%.*]] = zext i8 [[A]] to i16
+; CHECK-NEXT: br label %[[DISPATCH:.*]]
+; CHECK: [[DISPATCH]]:
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A]], 98
+; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
+; CHECK: [[TARGET]]:
+; CHECK-NEXT: ret i16 [[B]]
+;
+entry:
+ %b = zext i8 %a to i16
+ br label %dispatch
+
+dispatch:
+ %cmp = icmp ult i8 %a, 98
+ br i1 %cmp, label %target, label %dispatch
+
+target:
+ ret i16 %b
+}
+
+define i16 @return_range_for_edge_value_sext(i8 %a) {
+; CHECK-LABEL: define range(i16 0, 98) i16 @return_range_for_edge_value_sext(
+; CHECK-SAME: i8 [[A:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[B:%.*]] = sext i8 [[A]] to i16
+; CHECK-NEXT: br label %[[DISPATCH:.*]]
+; CHECK: [[DISPATCH]]:
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A]], 98
+; CHECK-NEXT: br i1 [[CMP]], label %[[TARGET:.*]], label %[[DISPATCH]]
+; CHECK: [[TARGET]]:
+; CHECK-NEXT: ret i16 [[B]]
+;
+entry:
+ %b = sext i8 %a to i16
+ br label %dispatch
+
+dispatch:
+ %cmp = icmp ult i8 %a, 98
----------------
nikic wrote:
Use a constant that shows the distinction between zext/sext?
https://github.com/llvm/llvm-project/pull/157614
More information about the llvm-commits
mailing list