@@ -11,17 +11,16 @@ 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]]
1415; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
1516; GFX: [[COMMON_RET:.*]]:
1617; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi double [ [[ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
1718; GFX-NEXT: ret double [[COMMON_RET_OP]]
1819; 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: [[MUL1:%.*]] = fmul contract double [[X]], [[A_1]]
24- ; GFX-NEXT: [[SUB]] = fsub contract double [[MUL1]], [[Y]]
23+ ; GFX-NEXT: [[SUB]] = fsub contract double [[MUL]], [[Y]]
2524; GFX-NEXT: br label %[[COMMON_RET]]
2625;
2726entry:
@@ -94,17 +93,16 @@ define float @is_profitable_f32(ptr dereferenceable(8) %ptr_x, ptr dereferenceab
9493; GFX-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y]], 0.000000e+00
9594; GFX-NEXT: [[X:%.*]] = load float, ptr [[PTR_X]], align 8
9695; 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]]
103102; GFX-NEXT: [[ADD:%.*]] = fadd contract float 1.000000e+00, [[MUL]]
104103; GFX-NEXT: br label %[[COMMON_RET]]
105104; GFX: [[IF_ELSE]]:
106- ; GFX-NEXT: [[MUL1:%.*]] = fmul contract float [[X]], [[A_1]]
107- ; GFX-NEXT: [[SUB]] = fsub contract float [[MUL1]], [[Y]]
105+ ; GFX-NEXT: [[SUB]] = fsub contract float [[MUL]], [[Y]]
108106; GFX-NEXT: br label %[[COMMON_RET]]
109107;
110108entry:
@@ -113,6 +111,7 @@ entry:
113111 %x = load float , ptr %ptr_x , align 8
114112 br i1 %cmp , label %if.then , label %if.else
115113
114+
116115if.then: ; preds = %entry
117116 %a_1 = load float , ptr %ptr_a , align 8
118117 %mul = fmul contract float %x , %a_1
@@ -173,17 +172,16 @@ define half @is_profitable_f16_ieee(ptr dereferenceable(8) %ptr_x, ptr dereferen
173172; GFX-NEXT: [[CMP:%.*]] = fcmp oeq half [[Y]], 0xH0000
174173; GFX-NEXT: [[X:%.*]] = load half, ptr [[PTR_X]], align 8
175174; 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]]
182181; GFX-NEXT: [[ADD:%.*]] = fadd contract half [[Y]], [[MUL]]
183182; GFX-NEXT: br label %[[COMMON_RET]]
184183; GFX: [[IF_ELSE]]:
185- ; GFX-NEXT: [[MUL1:%.*]] = fmul contract half [[X]], [[A_1]]
186- ; GFX-NEXT: [[SUB]] = fsub contract half [[MUL1]], [[Y]]
184+ ; GFX-NEXT: [[SUB]] = fsub contract half [[MUL]], [[Y]]
187185; GFX-NEXT: br label %[[COMMON_RET]]
188186;
189187entry:
@@ -252,17 +250,16 @@ define bfloat @is_profitable_bfloat_ieee(ptr dereferenceable(8) %ptr_x, ptr dere
252250; GFX-NEXT: [[CMP:%.*]] = fcmp oeq bfloat [[Y]], 0xR0000
253251; GFX-NEXT: [[X:%.*]] = load bfloat, ptr [[PTR_X]], align 8
254252; GFX-NEXT: [[A_1:%.*]] = load bfloat, ptr [[PTR_A]], align 8
253+ ; GFX-NEXT: [[MUL:%.*]] = fmul contract bfloat [[X]], [[A_1]]
255254; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
256255; GFX: [[COMMON_RET:.*]]:
257- ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi bfloat [ [[MUL:%.* ]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
256+ ; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi bfloat [ [[MUL]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
258257; GFX-NEXT: ret bfloat [[COMMON_RET_OP]]
259258; GFX: [[IF_THEN]]:
260- ; GFX-NEXT: [[MUL]] = fmul contract bfloat [[X]], [[A_1]]
261259; GFX-NEXT: [[ADD:%.*]] = fadd contract bfloat 0xR3F80, [[MUL]]
262260; GFX-NEXT: br label %[[COMMON_RET]]
263261; GFX: [[IF_ELSE]]:
264- ; GFX-NEXT: [[MUL1:%.*]] = fmul contract bfloat [[X]], [[A_1]]
265- ; GFX-NEXT: [[SUB]] = fsub contract bfloat [[MUL1]], [[Y]]
262+ ; GFX-NEXT: [[SUB]] = fsub contract bfloat [[MUL]], [[Y]]
266263; GFX-NEXT: br label %[[COMMON_RET]]
267264;
268265entry:
@@ -333,17 +330,16 @@ define <8 x half> @is_profitable_vector(ptr dereferenceable(8) %ptr_x, ptr deref
333330; GFX-NEXT: [[V1:%.*]] = load <8 x half>, ptr addrspace(3) @v1_ptr, align 16
334331; GFX-NEXT: [[V2:%.*]] = load <8 x half>, ptr addrspace(3) @v2_ptr, align 16
335332; GFX-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
333+ ; GFX-NEXT: [[MUL:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
336334; GFX-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
337335; GFX: [[COMMON_RET:.*]]:
338336; GFX-NEXT: [[COMMON_RET_OP:%.*]] = phi <8 x half> [ [[ADD:%.*]], %[[IF_THEN]] ], [ [[SUB:%.*]], %[[IF_ELSE]] ]
339337; GFX-NEXT: ret <8 x half> [[COMMON_RET_OP]]
340338; GFX: [[IF_THEN]]:
341- ; GFX-NEXT: [[MUL:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
342339; GFX-NEXT: [[ADD]] = fadd contract <8 x half> [[V2]], [[MUL]]
343340; GFX-NEXT: br label %[[COMMON_RET]]
344341; GFX: [[IF_ELSE]]:
345- ; GFX-NEXT: [[MUL1:%.*]] = fmul contract <8 x half> [[V1]], [[X]]
346- ; GFX-NEXT: [[SUB]] = fsub contract <8 x half> [[MUL1]], [[V2]]
342+ ; GFX-NEXT: [[SUB]] = fsub contract <8 x half> [[MUL]], [[V2]]
347343; GFX-NEXT: br label %[[COMMON_RET]]
348344;
349345entry:
@@ -366,61 +362,23 @@ if.else: ; preds = %entry
366362}
367363
368364define double @is_profitable_f64_nocontract (ptr dereferenceable (8 ) %ptr_x , ptr dereferenceable (8 ) %ptr_y , ptr dereferenceable (8 ) %ptr_a ) #0 {
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]]
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]]
424382;
425383 %y = load double , ptr %ptr_y , align 8
426384 %cmp = fcmp oeq double %y , 0 .000000e+00
@@ -442,3 +400,7 @@ if.else: ; preds = %entry
442400
443401attributes #0 = { nounwind "denormal-fp-math" ="preserve-sign,preserve-sign" }
444402attributes #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