[polly] r209571 - Split implementation from ScopDetectionDiagnostic.h

Andreas Simbuerger simbuerg at fim.uni-passau.de
Sat May 24 02:24:55 PDT 2014


Author: simbuerg
Date: Sat May 24 04:24:53 2014
New Revision: 209571

URL: http://llvm.org/viewvc/llvm-project?rev=209571&view=rev
Log:
Split implementation from ScopDetectionDiagnostic.h

We don't want the Statistic variables in every module that
includes the diagnostics.

Added:
    polly/trunk/lib/Analysis/ScopDetectionDiagnostic.cpp
Modified:
    polly/trunk/include/polly/ScopDetectionDiagnostic.h
    polly/trunk/lib/CMakeLists.txt

Modified: polly/trunk/include/polly/ScopDetectionDiagnostic.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetectionDiagnostic.h?rev=209571&r1=209570&r2=209571&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopDetectionDiagnostic.h (original)
+++ polly/trunk/include/polly/ScopDetectionDiagnostic.h Sat May 24 04:24:53 2014
@@ -5,6 +5,8 @@
 // This file is distributed under the University of Illinois Open Source
 // License. See LICENSE.TXT for details.
 //
+//===----------------------------------------------------------------------===//
+//
 // Small set of diagnostic helper classes to encapsulate any errors occurred
 // during the detection of Scops.
 //
@@ -13,6 +15,7 @@
 // related errors.
 // On error we generate an object that carries enough additional information
 // to diagnose the error and generate a helpful error message.
+//
 //===----------------------------------------------------------------------===//
 #ifndef POLLY_SCOP_DETECTION_DIAGNOSTIC_H
 #define POLLY_SCOP_DETECTION_DIAGNOSTIC_H
@@ -21,39 +24,24 @@
 #include "llvm/Analysis/AliasSetTracker.h"
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Value.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/Twine.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/raw_ostream.h"
-#include <string>
-
-#define DEBUG_TYPE "polly-detect"
+#include "llvm/Analysis/ScalarEvolutionExpressions.h"
 
