<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>