[llvm] 40569db - [DSE,MSSA] Move reachability check to main loop.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 21 08:38:45 PDT 2020


Author: Florian Hahn
Date: 2020-06-21T16:38:10+01:00
New Revision: 40569db7b3d71b5f4f71108015165c6224b0b242

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

LOG: [DSE,MSSA] Move reachability check to main loop.

As we traverse the CFG backwards, we could end up reaching unreachable
blocks. For unreachable blocks, we won't have computed post order
numbers and because DomAccess is reachable, unreachable blocks cannot be
on any path from it.

This fixes a crash with unreachable blocks.

Added: 
    llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll

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

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index c891487b42d6..80da42d99b00 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -1802,11 +1802,8 @@ struct DSEState {
         if (CommonPred)
           WorkList.insert(CommonPred);
         else
-          for (BasicBlock *R : PDT.getRoots()) {
-            if (!DT.isReachableFromEntry(R))
-              continue;
+          for (BasicBlock *R : PDT.getRoots())
             WorkList.insert(R);
-          }
 
         NumCFGTries++;
         // Check if all paths starting from an exit node go through one of the
@@ -1818,6 +1815,12 @@ struct DSEState {
             continue;
           if (Current == DomAccess->getBlock())
             return None;
+
+          // DomAccess is reachable from the entry, so we don't have to explore
+          // unreachable blocks further.
+          if (!DT.isReachableFromEntry(Current))
+            continue;
+
           unsigned CPO = PostOrderNumbers.find(Current)->second;
           // Current block is not on a path starting at DomAccess.
           if (CPO > UpperBound)

diff  --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll b/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll
new file mode 100644
index 000000000000..df08d619f9dc
--- /dev/null
+++ b/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll
@@ -0,0 +1,59 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -dse -enable-dse-memoryssa -S %s | FileCheck %s
+
+target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+
+; Make sure we do not crash when we encounter unreachable blocks while checking
+; if all paths to DomAccess go through a killing block.
+define void @test(float* %ptr, i1 %c.1, i1 %c.2, i1 %c.3) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[BB27:%.*]], label [[BB53:%.*]]
+; CHECK:       bb10:
+; CHECK-NEXT:    br label [[BB43:%.*]]
+; CHECK:       bb22:
+; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[BB22:%.*]], label [[BB53]]
+; CHECK:       bb27:
+; CHECK-NEXT:    br i1 [[C_3:%.*]], label [[BB38:%.*]], label [[BB39:%.*]]
+; CHECK:       bb38:
+; CHECK-NEXT:    store float 0.000000e+00, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[BB38]]
+; CHECK:       bb39:
+; CHECK-NEXT:    br i1 [[C_2]], label [[BB43]], label [[BB38]]
+; CHECK:       bb43:
+; CHECK-NEXT:    store float 0.000000e+00, float* [[PTR]], align 4
+; CHECK-NEXT:    br label [[BB50:%.*]]
+; CHECK:       bb50:
+; CHECK-NEXT:    br i1 [[C_3]], label [[BB27]], label [[BB53]]
+; CHECK:       bb53:
+; CHECK-NEXT:    br label [[BB53]]
+;
+bb:
+  br i1 %c.1, label %bb27, label %bb53
+
+bb10:                                             ; No predecessors!
+  br label %bb43
+
+bb22:                                             ; preds = %bb22
+  br i1 %c.2, label %bb22, label %bb53
+
+bb27:                                             ; preds = %bb50, %bb
+  br i1 %c.3, label %bb38, label %bb39
+
+bb38:                                             ; preds = %bb39, %bb38, %bb27
+  store float 0.000000e+00, float* %ptr, align 4
+  br label %bb38
+
+bb39:                                             ; preds = %bb27
+  br i1 %c.2, label %bb43, label %bb38
+
+bb43:                                             ; preds = %bb39, %bb10
+  store float 0.000000e+00, float* %ptr, align 4
+  br label %bb50
+
+bb50:                                             ; preds = %bb43
+  br i1 %c.3, label %bb27, label %bb53
+
+bb53:                                             ; preds = %bb53, %bb50, %bb22, %bb
+  br label %bb53
+}


        


More information about the llvm-commits mailing list