Skip to content

Commit 4cbb7b5

Browse files
committed
[ARM] Disable strict node mutation and use correct lowering for several strict ops
1 parent 60ea03b commit 4cbb7b5

File tree

3 files changed

+331
-686
lines changed

3 files changed

+331
-686
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -614,16 +614,30 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
614614
for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
615615
ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
616616
setOperationAction(Op, MVT::f64, Legal);
617+
618+
setOperationAction(ISD::STRICT_FP_ROUND, MVT::f32, Legal);
619+
setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Legal);
617620
}
618621
}
619622

620623
if (Subtarget->hasFullFP16()) {
624+
for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
625+
ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
626+
setOperationAction(Op, MVT::f16, Legal);
627+
621628
addRegisterClass(MVT::f16, &ARM::HPRRegClass);
622629
setOperationAction(ISD::BITCAST, MVT::i16, Custom);
623630
setOperationAction(ISD::BITCAST, MVT::f16, Custom);
624631

625632
setOperationAction(ISD::FMINNUM, MVT::f16, Legal);
626633
setOperationAction(ISD::FMAXNUM, MVT::f16, Legal);
634+
setOperationAction(ISD::STRICT_FMINNUM, MVT::f16, Legal);
635+
setOperationAction(ISD::STRICT_FMAXNUM, MVT::f16, Legal);
636+
637+
if (Subtarget->hasVFPv3()) {
638+
setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f32, Legal);
639+
setOperationAction(ISD::STRICT_FP_ROUND, MVT::f16, Legal);
640+
}
627641
}
628642

629643
if (Subtarget->hasBF16()) {
@@ -933,13 +947,14 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
933947
setOperationAction(ISD::FP_TO_SINT, MVT::f64, Custom);
934948
setOperationAction(ISD::FP_TO_UINT, MVT::f64, Custom);
935949
setOperationAction(ISD::FP_ROUND, MVT::f32, Custom);
936-
setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::i32, Custom);
937-
setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::i32, Custom);
938950
setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::f64, Custom);
939951
setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::f64, Custom);
940952
setOperationAction(ISD::STRICT_FP_ROUND, MVT::f32, Custom);
941953
}
942954

955+
setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::i32, Custom);
956+
setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::i32, Custom);
957+
943958
if (!Subtarget->hasFP64() || !Subtarget->hasFPARMv8Base()) {
944959
setOperationAction(ISD::FP_EXTEND, MVT::f64, Custom);
945960
setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Custom);
@@ -1316,34 +1331,26 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
13161331
setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
13171332

13181333
// FP-ARMv8 implements a lot of rounding-like FP operations.
1319-
if (Subtarget->hasFPARMv8Base()) {
1320-
setOperationAction(ISD::FFLOOR, MVT::f32, Legal);
1321-
setOperationAction(ISD::FCEIL, MVT::f32, Legal);
1322-
setOperationAction(ISD::FROUND, MVT::f32, Legal);
1323-
setOperationAction(ISD::FTRUNC, MVT::f32, Legal);
1324-
setOperationAction(ISD::FNEARBYINT, MVT::f32, Legal);
1325-
setOperationAction(ISD::FRINT, MVT::f32, Legal);
1326-
setOperationAction(ISD::FROUNDEVEN, MVT::f32, Legal);
1327-
setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
1328-
setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
1334+
if (Subtarget->hasFPARMv8Base()) {
1335+
for (auto Op :
1336+
{ISD::FFLOOR, ISD::FCEIL, ISD::FROUND,
1337+
ISD::FTRUNC, ISD::FNEARBYINT, ISD::FRINT,
1338+
ISD::FROUNDEVEN, ISD::FMINNUM, ISD::FMAXNUM,
1339+
ISD::STRICT_FFLOOR, ISD::STRICT_FCEIL, ISD::STRICT_FROUND,
1340+
ISD::STRICT_FTRUNC, ISD::STRICT_FNEARBYINT, ISD::STRICT_FRINT,
1341+
ISD::STRICT_FROUNDEVEN, ISD::STRICT_FMINNUM, ISD::STRICT_FMAXNUM}) {
1342+
setOperationAction(Op, MVT::f32, Legal);
1343+
1344+
if (Subtarget->hasFP64())
1345+
setOperationAction(Op, MVT::f64, Legal);
1346+
}
1347+
13291348
if (Subtarget->hasNEON()) {
13301349
setOperationAction(ISD::FMINNUM, MVT::v2f32, Legal);
13311350
setOperationAction(ISD::FMAXNUM, MVT::v2f32, Legal);
13321351
setOperationAction(ISD::FMINNUM, MVT::v4f32, Legal);
13331352
setOperationAction(ISD::FMAXNUM, MVT::v4f32, Legal);
13341353
}
1335-
1336-
if (Subtarget->hasFP64()) {
1337-
setOperationAction(ISD::FFLOOR, MVT::f64, Legal);
1338-
setOperationAction(ISD::FCEIL, MVT::f64, Legal);
1339-
setOperationAction(ISD::FROUND, MVT::f64, Legal);
1340-
setOperationAction(ISD::FTRUNC, MVT::f64, Legal);
1341-
setOperationAction(ISD::FNEARBYINT, MVT::f64, Legal);
1342-
setOperationAction(ISD::FRINT, MVT::f64, Legal);
1343-
setOperationAction(ISD::FROUNDEVEN, MVT::f64, Legal);
1344-
setOperationAction(ISD::FMINNUM, MVT::f64, Legal);
1345-
setOperationAction(ISD::FMAXNUM, MVT::f64, Legal);
1346-
}
13471354
}
13481355

13491356
// FP16 often need to be promoted to call lib functions
@@ -1498,6 +1505,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
14981505
Align(1ULL << Subtarget->getPreferBranchLogAlignment()));
14991506

15001507
setMinFunctionAlignment(Subtarget->isThumb() ? Align(2) : Align(4));
1508+
1509+
IsStrictFPEnabled = true;
15011510
}
15021511

15031512
bool ARMTargetLowering::useSoftFloat() const {

0 commit comments

Comments
 (0)