@@ -1096,6 +1096,62 @@ define float @clamp_fabs_is_is_ole_smallest_normal_to_0(float %arg) {
1096
1096
ret float %select
1097
1097
}
1098
1098
1099
+ define float @clamp_fabs_oeq_smallest_normal_to_zero (float %arg ) {
1100
+ ; CHECK-LABEL: define float @clamp_fabs_oeq_smallest_normal_to_zero(
1101
+ ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR2]] {
1102
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
1103
+ ; CHECK-NEXT: [[IS_OEQ_SMALLEST_NORMAL:%.*]] = fcmp oeq float [[FABS_ARG]], 0x3810000000000000
1104
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[IS_OEQ_SMALLEST_NORMAL]], float 0.000000e+00, float [[ARG]]
1105
+ ; CHECK-NEXT: ret float [[SELECT]]
1106
+ ;
1107
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
1108
+ %is.oeq.smallest.normal = fcmp oeq float %fabs.arg , 0x3810000000000000
1109
+ %select = select i1 %is.oeq.smallest.normal , float 0 .0 , float %arg
1110
+ ret float %select
1111
+ }
1112
+
1113
+ define float @clamp_fabs_one_smallest_normal_to_zero (float %arg ) {
1114
+ ; CHECK-LABEL: define float @clamp_fabs_one_smallest_normal_to_zero(
1115
+ ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR2]] {
1116
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
1117
+ ; CHECK-NEXT: [[IS_ONE_SMALLEST_NORMAL:%.*]] = fcmp one float [[FABS_ARG]], 0x3810000000000000
1118
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[IS_ONE_SMALLEST_NORMAL]], float 0.000000e+00, float [[ARG]]
1119
+ ; CHECK-NEXT: ret float [[SELECT]]
1120
+ ;
1121
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
1122
+ %is.one.smallest.normal = fcmp one float %fabs.arg , 0x3810000000000000
1123
+ %select = select i1 %is.one.smallest.normal , float 0 .0 , float %arg
1124
+ ret float %select
1125
+ }
1126
+
1127
+ define float @clamp_fabs_ueq_smallest_normal_to_zero (float %arg ) {
1128
+ ; CHECK-LABEL: define float @clamp_fabs_ueq_smallest_normal_to_zero(
1129
+ ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR2]] {
1130
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
1131
+ ; CHECK-NEXT: [[IS_UEQ_SMALLEST_NORMAL:%.*]] = fcmp ueq float [[FABS_ARG]], 0x3810000000000000
1132
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[IS_UEQ_SMALLEST_NORMAL]], float 0.000000e+00, float [[ARG]]
1133
+ ; CHECK-NEXT: ret float [[SELECT]]
1134
+ ;
1135
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
1136
+ %is.ueq.smallest.normal = fcmp ueq float %fabs.arg , 0x3810000000000000
1137
+ %select = select i1 %is.ueq.smallest.normal , float 0 .0 , float %arg
1138
+ ret float %select
1139
+ }
1140
+
1141
+ define float @clamp_fabs_une_smallest_normal_to_zero (float %arg ) {
1142
+ ; CHECK-LABEL: define float @clamp_fabs_une_smallest_normal_to_zero(
1143
+ ; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR2]] {
1144
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
1145
+ ; CHECK-NEXT: [[IS_UNE_SMALLEST_NORMAL:%.*]] = fcmp une float [[FABS_ARG]], 0x3810000000000000
1146
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[IS_UNE_SMALLEST_NORMAL]], float 0.000000e+00, float [[ARG]]
1147
+ ; CHECK-NEXT: ret float [[SELECT]]
1148
+ ;
1149
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
1150
+ %is.une.smallest.normal = fcmp une float %fabs.arg , 0x3810000000000000
1151
+ %select = select i1 %is.une.smallest.normal , float 0 .0 , float %arg
1152
+ ret float %select
1153
+ }
1154
+
1099
1155
;---------------------------------------------------------------------
1100
1156
; compare fabs to negative normal
1101
1157
;---------------------------------------------------------------------
@@ -2167,5 +2223,177 @@ define float @ret_assumed_uge_known_negative(float %arg, float %unknown) {
2167
2223
ret float %arg
2168
2224
}
2169
2225
2226
+ ;---------------------------------------------------------------------
2227
+ ; assume compare to smallest normal
2228
+ ;---------------------------------------------------------------------
2229
+
2230
+ define float @assume_oeq_smallest_normal (float %arg ) {
2231
+ ; CHECK-LABEL: define float @assume_oeq_smallest_normal(
2232
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2233
+ ; CHECK-NEXT: [[IS_OEQ_SMALLEST_NORMAL:%.*]] = fcmp oeq float [[ARG]], 0x3810000000000000
2234
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_OEQ_SMALLEST_NORMAL]]) #[[ATTR5]]
2235
+ ; CHECK-NEXT: ret float [[ARG]]
2236
+ ;
2237
+ %is.oeq.smallest.normal = fcmp oeq float %arg , 0x3810000000000000
2238
+ call void @llvm.assume (i1 %is.oeq.smallest.normal )
2239
+ ret float %arg
2240
+ }
2241
+
2242
+ define float @assume_one_smallest_normal (float %arg ) {
2243
+ ; CHECK-LABEL: define float @assume_one_smallest_normal(
2244
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2245
+ ; CHECK-NEXT: [[IS_ONE_SMALLEST_NORMAL:%.*]] = fcmp one float [[ARG]], 0x3810000000000000
2246
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_ONE_SMALLEST_NORMAL]]) #[[ATTR5]]
2247
+ ; CHECK-NEXT: ret float [[ARG]]
2248
+ ;
2249
+ %is.one.smallest.normal = fcmp one float %arg , 0x3810000000000000
2250
+ call void @llvm.assume (i1 %is.one.smallest.normal )
2251
+ ret float %arg
2252
+ }
2253
+
2254
+ define float @assume_ueq_smallest_normal (float %arg ) {
2255
+ ; CHECK-LABEL: define float @assume_ueq_smallest_normal(
2256
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2257
+ ; CHECK-NEXT: [[IS_UEQ_SMALLEST_NORMAL:%.*]] = fcmp ueq float [[ARG]], 0x3810000000000000
2258
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_UEQ_SMALLEST_NORMAL]]) #[[ATTR5]]
2259
+ ; CHECK-NEXT: ret float [[ARG]]
2260
+ ;
2261
+ %is.ueq.smallest.normal = fcmp ueq float %arg , 0x3810000000000000
2262
+ call void @llvm.assume (i1 %is.ueq.smallest.normal )
2263
+ ret float %arg
2264
+ }
2265
+
2266
+ define float @assume_une_smallest_normal (float %arg ) {
2267
+ ; CHECK-LABEL: define float @assume_une_smallest_normal(
2268
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2269
+ ; CHECK-NEXT: [[IS_UNE_SMALLEST_NORMAL:%.*]] = fcmp une float [[ARG]], 0x3810000000000000
2270
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_UNE_SMALLEST_NORMAL]]) #[[ATTR5]]
2271
+ ; CHECK-NEXT: ret float [[ARG]]
2272
+ ;
2273
+ %is.une.smallest.normal = fcmp une float %arg , 0x3810000000000000
2274
+ call void @llvm.assume (i1 %is.une.smallest.normal )
2275
+ ret float %arg
2276
+ }
2277
+
2278
+ define float @assume_ord_smallest_normal (float %arg ) {
2279
+ ; CHECK-LABEL: define nofpclass(nan) float @assume_ord_smallest_normal(
2280
+ ; CHECK-SAME: float returned nofpclass(nan) [[ARG:%.*]]) #[[ATTR3]] {
2281
+ ; CHECK-NEXT: [[IS_ORD_SMALLEST_NORMAL:%.*]] = fcmp ord float [[ARG]], 0x3810000000000000
2282
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_ORD_SMALLEST_NORMAL]]) #[[ATTR5]]
2283
+ ; CHECK-NEXT: ret float [[ARG]]
2284
+ ;
2285
+ %is.ord.smallest.normal = fcmp ord float %arg , 0x3810000000000000
2286
+ call void @llvm.assume (i1 %is.ord.smallest.normal )
2287
+ ret float %arg
2288
+ }
2289
+
2290
+ define float @assume_uno_smallest_normal (float %arg ) {
2291
+ ; CHECK-LABEL: define nofpclass(inf zero sub norm) float @assume_uno_smallest_normal(
2292
+ ; CHECK-SAME: float returned nofpclass(inf zero sub norm) [[ARG:%.*]]) #[[ATTR3]] {
2293
+ ; CHECK-NEXT: [[IS_UNO_SMALLEST_NORMAL:%.*]] = fcmp uno float [[ARG]], 0x3810000000000000
2294
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_UNO_SMALLEST_NORMAL]]) #[[ATTR5]]
2295
+ ; CHECK-NEXT: ret float [[ARG]]
2296
+ ;
2297
+ %is.uno.smallest.normal = fcmp uno float %arg , 0x3810000000000000
2298
+ call void @llvm.assume (i1 %is.uno.smallest.normal )
2299
+ ret float %arg
2300
+ }
2301
+
2302
+ define float @assume_fabs_oeq_smallest_normal (float %arg ) {
2303
+ ; CHECK-LABEL: define float @assume_fabs_oeq_smallest_normal(
2304
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2305
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
2306
+ ; CHECK-NEXT: [[IS_OEQ_SMALLEST_NORMAL:%.*]] = fcmp oeq float [[FABS_ARG]], 0x3810000000000000
2307
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_OEQ_SMALLEST_NORMAL]]) #[[ATTR5]]
2308
+ ; CHECK-NEXT: ret float [[ARG]]
2309
+ ;
2310
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
2311
+ %is.oeq.smallest.normal = fcmp oeq float %fabs.arg , 0x3810000000000000
2312
+ call void @llvm.assume (i1 %is.oeq.smallest.normal )
2313
+ ret float %arg
2314
+ }
2315
+
2316
+ define float @assume_fabs_one_smallest_normal (float %arg ) {
2317
+ ; CHECK-LABEL: define float @assume_fabs_one_smallest_normal(
2318
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2319
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
2320
+ ; CHECK-NEXT: [[IS_ONE_SMALLEST_NORMAL:%.*]] = fcmp one float [[FABS_ARG]], 0x3810000000000000
2321
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_ONE_SMALLEST_NORMAL]]) #[[ATTR5]]
2322
+ ; CHECK-NEXT: ret float [[ARG]]
2323
+ ;
2324
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
2325
+ %is.one.smallest.normal = fcmp one float %fabs.arg , 0x3810000000000000
2326
+ call void @llvm.assume (i1 %is.one.smallest.normal )
2327
+ ret float %arg
2328
+ }
2329
+
2330
+ define float @assume_fabs_ueq_smallest_normal (float %arg ) {
2331
+ ; CHECK-LABEL: define float @assume_fabs_ueq_smallest_normal(
2332
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2333
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
2334
+ ; CHECK-NEXT: [[IS_UEQ_SMALLEST_NORMAL:%.*]] = fcmp ueq float [[FABS_ARG]], 0x3810000000000000
2335
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_UEQ_SMALLEST_NORMAL]]) #[[ATTR5]]
2336
+ ; CHECK-NEXT: ret float [[ARG]]
2337
+ ;
2338
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
2339
+ %is.ueq.smallest.normal = fcmp ueq float %fabs.arg , 0x3810000000000000
2340
+ call void @llvm.assume (i1 %is.ueq.smallest.normal )
2341
+ ret float %arg
2342
+ }
2343
+
2344
+ define float @assume_fabs_une_smallest_normal (float %arg ) {
2345
+ ; CHECK-LABEL: define float @assume_fabs_une_smallest_normal(
2346
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2347
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
2348
+ ; CHECK-NEXT: [[IS_UNE_SMALLEST_NORMAL:%.*]] = fcmp une float [[FABS_ARG]], 0x3810000000000000
2349
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_UNE_SMALLEST_NORMAL]]) #[[ATTR5]]
2350
+ ; CHECK-NEXT: ret float [[ARG]]
2351
+ ;
2352
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
2353
+ %is.une.smallest.normal = fcmp une float %fabs.arg , 0x3810000000000000
2354
+ call void @llvm.assume (i1 %is.une.smallest.normal )
2355
+ ret float %arg
2356
+ }
2357
+
2358
+ define float @assume_fabs_ord_smallest_normal (float %arg ) {
2359
+ ; CHECK-LABEL: define float @assume_fabs_ord_smallest_normal(
2360
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2361
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
2362
+ ; CHECK-NEXT: [[IS_ORD_SMALLEST_NORMAL:%.*]] = fcmp ord float [[FABS_ARG]], 0x3810000000000000
2363
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_ORD_SMALLEST_NORMAL]]) #[[ATTR5]]
2364
+ ; CHECK-NEXT: ret float [[ARG]]
2365
+ ;
2366
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
2367
+ %is.ord.smallest.normal = fcmp ord float %fabs.arg , 0x3810000000000000
2368
+ call void @llvm.assume (i1 %is.ord.smallest.normal )
2369
+ ret float %arg
2370
+ }
2371
+
2372
+ define float @assume_fabs_uno_smallest_normal (float %arg ) {
2373
+ ; CHECK-LABEL: define float @assume_fabs_uno_smallest_normal(
2374
+ ; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2375
+ ; CHECK-NEXT: [[FABS_ARG:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
2376
+ ; CHECK-NEXT: [[IS_UNO_SMALLEST_NORMAL:%.*]] = fcmp uno float [[FABS_ARG]], 0x3810000000000000
2377
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_UNO_SMALLEST_NORMAL]]) #[[ATTR5]]
2378
+ ; CHECK-NEXT: ret float [[ARG]]
2379
+ ;
2380
+ %fabs.arg = call float @llvm.fabs.f32 (float %arg )
2381
+ %is.uno.smallest.normal = fcmp uno float %fabs.arg , 0x3810000000000000
2382
+ call void @llvm.assume (i1 %is.uno.smallest.normal )
2383
+ ret float %arg
2384
+ }
2385
+
2386
+ define float @assume_oeq_smallest_normal_known_pos (float nofpclass(ninf nsub nnorm nzero) %arg ) {
2387
+ ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @assume_oeq_smallest_normal_known_pos(
2388
+ ; CHECK-SAME: float returned nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR3]] {
2389
+ ; CHECK-NEXT: [[IS_OEQ_SMALLEST_NORMAL:%.*]] = fcmp oeq float [[ARG]], 0x3810000000000000
2390
+ ; CHECK-NEXT: call void @llvm.assume(i1 noundef [[IS_OEQ_SMALLEST_NORMAL]]) #[[ATTR5]]
2391
+ ; CHECK-NEXT: ret float [[ARG]]
2392
+ ;
2393
+ %is.oeq.smallest.normal = fcmp oeq float %arg , 0x3810000000000000
2394
+ call void @llvm.assume (i1 %is.oeq.smallest.normal )
2395
+ ret float %arg
2396
+ }
2397
+
2170
2398
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
2171
2399
; TUNIT: {{.*}}
0 commit comments