@@ -11,16 +11,17 @@ define double @is_profitable_f64_contract(ptr dereferenceable(8) %ptr_x, ptr der
11
11
; GFX-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
12
12
; GFX-NEXT: [[X:%.*]] = load double, ptr [[PTR_X]], align 8
13
13
; GFX-NEXT: [[A_1:%.*]] = load double, ptr [[PTR_A]], align 8
14
- ; GFX-NEXT: [[MUL:%.*]] = fmul contract double [[X]], [[A_1]]
15
14
; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
16
15
; GFX: [[COMMON_RET:.*]]:
17
16
; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
18
17
; GFX-NEXT: ret double [[COMMON_RET_OP]]
19
18
; GFX: [[IF_THEN]]:
19
+ ; GFX-NEXT: [[MUL:%.*]] = fmul contract double [[X]], [[A_1]]
20
20
; GFX-NEXT: [[ADD]] = fadd contract double 1.000000e+00, [[MUL]]
21
21
; GFX-NEXT: br label %[[COMMON_RET]]
22
22
; GFX: [[IF_ELSE]]:
23
- ; GFX-NEXT: [[SUB]] = fsub contract double [[MUL]], [[Y]]
23
+ ; GFX-NEXT: [[MUL1:%.*]] = fmul contract double [[X]], [[A_1]]
24
+ ; GFX-NEXT: [[SUB]] = fsub contract double [[MUL1]], [[Y]]
24
25
; GFX-NEXT: br label %[[COMMON_RET]]
25
26
;
26
27
entry:
@@ -93,16 +94,17 @@ define float @is_profitable_f32(ptr dereferenceable(8) %ptr_x, ptr dereferenceab
93
94
; GFX-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y]], 0.000000e+00
94
95
; GFX-NEXT: [[X:%.*]] = load float, ptr [[PTR_X]], align 8
95
96
; GFX-NEXT: [[A_1:%.*]] = load float, ptr [[PTR_A]], align 8
96
- ; GFX-NEXT: [[MUL:%.*]] = fmul contract float [[X]], [[A_1]]
97
97
; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
98
98
; GFX: [[COMMON_RET:.*]]:
99
- ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi float [ [[MUL]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
99
+ ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi float [ [[MUL:%.* ]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
100
100
; GFX-NEXT: ret float [[COMMON_RET_OP]]
101
101
; GFX: [[IF_THEN]]:
102
+ ; GFX-NEXT: [[MUL]] = fmul contract float [[X]], [[A_1]]
102
103
; GFX-NEXT: [[ADD:%.*]] = fadd contract float 1.000000e+00, [[MUL]]
103
104
; GFX-NEXT: br label %[[COMMON_RET]]
104
105
; GFX: [[IF_ELSE]]:
105
- ; GFX-NEXT: [[SUB]] = fsub contract float [[MUL]], [[Y]]
106
+ ; GFX-NEXT: [[MUL1:%.*]] = fmul contract float [[X]], [[A_1]]
107
+ ; GFX-NEXT: [[SUB]] = fsub contract float [[MUL1]], [[Y]]
106
108
; GFX-NEXT: br label %[[COMMON_RET]]
107
109
;
108
110
entry:
@@ -111,7 +113,6 @@ entry:
111
113
%x = load float , ptr %ptr_x , align 8
112
114
br i1 %cmp , label %if.then , label %if.else
113
115
114
-
115
116
if.then: ; preds = %entry
116
117
%a_1 = load float , ptr %ptr_a , align 8
117
118
%mul = fmul contract float %x , %a_1
@@ -172,16 +173,17 @@ define half @is_profitable_f16_ieee(ptr dereferenceable(8) %ptr_x, ptr dereferen
172
173
; GFX-NEXT: [[CMP:%.*]] = fcmp oeq half [[Y]], 0xH0000
173
174
; GFX-NEXT: [[X:%.*]] = load half, ptr [[PTR_X]], align 8
174
175
; GFX-NEXT: [[A_1:%.*]] = load half, ptr [[PTR_A]], align 8
175
- ; GFX-NEXT: [[MUL:%.*]] = fmul contract half [[X]], [[A_1]]
176
176
; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
177
177
; GFX: [[COMMON_RET:.*]]:
178
- ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi half [ [[MUL]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
178
+ ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi half [ [[MUL:%.* ]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
179
179
; GFX-NEXT: ret half [[COMMON_RET_OP]]
180
180
; GFX: [[IF_THEN]]:
181
+ ; GFX-NEXT: [[MUL]] = fmul contract half [[X]], [[A_1]]
181
182
; GFX-NEXT: [[ADD:%.*]] = fadd contract half [[Y]], [[MUL]]
182
183
; GFX-NEXT: br label %[[COMMON_RET]]
183
184
; GFX: [[IF_ELSE]]:
184
- ; GFX-NEXT: [[SUB]] = fsub contract half [[MUL]], [[Y]]
185
+ ; GFX-NEXT: [[MUL1:%.*]] = fmul contract half [[X]], [[A_1]]
186
+ ; GFX-NEXT: [[SUB]] = fsub contract half [[MUL1]], [[Y]]
185
187
; GFX-NEXT: br label %[[COMMON_RET]]
186
188
;
187
189
entry:
@@ -250,16 +252,17 @@ define bfloat @is_profitable_bfloat_ieee(ptr dereferenceable(8) %ptr_x, ptr dere
250
252
; GFX-NEXT: [[CMP:%.*]] = fcmp oeq bfloat [[Y]], 0xR0000
251
253
; GFX-NEXT: [[X:%.*]] = load bfloat, ptr [[PTR_X]], align 8
252
254
; GFX-NEXT: [[A_1:%.*]] = load bfloat, ptr [[PTR_A]], align 8
253
- ; GFX-NEXT: [[MUL:%.*]] = fmul contract bfloat [[X]], [[A_1]]
254
255
; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
255
256
; GFX: [[COMMON_RET:.*]]:
256
- ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi bfloat [ [[MUL]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
257
+ ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi bfloat [ [[MUL:%.* ]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
257
258
; GFX-NEXT: ret bfloat [[COMMON_RET_OP]]
258
259
; GFX: [[IF_THEN]]:
260
+ ; GFX-NEXT: [[MUL]] = fmul contract bfloat [[X]], [[A_1]]
259
261
; GFX-NEXT: [[ADD:%.*]] = fadd contract bfloat 0xR3F80, [[MUL]]
260
262
; GFX-NEXT: br label %[[COMMON_RET]]
261
263
; GFX: [[IF_ELSE]]:
262
- ; GFX-NEXT: [[SUB]] = fsub contract bfloat [[MUL]], [[Y]]
264
+ ; GFX-NEXT: [[MUL1:%.*]] = fmul contract bfloat [[X]], [[A_1]]
265
+ ; GFX-NEXT: [[SUB]] = fsub contract bfloat [[MUL1]], [[Y]]
263
266
; GFX-NEXT: br label %[[COMMON_RET]]
264
267
;
265
268
entry:
@@ -330,16 +333,17 @@ define <8 x half> @is_profitable_vector(ptr dereferenceable(8) %ptr_x, ptr deref
330
333
; GFX-NEXT: [[V1:%.*]] = load <8 x half>, ptr addrspace(3) @v1_ptr, align 16
331
334
; GFX-NEXT: [[V2:%.*]] = load <8 x half>, ptr addrspace(3) @v2_ptr, align 16
332
335
; GFX-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
333
- ; GFX-NEXT: [[MUL:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
334
336
; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
335
337
; GFX: [[COMMON_RET:.*]]:
336
338
; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi <8 x half> [ [[ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
337
339
; GFX-NEXT: ret <8 x half> [[COMMON_RET_OP]]
338
340
; GFX: [[IF_THEN]]:
341
+ ; GFX-NEXT: [[MUL:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
339
342
; GFX-NEXT: [[ADD]] = fadd contract <8 x half> [[V2]], [[MUL]]
340
343
; GFX-NEXT: br label %[[COMMON_RET]]
341
344
; GFX: [[IF_ELSE]]:
342
- ; GFX-NEXT: [[SUB]] = fsub contract <8 x half> [[MUL]], [[V2]]
345
+ ; GFX-NEXT: [[MUL1:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
346
+ ; GFX-NEXT: [[SUB]] = fsub contract <8 x half> [[MUL1]], [[V2]]
343
347
; GFX-NEXT: br label %[[COMMON_RET]]
344
348
;
345
349
entry:
@@ -362,23 +366,61 @@ if.else: ; preds = %entry
362
366
}
363
367
364
368
define double @is_profitable_f64_nocontract (ptr dereferenceable (8 ) %ptr_x , ptr dereferenceable (8 ) %ptr_y , ptr dereferenceable (8 ) %ptr_a ) #0 {
365
- ; GFX-LABEL: define double @is_profitable_f64_nocontract(
366
- ; GFX-SAME: ptr dereferenceable(8) [[PTR_X:%.*]], ptr dereferenceable(8) [[PTR_Y:%.*]], ptr dereferenceable(8) [[PTR_A:%.*]]) #[[ATTR0]] {
367
- ; GFX-NEXT: [[Y:%.*]] = load double, ptr [[PTR_Y]], align 8
368
- ; GFX-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
369
- ; GFX-NEXT: [[X:%.*]] = load double, ptr [[PTR_X]], align 8
370
- ; GFX-NEXT: [[A_1:%.*]] = load double, ptr [[PTR_A]], align 8
371
- ; GFX-NEXT: [[MUL:%.*]] = fmul double [[X]], [[A_1]]
372
- ; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
373
- ; GFX: [[COMMON_RET:.*]]:
374
- ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[PTR_ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
375
- ; GFX-NEXT: ret double [[COMMON_RET_OP]]
376
- ; GFX: [[IF_THEN]]:
377
- ; GFX-NEXT: [[PTR_ADD]] = fadd double 1.000000e+00, [[MUL]]
378
- ; GFX-NEXT: br label %[[COMMON_RET]]
379
- ; GFX: [[IF_ELSE]]:
380
- ; GFX-NEXT: [[SUB]] = fsub double [[MUL]], [[Y]]
381
- ; GFX-NEXT: br label %[[COMMON_RET]]
369
+ ; FP-CONTRACT-FAST-LABEL: define double @is_profitable_f64_nocontract(
370
+ ; FP-CONTRACT-FAST-SAME: ptr dereferenceable(8) [[PTR_X:%.*]], ptr dereferenceable(8) [[PTR_Y:%.*]], ptr dereferenceable(8) [[PTR_A:%.*]]) #[[ATTR0]] {
371
+ ; FP-CONTRACT-FAST-NEXT: [[Y:%.*]] = load double, ptr [[PTR_Y]], align 8
372
+ ; FP-CONTRACT-FAST-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
373
+ ; FP-CONTRACT-FAST-NEXT: [[X:%.*]] = load double, ptr [[PTR_X]], align 8
374
+ ; FP-CONTRACT-FAST-NEXT: [[A_1:%.*]] = load double, ptr [[PTR_A]], align 8
375
+ ; FP-CONTRACT-FAST-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
376
+ ; FP-CONTRACT-FAST: [[COMMON_RET:.*]]:
377
+ ; FP-CONTRACT-FAST-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[PTR_ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
378
+ ; FP-CONTRACT-FAST-NEXT: ret double [[COMMON_RET_OP]]
379
+ ; FP-CONTRACT-FAST: [[IF_THEN]]:
380
+ ; FP-CONTRACT-FAST-NEXT: [[MUL:%.*]] = fmul double [[X]], [[A_1]]
381
+ ; FP-CONTRACT-FAST-NEXT: [[PTR_ADD]] = fadd double 1.000000e+00, [[MUL]]
382
+ ; FP-CONTRACT-FAST-NEXT: br label %[[COMMON_RET]]
383
+ ; FP-CONTRACT-FAST: [[IF_ELSE]]:
384
+ ; FP-CONTRACT-FAST-NEXT: [[MUL1:%.*]] = fmul double [[X]], [[A_1]]
385
+ ; FP-CONTRACT-FAST-NEXT: [[SUB]] = fsub double [[MUL1]], [[Y]]
386
+ ; FP-CONTRACT-FAST-NEXT: br label %[[COMMON_RET]]
387
+ ;
388
+ ; UNSAFE-FP-MATH-LABEL: define double @is_profitable_f64_nocontract(
389
+ ; UNSAFE-FP-MATH-SAME: ptr dereferenceable(8) [[PTR_X:%.*]], ptr dereferenceable(8) [[PTR_Y:%.*]], ptr dereferenceable(8) [[PTR_A:%.*]]) #[[ATTR0]] {
390
+ ; UNSAFE-FP-MATH-NEXT: [[Y:%.*]] = load double, ptr [[PTR_Y]], align 8
391
+ ; UNSAFE-FP-MATH-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
392
+ ; UNSAFE-FP-MATH-NEXT: [[X:%.*]] = load double, ptr [[PTR_X]], align 8
393
+ ; UNSAFE-FP-MATH-NEXT: [[A_1:%.*]] = load double, ptr [[PTR_A]], align 8
394
+ ; UNSAFE-FP-MATH-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
395
+ ; UNSAFE-FP-MATH: [[COMMON_RET:.*]]:
396
+ ; UNSAFE-FP-MATH-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[PTR_ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
397
+ ; UNSAFE-FP-MATH-NEXT: ret double [[COMMON_RET_OP]]
398
+ ; UNSAFE-FP-MATH: [[IF_THEN]]:
399
+ ; UNSAFE-FP-MATH-NEXT: [[MUL:%.*]] = fmul double [[X]], [[A_1]]
400
+ ; UNSAFE-FP-MATH-NEXT: [[PTR_ADD]] = fadd double 1.000000e+00, [[MUL]]
401
+ ; UNSAFE-FP-MATH-NEXT: br label %[[COMMON_RET]]
402
+ ; UNSAFE-FP-MATH: [[IF_ELSE]]:
403
+ ; UNSAFE-FP-MATH-NEXT: [[MUL1:%.*]] = fmul double [[X]], [[A_1]]
404
+ ; UNSAFE-FP-MATH-NEXT: [[SUB]] = fsub double [[MUL1]], [[Y]]
405
+ ; UNSAFE-FP-MATH-NEXT: br label %[[COMMON_RET]]
406
+ ;
407
+ ; NO-UNSAFE-FP-MATH-LABEL: define double @is_profitable_f64_nocontract(
408
+ ; NO-UNSAFE-FP-MATH-SAME: ptr dereferenceable(8) [[PTR_X:%.*]], ptr dereferenceable(8) [[PTR_Y:%.*]], ptr dereferenceable(8) [[PTR_A:%.*]]) #[[ATTR0]] {
409
+ ; NO-UNSAFE-FP-MATH-NEXT: [[Y:%.*]] = load double, ptr [[PTR_Y]], align 8
410
+ ; NO-UNSAFE-FP-MATH-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
411
+ ; NO-UNSAFE-FP-MATH-NEXT: [[X:%.*]] = load double, ptr [[PTR_X]], align 8
412
+ ; NO-UNSAFE-FP-MATH-NEXT: [[A_1:%.*]] = load double, ptr [[PTR_A]], align 8
413
+ ; NO-UNSAFE-FP-MATH-NEXT: [[MUL:%.*]] = fmul double [[X]], [[A_1]]
414
+ ; NO-UNSAFE-FP-MATH-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
415
+ ; NO-UNSAFE-FP-MATH: [[COMMON_RET:.*]]:
416
+ ; NO-UNSAFE-FP-MATH-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[PTR_ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
417
+ ; NO-UNSAFE-FP-MATH-NEXT: ret double [[COMMON_RET_OP]]
418
+ ; NO-UNSAFE-FP-MATH: [[IF_THEN]]:
419
+ ; NO-UNSAFE-FP-MATH-NEXT: [[PTR_ADD]] = fadd double 1.000000e+00, [[MUL]]
420
+ ; NO-UNSAFE-FP-MATH-NEXT: br label %[[COMMON_RET]]
421
+ ; NO-UNSAFE-FP-MATH: [[IF_ELSE]]:
422
+ ; NO-UNSAFE-FP-MATH-NEXT: [[SUB]] = fsub double [[MUL]], [[Y]]
423
+ ; NO-UNSAFE-FP-MATH-NEXT: br label %[[COMMON_RET]]
382
424
;
383
425
%y = load double , ptr %ptr_y , align 8
384
426
%cmp = fcmp oeq double %y , 0 .000000e+00
@@ -400,7 +442,3 @@ if.else: ; preds = %entry
400
442
401
443
attributes #0 = { nounwind "denormal-fp-math" ="preserve-sign,preserve-sign" }
402
444
attributes #1 = { nounwind "denormal-fp-math" ="ieee,ieee" }
403
- ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
404
- ; FP-CONTRACT-FAST: {{.*}}
405
- ; NO-UNSAFE-FP-MATH: {{.*}}
406
- ; UNSAFE-FP-MATH: {{.*}}
0 commit comments