@@ -8,11 +8,7 @@ declare void @use.i64i1({i64, i1} %x)
8
8
define i1 @umul_greater_than_or_overflow_const (i64 %in ) {
9
9
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const(
10
10
; CHECK-SAME: i64 [[IN:%.*]]) {
11
- ; CHECK-NEXT: [[TMP2:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[IN]], i64 168)
12
- ; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0
13
- ; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1
14
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt i64 [[TMP3]], -16
15
- ; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
11
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i64 [[IN]], 109802048057794950
16
12
; CHECK-NEXT: ret i1 [[TMP6]]
17
13
;
18
14
%mwo = call { i64 , i1 } @llvm.umul.with.overflow.i64 (i64 %in , i64 168 )
@@ -26,11 +22,7 @@ define i1 @umul_greater_than_or_overflow_const(i64 %in) {
26
22
define i1 @umul_greater_than_or_overflow_const_i8 (i8 %in ) {
27
23
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const_i8(
28
24
; CHECK-SAME: i8 [[IN:%.*]]) {
29
- ; CHECK-NEXT: [[TMP2:%.*]] = call { i8, i1 } @llvm.umul.with.overflow.i8(i8 [[IN]], i8 24)
30
- ; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i8, i1 } [[TMP2]], 0
31
- ; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i8, i1 } [[TMP2]], 1
32
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt i8 [[TMP3]], -16
33
- ; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP4]], [[TMP5]]
25
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[IN]], 10
34
26
; CHECK-NEXT: ret i1 [[TMP6]]
35
27
;
36
28
%mwo = call { i8 , i1 } @llvm.umul.with.overflow.i8 (i8 %in , i8 24 )
@@ -44,11 +36,7 @@ define i1 @umul_greater_than_or_overflow_const_i8(i8 %in) {
44
36
define i1 @umul_greater_than_or_overflow_const_commuted (i64 %in ) {
45
37
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const_commuted(
46
38
; CHECK-SAME: i64 [[IN:%.*]]) {
47
- ; CHECK-NEXT: [[TMP2:%.*]] = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[IN]], i64 48)
48
- ; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0
49
- ; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1
50
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt i64 [[TMP3]], 9223372036854775800
51
- ; CHECK-NEXT: [[TMP6:%.*]] = or i1 [[TMP5]], [[TMP4]]
39
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i64 [[IN]], 192153584101141162
52
40
; CHECK-NEXT: ret i1 [[TMP6]]
53
41
;
54
42
%mwo = tail call { i64 , i1 } @llvm.umul.with.overflow.i64 (i64 %in , i64 48 )
@@ -62,11 +50,7 @@ define i1 @umul_greater_than_or_overflow_const_commuted(i64 %in) {
62
50
define i1 @umul_greater_than_or_overflow_const_disjoint (i64 %in ) {
63
51
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const_disjoint(
64
52
; CHECK-SAME: i64 [[IN:%.*]]) {
65
- ; CHECK-NEXT: [[TMP2:%.*]] = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[IN]], i64 40)
66
- ; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0
67
- ; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1
68
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt i64 [[TMP3]], 9223372036854775800
69
- ; CHECK-NEXT: [[TMP6:%.*]] = or disjoint i1 [[TMP4]], [[TMP5]]
53
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i64 [[IN]], 230584300921369395
70
54
; CHECK-NEXT: ret i1 [[TMP6]]
71
55
;
72
56
%mwo = tail call { i64 , i1 } @llvm.umul.with.overflow.i64 (i64 %in , i64 40 )
@@ -80,11 +64,8 @@ define i1 @umul_greater_than_or_overflow_const_disjoint(i64 %in) {
80
64
define i1 @umul_greater_than_or_overflow_const_multiuse_mul (i64 %in ) {
81
65
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const_multiuse_mul(
82
66
; CHECK-SAME: i64 [[IN:%.*]]) {
83
- ; CHECK-NEXT: [[MWO:%.*]] = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[IN]], i64 48)
84
- ; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i64, i1 } [[MWO]], 0
85
- ; CHECK-NEXT: [[OVF:%.*]] = extractvalue { i64, i1 } [[MWO]], 1
86
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[MUL]], 9223372036854775800
87
- ; CHECK-NEXT: [[RET:%.*]] = or i1 [[OVF]], [[CMP]]
67
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[IN]], 48
68
+ ; CHECK-NEXT: [[RET:%.*]] = icmp ugt i64 [[IN]], 192153584101141162
88
69
; CHECK-NEXT: tail call void @use.i64(i64 [[MUL]])
89
70
; CHECK-NEXT: ret i1 [[RET]]
90
71
;
@@ -100,11 +81,8 @@ define i1 @umul_greater_than_or_overflow_const_multiuse_mul(i64 %in) {
100
81
define i1 @umul_greater_than_or_overflow_const_multiuse_overflow (i64 %in ) {
101
82
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const_multiuse_overflow(
102
83
; CHECK-SAME: i64 [[IN:%.*]]) {
103
- ; CHECK-NEXT: [[MWO:%.*]] = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[IN]], i64 48)
104
- ; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i64, i1 } [[MWO]], 0
105
- ; CHECK-NEXT: [[OVF:%.*]] = extractvalue { i64, i1 } [[MWO]], 1
106
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[MUL]], 9223372036854775800
107
- ; CHECK-NEXT: [[RET:%.*]] = or i1 [[OVF]], [[CMP]]
84
+ ; CHECK-NEXT: [[OVF:%.*]] = icmp ugt i64 [[IN]], 384307168202282325
85
+ ; CHECK-NEXT: [[RET:%.*]] = icmp ugt i64 [[IN]], 192153584101141162
108
86
; CHECK-NEXT: tail call void @use.i1(i1 [[OVF]])
109
87
; CHECK-NEXT: ret i1 [[RET]]
110
88
;
@@ -121,10 +99,7 @@ define i1 @umul_greater_than_or_overflow_const_multiuse_umul_call(i64 %in) {
121
99
; CHECK-LABEL: define i1 @umul_greater_than_or_overflow_const_multiuse_umul_call(
122
100
; CHECK-SAME: i64 [[IN:%.*]]) {
123
101
; CHECK-NEXT: [[MWO:%.*]] = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[IN]], i64 48)
124
- ; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i64, i1 } [[MWO]], 0
125
- ; CHECK-NEXT: [[OVF:%.*]] = extractvalue { i64, i1 } [[MWO]], 1
126
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[MUL]], 9223372036854775800
127
- ; CHECK-NEXT: [[RET:%.*]] = or i1 [[OVF]], [[CMP]]
102
+ ; CHECK-NEXT: [[RET:%.*]] = icmp ugt i64 [[IN]], 192153584101141162
128
103
; CHECK-NEXT: tail call void @use.i64i1({ i64, i1 } [[MWO]])
129
104
; CHECK-NEXT: ret i1 [[RET]]
130
105
;
@@ -140,11 +115,7 @@ define i1 @umul_greater_than_or_overflow_const_multiuse_umul_call(i64 %in) {
140
115
define <2 x i1 > @umul_greater_than_or_overflow_const_vector_splat (<2 x i64 > %in ) {
141
116
; CHECK-LABEL: define <2 x i1> @umul_greater_than_or_overflow_const_vector_splat(
142
117
; CHECK-SAME: <2 x i64> [[IN:%.*]]) {
143
- ; CHECK-NEXT: [[TMP2:%.*]] = tail call { <2 x i64>, <2 x i1> } @llvm.umul.with.overflow.v2i64(<2 x i64> [[IN]], <2 x i64> splat (i64 1424))
144
- ; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <2 x i64>, <2 x i1> } [[TMP2]], 0
145
- ; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { <2 x i64>, <2 x i1> } [[TMP2]], 1
146
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt <2 x i64> [[TMP3]], splat (i64 9223372036854775800)
147
- ; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i1> [[TMP4]], [[TMP5]]
118
+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt <2 x i64> [[IN]], splat (i64 6477087104532848)
148
119
; CHECK-NEXT: ret <2 x i1> [[TMP6]]
149
120
;
150
121
%mwo = tail call { <2 x i64 >, <2 x i1 > } @llvm.umul.with.overflow.v2i64 (<2 x i64 > %in , <2 x i64 > <i64 1424 , i64 1424 >)
0 commit comments