[llvm-commits] [llvm] r166872 - /llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Benjamin Kramer benny.kra at googlemail.com
Sat Oct 27 03:45:02 PDT 2012


Author: d0k
Date: Sat Oct 27 05:45:01 2012
New Revision: 166872

URL: http://llvm.org/viewvc/llvm-project?rev=166872&view=rev
Log:
SCEV validator: Add workarounds for some common false positives due to the way it handles strings.

Modified:
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=166872&r1=166871&r2=166872&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Sat Oct 27 05:45:01 2012
@@ -6941,6 +6941,16 @@
 }
 
 typedef DenseMap<const Loop *, std::string> VerifyMap;
+
+/// replaceSubString - Replaces all occurences of From in Str with To.
+static void replaceSubString(std::string &Str, StringRef From, StringRef To) {
+  size_t Pos = 0;
+  while ((Pos = Str.find(From, Pos)) != std::string::npos) {
+    Str.replace(Pos, From.size(), To.data(), To.size());
+    Pos += To.size();
+  }
+}
+
 /// getLoopBackedgeTakenCounts - Helper method for verifyAnalysis.
 static void
 getLoopBackedgeTakenCounts(Loop *L, VerifyMap &Map, ScalarEvolution &SE) {
@@ -6951,6 +6961,14 @@
     if (S.empty()) {
       raw_string_ostream OS(S);
       SE.getBackedgeTakenCount(L)->print(OS);
+
+      // false and 0 are semantically equivalent. This can happen in dead loops.
+      replaceSubString(OS.str(), "false", "0");
+      // Remove wrap flags, their use in SCEV is highly fragile.
+      // FIXME: Remove this when SCEV gets smarter about them.
+      replaceSubString(OS.str(), "<nw>", "");
+      replaceSubString(OS.str(), "<nsw>", "");
+      replaceSubString(OS.str(), "<nuw>", "");
     }
   }
 }





More information about the llvm-commits mailing list