<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">D'oh! My clang revision didn't match my llvm revision.</div><div class="">Sorry for the trouble I caused.</div><div class=""><br class=""></div><div class="">- Matthias</div><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 5, 2015, at 3:18 PM, Sanjay Patel <<a href="mailto:spatel@rotateright.com" class="">spatel@rotateright.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Sorry. Can you give me more details on the build settings? I built with autotools and cmake on Linux and Mac and didn't see this missing dependency.<br class=""><br class="">I thought this was fixed with r238855:<br class=""><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Fview-3Drevision-26revision-3D238855&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=DB7PWeYQu5FaZi4oNHZ3KYlVLbBWDSoPb7ZtB1Gf4uU&e=" class="">http://llvm.org/viewvc/llvm-project?view=revision&revision=238855</a><br class=""></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Fri, Jun 5, 2015 at 3:34 PM, Matthias Braun <span dir="ltr" class=""><<a href="mailto:mbraun@apple.com" target="_blank" class="">mbraun@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This breaks -DBUILD_SHARED_LIBS=ON for me in an llvm+clang build:<br class="">
<br class="">
[10/92] Linking CXX shared library lib/libclangCodeGen.3.7.0svn.dylib<br class="">
FAILED: : && /usr/bin/c++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -std=c++11 -fcolor-diagnostics -fno-common -Woverloaded-virtual -fno-strict-aliasing -Wno-nested-anon-types -g -dynamiclib -Wl,-headerpad_max_install_names -o lib/libclangCodeGen.3.7.0svn.dylib ...<br class="">
<br class="">
Undefined symbols for architecture x86_64:<br class="">
"llvm::TargetRecip::TargetRecip()", referenced from:<br class="">
llvm::TargetOptions::TargetOptions() in BackendUtil.cpp.o<br class="">
ld: symbol(s) not found for architecture x86_64<br class="">
clang: error: linker command failed with exit code 1 (use -v to see invocation)<br class="">
<span class="HOEnZb"><font color="#888888" class=""><br class="">
- Matthias<br class="">
</font></span><div class="HOEnZb"><div class="h5"><br class="">
> On Jun 3, 2015, at 6:32 PM, Sanjay Patel <<a href="mailto:spatel@rotateright.com" class="">spatel@rotateright.com</a>> wrote:<br class="">
><br class="">
> Author: spatel<br class="">
> Date: Wed Jun 3 20:32:35 2015<br class="">
> New Revision: 239001<br class="">
><br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239001-26view-3Drev&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=iDtv1P08XZruA5eq_ntn99S6wrQUmngQZsSLo2omiLA&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=239001&view=rev</a><br class="">
> Log:<br class="">
> make reciprocal estimate code generation more flexible by adding command-line options (3rd try)<br class="">
><br class="">
> The first try (r238051) to land this was reverted due to ExecutionEngine build failure;<br class="">
> that was hopefully addressed by r238788.<br class="">
><br class="">
> The second try (r238842) to land this was reverted due to BUILD_SHARED_LIBS failure;<br class="">
> that was hopefully addressed by r238953.<br class="">
><br class="">
> This patch adds a TargetRecip class for processing many recip codegen possibilities.<br class="">
> The class is intended to handle both command-line options to llc as well<br class="">
> as options passed in from a front-end such as clang with the -mrecip option.<br class="">
><br class="">
> The x86 backend is updated to use the new functionality.<br class="">
> Only -mcpu=btver2 with -ffast-math should see a functional change from this patch.<br class="">
> All other x86 CPUs continue to *not* use reciprocal estimates by default with -ffast-math.<br class="">
><br class="">
> Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D8982&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=SrNR0iU_ysYfq5nqin2bgv985gs8r_altb05ixv5fA8&e=" target="_blank" class="">http://reviews.llvm.org/D8982</a><br class="">
><br class="">
><br class="">
> Added:<br class="">
> llvm/trunk/include/llvm/Target/TargetRecip.h<br class="">
> llvm/trunk/lib/Target/TargetRecip.cpp<br class="">
> Modified:<br class="">
> llvm/trunk/include/llvm/CodeGen/CommandFlags.h<br class="">
> llvm/trunk/include/llvm/Target/TargetOptions.h<br class="">
> llvm/trunk/lib/Target/CMakeLists.txt<br class="">
> llvm/trunk/lib/Target/X86/X86.td<br class="">
> llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br class="">
> llvm/trunk/lib/Target/X86/X86Subtarget.cpp<br class="">
> llvm/trunk/lib/Target/X86/X86Subtarget.h<br class="">
> llvm/trunk/lib/Target/X86/X86TargetMachine.cpp<br class="">
> llvm/trunk/test/CodeGen/X86/recip-fastmath.ll<br class="">
> llvm/trunk/test/CodeGen/X86/sqrt-fastmath.ll<br class="">
><br class="">
> Modified: llvm/trunk/include/llvm/CodeGen/CommandFlags.h<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_CodeGen_CommandFlags.h-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=GeXHn8gdVXK0AZvWWFZfSeeDiG90yVzeSuSVje8VEKI&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/CommandFlags.h?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h (original)<br class="">
> +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h Wed Jun 3 20:32:35 2015<br class="">
> @@ -24,6 +24,7 @@<br class="">
> #include "llvm/Support/Host.h"<br class="">
> #include "llvm/Target/TargetMachine.h"<br class="">
> #include "llvm/Target/TargetOptions.h"<br class="">
> +#include "llvm/Target/TargetRecip.h"<br class="">
> #include <string><br class="">
> using namespace llvm;<br class="">
><br class="">
> @@ -152,6 +153,12 @@ FuseFPOps("fp-contract",<br class="">
> "Only fuse FP ops when the result won't be effected."),<br class="">
> clEnumValEnd));<br class="">
><br class="">
> +cl::list<std::string><br class="">
> +ReciprocalOps("recip",<br class="">
> + cl::CommaSeparated,<br class="">
> + cl::desc("Choose reciprocal operation types and parameters."),<br class="">
> + cl::value_desc("all,none,default,divf,!vec-sqrtd,vec-divd:0,sqrt:9..."));<br class="">
> +<br class="">
> cl::opt<bool><br class="">
> DontPlaceZerosInBSS("nozero-initialized-in-bss",<br class="">
> cl::desc("Don't place zero-initialized symbols into bss section"),<br class="">
> @@ -230,6 +237,7 @@ static inline TargetOptions InitTargetOp<br class="">
> TargetOptions Options;<br class="">
> Options.LessPreciseFPMADOption = EnableFPMAD;<br class="">
> Options.AllowFPOpFusion = FuseFPOps;<br class="">
> + Options.Reciprocals = TargetRecip(ReciprocalOps);<br class="">
> Options.UnsafeFPMath = EnableUnsafeFPMath;<br class="">
> Options.NoInfsFPMath = EnableNoInfsFPMath;<br class="">
> Options.NoNaNsFPMath = EnableNoNaNsFPMath;<br class="">
><br class="">
> Modified: llvm/trunk/include/llvm/Target/TargetOptions.h<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Target_TargetOptions.h-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=i1v80rYHHcz99JrABOE6qvObZb-xb2BV7QFwdvQLjLA&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetOptions.h?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/include/llvm/Target/TargetOptions.h (original)<br class="">
> +++ llvm/trunk/include/llvm/Target/TargetOptions.h Wed Jun 3 20:32:35 2015<br class="">
> @@ -15,6 +15,7 @@<br class="">
> #ifndef LLVM_TARGET_TARGETOPTIONS_H<br class="">
> #define LLVM_TARGET_TARGETOPTIONS_H<br class="">
><br class="">
> +#include "llvm/Target/TargetRecip.h"<br class="">
> #include "llvm/MC/MCTargetOptions.h"<br class="">
> #include <string><br class="">
><br class="">
> @@ -72,7 +73,8 @@ namespace llvm {<br class="">
> CompressDebugSections(false), FunctionSections(false),<br class="">
> DataSections(false), UniqueSectionNames(true), TrapUnreachable(false),<br class="">
> TrapFuncName(), FloatABIType(FloatABI::Default),<br class="">
> - AllowFPOpFusion(FPOpFusion::Standard), JTType(JumpTable::Single),<br class="">
> + AllowFPOpFusion(FPOpFusion::Standard), Reciprocals(TargetRecip()),<br class="">
> + JTType(JumpTable::Single),<br class="">
> ThreadModel(ThreadModel::POSIX) {}<br class="">
><br class="">
> /// PrintMachineCode - This flag is enabled when the -print-machineinstrs<br class="">
> @@ -206,6 +208,9 @@ namespace llvm {<br class="">
> /// the value of this option.<br class="">
> FPOpFusion::FPOpFusionMode AllowFPOpFusion;<br class="">
><br class="">
> + /// This class encapsulates options for reciprocal-estimate code generation.<br class="">
> + TargetRecip Reciprocals;<br class="">
> +<br class="">
> /// JTType - This flag specifies the type of jump-instruction table to<br class="">
> /// create for functions that have the jumptable attribute.<br class="">
> JumpTable::JumpTableType JTType;<br class="">
> @@ -240,6 +245,7 @@ inline bool operator==(const TargetOptio<br class="">
> ARE_EQUAL(TrapFuncName) &&<br class="">
> ARE_EQUAL(FloatABIType) &&<br class="">
> ARE_EQUAL(AllowFPOpFusion) &&<br class="">
> + ARE_EQUAL(Reciprocals) &&<br class="">
> ARE_EQUAL(JTType) &&<br class="">
> ARE_EQUAL(ThreadModel) &&<br class="">
> ARE_EQUAL(MCOptions);<br class="">
><br class="">
> Added: llvm/trunk/include/llvm/Target/TargetRecip.h<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Target_TargetRecip.h-3Frev-3D239001-26view-3Dauto&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=1u20qvli_pXsE6KCX95qga3ia6UMS5Co6s4IptWBVdg&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetRecip.h?rev=239001&view=auto</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/include/llvm/Target/TargetRecip.h (added)<br class="">
> +++ llvm/trunk/include/llvm/Target/TargetRecip.h Wed Jun 3 20:32:35 2015<br class="">
> @@ -0,0 +1,73 @@<br class="">
> +//===--------------------- llvm/Target/TargetRecip.h ------------*- C++ -*-===//<br class="">
> +//<br class="">
> +// The LLVM Compiler Infrastructure<br class="">
> +//<br class="">
> +// This file is distributed under the University of Illinois Open Source<br class="">
> +// License. See LICENSE.TXT for details.<br class="">
> +//<br class="">
> +//===----------------------------------------------------------------------===//<br class="">
> +//<br class="">
> +// This class is used to customize machine-specific reciprocal estimate code<br class="">
> +// generation in a target-independent way.<br class="">
> +// If a target does not support operations in this specification, then code<br class="">
> +// generation will default to using supported operations.<br class="">
> +//<br class="">
> +//===----------------------------------------------------------------------===//<br class="">
> +<br class="">
> +#ifndef LLVM_TARGET_TARGETRECIP_H<br class="">
> +#define LLVM_TARGET_TARGETRECIP_H<br class="">
> +<br class="">
> +#include "llvm/ADT/StringRef.h"<br class="">
> +#include <vector><br class="">
> +#include <string><br class="">
> +#include <map><br class="">
> +<br class="">
> +namespace llvm {<br class="">
> +<br class="">
> +struct TargetRecip {<br class="">
> +public:<br class="">
> + TargetRecip();<br class="">
> +<br class="">
> + /// Initialize all or part of the operations from command-line options or<br class="">
> + /// a front end.<br class="">
> + TargetRecip(const std::vector<std::string> &Args);<br class="">
> +<br class="">
> + /// Set whether a particular reciprocal operation is enabled and how many<br class="">
> + /// refinement steps are needed when using it. Use "all" to set enablement<br class="">
> + /// and refinement steps for all operations.<br class="">
> + void setDefaults(const StringRef &Key, bool Enable, unsigned RefSteps);<br class="">
> +<br class="">
> + /// Return true if the reciprocal operation has been enabled by default or<br class="">
> + /// from the command-line. Return false if the operation has been disabled<br class="">
> + /// by default or from the command-line.<br class="">
> + bool isEnabled(const StringRef &Key) const;<br class="">
> +<br class="">
> + /// Return the number of iterations necessary to refine the<br class="">
> + /// the result of a machine instruction for the given reciprocal operation.<br class="">
> + unsigned getRefinementSteps(const StringRef &Key) const;<br class="">
> +<br class="">
> + bool operator==(const TargetRecip &Other) const;<br class="">
> +<br class="">
> +private:<br class="">
> + enum {<br class="">
> + Uninitialized = -1<br class="">
> + };<br class="">
> +<br class="">
> + struct RecipParams {<br class="">
> + int8_t Enabled;<br class="">
> + int8_t RefinementSteps;<br class="">
> +<br class="">
> + RecipParams() : Enabled(Uninitialized), RefinementSteps(Uninitialized) {}<br class="">
> + };<br class="">
> +<br class="">
> + std::map<StringRef, RecipParams> RecipMap;<br class="">
> + typedef std::map<StringRef, RecipParams>::iterator RecipIter;<br class="">
> + typedef std::map<StringRef, RecipParams>::const_iterator ConstRecipIter;<br class="">
> +<br class="">
> + bool parseGlobalParams(const std::string &Arg);<br class="">
> + void parseIndividualParams(const std::vector<std::string> &Args);<br class="">
> +};<br class="">
> +<br class="">
> +} // End llvm namespace<br class="">
> +<br class="">
> +#endif<br class="">
><br class="">
> Modified: llvm/trunk/lib/Target/CMakeLists.txt<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_CMakeLists.txt-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=jiWFFTJEBzD8u_j3qQ6cRw5d6sXOYc_tKzmnKMy9BuI&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CMakeLists.txt?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/CMakeLists.txt (original)<br class="">
> +++ llvm/trunk/lib/Target/CMakeLists.txt Wed Jun 3 20:32:35 2015<br class="">
> @@ -6,6 +6,7 @@ add_llvm_library(LLVMTarget<br class="">
> TargetLoweringObjectFile.cpp<br class="">
> TargetMachine.cpp<br class="">
> TargetMachineC.cpp<br class="">
> + TargetRecip.cpp<br class="">
> TargetSubtargetInfo.cpp<br class="">
><br class="">
> ADDITIONAL_HEADER_DIRS<br class="">
><br class="">
> Added: llvm/trunk/lib/Target/TargetRecip.cpp<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_TargetRecip.cpp-3Frev-3D239001-26view-3Dauto&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=m3x2COM1mTYg9v4Zbcqv7Tb2hfjP1orH0wHGSSY_KYk&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetRecip.cpp?rev=239001&view=auto</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/TargetRecip.cpp (added)<br class="">
> +++ llvm/trunk/lib/Target/TargetRecip.cpp Wed Jun 3 20:32:35 2015<br class="">
> @@ -0,0 +1,225 @@<br class="">
> +//===-------------------------- TargetRecip.cpp ---------------------------===//<br class="">
> +//<br class="">
> +// The LLVM Compiler Infrastructure<br class="">
> +//<br class="">
> +// This file is distributed under the University of Illinois Open Source<br class="">
> +// License. See LICENSE.TXT for details.<br class="">
> +//<br class="">
> +//===----------------------------------------------------------------------===//<br class="">
> +//<br class="">
> +// This class is used to customize machine-specific reciprocal estimate code<br class="">
> +// generation in a target-independent way.<br class="">
> +// If a target does not support operations in this specification, then code<br class="">
> +// generation will default to using supported operations.<br class="">
> +//<br class="">
> +//===----------------------------------------------------------------------===//<br class="">
> +<br class="">
> +#include "llvm/ADT/StringRef.h"<br class="">
> +#include "llvm/ADT/STLExtras.h"<br class="">
> +#include "llvm/Support/ErrorHandling.h"<br class="">
> +#include "llvm/Target/TargetRecip.h"<br class="">
> +#include <map><br class="">
> +<br class="">
> +using namespace llvm;<br class="">
> +<br class="">
> +// These are the names of the individual reciprocal operations. These are<br class="">
> +// the key strings for queries and command-line inputs.<br class="">
> +// In addition, the command-line interface recognizes the global parameters<br class="">
> +// "all", "none", and "default".<br class="">
> +static const char *RecipOps[] = {<br class="">
> + "divd",<br class="">
> + "divf",<br class="">
> + "vec-divd",<br class="">
> + "vec-divf",<br class="">
> + "sqrtd",<br class="">
> + "sqrtf",<br class="">
> + "vec-sqrtd",<br class="">
> + "vec-sqrtf",<br class="">
> +};<br class="">
> +<br class="">
> +// The uninitialized state is needed for the enabled settings and refinement<br class="">
> +// steps because custom settings may arrive via the command-line before target<br class="">
> +// defaults are set.<br class="">
> +TargetRecip::TargetRecip() {<br class="">
> + unsigned NumStrings = llvm::array_lengthof(RecipOps);<br class="">
> + for (unsigned i = 0; i < NumStrings; ++i)<br class="">
> + RecipMap.insert(std::make_pair(RecipOps[i], RecipParams()));<br class="">
> +}<br class="">
> +<br class="">
> +static bool parseRefinementStep(const StringRef &In, size_t &Position,<br class="">
> + uint8_t &Value) {<br class="">
> + const char RefStepToken = ':';<br class="">
> + Position = In.find(RefStepToken);<br class="">
> + if (Position == StringRef::npos)<br class="">
> + return false;<br class="">
> +<br class="">
> + StringRef RefStepString = In.substr(Position + 1);<br class="">
> + // Allow exactly one numeric character for the additional refinement<br class="">
> + // step parameter.<br class="">
> + if (RefStepString.size() == 1) {<br class="">
> + char RefStepChar = RefStepString[0];<br class="">
> + if (RefStepChar >= '0' && RefStepChar <= '9') {<br class="">
> + Value = RefStepChar - '0';<br class="">
> + return true;<br class="">
> + }<br class="">
> + }<br class="">
> + report_fatal_error("Invalid refinement step for -recip.");<br class="">
> +}<br class="">
> +<br class="">
> +bool TargetRecip::parseGlobalParams(const std::string &Arg) {<br class="">
> + StringRef ArgSub = Arg;<br class="">
> +<br class="">
> + // Look for an optional setting of the number of refinement steps needed<br class="">
> + // for this type of reciprocal operation.<br class="">
> + size_t RefPos;<br class="">
> + uint8_t RefSteps;<br class="">
> + StringRef RefStepString;<br class="">
> + if (parseRefinementStep(ArgSub, RefPos, RefSteps)) {<br class="">
> + // Split the string for further processing.<br class="">
> + RefStepString = ArgSub.substr(RefPos + 1);<br class="">
> + ArgSub = ArgSub.substr(0, RefPos);<br class="">
> + }<br class="">
> + bool Enable;<br class="">
> + bool UseDefaults;<br class="">
> + if (ArgSub == "all") {<br class="">
> + UseDefaults = false;<br class="">
> + Enable = true;<br class="">
> + } else if (ArgSub == "none") {<br class="">
> + UseDefaults = false;<br class="">
> + Enable = false;<br class="">
> + } else if (ArgSub == "default") {<br class="">
> + UseDefaults = true;<br class="">
> + } else {<br class="">
> + // Any other string is invalid or an individual setting.<br class="">
> + return false;<br class="">
> + }<br class="">
> +<br class="">
> + // All enable values will be initialized to target defaults if 'default' was<br class="">
> + // specified.<br class="">
> + if (!UseDefaults)<br class="">
> + for (auto &KV : RecipMap)<br class="">
> + KV.second.Enabled = Enable;<br class="">
> +<br class="">
> + // Custom refinement count was specified with all, none, or default.<br class="">
> + if (!RefStepString.empty())<br class="">
> + for (auto &KV : RecipMap)<br class="">
> + KV.second.RefinementSteps = RefSteps;<br class="">
> +<br class="">
> + return true;<br class="">
> +}<br class="">
> +<br class="">
> +void TargetRecip::parseIndividualParams(const std::vector<std::string> &Args) {<br class="">
> + static const char DisabledPrefix = '!';<br class="">
> + unsigned NumArgs = Args.size();<br class="">
> +<br class="">
> + for (unsigned i = 0; i != NumArgs; ++i) {<br class="">
> + StringRef Val = Args[i];<br class="">
> +<br class="">
> + bool IsDisabled = Val[0] == DisabledPrefix;<br class="">
> + // Ignore the disablement token for string matching.<br class="">
> + if (IsDisabled)<br class="">
> + Val = Val.substr(1);<br class="">
> +<br class="">
> + size_t RefPos;<br class="">
> + uint8_t RefSteps;<br class="">
> + StringRef RefStepString;<br class="">
> + if (parseRefinementStep(Val, RefPos, RefSteps)) {<br class="">
> + // Split the string for further processing.<br class="">
> + RefStepString = Val.substr(RefPos + 1);<br class="">
> + Val = Val.substr(0, RefPos);<br class="">
> + }<br class="">
> +<br class="">
> + RecipIter Iter = RecipMap.find(Val);<br class="">
> + if (Iter == RecipMap.end()) {<br class="">
> + // Try again specifying float suffix.<br class="">
> + Iter = RecipMap.find(Val.str() + 'f');<br class="">
> + if (Iter == RecipMap.end()) {<br class="">
> + Iter = RecipMap.find(Val.str() + 'd');<br class="">
> + assert(Iter == RecipMap.end() && "Float entry missing from map");<br class="">
> + report_fatal_error("Invalid option for -recip.");<br class="">
> + }<br class="">
> +<br class="">
> + // The option was specified without a float or double suffix.<br class="">
> + if (RecipMap[Val.str() + 'd'].Enabled != Uninitialized) {<br class="">
> + // Make sure that the double entry was not already specified.<br class="">
> + // The float entry will be checked below.<br class="">
> + report_fatal_error("Duplicate option for -recip.");<br class="">
> + }<br class="">
> + }<br class="">
> +<br class="">
> + if (Iter->second.Enabled != Uninitialized)<br class="">
> + report_fatal_error("Duplicate option for -recip.");<br class="">
> +<br class="">
> + // Mark the matched option as found. Do not allow duplicate specifiers.<br class="">
> + Iter->second.Enabled = !IsDisabled;<br class="">
> + if (!RefStepString.empty())<br class="">
> + Iter->second.RefinementSteps = RefSteps;<br class="">
> +<br class="">
> + // If the precision was not specified, the double entry is also initialized.<br class="">
> + if (Val.back() != 'f' && Val.back() != 'd') {<br class="">
> + RecipMap[Val.str() + 'd'].Enabled = !IsDisabled;<br class="">
> + if (!RefStepString.empty())<br class="">
> + RecipMap[Val.str() + 'd'].RefinementSteps = RefSteps;<br class="">
> + }<br class="">
> + }<br class="">
> +}<br class="">
> +<br class="">
> +TargetRecip::TargetRecip(const std::vector<std::string> &Args) :<br class="">
> + TargetRecip() {<br class="">
> + unsigned NumArgs = Args.size();<br class="">
> +<br class="">
> + // Check if "all", "default", or "none" was specified.<br class="">
> + if (NumArgs == 1 && parseGlobalParams(Args[0]))<br class="">
> + return;<br class="">
> +<br class="">
> + parseIndividualParams(Args);<br class="">
> +}<br class="">
> +<br class="">
> +bool TargetRecip::isEnabled(const StringRef &Key) const {<br class="">
> + ConstRecipIter Iter = RecipMap.find(Key);<br class="">
> + assert(Iter != RecipMap.end() && "Unknown name for reciprocal map");<br class="">
> + assert(Iter->second.Enabled != Uninitialized &&<br class="">
> + "Enablement setting was not initialized");<br class="">
> + return Iter->second.Enabled;<br class="">
> +}<br class="">
> +<br class="">
> +unsigned TargetRecip::getRefinementSteps(const StringRef &Key) const {<br class="">
> + ConstRecipIter Iter = RecipMap.find(Key);<br class="">
> + assert(Iter != RecipMap.end() && "Unknown name for reciprocal map");<br class="">
> + assert(Iter->second.RefinementSteps != Uninitialized &&<br class="">
> + "Refinement step setting was not initialized");<br class="">
> + return Iter->second.RefinementSteps;<br class="">
> +}<br class="">
> +<br class="">
> +/// Custom settings (previously initialized values) override target defaults.<br class="">
> +void TargetRecip::setDefaults(const StringRef &Key, bool Enable,<br class="">
> + unsigned RefSteps) {<br class="">
> + if (Key == "all") {<br class="">
> + for (auto &KV : RecipMap) {<br class="">
> + RecipParams &RP = KV.second;<br class="">
> + if (RP.Enabled == Uninitialized)<br class="">
> + RP.Enabled = Enable;<br class="">
> + if (RP.RefinementSteps == Uninitialized)<br class="">
> + RP.RefinementSteps = RefSteps;<br class="">
> + }<br class="">
> + } else {<br class="">
> + RecipParams &RP = RecipMap[Key];<br class="">
> + if (RP.Enabled == Uninitialized)<br class="">
> + RP.Enabled = Enable;<br class="">
> + if (RP.RefinementSteps == Uninitialized)<br class="">
> + RP.RefinementSteps = RefSteps;<br class="">
> + }<br class="">
> +}<br class="">
> +<br class="">
> +bool TargetRecip::operator==(const TargetRecip &Other) const {<br class="">
> + for (const auto &KV : RecipMap) {<br class="">
> + const StringRef &Op = KV.first;<br class="">
> + const RecipParams &RP = KV.second;<br class="">
> + const RecipParams &OtherRP = Other.RecipMap.find(Op)->second;<br class="">
> + if (RP.RefinementSteps != OtherRP.RefinementSteps)<br class="">
> + return false;<br class="">
> + if (RP.Enabled != OtherRP.Enabled)<br class="">
> + return false;<br class="">
> + }<br class="">
> + return true;<br class="">
> +}<br class="">
><br class="">
> Modified: llvm/trunk/lib/Target/X86/X86.td<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86.td-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=Gfy8vejozfODnYzPv_7RN2YUTArp-ADQcQGHsFPvxyo&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.td?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/X86/X86.td (original)<br class="">
> +++ llvm/trunk/lib/Target/X86/X86.td Wed Jun 3 20:32:35 2015<br class="">
> @@ -190,10 +190,6 @@ def FeatureSlowLEA : SubtargetFeature<"s<br class="">
> "LEA instruction with certain arguments is slow">;<br class="">
> def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",<br class="">
> "INC and DEC instructions are slower than ADD and SUB">;<br class="">
> -def FeatureUseSqrtEst : SubtargetFeature<"use-sqrt-est", "UseSqrtEst", "true",<br class="">
> - "Use RSQRT* to optimize square root calculations">;<br class="">
> -def FeatureUseRecipEst : SubtargetFeature<"use-recip-est", "UseReciprocalEst",<br class="">
> - "true", "Use RCP* to optimize division calculations">;<br class="">
> def FeatureSoftFloat<br class="">
> : SubtargetFeature<"soft-float", "UseSoftFloat", "true",<br class="">
> "Use software floating point features.">;<br class="">
> @@ -446,7 +442,7 @@ def : ProcessorModel<"btver2", BtVer2Mod<br class="">
> FeaturePRFCHW, FeatureAES, FeaturePCLMUL,<br class="">
> FeatureBMI, FeatureF16C, FeatureMOVBE,<br class="">
> FeatureLZCNT, FeaturePOPCNT, FeatureFastUAMem,<br class="">
> - FeatureSlowSHLD, FeatureUseSqrtEst, FeatureUseRecipEst]>;<br class="">
> + FeatureSlowSHLD]>;<br class="">
><br class="">
> // TODO: We should probably add 'FeatureFastUAMem' to all of the AMD chips.<br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86ISelLowering.cpp-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=dHwSxD7ssKBQCAjk850FyLaydnAzVTO0Y7mrsF5960Y&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br class="">
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Jun 3 20:32:35 2015<br class="">
> @@ -67,12 +67,6 @@ static cl::opt<bool> ExperimentalVectorW<br class="">
> "rather than promotion."),<br class="">
> cl::Hidden);<br class="">
><br class="">
> -static cl::opt<int> ReciprocalEstimateRefinementSteps(<br class="">
> - "x86-recip-refinement-steps", cl::init(1),<br class="">
> - cl::desc("Specify the number of Newton-Raphson iterations applied to the "<br class="">
> - "result of the hardware reciprocal estimate instruction."),<br class="">
> - cl::NotHidden);<br class="">
> -<br class="">
> // Forward declarations.<br class="">
> static SDValue getMOVL(SelectionDAG &DAG, SDLoc dl, EVT VT, SDValue V1,<br class="">
> SDValue V2);<br class="">
> @@ -13006,29 +13000,31 @@ SDValue X86TargetLowering::getRsqrtEstim<br class="">
> DAGCombinerInfo &DCI,<br class="">
> unsigned &RefinementSteps,<br class="">
> bool &UseOneConstNR) const {<br class="">
> - // FIXME: We should use instruction latency models to calculate the cost of<br class="">
> - // each potential sequence, but this is very hard to do reliably because<br class="">
> - // at least Intel's Core* chips have variable timing based on the number of<br class="">
> - // significant digits in the divisor and/or sqrt operand.<br class="">
> - if (!Subtarget->useSqrtEst())<br class="">
> - return SDValue();<br class="">
> -<br class="">
> EVT VT = Op.getValueType();<br class="">
> + const char *RecipOp;<br class="">
><br class="">
> - // SSE1 has rsqrtss and rsqrtps.<br class="">
> + // SSE1 has rsqrtss and rsqrtps. AVX adds a 256-bit variant for rsqrtps.<br class="">
> // TODO: Add support for AVX512 (v16f32).<br class="">
> // It is likely not profitable to do this for f64 because a double-precision<br class="">
> // rsqrt estimate with refinement on x86 prior to FMA requires at least 16<br class="">
> // instructions: convert to single, rsqrtss, convert back to double, refine<br class="">
> // (3 steps = at least 13 insts). If an 'rsqrtsd' variant was added to the ISA<br class="">
> // along with FMA, this could be a throughput win.<br class="">
> - if ((Subtarget->hasSSE1() && (VT == MVT::f32 || VT == MVT::v4f32)) ||<br class="">
> - (Subtarget->hasAVX() && VT == MVT::v8f32)) {<br class="">
> - RefinementSteps = 1;<br class="">
> - UseOneConstNR = false;<br class="">
> - return DCI.DAG.getNode(X86ISD::FRSQRT, SDLoc(Op), VT, Op);<br class="">
> - }<br class="">
> - return SDValue();<br class="">
> + if (VT == MVT::f32 && Subtarget->hasSSE1())<br class="">
> + RecipOp = "sqrtf";<br class="">
> + else if ((VT == MVT::v4f32 && Subtarget->hasSSE1()) ||<br class="">
> + (VT == MVT::v8f32 && Subtarget->hasAVX()))<br class="">
> + RecipOp = "vec-sqrtf";<br class="">
> + else<br class="">
> + return SDValue();<br class="">
> +<br class="">
> + TargetRecip Recips = DCI.DAG.getTarget().Options.Reciprocals;<br class="">
> + if (!Recips.isEnabled(RecipOp))<br class="">
> + return SDValue();<br class="">
> +<br class="">
> + RefinementSteps = Recips.getRefinementSteps(RecipOp);<br class="">
> + UseOneConstNR = false;<br class="">
> + return DCI.DAG.getNode(X86ISD::FRSQRT, SDLoc(Op), VT, Op);<br class="">
> }<br class="">
><br class="">
> /// The minimum architected relative accuracy is 2^-12. We need one<br class="">
> @@ -13036,15 +13032,9 @@ SDValue X86TargetLowering::getRsqrtEstim<br class="">
> SDValue X86TargetLowering::getRecipEstimate(SDValue Op,<br class="">
> DAGCombinerInfo &DCI,<br class="">
> unsigned &RefinementSteps) const {<br class="">
> - // FIXME: We should use instruction latency models to calculate the cost of<br class="">
> - // each potential sequence, but this is very hard to do reliably because<br class="">
> - // at least Intel's Core* chips have variable timing based on the number of<br class="">
> - // significant digits in the divisor.<br class="">
> - if (!Subtarget->useReciprocalEst())<br class="">
> - return SDValue();<br class="">
> -<br class="">
> EVT VT = Op.getValueType();<br class="">
> -<br class="">
> + const char *RecipOp;<br class="">
> +<br class="">
> // SSE1 has rcpss and rcpps. AVX adds a 256-bit variant for rcpps.<br class="">
> // TODO: Add support for AVX512 (v16f32).<br class="">
> // It is likely not profitable to do this for f64 because a double-precision<br class="">
> @@ -13052,12 +13042,20 @@ SDValue X86TargetLowering::getRecipEstim<br class="">
> // 15 instructions: convert to single, rcpss, convert back to double, refine<br class="">
> // (3 steps = 12 insts). If an 'rcpsd' variant was added to the ISA<br class="">
> // along with FMA, this could be a throughput win.<br class="">
> - if ((Subtarget->hasSSE1() && (VT == MVT::f32 || VT == MVT::v4f32)) ||<br class="">
> - (Subtarget->hasAVX() && VT == MVT::v8f32)) {<br class="">
> - RefinementSteps = ReciprocalEstimateRefinementSteps;<br class="">
> - return DCI.DAG.getNode(X86ISD::FRCP, SDLoc(Op), VT, Op);<br class="">
> - }<br class="">
> - return SDValue();<br class="">
> + if (VT == MVT::f32 && Subtarget->hasSSE1())<br class="">
> + RecipOp = "divf";<br class="">
> + else if ((VT == MVT::v4f32 && Subtarget->hasSSE1()) ||<br class="">
> + (VT == MVT::v8f32 && Subtarget->hasAVX()))<br class="">
> + RecipOp = "vec-divf";<br class="">
> + else<br class="">
> + return SDValue();<br class="">
> +<br class="">
> + TargetRecip Recips = DCI.DAG.getTarget().Options.Reciprocals;<br class="">
> + if (!Recips.isEnabled(RecipOp))<br class="">
> + return SDValue();<br class="">
> +<br class="">
> + RefinementSteps = Recips.getRefinementSteps(RecipOp);<br class="">
> + return DCI.DAG.getNode(X86ISD::FRCP, SDLoc(Op), VT, Op);<br class="">
> }<br class="">
><br class="">
> /// If we have at least two divisions that use the same divisor, convert to<br class="">
><br class="">
> Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86Subtarget.cpp-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=e6I0GenpUxHAc1i_D1-P30_9kktT-NDrO2rQMzEiTV0&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original)<br class="">
> +++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Wed Jun 3 20:32:35 2015<br class="">
> @@ -274,8 +274,6 @@ void X86Subtarget::initializeEnvironment<br class="">
> LEAUsesAG = false;<br class="">
> SlowLEA = false;<br class="">
> SlowIncDec = false;<br class="">
> - UseSqrtEst = false;<br class="">
> - UseReciprocalEst = false;<br class="">
> stackAlignment = 4;<br class="">
> // FIXME: this is a known good value for Yonah. How about others?<br class="">
> MaxInlineSizeThreshold = 128;<br class="">
><br class="">
> Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86Subtarget.h-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=qBZYjvQgynjxbjiZ8GdTD78EZrqVzH-NeVfffZq8Gz8&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/X86/X86Subtarget.h (original)<br class="">
> +++ llvm/trunk/lib/Target/X86/X86Subtarget.h Wed Jun 3 20:32:35 2015<br class="">
> @@ -190,16 +190,6 @@ protected:<br class="">
> /// True if INC and DEC instructions are slow when writing to flags<br class="">
> bool SlowIncDec;<br class="">
><br class="">
> - /// Use the RSQRT* instructions to optimize square root calculations.<br class="">
> - /// For this to be profitable, the cost of FSQRT and FDIV must be<br class="">
> - /// substantially higher than normal FP ops like FADD and FMUL.<br class="">
> - bool UseSqrtEst;<br class="">
> -<br class="">
> - /// Use the RCP* instructions to optimize FP division calculations.<br class="">
> - /// For this to be profitable, the cost of FDIV must be<br class="">
> - /// substantially higher than normal FP ops like FADD and FMUL.<br class="">
> - bool UseReciprocalEst;<br class="">
> -<br class="">
> /// Processor has AVX-512 PreFetch Instructions<br class="">
> bool HasPFI;<br class="">
><br class="">
> @@ -380,8 +370,6 @@ public:<br class="">
> bool LEAusesAG() const { return LEAUsesAG; }<br class="">
> bool slowLEA() const { return SlowLEA; }<br class="">
> bool slowIncDec() const { return SlowIncDec; }<br class="">
> - bool useSqrtEst() const { return UseSqrtEst; }<br class="">
> - bool useReciprocalEst() const { return UseReciprocalEst; }<br class="">
> bool hasCDI() const { return HasCDI; }<br class="">
> bool hasPFI() const { return HasPFI; }<br class="">
> bool hasERI() const { return HasERI; }<br class="">
><br class="">
> Modified: llvm/trunk/lib/Target/X86/X86TargetMachine.cpp<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86TargetMachine.cpp-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=tqQ4wDHPvbPmmYo2EUQDatzqioUp0gfMAwGmLghnRBg&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.cpp?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/lib/Target/X86/X86TargetMachine.cpp (original)<br class="">
> +++ llvm/trunk/lib/Target/X86/X86TargetMachine.cpp Wed Jun 3 20:32:35 2015<br class="">
> @@ -105,6 +105,13 @@ X86TargetMachine::X86TargetMachine(const<br class="">
> if (Subtarget.isTargetWin64())<br class="">
> this->Options.TrapUnreachable = true;<br class="">
><br class="">
> + // TODO: By default, all reciprocal estimate operations are off because<br class="">
> + // that matches the behavior before TargetRecip was added (except for btver2<br class="">
> + // which used subtarget features to enable this type of codegen).<br class="">
> + // We should change this to match GCC behavior where everything but<br class="">
> + // scalar division estimates are turned on by default with -ffast-math.<br class="">
> + this->Options.Reciprocals.setDefaults("all", false, 1);<br class="">
> +<br class="">
> initAsmInfo();<br class="">
> }<br class="">
><br class="">
><br class="">
> Modified: llvm/trunk/test/CodeGen/X86/recip-fastmath.ll<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_recip-2Dfastmath.ll-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=oyD52fZaucYGj8qjTrRsgFnbcTyrCT9PnSJGjNnwcJw&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/recip-fastmath.ll?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/test/CodeGen/X86/recip-fastmath.ll (original)<br class="">
> +++ llvm/trunk/test/CodeGen/X86/recip-fastmath.ll Wed Jun 3 20:32:35 2015<br class="">
> @@ -1,6 +1,6 @@<br class="">
> ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s<br class="">
> -; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx,use-recip-est | FileCheck %s --check-prefix=RECIP<br class="">
> -; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx,use-recip-est -x86-recip-refinement-steps=2 | FileCheck %s --check-prefix=REFINE<br class="">
> +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx -recip=divf,vec-divf | FileCheck %s --check-prefix=RECIP<br class="">
> +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx -recip=divf:2,vec-divf:2 | FileCheck %s --check-prefix=REFINE<br class="">
><br class="">
> ; If the target's divss/divps instructions are substantially<br class="">
> ; slower than rcpss/rcpps with a Newton-Raphson refinement,<br class="">
><br class="">
> Modified: llvm/trunk/test/CodeGen/X86/sqrt-fastmath.ll<br class="">
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_sqrt-2Dfastmath.ll-3Frev-3D239001-26r1-3D239000-26r2-3D239001-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=FFUE-Qdm6Fdix5gdreoEgOF12ozql82AUxP1v24keM4&s=0FSFG8_9MuUAh1RU4HUPFMHlBA-WFNgVUzo-nOa6Aek&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sqrt-fastmath.ll?rev=239001&r1=239000&r2=239001&view=diff</a><br class="">
> ==============================================================================<br class="">
> --- llvm/trunk/test/CodeGen/X86/sqrt-fastmath.ll (original)<br class="">
> +++ llvm/trunk/test/CodeGen/X86/sqrt-fastmath.ll Wed Jun 3 20:32:35 2015<br class="">
> @@ -1,5 +1,5 @@<br class="">
> ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s<br class="">
> -; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx,use-sqrt-est | FileCheck %s --check-prefix=ESTIMATE<br class="">
> +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx -recip=sqrtf,vec-sqrtf | FileCheck %s --check-prefix=ESTIMATE<br class="">
><br class="">
> declare double @__sqrt_finite(double) #0<br class="">
> declare float @__sqrtf_finite(float) #0<br class="">
><br class="">
><br class="">
> _______________________________________________<br class="">
> llvm-commits mailing list<br class="">
> <a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class="">
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br class="">
<br class="">
</div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></body></html>