Skip to content

Commit 3413aa8

Browse files
authored
Revert "[AMDGPU] Implement IR variant of isFMAFasterThanFMulAndFAdd (… (#145580)
#121465)" This reverts commit 211bcf6.
1 parent e615544 commit 3413aa8

File tree

3 files changed

+35
-132
lines changed

3 files changed

+35
-132
lines changed

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5959,35 +5959,6 @@ bool SITargetLowering::isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
59595959
return false;
59605960
}
59615961

5962-
// Refer to comments added to the MIR variant of isFMAFasterThanFMulAndFAdd for
5963-
// specific details.
5964-
bool SITargetLowering::isFMAFasterThanFMulAndFAdd(const Function &F,
5965-
Type *Ty) const {
5966-
switch (Ty->getScalarSizeInBits()) {
5967-
case 16: {
5968-
SIModeRegisterDefaults Mode = SIModeRegisterDefaults(F, *Subtarget);
5969-
return Subtarget->has16BitInsts() &&
5970-
Mode.FP64FP16Denormals != DenormalMode::getPreserveSign();
5971-
}
5972-
case 32: {
5973-
if (!Subtarget->hasMadMacF32Insts())
5974-
return Subtarget->hasFastFMAF32();
5975-
5976-
SIModeRegisterDefaults Mode = SIModeRegisterDefaults(F, *Subtarget);
5977-
if (Mode.FP32Denormals != DenormalMode::getPreserveSign())
5978-
return Subtarget->hasFastFMAF32() || Subtarget->hasDLInsts();
5979-
5980-
return Subtarget->hasFastFMAF32() && Subtarget->hasDLInsts();
5981-
}
5982-
case 64:
5983-
return true;
5984-
default:
5985-
break;
5986-
}
5987-
5988-
return false;
5989-
}
5990-
59915962
bool SITargetLowering::isFMADLegal(const MachineInstr &MI, LLT Ty) const {
59925963
if (!Ty.isScalar())
59935964
return false;
@@ -17621,33 +17592,6 @@ bool SITargetLowering::checkForPhysRegDependency(
1762117592
return false;
1762217593
}
1762317594

17624-
/// Check if it is profitable to hoist instruction in then/else to if.
17625-
bool SITargetLowering::isProfitableToHoist(Instruction *I) const {
17626-
if (!I->hasOneUse())
17627-
return true;
17628-
17629-
Instruction *User = I->user_back();
17630-
// TODO: Add more patterns that are not profitable to hoist and
17631-
// handle modifiers such as fabs and fneg
17632-
switch (I->getOpcode()) {
17633-
case Instruction::FMul: {
17634-
if (User->getOpcode() != Instruction::FSub &&
17635-
User->getOpcode() != Instruction::FAdd)
17636-
return true;
17637-
17638-
const TargetOptions &Options = getTargetMachine().Options;
17639-
17640-
return ((!I->hasAllowContract() || !User->hasAllowContract()) &&
17641-
Options.AllowFPOpFusion != FPOpFusion::Fast &&
17642-
!Options.UnsafeFPMath) ||
17643-
!isFMAFasterThanFMulAndFAdd(*I->getFunction(), User->getType());
17644-
}
17645-
default:
17646-
return true;
17647-
}
17648-
return true;
17649-
}
17650-
1765117595
void SITargetLowering::emitExpandAtomicAddrSpacePredicate(
1765217596
Instruction *AI) const {
1765317597
// Given: atomicrmw fadd ptr %addr, float %val ordering

llvm/lib/Target/AMDGPU/SIISelLowering.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,6 @@ class SITargetLowering final : public AMDGPUTargetLowering {
468468
EVT VT) const override;
469469
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
470470
const LLT Ty) const override;
471-
bool isFMAFasterThanFMulAndFAdd(const Function &F, Type *Ty) const override;
472471
bool isFMADLegal(const SelectionDAG &DAG, const SDNode *N) const override;
473472
bool isFMADLegal(const MachineInstr &MI, const LLT Ty) const override;
474473

@@ -549,8 +548,6 @@ class SITargetLowering final : public AMDGPUTargetLowering {
549548
const TargetInstrInfo *TII,
550549
MCRegister &PhysReg, int &Cost) const override;
551550

552-
bool isProfitableToHoist(Instruction *I) const override;
553-
554551
bool isKnownNeverNaNForTargetNode(SDValue Op, const APInt &DemandedElts,
555552
const SelectionDAG &DAG, bool SNaN = false,
556553
unsigned Depth = 0) const override;

llvm/test/CodeGen/AMDGPU/prevent-fmul-hoist-ir.ll

Lines changed: 35 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -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
;
2726
entry:
@@ -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
;
110108
entry:
@@ -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+
116115
if.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
;
189187
entry:
@@ -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
;
268265
entry:
@@ -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
;
349345
entry:
@@ -366,61 +362,23 @@ if.else: ; preds = %entry
366362
}
367363

368364
define 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

443401
attributes #0 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" }
444402
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

Comments
 (0)