[llvm] e4d20ec - [IndVarSimply] Fix assert/release build difference.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 19 12:39:16 PST 2020


Author: Michael Kruse
Date: 2020-02-19T14:36:22-06:00
New Revision: e4d20ec8add39209972e55a71c327fa5b4fc4400

URL: https://github.com/llvm/llvm-project/commit/e4d20ec8add39209972e55a71c327fa5b4fc4400
DIFF: https://github.com/llvm/llvm-project/commit/e4d20ec8add39209972e55a71c327fa5b4fc4400.diff

LOG: [IndVarSimply] Fix assert/release build difference.

In builds with assertions enabled (!NDEBUG), IndVarSimplify does an
additional query to ScalarEvolution which may change future SCEV queries
since it fills the internal cache differently. The result is actually
only used with the -verify-indvars command line option. We fix the issue
by only calling SE->getBackedgeTakenCount(L) if -verify-indvars is
enabled such that only -verify-indvars shows the behavior, but not debug
builds themselves. Also add a remark to the description of
-verify-indvars about this behavior.

Fixes llvm.org/PR44815

Differential Revision: https://reviews.llvm.org/D74810

Added: 
    llvm/test/Transforms/IndVarSimplify/deterministic-scev-verify.ll

Modified: 
    llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
index 210f6bcfdc93..5237fb5718d0 100644
--- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -102,8 +102,10 @@ STATISTIC(NumElimIV      , "Number of congruent IVs eliminated");
 // implement a strong expression equivalence checker in SCEV. Until then, we
 // use the verify-indvars flag, which may assert in some cases.
 static cl::opt<bool> VerifyIndvars(
-  "verify-indvars", cl::Hidden,
-  cl::desc("Verify the ScalarEvolution result after running indvars"));
+    "verify-indvars", cl::Hidden,
+    cl::desc("Verify the ScalarEvolution result after running indvars. Has no "
+             "effect in release builds. (Note: this adds additional SCEV "
+             "queries potentially changing the analysis result)"));
 
 static cl::opt<ReplaceExitVal> ReplaceExitValue(
     "replexitval", cl::Hidden, cl::init(OnlyCheapRepl),
@@ -2663,7 +2665,12 @@ bool IndVarSimplify::run(Loop *L) {
 
 #ifndef NDEBUG
   // Used below for a consistency check only
-  const SCEV *BackedgeTakenCount = SE->getBackedgeTakenCount(L);
+  // Note: Since the result returned by ScalarEvolution may depend on the order
+  // in which previous results are added to its cache, the call to
+  // getBackedgeTakenCount() may change following SCEV queries.
+  const SCEV *BackedgeTakenCount;
+  if (VerifyIndvars)
+    BackedgeTakenCount = SE->getBackedgeTakenCount(L);
 #endif
 
   bool Changed = false;

diff  --git a/llvm/test/Transforms/IndVarSimplify/deterministic-scev-verify.ll b/llvm/test/Transforms/IndVarSimplify/deterministic-scev-verify.ll
new file mode 100644
index 000000000000..b497dd0d974f
--- /dev/null
+++ b/llvm/test/Transforms/IndVarSimplify/deterministic-scev-verify.ll
@@ -0,0 +1,38 @@
+; RUN: opt -indvars -stats -disable-output < %s 2>&1 | FileCheck %s --check-prefix=STATS
+; RUN: opt -indvars -S < %s | FileCheck %s --check-prefix=IR
+; REQUIRES: asserts
+
+; Check that IndVarSimplify's result is not influenced by stray calls to
+; ScalarEvolution in debug builds. However, -verify-indvars may still do
+; such calls.
+; llvm.org/PR44815
+
+; STATS: 1 scalar-evolution - Number of loops with trip counts computed by force
+; STATS: 2 scalar-evolution - Number of loops with predictable loop counts
+
+; In this test, adding -verify-indvars causes %tmp13 to not be optimized away.
+; IR-LABEL: @foo
+; IR-NOT:   phi i32
+
+target triple = "x86_64-unknown-linux-gnu"
+
+ at b = external dso_local local_unnamed_addr global i32
+
+define dso_local void @foo() {
+tmp0:
+  br label %tmp12
+
+tmp7:
+  %tmp8 = add nuw nsw i32 %tmp13, 1
+  store i32 undef, i32* @b
+  br label %tmp12
+
+tmp12:
+  %tmp13 = phi i32 [ 2, %tmp0 ], [ %tmp8, %tmp7 ]
+  %tmp14 = phi i32 [ 1, %tmp0 ], [ %tmp13, %tmp7 ]
+  %tmp15 = icmp ult i32 %tmp14, undef
+  br i1 %tmp15, label %tmp7, label %tmp16
+
+tmp16:
+  ret void
+}


        


More information about the llvm-commits mailing list