389 lines
14 KiB
LLVM
389 lines
14 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
|
|
; RUN: opt -p constraint-elimination -S %s | FileCheck %s
|
|
|
|
declare void @llvm.assume(i1)
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_i64(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_i64(
|
|
; CHECK-SAME: i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i64 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i64 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i64 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i64 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i64 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i64 %b, %a
|
|
%cmp.add = icmp ult i64 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%t = icmp ult i64 %a, %c
|
|
ret i1 %t
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_1(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_1(
|
|
; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%t = icmp ult i16 %a, %c
|
|
ret i1 %t
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_2(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_2(
|
|
; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%t = icmp ult i16 %b, %c
|
|
ret i1 %t
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_3(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_3(
|
|
; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%f = icmp uge i16 %a, %c
|
|
ret i1 %f
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_4(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_4(
|
|
; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%f = icmp uge i16 %b, %c
|
|
ret i1 %f
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_5(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_5(
|
|
; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i16 [[A]], 10
|
|
; CHECK-NEXT: ret i1 [[CMP]]
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%cmp = icmp uge i16 %a, 10
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_args_ult_6(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_6(
|
|
; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[A]], [[B]]
|
|
; CHECK-NEXT: ret i1 [[CMP]]
|
|
;
|
|
entry:
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%cmp = icmp ult i16 %a, %b
|
|
ret i1 %cmp
|
|
}
|
|
|
|
|
|
declare i16 @get()
|
|
|
|
define i1 @addition_with_extra_facts_and_return_value_ult_1() {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_return_value_ult_1() {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[B:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[C:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
entry:
|
|
%a = call i16 @get()
|
|
%b = call i16 @get()
|
|
%c = call i16 @get()
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%t = icmp ult i16 %a, %c
|
|
ret i1 %t
|
|
}
|
|
|
|
define i1 @addition_with_extra_facts_and_return_value_ult_2() {
|
|
; CHECK-LABEL: define i1 @addition_with_extra_facts_and_return_value_ult_2() {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[B:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[C:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_A]])
|
|
; CHECK-NEXT: [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_B]])
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
entry:
|
|
%a = call i16 @get()
|
|
%b = call i16 @get()
|
|
%c = call i16 @get()
|
|
%cmp.a = icmp ule i16 %a, 2048
|
|
call void @llvm.assume(i1 %cmp.a)
|
|
%cmp.b = icmp ule i16 %b, 1024
|
|
call void @llvm.assume(i1 %cmp.b)
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%f = icmp uge i16 %a, %c
|
|
ret i1 %f
|
|
}
|
|
|
|
define i1 @addition_no_extra_facts_with_return_value_ult_1() {
|
|
; CHECK-LABEL: define i1 @addition_no_extra_facts_with_return_value_ult_1() {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[B:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[C:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
entry:
|
|
%a = call i16 @get()
|
|
%b = call i16 @get()
|
|
%c = call i16 @get()
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%t = icmp ult i16 %a, %c
|
|
ret i1 %t
|
|
}
|
|
|
|
define i1 @addition_no_extra_facts_with_return_value_ult_2() {
|
|
; CHECK-LABEL: define i1 @addition_no_extra_facts_with_return_value_ult_2() {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[B:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[C:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
entry:
|
|
%a = call i16 @get()
|
|
%b = call i16 @get()
|
|
%c = call i16 @get()
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%f = icmp uge i16 %a, %c
|
|
ret i1 %f
|
|
}
|
|
|
|
define i1 @addition_no_extra_facts_with_return_value_ult_3() {
|
|
; CHECK-LABEL: define i1 @addition_no_extra_facts_with_return_value_ult_3() {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[A:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[B:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[C:%.*]] = call i16 @get()
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]
|
|
; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]])
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i16 [[A]], 9
|
|
; CHECK-NEXT: ret i1 [[CMP]]
|
|
;
|
|
entry:
|
|
%a = call i16 @get()
|
|
%b = call i16 @get()
|
|
%c = call i16 @get()
|
|
%add = add nuw nsw i16 %b, %a
|
|
%cmp.add = icmp ult i16 %add, %c
|
|
call void @llvm.assume(i1 %cmp.add)
|
|
%cmp = icmp uge i16 %a, 9
|
|
ret i1 %cmp
|
|
}
|
|
|
|
; Test for https://github.com/llvm/llvm-project/issues/63490.
|
|
define i1 @assume_x_ugt_y_plus_y_via_shl_eq(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_shl_eq(
|
|
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
|
|
; CHECK-NEXT: [[S:%.*]] = shl nuw i8 [[Y]], 1
|
|
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]
|
|
; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]])
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%s = shl nuw i8 %y, 1
|
|
%c.1 = icmp ugt i8 %x, %s
|
|
tail call void @llvm.assume(i1 %c.1)
|
|
%c.2 = icmp eq i8 %x, %y
|
|
ret i1 %c.2
|
|
}
|
|
|
|
define i1 @assume_x_ugt_y_plus_y_via_shl_eq_no_nuw(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_shl_eq_no_nuw(
|
|
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
|
|
; CHECK-NEXT: [[S:%.*]] = shl i8 [[Y]], 1
|
|
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]
|
|
; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]])
|
|
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: ret i1 [[C_2]]
|
|
;
|
|
%s = shl i8 %y, 1
|
|
%c.1 = icmp ugt i8 %x, %s
|
|
tail call void @llvm.assume(i1 %c.1)
|
|
%c.2 = icmp eq i8 %x, %y
|
|
ret i1 %c.2
|
|
}
|
|
|
|
define i1 @assume_x_ugt_y_plus_y_via_add_eq(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_add_eq(
|
|
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
|
|
; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[Y]], [[Y]]
|
|
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]
|
|
; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]])
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%s = add nuw i8 %y, %y
|
|
%c.1 = icmp ugt i8 %x, %s
|
|
tail call void @llvm.assume(i1 %c.1)
|
|
%c.2 = icmp eq i8 %x, %y
|
|
ret i1 %c.2
|
|
}
|
|
|
|
define i1 @assume_x_ugt_y_plus_y_via_add_eq_no_nuw(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_add_eq_no_nuw(
|
|
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
|
|
; CHECK-NEXT: [[S:%.*]] = add i8 [[Y]], [[Y]]
|
|
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]
|
|
; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]])
|
|
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X]], [[Y]]
|
|
; CHECK-NEXT: ret i1 [[C_2]]
|
|
;
|
|
%s = add i8 %y, %y
|
|
%c.1 = icmp ugt i8 %x, %s
|
|
tail call void @llvm.assume(i1 %c.1)
|
|
%c.2 = icmp eq i8 %x, %y
|
|
ret i1 %c.2
|
|
}
|
|
|
|
define i1 @assume_x_ugt_y_plus_y_via_shl_ne(i8 %x, i8 %y) {
|
|
; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_shl_ne(
|
|
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
|
|
; CHECK-NEXT: [[S:%.*]] = shl nuw i8 [[Y]], 1
|
|
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]
|
|
; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
%s = shl nuw i8 %y, 1
|
|
%c.1 = icmp ugt i8 %x, %s
|
|
tail call void @llvm.assume(i1 %c.1)
|
|
%c.2 = icmp ne i8 %x, %y
|
|
ret i1 %c.2
|
|
}
|