@@ -11,16 +11,17 @@ define double @is_profitable_f64_contract(ptr dereferenceable(8) %ptr_x, ptr der
1111; GFX-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
1212; GFX-NEXT: [[X:%.*]] = load double, ptr [[PTR_X]], align 8
1313; GFX-NEXT: [[A_1:%.*]] = load double, ptr [[PTR_A]], align 8
14- ; GFX-NEXT: [[MUL:%.*]] = fmul contract double [[X]], [[A_1]]
1514; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
1615; GFX: [[COMMON_RET:.*]]:
1716; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
1817; GFX-NEXT: ret double [[COMMON_RET_OP]]
1918; GFX: [[IF_THEN]]:
19+ ; GFX-NEXT: [[MUL:%.*]] = fmul contract double [[X]], [[A_1]]
2020; GFX-NEXT: [[ADD]] = fadd contract double 1.000000e+00, [[MUL]]
2121; GFX-NEXT: br label %[[COMMON_RET]]
2222; 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]]
2425; GFX-NEXT: br label %[[COMMON_RET]]
2526;
2627entry:
@@ -93,16 +94,17 @@ define float @is_profitable_f32(ptr dereferenceable(8) %ptr_x, ptr dereferenceab
9394; GFX-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y]], 0.000000e+00
9495; GFX-NEXT: [[X:%.*]] = load float, ptr [[PTR_X]], align 8
9596; GFX-NEXT: [[A_1:%.*]] = load float, ptr [[PTR_A]], align 8
96- ; GFX-NEXT: [[MUL:%.*]] = fmul contract float [[X]], [[A_1]]
9797; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
9898; 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]] ]
100100; GFX-NEXT: ret float [[COMMON_RET_OP]]
101101; GFX: [[IF_THEN]]:
102+ ; GFX-NEXT: [[MUL]] = fmul contract float [[X]], [[A_1]]
102103; GFX-NEXT: [[ADD:%.*]] = fadd contract float 1.000000e+00, [[MUL]]
103104; GFX-NEXT: br label %[[COMMON_RET]]
104105; 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]]
106108; GFX-NEXT: br label %[[COMMON_RET]]
107109;
108110entry:
@@ -111,7 +113,6 @@ entry:
111113 %x = load float , ptr %ptr_x , align 8
112114 br i1 %cmp , label %if.then , label %if.else
113115
114-
115116if.then: ; preds = %entry
116117 %a_1 = load float , ptr %ptr_a , align 8
117118 %mul = fmul contract float %x , %a_1
@@ -172,16 +173,17 @@ define half @is_profitable_f16_ieee(ptr dereferenceable(8) %ptr_x, ptr dereferen
172173; GFX-NEXT: [[CMP:%.*]] = fcmp oeq half [[Y]], 0xH0000
173174; GFX-NEXT: [[X:%.*]] = load half, ptr [[PTR_X]], align 8
174175; GFX-NEXT: [[A_1:%.*]] = load half, ptr [[PTR_A]], align 8
175- ; GFX-NEXT: [[MUL:%.*]] = fmul contract half [[X]], [[A_1]]
176176; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
177177; 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]] ]
179179; GFX-NEXT: ret half [[COMMON_RET_OP]]
180180; GFX: [[IF_THEN]]:
181+ ; GFX-NEXT: [[MUL]] = fmul contract half [[X]], [[A_1]]
181182; GFX-NEXT: [[ADD:%.*]] = fadd contract half [[Y]], [[MUL]]
182183; GFX-NEXT: br label %[[COMMON_RET]]
183184; 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]]
185187; GFX-NEXT: br label %[[COMMON_RET]]
186188;
187189entry:
@@ -250,16 +252,17 @@ define bfloat @is_profitable_bfloat_ieee(ptr dereferenceable(8) %ptr_x, ptr dere
250252; GFX-NEXT: [[CMP:%.*]] = fcmp oeq bfloat [[Y]], 0xR0000
251253; GFX-NEXT: [[X:%.*]] = load bfloat, ptr [[PTR_X]], align 8
252254; GFX-NEXT: [[A_1:%.*]] = load bfloat, ptr [[PTR_A]], align 8
253- ; GFX-NEXT: [[MUL:%.*]] = fmul contract bfloat [[X]], [[A_1]]
254255; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
255256; 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]] ]
257258; GFX-NEXT: ret bfloat [[COMMON_RET_OP]]
258259; GFX: [[IF_THEN]]:
260+ ; GFX-NEXT: [[MUL]] = fmul contract bfloat [[X]], [[A_1]]
259261; GFX-NEXT: [[ADD:%.*]] = fadd contract bfloat 0xR3F80, [[MUL]]
260262; GFX-NEXT: br label %[[COMMON_RET]]
261263; 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]]
263266; GFX-NEXT: br label %[[COMMON_RET]]
264267;
265268entry:
@@ -330,16 +333,17 @@ define <8 x half> @is_profitable_vector(ptr dereferenceable(8) %ptr_x, ptr deref
330333; GFX-NEXT: [[V1:%.*]] = load <8 x half>, ptr addrspace(3) @v1_ptr, align 16
331334; GFX-NEXT: [[V2:%.*]] = load <8 x half>, ptr addrspace(3) @v2_ptr, align 16
332335; GFX-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
333- ; GFX-NEXT: [[MUL:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
334336; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
335337; GFX: [[COMMON_RET:.*]]:
336338; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi <8 x half> [ [[ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
337339; GFX-NEXT: ret <8 x half> [[COMMON_RET_OP]]
338340; GFX: [[IF_THEN]]:
341+ ; GFX-NEXT: [[MUL:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
339342; GFX-NEXT: [[ADD]] = fadd contract <8 x half> [[V2]], [[MUL]]
340343; GFX-NEXT: br label %[[COMMON_RET]]
341344; 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]]
343347; GFX-NEXT: br label %[[COMMON_RET]]
344348;
345349entry:
@@ -362,23 +366,61 @@ if.else: ; preds = %entry
362366}
363367
364368define 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]]
382424;
383425 %y = load double , ptr %ptr_y , align 8
384426 %cmp = fcmp oeq double %y , 0 .000000e+00
@@ -400,7 +442,3 @@ if.else: ; preds = %entry
400442
401443attributes #0 = { nounwind "denormal-fp-math" ="preserve-sign,preserve-sign" }
402444attributes #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