From f139bbd015c8df4c99158c30d93981b99bd48ba4 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 5 Dec 2019 15:15:32 +0530 Subject: [PATCH] AMDGPU: Stop setting attributes based on TargetOptions Having arbitrary passes looking at the TargetOptions is pretty messy. This was also disregarding if a function already had an explicit attribute setting on it. opt/llc now add the attributes to functions that don't specify the attribute. clang and lld do not call the function to do this, which they maybe should. This was also treating unsafe-fp-math as implying the others, and setting the other attributes based on it. This is not done anywhere else, and I'm not sure is correct based on the current description of the option bit. Effectively reverts 1d8cf2be89087a2babc1dc38b16040fad0a555e2 --- lib/Target/AMDGPU/AMDGPU.h | 4 +-- lib/Target/AMDGPU/AMDGPULibCalls.cpp | 36 +++-------------------- lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 7 ++--- test/CodeGen/AMDGPU/inline-attr.ll | 4 +-- 4 files changed, 11 insertions(+), 40 deletions(-) diff --git a/lib/Target/AMDGPU/AMDGPU.h b/lib/Target/AMDGPU/AMDGPU.h index 2cf7560519b..ded11074232 100644 --- a/lib/Target/AMDGPU/AMDGPU.h +++ b/lib/Target/AMDGPU/AMDGPU.h @@ -61,9 +61,9 @@ FunctionPass *createSIMemoryLegalizerPass(); FunctionPass *createSIInsertWaitcntsPass(); FunctionPass *createSIPreAllocateWWMRegsPass(); FunctionPass *createSIFormMemoryClausesPass(); + FunctionPass *createSIPostRABundlerPass(); -FunctionPass *createAMDGPUSimplifyLibCallsPass(const TargetOptions &, - const TargetMachine *); +FunctionPass *createAMDGPUSimplifyLibCallsPass(const TargetMachine *); FunctionPass *createAMDGPUUseNativeCallsPass(); FunctionPass *createAMDGPUCodeGenPreparePass(); FunctionPass *createAMDGPUMachineCFGStructurizerPass(); diff --git a/lib/Target/AMDGPU/AMDGPULibCalls.cpp b/lib/Target/AMDGPU/AMDGPULibCalls.cpp index 98931c72bc6..4fb85832412 100644 --- a/lib/Target/AMDGPU/AMDGPULibCalls.cpp +++ b/lib/Target/AMDGPU/AMDGPULibCalls.cpp @@ -32,7 +32,6 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetOptions.h" #include #include @@ -170,16 +169,13 @@ namespace { class AMDGPUSimplifyLibCalls : public FunctionPass { - const TargetOptions Options; - AMDGPULibCalls Simplifier; public: static char ID; // Pass identification - AMDGPUSimplifyLibCalls(const TargetOptions &Opt = TargetOptions(), - const TargetMachine *TM = nullptr) - : FunctionPass(ID), Options(Opt), Simplifier(TM) { + AMDGPUSimplifyLibCalls(const TargetMachine *TM = nullptr) + : FunctionPass(ID), Simplifier(TM) { initializeAMDGPUSimplifyLibCallsPass(*PassRegistry::getPassRegistry()); } @@ -1711,35 +1707,14 @@ bool AMDGPULibCalls::evaluateCall(CallInst *aCI, FuncInfo &FInfo) { } // Public interface to the Simplify LibCalls pass. -FunctionPass *llvm::createAMDGPUSimplifyLibCallsPass(const TargetOptions &Opt, - const TargetMachine *TM) { - return new AMDGPUSimplifyLibCalls(Opt, TM); +FunctionPass *llvm::createAMDGPUSimplifyLibCallsPass(const TargetMachine *TM) { + return new AMDGPUSimplifyLibCalls(TM); } FunctionPass *llvm::createAMDGPUUseNativeCallsPass() { return new AMDGPUUseNativeCalls(); } -static bool setFastFlags(Function &F, const TargetOptions &Options) { - AttrBuilder B; - - if (Options.UnsafeFPMath || Options.NoInfsFPMath) - B.addAttribute("no-infs-fp-math", "true"); - if (Options.UnsafeFPMath || Options.NoNaNsFPMath) - B.addAttribute("no-nans-fp-math", "true"); - if (Options.UnsafeFPMath) { - B.addAttribute("less-precise-fpmad", "true"); - B.addAttribute("unsafe-fp-math", "true"); - } - - if (!B.hasAttributes()) - return false; - - F.addAttributes(AttributeList::FunctionIndex, B); - - return true; -} - bool AMDGPUSimplifyLibCalls::runOnFunction(Function &F) { if (skipFunction(F)) return false; @@ -1750,9 +1725,6 @@ bool AMDGPUSimplifyLibCalls::runOnFunction(Function &F) { LLVM_DEBUG(dbgs() << "AMDIC: process function "; F.printAsOperand(dbgs(), false, F.getParent()); dbgs() << '\n';); - if (!EnablePreLink) - Changed |= setFastFlags(F, Options); - for (auto &BB : F) { for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ) { // Ignore non-calls. diff --git a/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp index 86cfe6a1101..6908f43b4db 100644 --- a/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -446,11 +446,10 @@ void AMDGPUTargetMachine::adjustPassManager(PassManagerBuilder &Builder) { PM.add(createAMDGPUAlwaysInlinePass(false)); }); - const auto &Opt = Options; Builder.addExtension( PassManagerBuilder::EP_EarlyAsPossible, - [AMDGPUAA, LibCallSimplify, &Opt, this](const PassManagerBuilder &, - legacy::PassManagerBase &PM) { + [AMDGPUAA, LibCallSimplify, this](const PassManagerBuilder &, + legacy::PassManagerBase &PM) { if (AMDGPUAA) { PM.add(createAMDGPUAAWrapperPass()); PM.add(createAMDGPUExternalAAWrapperPass()); @@ -458,7 +457,7 @@ void AMDGPUTargetMachine::adjustPassManager(PassManagerBuilder &Builder) { PM.add(llvm::createAMDGPUPropagateAttributesEarlyPass(this)); PM.add(llvm::createAMDGPUUseNativeCallsPass()); if (LibCallSimplify) - PM.add(llvm::createAMDGPUSimplifyLibCallsPass(Opt, this)); + PM.add(llvm::createAMDGPUSimplifyLibCallsPass(this)); }); Builder.addExtension( diff --git a/test/CodeGen/AMDGPU/inline-attr.ll b/test/CodeGen/AMDGPU/inline-attr.ll index b44138d107a..c73a3c52e9a 100644 --- a/test/CodeGen/AMDGPU/inline-attr.ll +++ b/test/CodeGen/AMDGPU/inline-attr.ll @@ -6,8 +6,8 @@ ; GCN: define amdgpu_kernel void @caller(float addrspace(1)* nocapture %p) local_unnamed_addr #1 { ; GCN: %mul.i = fmul float %load, 1.500000e+01 -; UNSAFE: attributes #0 = { norecurse nounwind readnone "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "unsafe-fp-math"="true" } -; UNSAFE: attributes #1 = { nofree norecurse nounwind "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "unsafe-fp-math"="true" } +; UNSAFE: attributes #0 = { norecurse nounwind readnone "unsafe-fp-math"="true" } +; UNSAFE: attributes #1 = { nofree norecurse nounwind "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="true" } ; NOINFS: attributes #0 = { norecurse nounwind readnone "no-infs-fp-math"="true" } ; NOINFS: attributes #1 = { nofree norecurse nounwind "less-precise-fpmad"="false" "no-infs-fp-math"="true" "no-nans-fp-math"="false" "unsafe-fp-math"="false" }