diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h --- a/llvm/include/llvm/CodeGen/TargetLowering.h +++ b/llvm/include/llvm/CodeGen/TargetLowering.h @@ -4490,8 +4490,8 @@ /// Returns a 0 terminated array of rounding control registers that can be /// attached into strict FP call. - virtual const MCPhysReg *getRoundingControlRegisters() const { - return nullptr; + virtual ArrayRef getRoundingControlRegisters() const { + return ArrayRef(); } /// This callback is used to prepare for a volatile or atomic load. diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp --- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -1163,10 +1163,9 @@ // Add rounding control registers as implicit def for function call. if (II.isCall() && MF->getFunction().hasFnAttribute(Attribute::StrictFP)) { - const MCPhysReg *RCRegs = TLI->getRoundingControlRegisters(); - if (RCRegs) - for (; *RCRegs; ++RCRegs) - UsedRegs.push_back(*RCRegs); + ArrayRef RCRegs = TLI->getRoundingControlRegisters(); + for (MCPhysReg Reg : RCRegs) + UsedRegs.push_back(Reg); } // Finally mark unused registers as dead. diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h @@ -670,7 +670,7 @@ CodeGenOpt::Level OptLevel) const override; const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override; - const MCPhysReg *getRoundingControlRegisters() const override; + ArrayRef getRoundingControlRegisters() const override; /// Returns false if N is a bit extraction pattern of (X >> C) & Mask. bool isDesirableToCommuteWithShift(const SDNode *N, diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -14946,8 +14946,8 @@ return ScratchRegs; } -const MCPhysReg *AArch64TargetLowering::getRoundingControlRegisters() const { - static const MCPhysReg RCRegs[] = {AArch64::FPCR, 0}; +ArrayRef AArch64TargetLowering::getRoundingControlRegisters() const { + static const MCPhysReg RCRegs[] = {AArch64::FPCR}; return RCRegs; } diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -1702,7 +1702,7 @@ LLVMContext &Context) const override; const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override; - const MCPhysReg *getRoundingControlRegisters() const override; + ArrayRef getRoundingControlRegisters() const override; TargetLoweringBase::AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const override; diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -3097,10 +3097,10 @@ return ScratchRegs; } -const MCPhysReg *X86TargetLowering::getRoundingControlRegisters() const { +ArrayRef X86TargetLowering::getRoundingControlRegisters() const { // FIXME: We should def X86::FPCW for x87 as well. But it affects a lot of lit // tests at the moment, which is not what we expected. - static const MCPhysReg RCRegs[] = { X86::MXCSR, 0 }; + static const MCPhysReg RCRegs[] = {X86::MXCSR}; return RCRegs; }