@@ -5006,7 +5006,6 @@ define i1 @or_positive_sgt_zero_multi_use(i8 %a) {
5006
5006
ret i1 %cmp
5007
5007
}
5008
5008
5009
-
5010
5009
define i1 @disjoint_or_sgt_1 (i8 %a , i8 %b ) {
5011
5010
; CHECK-LABEL: @disjoint_or_sgt_1(
5012
5011
; CHECK-NEXT: [[B1:%.*]] = add nsw i8 [[B:%.*]], 2
@@ -5138,3 +5137,100 @@ entry:
5138
5137
%cmp = icmp eq i8 %add2 , %add1
5139
5138
ret i1 %cmp
5140
5139
}
5140
+
5141
+ define i1 @icmp_ugt_sdiv_by_constant (i64 %x ) {
5142
+ ; CHECK-LABEL: @icmp_ugt_sdiv_by_constant(
5143
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv exact i64 [[X:%.*]], 24
5144
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SDIV]], 384307168202282325
5145
+ ; CHECK-NEXT: ret i1 [[CMP]]
5146
+ ;
5147
+ %sdiv = sdiv exact i64 %x , 24
5148
+ %cmp = icmp ugt i64 %sdiv , 384307168202282325
5149
+ ret i1 %cmp
5150
+ }
5151
+
5152
+ define i1 @icmp_ult_sdiv_by_constant (i64 %x ) {
5153
+ ; CHECK-LABEL: @icmp_ult_sdiv_by_constant(
5154
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv exact i64 [[X:%.*]], 24
5155
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[SDIV]], 384307168202282326
5156
+ ; CHECK-NEXT: ret i1 [[CMP]]
5157
+ ;
5158
+ %sdiv = sdiv exact i64 %x , 24
5159
+ %cmp = icmp ult i64 %sdiv , 384307168202282326
5160
+ ret i1 %cmp
5161
+ }
5162
+
5163
+ ; TODO: This should be simplified to icmp slt i64 %x, 0
5164
+ define i1 @icmp_ugt_ashr_by_constant (i64 %x ) {
5165
+ ; CHECK-LABEL: @icmp_ugt_ashr_by_constant(
5166
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[X:%.*]], 9223372036854775804
5167
+ ; CHECK-NEXT: ret i1 [[CMP]]
5168
+ ;
5169
+ %sdiv = ashr exact i64 %x , 2
5170
+ %cmp = icmp ugt i64 %sdiv , 2305843009213693951
5171
+ ret i1 %cmp
5172
+ }
5173
+
5174
+ define i1 @icmp_ult_ashr_by_constant (i64 %x ) {
5175
+ ; CHECK-LABEL: @icmp_ult_ashr_by_constant(
5176
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[X:%.*]], -1
5177
+ ; CHECK-NEXT: ret i1 [[CMP]]
5178
+ ;
5179
+ %sdiv = ashr exact i64 %x , 2
5180
+ %cmp = icmp ult i64 %sdiv , 2305843009213693952
5181
+ ret i1 %cmp
5182
+ }
5183
+
5184
+ ; Negative tests
5185
+ define i1 @icmp_ugt_sdiv_by_constant_without_exact (i64 %x ) {
5186
+ ; CHECK-LABEL: @icmp_ugt_sdiv_by_constant_without_exact(
5187
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv i64 [[X:%.*]], 24
5188
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SDIV]], 384307168202282325
5189
+ ; CHECK-NEXT: ret i1 [[CMP]]
5190
+ ;
5191
+ %sdiv = sdiv i64 %x , 24
5192
+ %cmp = icmp ugt i64 %sdiv , 384307168202282325
5193
+ ret i1 %cmp
5194
+ }
5195
+
5196
+ define i1 @icmp_ugt_udiv_by_constant (i64 %x ) {
5197
+ ; CHECK-LABEL: @icmp_ugt_udiv_by_constant(
5198
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[X:%.*]], 9223372036854775800
5199
+ ; CHECK-NEXT: ret i1 [[CMP]]
5200
+ ;
5201
+ %sdiv = udiv exact i64 %x , 24
5202
+ %cmp = icmp ugt i64 %sdiv , 384307168202282325
5203
+ ret i1 %cmp
5204
+ }
5205
+
5206
+ define i1 @icmp_ne_sdiv_by_constant (i64 %x ) {
5207
+ ; CHECK-LABEL: @icmp_ne_sdiv_by_constant(
5208
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[X:%.*]], 9223372036854775800
5209
+ ; CHECK-NEXT: ret i1 [[CMP]]
5210
+ ;
5211
+ %sdiv = sdiv exact i64 %x , 24
5212
+ %cmp = icmp ne i64 %sdiv , 384307168202282325
5213
+ ret i1 %cmp
5214
+ }
5215
+
5216
+ define i1 @icmp_ugt_sdiv_by_constant_wrong_rhs (i64 %x ) {
5217
+ ; CHECK-LABEL: @icmp_ugt_sdiv_by_constant_wrong_rhs(
5218
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv exact i64 [[X:%.*]], 24
5219
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SDIV]], 384307168202282324
5220
+ ; CHECK-NEXT: ret i1 [[CMP]]
5221
+ ;
5222
+ %sdiv = sdiv exact i64 %x , 24
5223
+ %cmp = icmp ugt i64 %sdiv , 384307168202282324
5224
+ ret i1 %cmp
5225
+ }
5226
+
5227
+ define i1 @icmp_ugt_sdiv_by_negative_constant (i64 %x ) {
5228
+ ; CHECK-LABEL: @icmp_ugt_sdiv_by_negative_constant(
5229
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv i64 [[X:%.*]], -24
5230
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SDIV]], -384307168202282326
5231
+ ; CHECK-NEXT: ret i1 [[CMP]]
5232
+ ;
5233
+ %sdiv = sdiv i64 %x , -24
5234
+ %cmp = icmp ugt i64 %sdiv , -384307168202282326
5235
+ ret i1 %cmp
5236
+ }
0 commit comments