Index: clang/lib/Driver/ToolChains/Linux.h =================================================================== --- clang/lib/Driver/ToolChains/Linux.h +++ clang/lib/Driver/ToolChains/Linux.h @@ -49,6 +49,11 @@ std::vector ExtraOpts; + llvm::DenormalMode getDefaultDenormalModeForType( + const llvm::opt::ArgList &DriverArgs, + Action::OffloadKind DeviceOffloadKind, + const llvm::fltSemantics *FPType = nullptr) const override; + protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -1044,3 +1044,17 @@ Twine("-u", llvm::getInstrProfRuntimeHookVarName()))); ToolChain::addProfileRTLibs(Args, CmdArgs); } + +llvm::DenormalMode Linux::getDefaultDenormalModeForType( + const llvm::opt::ArgList &DriverArgs, + Action::OffloadKind DeviceOffloadKind, + const llvm::fltSemantics *FPType) const { + switch (getTriple().getArch()) { + case llvm::Triple::x86: + case llvm::Triple::x86_64: + // DAZ and FTZ are on by default. + return llvm::DenormalMode::getPreserveSign(); + default: + return llvm::DenormalMode::getIEEE(); + } +} Index: clang/lib/Driver/ToolChains/PS4CPU.h =================================================================== --- clang/lib/Driver/ToolChains/PS4CPU.h +++ clang/lib/Driver/ToolChains/PS4CPU.h @@ -88,6 +88,14 @@ // capable of unit splitting. bool canSplitThinLTOUnit() const override { return false; } + llvm::DenormalMode getDefaultDenormalModeForType( + const llvm::opt::ArgList &DriverArgs, + Action::OffloadKind DeviceOffloadKind, + const llvm::fltSemantics *FPType) const override { + // DAZ and FTZ are on by default. + return llvm::DenormalMode::getPreserveSign(); + } + protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; Index: clang/test/Driver/default-denormal-fp-math.c =================================================================== --- /dev/null +++ clang/test/Driver/default-denormal-fp-math.c @@ -0,0 +1,7 @@ +// RUN: %clang -### -target arm-unknown-linux-gnu -c %s -v 2>&1 | FileCheck -check-prefix=CHECK-IEEE %s +// RUN: %clang -### -target i386-unknown-linux-gnu -c %s -v 2>&1 | FileCheck -check-prefix=CHECK-ZEROSIGN %s +// RUN: %clang -### -target x86_64-unknown-linux-gnu -c %s -v 2>&1 | FileCheck -check-prefix=CHECK-ZEROSIGN %s +// RUN: %clang -### -target x86_64-scei-ps4 -c %s -v 2>&1 | FileCheck -check-prefix=CHECK-ZEROSIGN %s + +// CHECK-IEEE: -fdenormal-fp-math=ieee,ieee +// CHECK-ZEROSIGN: -fdenormal-fp-math=preserve-sign,preserve-sign