4
4
define i8 @add_and_sgt (i8 %x ) {
5
5
; CHECK-LABEL: define i8 @add_and_sgt(
6
6
; CHECK-SAME: i8 [[X:%.*]]) {
7
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16
8
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 8
9
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24
7
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
8
+ ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16
10
9
; CHECK-NEXT: ret i8 [[S]]
11
10
;
12
11
%add = add nsw i8 %x , 16
@@ -18,9 +17,8 @@ define i8 @add_and_sgt(i8 %x) {
18
17
define i8 @add_sgt_nuw (i8 %x ) {
19
18
; CHECK-LABEL: define i8 @add_sgt_nuw(
20
19
; CHECK-SAME: i8 [[X:%.*]]) {
21
- ; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[X]], 16
22
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 8
23
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24
20
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
21
+ ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16
24
22
; CHECK-NEXT: ret i8 [[S]]
25
23
;
26
24
%add = add nuw i8 %x , 16
@@ -32,9 +30,8 @@ define i8 @add_sgt_nuw(i8 %x) {
32
30
define i8 @sub_and_ugt (i8 %x ) {
33
31
; CHECK-LABEL: define i8 @sub_and_ugt(
34
32
; CHECK-SAME: i8 [[X:%.*]]) {
35
- ; CHECK-NEXT: [[SUB:%.*]] = add nsw i8 [[X]], -50
36
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 100
37
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 50, i8 [[SUB]]
33
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)
34
+ ; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -50
38
35
; CHECK-NEXT: ret i8 [[S]]
39
36
;
40
37
%sub = sub nsw i8 %x , 50
@@ -46,9 +43,8 @@ define i8 @sub_and_ugt(i8 %x) {
46
43
define i8 @sub_ugt_nuw_nsw (i8 %x ) {
47
44
; CHECK-LABEL: define i8 @sub_ugt_nuw_nsw(
48
45
; CHECK-SAME: i8 [[X:%.*]]) {
49
- ; CHECK-NEXT: [[SUB:%.*]] = add nsw i8 [[X]], -50
50
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 100
51
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 50, i8 [[SUB]]
46
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)
47
+ ; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -50
52
48
; CHECK-NEXT: ret i8 [[S]]
53
49
;
54
50
%sub = sub nuw nsw i8 %x , 50
@@ -60,9 +56,8 @@ define i8 @sub_ugt_nuw_nsw(i8 %x) {
60
56
define i8 @mul_and_ult (i8 %x ) {
61
57
; CHECK-LABEL: define i8 @mul_and_ult(
62
58
; CHECK-SAME: i8 [[X:%.*]]) {
63
- ; CHECK-NEXT: [[ADD:%.*]] = mul nsw i8 [[X]], 10
64
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 10
65
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 100, i8 [[ADD]]
59
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10)
60
+ ; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 10
66
61
; CHECK-NEXT: ret i8 [[S]]
67
62
;
68
63
%add = mul nsw i8 %x , 10
@@ -74,9 +69,8 @@ define i8 @mul_and_ult(i8 %x) {
74
69
define i8 @mul_ult_noflags (i8 %x ) {
75
70
; CHECK-LABEL: define i8 @mul_ult_noflags(
76
71
; CHECK-SAME: i8 [[X:%.*]]) {
77
- ; CHECK-NEXT: [[ADD:%.*]] = mul i8 [[X]], 10
78
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 10
79
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 100, i8 [[ADD]]
72
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10)
73
+ ; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 10
80
74
; CHECK-NEXT: ret i8 [[S]]
81
75
;
82
76
%add = mul i8 %x , 10
@@ -88,9 +82,8 @@ define i8 @mul_ult_noflags(i8 %x) {
88
82
define i8 @udiv_and_slt (i8 %x ) {
89
83
; CHECK-LABEL: define i8 @udiv_and_slt(
90
84
; CHECK-SAME: i8 [[X:%.*]]) {
91
- ; CHECK-NEXT: [[SUB:%.*]] = udiv i8 [[X]], 10
92
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X]], 100
93
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]]
85
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 100)
86
+ ; CHECK-NEXT: [[S:%.*]] = udiv i8 [[TMP1]], 10
94
87
; CHECK-NEXT: ret i8 [[S]]
95
88
;
96
89
%sub = udiv i8 %x , 10
@@ -102,9 +95,8 @@ define i8 @udiv_and_slt(i8 %x) {
102
95
define i8 @udiv_slt_exact (i8 %x ) {
103
96
; CHECK-LABEL: define i8 @udiv_slt_exact(
104
97
; CHECK-SAME: i8 [[X:%.*]]) {
105
- ; CHECK-NEXT: [[SUB:%.*]] = udiv exact i8 [[X]], 10
106
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X]], 100
107
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]]
98
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 100)
99
+ ; CHECK-NEXT: [[S:%.*]] = udiv i8 [[TMP1]], 10
108
100
; CHECK-NEXT: ret i8 [[S]]
109
101
;
110
102
%sub = udiv exact i8 %x , 10
@@ -116,9 +108,8 @@ define i8 @udiv_slt_exact(i8 %x) {
116
108
define i8 @canonicalize_icmp_operands (i8 %x ) {
117
109
; CHECK-LABEL: define i8 @canonicalize_icmp_operands(
118
110
; CHECK-SAME: i8 [[X:%.*]]) {
119
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 8
120
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 119
121
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 127, i8 [[ADD]]
111
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 119)
112
+ ; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], 8
122
113
; CHECK-NEXT: ret i8 [[S]]
123
114
;
124
115
%add = add nsw i8 %x , 8
@@ -133,10 +124,10 @@ declare void @use_byte(i8)
133
124
define i8 @multi_use_cond_and_sel (i8 %x ) {
134
125
; CHECK-LABEL: define i8 @multi_use_cond_and_sel(
135
126
; CHECK-SAME: i8 [[X:%.*]]) {
136
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16
137
127
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 8
138
128
; CHECK-NEXT: call void @use(i1 [[CMP]])
139
- ; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24
129
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
130
+ ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16
140
131
; CHECK-NEXT: call void @use_byte(i8 [[S]])
141
132
; CHECK-NEXT: ret i8 [[S]]
142
133
;
@@ -155,11 +146,9 @@ define void @rust_noop_loop() {
155
146
; CHECK: [[BB2_I]]:
156
147
; CHECK-NEXT: [[ITER_SROA_0_07:%.*]] = phi i32 [ 0, %[[START]] ], [ [[SPEC_SELECT5:%.*]], %[[BB2_I]] ]
157
148
; CHECK-NEXT: [[_0_I3_I:%.*]] = icmp sgt i32 [[ITER_SROA_0_07]], 99
158
- ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i32 [[ITER_SROA_0_07]], 1
159
- ; CHECK-NEXT: [[SPEC_SELECT5]] = select i1 [[_0_I3_I]], i32 100, i32 [[TMP0]]
160
- ; CHECK-NEXT: [[_0_I_NOT_I:%.*]] = icmp sgt i32 [[SPEC_SELECT5]], 100
161
- ; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[_0_I3_I]], i1 true, i1 [[_0_I_NOT_I]]
162
- ; CHECK-NEXT: br i1 [[OR_COND]], label %[[BASICBLOCK4:.*]], label %[[BB2_I]]
149
+ ; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.smin.i32(i32 [[ITER_SROA_0_07]], i32 99)
150
+ ; CHECK-NEXT: [[SPEC_SELECT5]] = add nsw i32 [[TMP0]], 1
151
+ ; CHECK-NEXT: br i1 [[_0_I3_I]], label %[[BASICBLOCK4:.*]], label %[[BB2_I]]
163
152
; CHECK: [[BASICBLOCK4]]:
164
153
; CHECK-NEXT: ret void
165
154
;
@@ -182,9 +171,8 @@ basicblock4:
182
171
define <2 x i8 > @add_non_splat_vector (<2 x i8 > %x ) {
183
172
; CHECK-LABEL: define <2 x i8> @add_non_splat_vector(
184
173
; CHECK-SAME: <2 x i8> [[X:%.*]]) {
185
- ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], <i8 1, i8 0>
186
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X]], <i8 0, i8 1>
187
- ; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> splat (i8 1)
174
+ ; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> <i8 0, i8 1>)
175
+ ; CHECK-NEXT: [[S:%.*]] = add nuw <2 x i8> [[TMP1]], <i8 1, i8 0>
188
176
; CHECK-NEXT: ret <2 x i8> [[S]]
189
177
;
190
178
%add = add <2 x i8 > %x , <i8 1 , i8 0 >
@@ -196,9 +184,8 @@ define <2 x i8> @add_non_splat_vector(<2 x i8> %x) {
196
184
define <2 x i8 > @or_splat_vector (<2 x i8 > %x ) {
197
185
; CHECK-LABEL: define <2 x i8> @or_splat_vector(
198
186
; CHECK-SAME: <2 x i8> [[X:%.*]]) {
199
- ; CHECK-NEXT: [[ADD:%.*]] = or <2 x i8> [[X]], splat (i8 1)
200
- ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt <2 x i8> [[X]], splat (i8 1)
201
- ; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[CMP_INV]], <2 x i8> splat (i8 1), <2 x i8> [[ADD]]
187
+ ; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> splat (i8 1))
188
+ ; CHECK-NEXT: [[S:%.*]] = or <2 x i8> [[TMP1]], splat (i8 1)
202
189
; CHECK-NEXT: ret <2 x i8> [[S]]
203
190
;
204
191
%add = or <2 x i8 > %x , <i8 1 , i8 1 >
0 commit comments