[PATCH] D96979: Extending IsGuaranteedLoopInvariant to support a GetElementPtrInst defined in the entry block

Matteo Favaro via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 18 11:03:10 PST 2021


fvrmatteo created this revision.
fvrmatteo added a reviewer: fhahn.
Herald added a subscriber: hiraditya.
fvrmatteo requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The **IsGuaranteedLoopInvariant** function is making sure to check if the incoming pointer is guaranteed to be loop invariant, therefore I think the case where the pointer is defined in the entry block of a function automatically guarantees the pointer to be loop invariant, as the entry block of a function cannot have predecessors or be part of a loop.

I implemented this small patch and tested it using **ninja check-llvm-unit** and **ninja check-llvm**. I added a contained test file that shows the problem and used **opt -O3 -debug** on it to make sure the case is not currently handled (in fact the debug log is showing that the DSE pass is bailing out when testing if the killer store is able to clobber the dead store).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D96979

Files:
  llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
  llvm/test/Transforms/DeadStoreElimination/MSSA/loop-invariant-entry-block.ll


Index: llvm/test/Transforms/DeadStoreElimination/MSSA/loop-invariant-entry-block.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/DeadStoreElimination/MSSA/loop-invariant-entry-block.ll
@@ -0,0 +1,42 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -dse -S | FileCheck %s
+
+ at BUFFER = external dso_local local_unnamed_addr global [0 x i8], align 1
+
+define void @MissedDSEOpportunity(i64 %idx, i1* noalias %cc) {
+; CHECK-LABEL: @MissedDSEOpportunity(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [0 x i8], [0 x i8]* @BUFFER, i64 0, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[BC:%.*]] = bitcast i8* [[GEP]] to i64*
+; CHECK-NEXT:    [[CC0:%.*]] = load volatile i1, i1* [[CC:%.*]], align 1
+; CHECK-NEXT:    br i1 [[CC0]], label [[HEAD:%.*]], label [[EXIT:%.*]]
+; CHECK:       head:
+; CHECK-NEXT:    [[CC1:%.*]] = load volatile i1, i1* [[CC]], align 1
+; CHECK-NEXT:    br i1 [[CC1]], label [[HEAD]], label [[EXIT_LOOPEXIT:%.*]]
+; CHECK:       exit.loopexit:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    store i64 0, i64* [[BC]], align 4
+; CHECK-NEXT:    ret void
+;
+entry:
+  ; The entry block cannot have predecessors or be part of a loop
+  %gep = getelementptr inbounds [0 x i8], [0 x i8]* @BUFFER, i64 0, i64 %idx
+  %bc = bitcast i8* %gep to i64*
+  %cc0 = load volatile i1, i1* %cc, align 1
+  br i1 %cc0, label %head, label %exit
+
+head:                                             ; preds = %entry, %head
+  %cc1 = load volatile i1, i1* %cc, align 1
+  br i1 %cc1, label %head, label %exit.loopexit
+
+exit.loopexit:                                    ; preds = %head
+  ; Dead store
+  store i64 2, i64* %bc, align 4
+  br label %exit
+
+exit:                                             ; preds = %exit.loopexit, %entry
+  ; Killer store
+  store i64 0, i64* %bc, align 4
+  ret void
+}
Index: llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -1910,8 +1910,18 @@
       return true;
     };
 
+    auto IsEntryBlockGEP = [](GEPOperator *GEP) {
+      if (auto *I = dyn_cast<Instruction>(GEP)) {
+        return I->getParent() == &I->getFunction()->getEntryBlock();
+      }
+      return false;
+    };
+
     Ptr = Ptr->stripPointerCasts();
     if (auto *GEP = dyn_cast<GEPOperator>(Ptr)) {
+      if (IsEntryBlockGEP(GEP))
+        return true;
+
       return IsGuaranteedLoopInvariantBase(GEP->getPointerOperand()) &&
              GEP->hasAllConstantIndices();
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96979.324658.patch
Type: text/x-patch
Size: 2741 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210218/a3109812/attachment.bin>


More information about the llvm-commits mailing list