<div dir="ltr">Hello Chris,<br><br>This revision broke couple or our builders:<br><br><a href="http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/947">http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/947</a><br><a href="http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu/builds/6">http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu/builds/6</a><br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 19, 2016 at 7:01 AM, Chris Dewhurst via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: lerochris<br>
Date: Wed Oct 19 09:01:06 2016<br>
New Revision: 284591<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=284591&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=284591&view=rev</a><br>
Log:<br>
[Sparc][LEON] Detects an erratum on UT699 LEON 3 processors involving rounding mode changes and issues an appropriate user error message.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D24665" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D24665</a><br>
<br>
Added:<br>
llvm/trunk/test/CodeGen/SPARC/<wbr>LeonDetectRoundChangePassUT.ll (with props)<br>
Modified:<br>
llvm/trunk/lib/Target/Sparc/<wbr>LeonFeatures.td<br>
llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.cpp<br>
llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.h<br>
llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.cpp<br>
llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.h<br>
llvm/trunk/lib/Target/Sparc/<wbr>SparcTargetMachine.cpp<br>
<br>
Modified: llvm/trunk/lib/Target/Sparc/<wbr>LeonFeatures.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/LeonFeatures.td?rev=284591&r1=284590&r2=284591&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>Sparc/LeonFeatures.td?rev=<wbr>284591&r1=284590&r2=284591&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/Sparc/<wbr>LeonFeatures.td (original)<br>
+++ llvm/trunk/lib/Target/Sparc/<wbr>LeonFeatures.td Wed Oct 19 09:01:06 2016<br>
@@ -66,6 +66,14 @@ def ReplaceFMULS : SubtargetFeature<<br>
"LEON erratum fix: Replace FMULS instruction with FMULD and relevant conversion instructions"<br>
>;<br>
<br>
+def DetectRoundChange : SubtargetFeature<<br>
+ "detectroundchange",<br>
+ "DetectRoundChange",<br>
+ "true",<br>
+ "LEON3 erratum detection: Detects any rounding mode change "<br>
+ "request: use only the round-to-nearest rounding mode"<br>
+>;<br>
+<br>
def FixAllFDIVSQRT : SubtargetFeature<<br>
"fixallfdivsqrt",<br>
"FixAllFDIVSQRT",<br>
<br>
Modified: llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/LeonPasses.cpp?rev=284591&r1=284590&r2=284591&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>Sparc/LeonPasses.cpp?rev=<wbr>284591&r1=284590&r2=284591&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.cpp (original)<br>
+++ llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.cpp Wed Oct 19 09:01:06 2016<br>
@@ -16,6 +16,7 @@<br>
#include "llvm/CodeGen/MachineInstr.h"<br>
#include "llvm/CodeGen/<wbr>MachineInstrBuilder.h"<br>
#include "llvm/CodeGen/<wbr>MachineRegisterInfo.h"<br>
+#include "llvm/IR/DiagnosticInfo.h"<br>
#include "llvm/IR/LLVMContext.h"<br>
#include "llvm/Support/raw_ostream.h"<br>
using namespace llvm;<br>
@@ -269,6 +270,50 @@ bool ReplaceFMULS::<wbr>runOnMachineFunction(<br>
}<br>
}<br>
}<br>
+ }<br>
+<br>
+ return Modified;<br>
+}<br>
+<br>
+<br>
+//***************************<wbr>******************************<wbr>********************<br>
+//**** DetectRoundChange pass<br>
+//***************************<wbr>******************************<wbr>********************<br>
+// To prevent any explicit change of the default rounding mode, this pass<br>
+// detects any call of the fesetround function.<br>
+// A warning is generated to ensure the user knows this has happened.<br>
+//<br>
+// Detects an erratum in UT699 LEON 3 processor<br>
+<br>
+char DetectRoundChange::ID = 0;<br>
+<br>
+DetectRoundChange::<wbr>DetectRoundChange(<wbr>TargetMachine &tm)<br>
+ : LEONMachineFunctionPass(tm, ID) {}<br>
+<br>
+bool DetectRoundChange::<wbr>runOnMachineFunction(<wbr>MachineFunction &MF) {<br>
+ Subtarget = &MF.getSubtarget<<wbr>SparcSubtarget>();<br>
+<br>
+ bool Modified = false;<br>
+ for (auto MFI = MF.begin(), E = MF.end(); MFI != E; ++MFI) {<br>
+ MachineBasicBlock &MBB = *MFI;<br>
+ for (auto MBBI = MBB.begin(), E = MBB.end(); MBBI != E; ++MBBI) {<br>
+ MachineInstr &MI = *MBBI;<br>
+ unsigned Opcode = MI.getOpcode();<br>
+ if (Opcode == SP::CALL && MI.getNumOperands() > 0) {<br>
+ MachineOperand &MO = MI.getOperand(0);<br>
+<br>
+ if (MO.isGlobal()) {<br>
+ StringRef FuncName = MO.getGlobal()->getName();<br>
+ if (FuncName.compare_lower("<wbr>fesetround") == 0) {<br>
+ errs() << "Error: You are using the detectroundchange "<br>
+ "option to detect rounding changes that will "<br>
+ "cause LEON errata. The only way to fix this "<br>
+ "is to remove the call to fesetround from "<br>
+ "the source code.\n";<br>
+ }<br>
+ }<br>
+ }<br>
+ }<br>
}<br>
<br>
return Modified;<br>
<br>
Modified: llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/LeonPasses.h?rev=284591&r1=284590&r2=284591&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>Sparc/LeonPasses.h?rev=284591&<wbr>r1=284590&r2=284591&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.h (original)<br>
+++ llvm/trunk/lib/Target/Sparc/<wbr>LeonPasses.h Wed Oct 19 09:01:06 2016<br>
@@ -84,6 +84,20 @@ public:<br>
}<br>
};<br>
<br>
+class LLVM_LIBRARY_VISIBILITY DetectRoundChange<br>
+ : public LEONMachineFunctionPass {<br>
+public:<br>
+ static char ID;<br>
+<br>
+ DetectRoundChange(<wbr>TargetMachine &tm);<br>
+ bool runOnMachineFunction(<wbr>MachineFunction &MF) override;<br>
+<br>
+ StringRef getPassName() const override {<br>
+ return "DetectRoundChange: Leon erratum detection: detect any rounding "<br>
+ "mode change request: use only the round-to-nearest rounding mode";<br>
+ }<br>
+};<br>
+<br>
class LLVM_LIBRARY_VISIBILITY FixAllFDIVSQRT : public LEONMachineFunctionPass {<br>
public:<br>
static char ID;<br>
<br>
Modified: llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcSubtarget.cpp?rev=284591&r1=284590&r2=284591&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>Sparc/SparcSubtarget.cpp?rev=<wbr>284591&r1=284590&r2=284591&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.cpp (original)<br>
+++ llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.cpp Wed Oct 19 09:01:06 2016<br>
@@ -44,6 +44,7 @@ SparcSubtarget &SparcSubtarget::initiali<br>
FixFSMULD = false;<br>
ReplaceFMULS = false;<br>
FixAllFDIVSQRT = false;<br>
+ DetectRoundChange = false;<br>
<br>
// Determine default and user specified characteristics<br>
std::string CPUName = CPU;<br>
<br>
Modified: llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcSubtarget.h?rev=284591&r1=284590&r2=284591&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>Sparc/SparcSubtarget.h?rev=<wbr>284591&r1=284590&r2=284591&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.h (original)<br>
+++ llvm/trunk/lib/Target/Sparc/<wbr>SparcSubtarget.h Wed Oct 19 09:01:06 2016<br>
@@ -48,6 +48,7 @@ class SparcSubtarget : public SparcGenSu<br>
bool FixFSMULD;<br>
bool ReplaceFMULS;<br>
bool FixAllFDIVSQRT;<br>
+ bool DetectRoundChange;<br>
bool PerformSDIVReplace;<br>
<br>
SparcInstrInfo InstrInfo;<br>
@@ -93,6 +94,7 @@ public:<br>
bool fixFSMULD() const { return FixFSMULD; }<br>
bool replaceFMULS() const { return ReplaceFMULS; }<br>
bool fixAllFDIVSQRT() const { return FixAllFDIVSQRT; }<br>
+ bool detectRoundChange() const { return DetectRoundChange; }<br>
<br>
/// ParseSubtargetFeatures - Parses features string setting specified<br>
/// subtarget options. Definition of function is auto generated by tblgen.<br>
<br>
Modified: llvm/trunk/lib/Target/Sparc/<wbr>SparcTargetMachine.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp?rev=284591&r1=284590&r2=284591&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>Sparc/SparcTargetMachine.cpp?<wbr>rev=284591&r1=284590&r2=<wbr>284591&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/Sparc/<wbr>SparcTargetMachine.cpp (original)<br>
+++ llvm/trunk/lib/Target/Sparc/<wbr>SparcTargetMachine.cpp Wed Oct 19 09:01:06 2016<br>
@@ -157,6 +157,9 @@ void SparcPassConfig::<wbr>addPreEmitPass(){<br>
{<br>
addPass(new ReplaceFMULS(<wbr>getSparcTargetMachine()));<br>
}<br>
+ if (this->getSparcTargetMachine()<wbr>.getSubtargetImpl()-><wbr>detectRoundChange()) {<br>
+ addPass(new DetectRoundChange(<wbr>getSparcTargetMachine()));<br>
+ }<br>
if (this->getSparcTargetMachine()<wbr>.getSubtargetImpl()-><wbr>fixAllFDIVSQRT())<br>
{<br>
addPass(new FixAllFDIVSQRT(<wbr>getSparcTargetMachine()));<br>
<br>
Added: llvm/trunk/test/CodeGen/SPARC/<wbr>LeonDetectRoundChangePassUT.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SPARC/LeonDetectRoundChangePassUT.ll?rev=284591&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/SPARC/<wbr>LeonDetectRoundChangePassUT.<wbr>ll?rev=284591&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/SPARC/<wbr>LeonDetectRoundChangePassUT.ll (added)<br>
+++ llvm/trunk/test/CodeGen/SPARC/<wbr>LeonDetectRoundChangePassUT.ll Wed Oct 19 09:01:06 2016<br>
@@ -0,0 +1,22 @@<br>
+; RUN: llc %s -O0 -march=sparc -mcpu=leon3 -mattr=+detectroundchange -o - |& grep "detect rounding changes"<br>
+<br>
+; Function Attrs: nounwind<br>
+declare i32 @fesetround(i32)<br>
+<br>
+define void @test_round_change() {<br>
+entry:<br>
+ %call = call i32 @fesetround(i32 2048)<br>
+<br>
+ ret void<br>
+}<br>
+; RUN: llc %s -O0 -march=sparc -mcpu=leon3 -mattr=+detectroundchange -o - |& grep "detect rounding changes"<br>
+<br>
+; Function Attrs: nounwind<br>
+declare i32 @fesetround(i32)<br>
+<br>
+define void @test_round_change() {<br>
+entry:<br>
+ %call = call i32 @fesetround(i32 2048)<br>
+<br>
+ ret void<br>
+}<br>
<br>
Propchange: llvm/trunk/test/CodeGen/SPARC/<wbr>LeonDetectRoundChangePassUT.ll<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
svn:eol-style = native<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>