ret i1 %res
}
-define i1 @intrinsic_range(i16 %x) {
-; CHECK-LABEL: @intrinsic_range(
+define i1 @ctlz_with_range_metadata(i16 %x) {
+; CHECK-LABEL: @ctlz_with_range_metadata(
; CHECK-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range [[RNG5:![0-9]+]]
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i16 [[CTLZ]] to i8
; CHECK-NEXT: ret i1 true
ret i1 %res
}
-define i1 @supported_intrinsic_range(i16 %x) {
-; CHECK-LABEL: @supported_intrinsic_range(
+define i1 @abs_with_range_metadata(i16 %x) {
+; CHECK-LABEL: @abs_with_range_metadata(
; CHECK-NEXT: [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[X:%.*]], i1 false), !range [[RNG5]]
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i16 [[ABS]] to i8
; CHECK-NEXT: ret i1 true
ret i1 %res
}
+define i1 @ctlz_fold(i16 %x) {
+; CHECK-LABEL: @ctlz_fold(
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 256
+; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK: if:
+; CHECK-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X]], i1 false)
+; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTLZ]], 8
+; CHECK-NEXT: ret i1 [[RES]]
+; CHECK: else:
+; CHECK-NEXT: [[CTLZ2:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X]], i1 false)
+; CHECK-NEXT: [[RES2:%.*]] = icmp ult i16 [[CTLZ2]], 8
+; CHECK-NEXT: ret i1 [[RES2]]
+;
+ %cmp = icmp ult i16 %x, 256
+ br i1 %cmp, label %if, label %else
+
+if:
+ %ctlz = call i16 @llvm.ctlz.i16(i16 %x, i1 false)
+ %res = icmp uge i16 %ctlz, 8
+ ret i1 %res
+
+else:
+ %ctlz2 = call i16 @llvm.ctlz.i16(i16 %x, i1 false)
+ %res2 = icmp ult i16 %ctlz2, 8
+ ret i1 %res2
+}
+
+define i1 @ctlz_nofold(i16 %x) {
+; CHECK-LABEL: @ctlz_nofold(
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 256
+; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK: if:
+; CHECK-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X]], i1 false)
+; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTLZ]], 9
+; CHECK-NEXT: ret i1 [[RES]]
+; CHECK: else:
+; CHECK-NEXT: [[CTLZ2:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X]], i1 false)
+; CHECK-NEXT: [[RES2:%.*]] = icmp ult i16 [[CTLZ2]], 7
+; CHECK-NEXT: ret i1 [[RES2]]
+;
+ %cmp = icmp ult i16 %x, 256
+ br i1 %cmp, label %if, label %else
+
+if:
+ %ctlz = call i16 @llvm.ctlz.i16(i16 %x, i1 false)
+ %res = icmp uge i16 %ctlz, 9
+ ret i1 %res
+
+else:
+ %ctlz2 = call i16 @llvm.ctlz.i16(i16 %x, i1 false)
+ %res2 = icmp ult i16 %ctlz2, 7
+ ret i1 %res2
+}
+
declare i16 @llvm.ctlz.i16(i16, i1)
declare i16 @llvm.abs.i16(i16, i1)
declare void @llvm.assume(i1)