From fb38b98338cc87442e3451665e82bf1c8ef9388f Mon Sep 17 00:00:00 2001 From: alex-t Date: Tue, 26 May 2020 19:47:29 +0300 Subject: [PATCH] [AMDGPU] NFC target dependent requiresUniformRegister refactored out Summary: Target specific method encapsulated into the Target Lowering Info. Reviewers: rampitec, vpykhtin Reviewed By: rampitec Subscribers: arsenm, kzhuravl, jvesely, wdng, nhaehnle, yaxunl, dstuttard, tpr, t-tye, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70085 --- llvm/include/llvm/CodeGen/TargetLowering.h | 13 +++++++------ llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp | 3 +-- llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 6 ++++++ llvm/lib/Target/AMDGPU/SIISelLowering.h | 5 +++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h index 2689838..70bc6b9 100644 --- a/llvm/include/llvm/CodeGen/TargetLowering.h +++ b/llvm/include/llvm/CodeGen/TargetLowering.h @@ -28,6 +28,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Analysis/LegacyDivergenceAnalysis.h" #include "llvm/CodeGen/DAGCombine.h" #include "llvm/CodeGen/ISDOpcodes.h" #include "llvm/CodeGen/RuntimeLibcalls.h" @@ -821,12 +822,12 @@ public: return RC; } - /// Allows target to decide about the register class of the - /// specific value that is live outside the defining block. - /// Returns true if the value needs uniform register class. - virtual bool requiresUniformRegister(MachineFunction &MF, - const Value *) const { - return false; + /// Allows target to decide about the divergence of the + /// specific value. Base class implementation returns true + /// if the Divergece Analysis exists and reports value as divergent. + virtual bool isDivergent(const LegacyDivergenceAnalysis *DA, + MachineFunction &MF, const Value *V) const { + return DA && DA->isDivergent(V); } /// Return the 'representative' register class for the specified value diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index 7a5fd7d..36e9ea5 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -398,8 +398,7 @@ Register FunctionLoweringInfo::CreateRegs(Type *Ty, bool isDivergent) { } Register FunctionLoweringInfo::CreateRegs(const Value *V) { - return CreateRegs(V->getType(), DA && DA->isDivergent(V) && - !TLI->requiresUniformRegister(*MF, V)); + return CreateRegs(V->getType(), TLI->isDivergent(DA, *MF, V)); } /// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index 2c147fa..722275e 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -11226,6 +11226,12 @@ SITargetLowering::getRegClassFor(MVT VT, bool isDivergent) const { return RC; } +bool SITargetLowering::isDivergent(const LegacyDivergenceAnalysis *DA, + MachineFunction &MF, const Value *V) const { + return !requiresUniformRegister(MF, V) && + TargetLoweringBase::isDivergent(DA, MF, V); +} + // FIXME: This is a workaround for DivergenceAnalysis not understanding always // uniform values (as produced by the mask results of control flow intrinsics) // used outside of divergent blocks. The phi users need to also be treated as diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.h b/llvm/lib/Target/AMDGPU/SIISelLowering.h index 7ef11eb..80f3a87c 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.h +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.h @@ -416,8 +416,9 @@ public: virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent) const override; - virtual bool requiresUniformRegister(MachineFunction &MF, - const Value *V) const override; + virtual bool isDivergent(const LegacyDivergenceAnalysis *DA, + MachineFunction &MF, const Value *V) const override; + bool requiresUniformRegister(MachineFunction &MF, const Value *V) const; Align getPrefLoopAlignment(MachineLoop *ML) const override; void allocateHSAUserSGPRs(CCState &CCInfo, -- 2.7.4