[llvm] [LV] Invalidate SCEV values in the scalar loop after loop vectorization (PR #69886)

via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 22 10:20:15 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Yingwei Zheng (dtcxzyw)

<details>
<summary>Changes</summary>

This PR fixes the assertion failure of `SE.verify()` after loop vectorization (with `--verify-scev-strict`).
After loop vectorization, we should forget all SCEV values in the scalar loops since the scalar loop doesn't dominate any of the loop exits.

Fixes #<!-- -->69097.
Fixes #<!-- -->66616.

I wonder if it increases compile time. Waiting for the evaluation result from https://llvm-compile-time-tracker.com/.

---
Full diff: https://github.com/llvm/llvm-project/pull/69886.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Vectorize/LoopVectorize.cpp (+4-1) 
- (added) llvm/test/Transforms/LoopVectorize/pr66616.ll (+35) 


``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index a5d523894bef155..8c8b4a1e2c32f7a 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -3543,7 +3543,10 @@ void InnerLoopVectorizer::fixVectorizedLoop(VPTransformState &State,
 
   // Forget the original basic block.
   PSE.getSE()->forgetLoop(OrigLoop);
-  PSE.getSE()->forgetBlockAndLoopDispositions();
+  // Now the scalar loop doesn't dominate any of the loop exits.
+  for (auto *Block : OrigLoop->getBlocks())
+    for (auto &Inst : *Block)
+      PSE.getSE()->forgetValue(&Inst);
 
   // After vectorization, the exit blocks of the original loop will have
   // additional predecessors. Invalidate SCEVs for the exit phis in case SE
diff --git a/llvm/test/Transforms/LoopVectorize/pr66616.ll b/llvm/test/Transforms/LoopVectorize/pr66616.ll
new file mode 100644
index 000000000000000..8374cfacfb71ecc
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/pr66616.ll
@@ -0,0 +1,35 @@
+; RUN: opt -passes="require<scalar-evolution>,print<scalar-evolution>,loop-vectorize" --verify-scev --verify-scev-strict -S < %s | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-LABEL: @pr66616(
+; CHECK: vector.body
+define void @pr66616() {
+entry:
+  br label %for.body
+
+for.cond5.preheader:                              ; preds = %for.body
+  br label %while.body.i
+
+for.body:                                         ; preds = %for.body, %entry
+  %storemerge12 = phi i8 [ 0, %entry ], [ %inc, %for.body ]
+  %0 = load i8, ptr null, align 1
+  %conv2 = sext i8 %0 to i32
+  %add3 = add i32 %conv2, 1
+  %inc = add i8 %storemerge12, 1
+  %conv1 = zext i8 %inc to i32
+  %tobool.not = icmp eq i32 %conv1, 0
+  br i1 %tobool.not, label %for.cond5.preheader, label %for.body
+
+while.body.i:                                     ; preds = %while.body.i, %for.cond5.preheader
+  %i.addr.09.i = phi i32 [ %dec.i, %while.body.i ], [ %add3, %for.cond5.preheader ]
+  %incdec.ptr48.i = phi ptr [ %incdec.ptr.i, %while.body.i ], [ null, %for.cond5.preheader ]
+  %dec.i = add i32 %i.addr.09.i, 1
+  %incdec.ptr.i = getelementptr i8, ptr %incdec.ptr48.i, i64 1
+  %tobool.not.i = icmp eq i32 %i.addr.09.i, 0
+  br i1 %tobool.not.i, label %for.inc9.loopexit, label %while.body.i
+
+for.inc9.loopexit:                                ; preds = %while.body.i
+  ret void
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/69886


More information about the llvm-commits mailing list