forked from OSchip/llvm-project
[InstCombine] Add tests for PR40846; NFC
The icmps are the same as the overflow result of the intrinsic. llvm-svn: 354760
This commit is contained in:
parent
bdefe47857
commit
b7918f3c14
|
@ -345,3 +345,126 @@ define { i32, i1 } @never_overflows_ssub_test0(i32 %a) {
|
|||
%x = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a, i32 0)
|
||||
ret { i32, i1 } %x
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ult_x(i32 %x, i32 %y, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ult_x(
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C]], [[X]]
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ult i32 %c, %x
|
||||
ret i1 %d
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ult_y(i32 %x, i32 %y, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ult_y(
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C]], [[Y]]
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ult i32 %c, %y
|
||||
ret i1 %d
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ugt_x(i32 %xx, i32 %y, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ugt_x(
|
||||
; CHECK-NEXT: [[X:%.*]] = urem i32 42, [[XX:%.*]]
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X]], i32 [[Y:%.*]])
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[X]], [[C]]
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%x = urem i32 42, %xx ; Thwart complexity-based canonicalization
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ugt i32 %x, %c
|
||||
ret i1 %d
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ugt_y(i32 %x, i32 %yy, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ugt_y(
|
||||
; CHECK-NEXT: [[Y:%.*]] = urem i32 42, [[YY:%.*]]
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y]])
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[Y]], [[C]]
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%y = urem i32 42, %yy ; Thwart complexity-based canonicalization
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ugt i32 %y, %c
|
||||
ret i1 %d
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ult_const(i32 %x, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ult_const(
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 42)
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C]], 42
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 42)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ult i32 %c, 42
|
||||
ret i1 %d
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ult_const_one(i32 %x, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ult_const_one(
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 1)
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp eq i32 [[C]], 0
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 1)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ult i32 %c, 1
|
||||
ret i1 %d
|
||||
}
|
||||
|
||||
define i1 @uadd_res_ult_const_minus_one(i32 %x, i1* %p) nounwind {
|
||||
; CHECK-LABEL: @uadd_res_ult_const_minus_one(
|
||||
; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 -1)
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
|
||||
; CHECK-NEXT: store i1 [[B]], i1* [[P:%.*]], align 1
|
||||
; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ne i32 [[C]], -1
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 -1)
|
||||
%b = extractvalue { i32, i1 } %a, 1
|
||||
store i1 %b, i1* %p
|
||||
%c = extractvalue { i32, i1 } %a, 0
|
||||
%d = icmp ult i32 %c, -1
|
||||
ret i1 %d
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue