[llvm] 8bf3116 - Revert "[MergeLoadStoreMotion] Don't require GEP for sinking"

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 27 03:39:01 PST 2022


Author: Nikita Popov
Date: 2022-12-27T12:38:04+01:00
New Revision: 8bf311638704a9488d6a83d0ddbb23b4f4bb70f2

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

LOG: Revert "[MergeLoadStoreMotion] Don't require GEP for sinking"

I missed a test failure in the DebugInfo directory.

This reverts commit 2c15b9d9e1a898cfd849db81b36d278eac3ef24e.
This reverts commit fb435e1cb5842e1437436e9e7378dfc4106fdad8.

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp
    llvm/test/Transforms/MergedLoadStoreMotion/st_sink_check_debug.ll
    llvm/test/Transforms/MergedLoadStoreMotion/st_sink_debuginvariant.ll
    llvm/test/Transforms/MergedLoadStoreMotion/st_sink_no_gep.ll
    llvm/test/Transforms/MergedLoadStoreMotion/st_sink_split_bb.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp b/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp
index af4ef29fa26a3..253a850d9479c 100644
--- a/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp
+++ b/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp
@@ -220,29 +220,27 @@ PHINode *MergedLoadStoreMotion::getPHIOperand(BasicBlock *BB, StoreInst *S0,
 }
 
 ///
-/// Check if 2 stores can be sunk, optionally together with corresponding GEPs.
+/// Check if 2 stores can be sunk together with corresponding GEPs
 ///
 bool MergedLoadStoreMotion::canSinkStoresAndGEPs(StoreInst *S0,
                                                  StoreInst *S1) const {
-  if (S0->getPointerOperand() == S1->getPointerOperand())
-    return true;
-  auto *GEP0 = dyn_cast<GetElementPtrInst>(S0->getPointerOperand());
-  auto *GEP1 = dyn_cast<GetElementPtrInst>(S1->getPointerOperand());
-  return GEP0 && GEP1 && GEP0->isIdenticalTo(GEP1) && GEP0->hasOneUse() &&
-         (GEP0->getParent() == S0->getParent()) && GEP1->hasOneUse() &&
-         (GEP1->getParent() == S1->getParent());
+  auto *A0 = dyn_cast<Instruction>(S0->getPointerOperand());
+  auto *A1 = dyn_cast<Instruction>(S1->getPointerOperand());
+  return A0 && A1 && A0->isIdenticalTo(A1) && A0->hasOneUse() &&
+         (A0->getParent() == S0->getParent()) && A1->hasOneUse() &&
+         (A1->getParent() == S1->getParent()) && isa<GetElementPtrInst>(A0);
 }
 
 ///
 /// Merge two stores to same address and sink into \p BB
 ///