-#define BADSCOP_STAT(NAME, DESC)                                               \
-  STATISTIC(Bad##NAME##ForScop, "Number of bad regions for Scop: " DESC)
-
-BADSCOP_STAT(CFG, "CFG too complex");
-BADSCOP_STAT(IndVar, "Non canonical induction variable in loop");
-BADSCOP_STAT(IndEdge, "Found invalid region entering edges");
-BADSCOP_STAT(LoopBound, "Loop bounds can not be computed");
-BADSCOP_STAT(FuncCall, "Function call with side effects appeared");
-BADSCOP_STAT(AffFunc, "Expression not affine");
-BADSCOP_STAT(Alias, "Found base address alias");
-BADSCOP_STAT(SimpleLoop, "Loop not in -loop-simplify form");
-BADSCOP_STAT(Other, "Others");
-
-namespace polly {
+#include <string>
+#include <memory>
 
-/// @brief Small string conversion via raw_string_stream.
-template <typename T> std::string operator+(Twine LHS, const T &RHS) {
-  std::string Buf;
-  raw_string_ostream fmt(Buf);
-  fmt << RHS;
-  fmt.flush();
+using namespace llvm;
 
-  return LHS.concat(Buf).str();
+namespace llvm {
+class SCEV;
+class BasicBlock;
+class Value;
+class Region;
 }
 
+namespace polly {
 //===----------------------------------------------------------------------===//
 /// @brief Base class of all reject reasons found during Scop detection.
 ///
@@ -79,7 +67,7 @@ public:
 class ReportCFG : public RejectReason {
   //===--------------------------------------------------------------------===//
 public:
-  ReportCFG() { ++BadCFGForScop; }
+  ReportCFG();
 };
 
 class ReportNonBranchTerminator : public ReportCFG {
@@ -90,9 +78,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("Non branch instruction terminates BB: " + BB->getName()).str();
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -109,9 +95,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("Not well structured condition at BB: " + BB->getName()).str();
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -123,7 +107,7 @@ public:
 class ReportAffFunc : public RejectReason {
   //===--------------------------------------------------------------------===//
 public:
-  ReportAffFunc() { ++BadAffFuncForScop; }
+  ReportAffFunc();
 };
 
 //===----------------------------------------------------------------------===//
@@ -139,9 +123,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("Condition based on 'undef' value in BB: " + BB->getName()).str();
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -160,10 +142,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("Condition in BB '" + BB->getName()).str() +
-           "' neither constant nor an icmp instruction";
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -180,9 +159,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("undef operand in branch at BB: " + BB->getName()).str();
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -206,10 +183,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("Non affine branch in BB '" + BB->getName()).str() +
-           "' with LHS: " + *LHS + " and RHS: " + *RHS;
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -220,7 +194,7 @@ class ReportNoBasePtr : public ReportAff
 public:
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const { return "No base pointer"; }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -231,7 +205,7 @@ class ReportUndefBasePtr : public Report
 public:
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const { return "Undefined base pointer"; }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -248,9 +222,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return "Base address not invariant in current region:" + *BaseValue;
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -268,9 +240,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return "Non affine access function: " + *AccessFunction;
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -282,7 +252,7 @@ public:
 class ReportIndVar : public RejectReason {
   //===--------------------------------------------------------------------===//
 public:
-  ReportIndVar() { ++BadIndVarForScop; }
+  ReportIndVar();
 };
 
 //===----------------------------------------------------------------------===//
@@ -298,9 +268,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return "SCEV of PHI node refers to SSA names in region: " + *Inst;
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -317,9 +285,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return "Non canonical PHI node: " + *Inst;
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -336,10 +302,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return ("No canonical IV at loop header: " + L->getHeader()->getName())
-        .str();
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -348,13 +311,12 @@ public:
 class ReportIndEdge : public RejectReason {
   //===--------------------------------------------------------------------===//
 public:
-  ReportIndEdge() { ++BadIndEdgeForScop; }
+  ReportIndEdge();
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return "Region has invalid entering edges!";
-  }
+  virtual std::string getMessage() const;
+  //@}
 };
 
 //===----------------------------------------------------------------------===//
@@ -369,16 +331,11 @@ class ReportLoopBound : public RejectRea
   const SCEV *LoopCount;
 
 public:
-  ReportLoopBound(Loop *L, const SCEV *LoopCount) : L(L), LoopCount(LoopCount) {
-    ++BadLoopBoundForScop;
-  }
+  ReportLoopBound(Loop *L, const SCEV *LoopCount);
 
   /// @name RejectReason interface
   //@{
-  virtual std::string getMessage() const {
-    return "Non affine loop bound '" + *LoopCount + "' in loop: " +
-           L->getHeader()->getName();
-  }
+  virtual std::string getMessage() const;
   //@}
 };
 
@@ -391,11 +348,11 @@ class ReportFuncCall : public RejectReas
   Instruction *Inst;
 
 public:
-  ReportFuncCall(Instruction *Inst) : Inst(Inst) { ++BadFuncCallForScop; }
+  ReportFuncCall(Instruction *Inst);
 
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const { return "Call instruction: " + *Inst; }
+  std::string getMessage() const;
   //@}
 };
 
@@ -410,46 +367,14 @@ class ReportAlias : public RejectReason
   /// @brief Format an invalid alias set.
   ///
   /// @param AS The invalid alias set to format.
-  std::string formatInvalidAlias(AliasSet &AS) const {
-    std::string Message;
-    raw_string_ostream OS(Message);
-
-    OS << "Possible aliasing: ";
-
-    std::vector<Value *> Pointers;
-
-    for (const auto &I : AS)
-      Pointers.push_back(I.getValue());
-
-    std::sort(Pointers.begin(), Pointers.end());
-
-    for (std::vector<Value *>::iterator PI = Pointers.begin(),
-                                        PE = Pointers.end();
-         ;) {
-      Value *V = *PI;
-
-      if (V->getName().size() == 0)
-        OS << "\"" << *V << "\"";
-      else
-        OS << "\"" << V->getName() << "\"";
-
-      ++PI;
-
-      if (PI != PE)
-        OS << ", ";
-      else
-        break;
-    }
-
-    return OS.str();
-  }
+  std::string formatInvalidAlias(AliasSet &AS) const;
 
 public:
-  ReportAlias(AliasSet *AS) : AS(AS) { ++BadAliasForScop; }
+  ReportAlias(AliasSet *AS);
 
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const { return formatInvalidAlias(*AS); }
+  std::string getMessage() const;
   //@}
 };
 
@@ -458,13 +383,11 @@ public:
 class ReportSimpleLoop : public RejectReason {
   //===--------------------------------------------------------------------===//
 public:
-  ReportSimpleLoop() { ++BadSimpleLoopForScop; }
+  ReportSimpleLoop();
 
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const {
-    return "Loop not in simplify form is invalid!";
-  }
+  std::string getMessage() const;
   //@}
 };
 
@@ -473,7 +396,7 @@ public:
 class ReportOther : public RejectReason {
   //===--------------------------------------------------------------------===//
 public:
-  ReportOther() { ++BadOtherForScop; }
+  ReportOther();
 
   /// @name RejectReason interface
   //@{
@@ -494,9 +417,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const {
-    return "Find bad intToptr prt: " + *BaseValue;
-  }
+  std::string getMessage() const;
   //@}
 };
 
@@ -511,7 +432,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const { return "Alloca instruction: " + *Inst; }
+  std::string getMessage() const;
   //@}
 };
 
