[llvm] [VPlan] Use RPOT traversal in CSE, fixing potential crash (PR #187548)

Ramkumar Ramachandra via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 31 01:02:13 PDT 2026


https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/187548

>From 5b4ae27419d5f27336631a26aa0cd410c78d3e1f Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 19 Mar 2026 17:42:11 +0000
Subject: [PATCH] [VPlan] Use RPOT traversal in CSE, fixing potential crash

There could be potential cse crashes arising from outdated hash values
unless we forbid replacements in successor phis in blocks that are not
dominated by the def. It is unfortunately impossible to write a test
case showing a crash at present, but crashes do occur when attempting to
cse DerivedIV recipes.

Fixes #187499.

Co-authored-by: Luke Lau <luke at igalia.com>
---
 llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index f779aa92a3aa7..d6e014e71e1f4 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -2630,8 +2630,9 @@ void VPlanTransforms::cse(VPlan &Plan) {
   VPDominatorTree VPDT(Plan);
   DenseMap<VPSingleDefRecipe *, VPSingleDefRecipe *, VPCSEDenseMapInfo> CSEMap;
 
-  for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
-           vp_depth_first_deep(Plan.getEntry()))) {
+  ReversePostOrderTraversal<VPBlockDeepTraversalWrapper<VPBlockBase *>> RPOT(
+      Plan.getEntry());
+  for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(RPOT)) {
     for (VPRecipeBase &R : *VPBB) {
       auto *Def = dyn_cast<VPSingleDefRecipe>(&R);
       if (!Def || !VPCSEDenseMapInfo::canHandle(Def))



More information about the llvm-commits mailing list