-/// Optionally also sinks GEP instruction computing the store address
+/// Also sinks GEP instruction computing the store address
 ///
 void MergedLoadStoreMotion::sinkStoresAndGEPs(BasicBlock *BB, StoreInst *S0,
                                               StoreInst *S1) {
-  Value *Ptr0 = S0->getPointerOperand();
-  Value *Ptr1 = S1->getPointerOperand();
   // Only one definition?
+  auto *A0 = dyn_cast<Instruction>(S0->getPointerOperand());
+  auto *A1 = dyn_cast<Instruction>(S1->getPointerOperand());
   LLVM_DEBUG(dbgs() << "Sink Instruction into BB \n"; BB->dump();
              dbgs() << "Instruction Left\n"; S0->dump(); dbgs() << "\n";
              dbgs() << "Instruction Right\n"; S1->dump(); dbgs() << "\n");
@@ -256,23 +254,23 @@ void MergedLoadStoreMotion::sinkStoresAndGEPs(BasicBlock *BB, StoreInst *S0,
 
   // Create the new store to be inserted at the join point.
   StoreInst *SNew = cast<StoreInst>(S0->clone());
+  Instruction *ANew = A0->clone();
   SNew->insertBefore(&*InsertPt);
+  ANew->insertBefore(SNew);
+  ANew->applyMergedLocation(A0->getDebugLoc(), A1->getDebugLoc());
+
+  assert(S0->getParent() == A0->getParent());
+  assert(S1->getParent() == A1->getParent());
+
   // New PHI operand? Use it.
   if (PHINode *NewPN = getPHIOperand(BB, S0, S1))
     SNew->setOperand(0, NewPN);
   S0->eraseFromParent();
   S1->eraseFromParent();
-
-  if (Ptr0 != Ptr1) {
-    auto *GEP0 = cast<GetElementPtrInst>(Ptr0);
-    auto *GEP1 = cast<GetElementPtrInst>(Ptr1);
-    Instruction *GEPNew = GEP0->clone();
-    GEPNew->insertBefore(SNew);
-    GEPNew->applyMergedLocation(GEP0->getDebugLoc(), GEP1->getDebugLoc());
-    SNew->setOperand(1, GEPNew);
-    GEP0->eraseFromParent();
-    GEP1->eraseFromParent();
-  }
+  A0->replaceAllUsesWith(ANew);
+  A0->eraseFromParent();
+  A1->replaceAllUsesWith(ANew);
+  A1->eraseFromParent();
 }
 
 ///

diff  --git a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_check_debug.ll b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_check_debug.ll
index 80696b6c4241d..b7cf96818a820 100644
--- a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_check_debug.ll
+++ b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_check_debug.ll
@@ -2,23 +2,25 @@
 
 %struct.S = type { i32 }
 
-define dso_local void @foo(ptr %this, i32 %bar) {
+define dso_local void @foo(%struct.S* %this, i32 %bar) {
 entry:
-  %this.addr = alloca ptr, align 8
+  %this.addr = alloca %struct.S*, align 8
   %bar.addr = alloca i32, align 4
-  store ptr %this, ptr %this.addr, align 8
-  store i32 %bar, ptr %bar.addr, align 4
-  %this1 = load ptr, ptr %this.addr, align 8
-  %0 = load i32, ptr %bar.addr, align 4
+  store %struct.S* %this, %struct.S** %this.addr, align 8
+  store i32 %bar, i32* %bar.addr, align 4
+  %this1 = load %struct.S*, %struct.S** %this.addr, align 8
+  %0 = load i32, i32* %bar.addr, align 4
   %tobool = icmp ne i32 %0, 0
   br i1 %tobool, label %if.then, label %if.else
 
 if.then:                                          ; preds = %entry
-  store i32 1, ptr %this1, align 4
+  %foo = getelementptr inbounds %struct.S, %struct.S* %this1, i32 0, i32 0
+  store i32 1, i32* %foo, align 4
   br label %if.end
 
 if.else:                                          ; preds = %entry
-  store i32 0, ptr %this1, align 4
+  %foo2 = getelementptr inbounds %struct.S, %struct.S* %this1, i32 0, i32 0
+  store i32 0, i32* %foo2, align 4
   br label %if.end
 
 if.end:                                           ; preds = %if.else, %if.then

diff  --git a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_debuginvariant.ll b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_debuginvariant.ll
index a9373fab22ca7..18c47fae73a34 100644
--- a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_debuginvariant.ll
+++ b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_debuginvariant.ll
@@ -8,9 +8,10 @@
 
 ; CHECK-LABEL: return:
 ; CHECK-NEXT:    %.sink = phi i16 [ 5, %if.end ], [ 6, %if.then ]
-; CHECK-NEXT:    store i16 %.sink, ptr %agg.result
-; CHECK-NEXT:    %0 = getelementptr inbounds %struct.S0, ptr %agg.result, i16 0, i32 1
-; CHECK-NEXT:    store i16 0, ptr %0
+; CHECK-NEXT:    %0 = getelementptr inbounds %struct.S0, %struct.S0* %agg.result, i16 0, i32 0
+; CHECK-NEXT:    store i16 %.sink, i16* %0
+; CHECK-NEXT:    %1 = getelementptr inbounds %struct.S0, %struct.S0* %agg.result, i16 0, i32 1
+; CHECK-NEXT:    store i16 0, i16* %1
 ; CHECK-NEXT:    ret void
 
 %struct.S0 = type { i16, i16 }
@@ -18,7 +19,7 @@
 @g_173 = dso_local local_unnamed_addr global i16 0, !dbg !0
 
 ; Function Attrs: noinline norecurse nounwind
-define dso_local void @func_34(ptr noalias sret(%struct.S0) %agg.result) local_unnamed_addr #0 !dbg !11 {
+define dso_local void @func_34(%struct.S0* noalias sret(%struct.S0) %agg.result) local_unnamed_addr #0 !dbg !11 {
 entry:
   br i1 undef, label %if.end, label %if.then, !dbg !18
 
@@ -95,16 +96,18 @@ if.then:                                          ; preds = %entry
   call void @llvm.dbg.value(metadata i16 5, metadata !19, metadata !DIExpression()), !dbg !22
   call void @llvm.dbg.value(metadata i16 5, metadata !19, metadata !DIExpression()), !dbg !22
   call void @llvm.dbg.value(metadata i16 5, metadata !19, metadata !DIExpression()), !dbg !22
-  store i16 6, ptr %agg.result, !dbg !23
-  %l_303.sroa.2.0..sroa_idx1 = getelementptr inbounds %struct.S0, ptr %agg.result, i16 0, i32 1, !dbg !23
-  store i16 0, ptr %l_303.sroa.2.0..sroa_idx1, !dbg !23
+  %l_303.sroa.0.0..sroa_idx = getelementptr inbounds %struct.S0, %struct.S0* %agg.result, i16 0, i32 0, !dbg !23
+  store i16 6, i16* %l_303.sroa.0.0..sroa_idx, !dbg !23
+  %l_303.sroa.2.0..sroa_idx1 = getelementptr inbounds %struct.S0, %struct.S0* %agg.result, i16 0, i32 1, !dbg !23
+  store i16 0, i16* %l_303.sroa.2.0..sroa_idx1, !dbg !23
   br label %return, !dbg !24
 
 if.end:                                           ; preds = %entry
-  store i16 5, ptr %agg.result, !dbg !25
-  %f138 = getelementptr inbounds %struct.S0, ptr %agg.result, i16 0, i32 1, !dbg !25
-  store i16 0, ptr %f138, !dbg !25
-  store i16 0, ptr @g_173, !dbg !27
+  %f037 = getelementptr inbounds %struct.S0, %struct.S0* %agg.result, i16 0, i32 0, !dbg !25
+  store i16 5, i16* %f037, !dbg !25
+  %f138 = getelementptr inbounds %struct.S0, %struct.S0* %agg.result, i16 0, i32 1, !dbg !25
+  store i16 0, i16* %f138, !dbg !25
+  store i16 0, i16* @g_173, !dbg !27
   br label %return, !dbg !28
 
 return:                                           ; preds = %if.end, %if.then

diff  --git a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_no_gep.ll b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_no_gep.ll
index 457b4942d8121..854ba9e549dec 100644
--- a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_no_gep.ll
+++ b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_no_gep.ll
@@ -7,12 +7,12 @@ define void @no_gep_same_ptr(i1 %c, ptr %p, i32 %x, i32 %y) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
 ; CHECK:       if.then:
+; CHECK-NEXT:    store i32 [[X:%.*]], ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    br label [[IF_END:%.*]]
 ; CHECK:       if.else:
+; CHECK-NEXT:    store i32 [[Y:%.*]], ptr [[P]], align 4
 ; CHECK-NEXT:    br label [[IF_END]]
 ; CHECK:       if.end:
-; CHECK-NEXT:    [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ]
-; CHECK-NEXT:    store i32 [[Y_SINK]], ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -64,12 +64,12 @@ define void @shared_gep(i1 %c, ptr %p, i32 %x, i32 %y) {
 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
 ; CHECK:       if.then:
+; CHECK-NEXT:    store i32 [[X:%.*]], ptr [[GEP]], align 4
 ; CHECK-NEXT:    br label [[IF_END:%.*]]
 ; CHECK:       if.else:
+; CHECK-NEXT:    store i32 [[Y:%.*]], ptr [[GEP]], align 4
 ; CHECK-NEXT:    br label [[IF_END]]
 ; CHECK:       if.end:
-; CHECK-NEXT:    [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ]
-; CHECK-NEXT:    store i32 [[Y_SINK]], ptr [[GEP]], align 4
 ; CHECK-NEXT:    ret void
 ;
 entry:

diff  --git a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_split_bb.ll b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_split_bb.ll
index 55656a8ae0f02..b7a022996f3f1 100644
--- a/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_split_bb.ll
+++ b/llvm/test/Transforms/MergedLoadStoreMotion/st_sink_split_bb.ll
@@ -48,12 +48,12 @@ define dso_local void @st_sink_split_bb(ptr nocapture %arg, ptr nocapture %arg1,
 ; CHECK-YES:       bb5:
 ; CHECK-YES-NEXT:    br i1 [[ARG3:%.*]], label [[BB6:%.*]], label [[BB7:%.*]]
 ; CHECK-YES:       bb6:
+; CHECK-YES-NEXT:    store i32 2, ptr [[ARG]], align 4
 ; CHECK-YES-NEXT:    br label [[BB9_SINK_SPLIT:%.*]]
 ; CHECK-YES:       bb7:
+; CHECK-YES-NEXT:    store i32 3, ptr [[ARG]], align 4
 ; CHECK-YES-NEXT:    br label [[BB9_SINK_SPLIT]]
 ; CHECK-YES:       bb9.sink.split:
-; CHECK-YES-NEXT:    [[DOTSINK:%.*]] = phi i32 [ 2, [[BB6]] ], [ 3, [[BB7]] ]
-; CHECK-YES-NEXT:    store i32 [[DOTSINK]], ptr [[ARG]], align 4
 ; CHECK-YES-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[ARG1:%.*]], i64 1
 ; CHECK-YES-NEXT:    store i32 3, ptr [[TMP0]], align 4
 ; CHECK-YES-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[ARG1]], i64 2


        


More information about the llvm-commits mailing list