@@ -526,7 +447,7 @@ public:
 
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const { return "Unknown instruction: " + *Inst; }
+  std::string getMessage() const;
   //@}
 };
 
@@ -537,7 +458,7 @@ class ReportPHIinExit : public ReportOth
 public:
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const { return "PHI node in exit BB"; }
+  std::string getMessage() const;
   //@}
 };
 
@@ -548,9 +469,7 @@ class ReportEntry : public ReportOther {
 public:
   /// @name RejectReason interface
   //@{
-  std::string getMessage() const {
-    return "Region containing entry block of function is invalid!";
-  }
+  std::string getMessage() const;
   //@}
 };
 

Added: polly/trunk/lib/Analysis/ScopDetectionDiagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetectionDiagnostic.cpp?rev=209571&view=auto
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetectionDiagnostic.cpp (added)
+++ polly/trunk/lib/Analysis/ScopDetectionDiagnostic.cpp Sat May 24 04:24:53 2014
@@ -0,0 +1,208 @@
+//=== ScopDetectionDiagnostic.cpp - Error diagnostics --------- -*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Small set of diagnostic helper classes to encapsulate any errors occurred
+// during the detection of Scops.
+//
+// The ScopDetection defines a set of error classes (via Statistic variables)
+// that groups a number of individual errors into a group, e.g. non-affinity
+// related errors.
+// On error we generate an object that carries enough additional information
+// to diagnose the error and generate a helpful error message.
+//
+//===----------------------------------------------------------------------===//
+#include "polly/ScopDetectionDiagnostic.h"
+
+#include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Analysis/AliasSetTracker.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Value.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/Statistic.h"
+
+#define DEBUG_TYPE "polly-detect"
+#include "llvm/Support/Debug.h"
+
+#include <string>
+
+#define BADSCOP_STAT(NAME, DESC)                                               \
+  STATISTIC(Bad##NAME##ForScop, "Number of bad regions for Scop: " DESC)
+
+BADSCOP_STAT(CFG, "CFG too complex");
+BADSCOP_STAT(IndVar, "Non canonical induction variable in loop");
+BADSCOP_STAT(IndEdge, "Found invalid region entering edges");
+BADSCOP_STAT(LoopBound, "Loop bounds can not be computed");
+BADSCOP_STAT(FuncCall, "Function call with side effects appeared");
+BADSCOP_STAT(AffFunc, "Expression not affine");
+BADSCOP_STAT(Alias, "Found base address alias");
+BADSCOP_STAT(SimpleLoop, "Loop not in -loop-simplify form");
+BADSCOP_STAT(Other, "Others");
+
+namespace polly {
+/// @brief Small string conversion via raw_string_stream.
+template <typename T> std::string operator+(Twine LHS, const T &RHS) {
+  std::string Buf;
+  raw_string_ostream fmt(Buf);
+  fmt << RHS;
+  fmt.flush();
+
+  return LHS.concat(Buf).str();
+}
+
+//===----------------------------------------------------------------------===//
+// ReportCFG.
+
+ReportCFG::ReportCFG() { ++BadCFGForScop; }
+
+std::string ReportNonBranchTerminator::getMessage() const {
+  return ("Non branch instruction terminates BB: " + BB->getName()).str();
+}
+
+std::string ReportCondition::getMessage() const {
+  return ("Not well structured condition at BB: " + BB->getName()).str();
+}
+
+ReportAffFunc::ReportAffFunc() { ++BadAffFuncForScop; }
+
+std::string ReportUndefCond::getMessage() const {
+  return ("Condition based on 'undef' value in BB: " + BB->getName()).str();
+}
+
+std::string ReportInvalidCond::getMessage() const {
+  return ("Condition in BB '" + BB->getName()).str() +
+         "' neither constant nor an icmp instruction";
+}
+
+std::string ReportUndefOperand::getMessage() const {
+  return ("undef operand in branch at BB: " + BB->getName()).str();
+}
+
+std::string ReportNonAffBranch::getMessage() const {
+  return ("Non affine branch in BB '" + BB->getName()).str() + "' with LHS: " +
+         *LHS + " and RHS: " + *RHS;
+}
+
+std::string ReportNoBasePtr::getMessage() const { return "No base pointer"; }
+
+std::string ReportUndefBasePtr::getMessage() const {
+  return "Undefined base pointer";
+}
+
+std::string ReportVariantBasePtr::getMessage() const {
+  return "Base address not invariant in current region:" + *BaseValue;
+}
+
+std::string ReportNonAffineAccess::getMessage() const {
+  return "Non affine access function: " + *AccessFunction;
+}
+
+ReportIndVar::ReportIndVar() { ++BadIndVarForScop; }
+
+std::string ReportPhiNodeRefInRegion::getMessage() const {
+  return "SCEV of PHI node refers to SSA names in region: " + *Inst;
+}
+
+std::string ReportNonCanonicalPhiNode::getMessage() const {
+  return "Non canonical PHI node: " + *Inst;
+}
+
+std::string ReportLoopHeader::getMessage() const {
+  return ("No canonical IV at loop header: " + L->getHeader()->getName()).str();
+}
+
+ReportIndEdge::ReportIndEdge() { ++BadIndEdgeForScop; }
+
+std::string ReportIndEdge::getMessage() const {
+  return "Region has invalid entering edges!";
+}
+
+ReportLoopBound::ReportLoopBound(Loop *L, const SCEV *LoopCount)
+    : L(L), LoopCount(LoopCount) {
+  ++BadLoopBoundForScop;
+}
+
+std::string ReportLoopBound::getMessage() const {
+  return "Non affine loop bound '" + *LoopCount + "' in loop: " +
+         L->getHeader()->getName();
+}
+
+ReportFuncCall::ReportFuncCall(Instruction *Inst) : Inst(Inst) {
+  ++BadFuncCallForScop;
+}
+
+std::string ReportFuncCall::getMessage() const {
+  return "Call instruction: " + *Inst;
+}
+
+ReportAlias::ReportAlias(AliasSet *AS) : AS(AS) { ++BadAliasForScop; }
+
+std::string ReportAlias::formatInvalidAlias(AliasSet &AS) const {
+  std::string Message;
+  raw_string_ostream OS(Message);
+
+  OS << "Possible aliasing: ";
+
+  std::vector<Value *> Pointers;
+
+  for (const auto &I : AS)
+    Pointers.push_back(I.getValue());
+
+  std::sort(Pointers.begin(), Pointers.end());
+
+  for (std::vector<Value *>::iterator PI = Pointers.begin(),
+                                      PE = Pointers.end();
+       ;) {
+    Value *V = *PI;
+
+    if (V->getName().size() == 0)
+      OS << "\"" << *V << "\"";
+    else
+      OS << "\"" << V->getName() << "\"";
+
+    ++PI;
+
+    if (PI != PE)
+      OS << ", ";
+    else
+      break;
+  }
+
+  return OS.str();
+}
+
+std::string ReportAlias::getMessage() const { return formatInvalidAlias(*AS); }
+
+ReportSimpleLoop::ReportSimpleLoop() { ++BadSimpleLoopForScop; }
+
+std::string ReportSimpleLoop::getMessage() const {
+  return "Loop not in simplify form is invalid!";
+}
+
+ReportOther::ReportOther() { ++BadOtherForScop; }
+
+std::string ReportIntToPtr::getMessage() const {
+  return "Find bad intToptr prt: " + *BaseValue;
+}
+
+std::string ReportAlloca::getMessage() const {
+  return "Alloca instruction: " + *Inst;
+}
+
+std::string ReportUnknownInst::getMessage() const {
+  return "Unknown instruction: " + *Inst;
+}
+
+std::string ReportPHIinExit::getMessage() const {
+  return "PHI node in exit BB";
+}
+
+std::string ReportEntry::getMessage() const {
+  return "Region containing entry block of function is invalid!";
+}
+} // namespace polly

Modified: polly/trunk/lib/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CMakeLists.txt?rev=209571&r1=209570&r2=209571&view=diff
==============================================================================
--- polly/trunk/lib/CMakeLists.txt (original)
+++ polly/trunk/lib/CMakeLists.txt Sat May 24 04:24:53 2014
@@ -36,6 +36,7 @@ endif (SCOPLIB_FOUND)
 add_polly_library(Polly
   Analysis/Dependences.cpp
   Analysis/ScopDetection.cpp
+  Analysis/ScopDetectionDiagnostic.cpp
   Analysis/ScopInfo.cpp
   Analysis/ScopGraphPrinter.cpp
   Analysis/ScopPass.cpp





More information about the llvm-commits mailing list