[PATCH] D113105: [InstCombine] Extend stacksave/restore elimination

Itay Bookstein via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 9 04:07:02 PST 2021


nextsilicon-itay-bookstein updated this revision to Diff 385769.
nextsilicon-itay-bookstein added a comment.

Add comment


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113105/new/

https://reviews.llvm.org/D113105

Files:
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/test/Transforms/InstCombine/stacksaverestore.ll


Index: llvm/test/Transforms/InstCombine/stacksaverestore.ll
===================================================================
--- llvm/test/Transforms/InstCombine/stacksaverestore.ll
+++ llvm/test/Transforms/InstCombine/stacksaverestore.ll
@@ -110,3 +110,31 @@
 ; CHECK: call void @llvm.stackrestore(i8* %save1)
 ; CHECK: br i1 %done, label %loop, label %return
 ; CHECK: ret void
+
+define i32 @test4(i32 %m, i32* %a, i32* %b) {
+entry:
+  br label %for.body
+
+for.body:
+  %x.012 = phi i32 [ 0, %entry ], [ %add2, %for.body ]
+  %i.011 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
+  %0 = call i8* @llvm.stacksave()
+  %load1 = load i32, i32* %a, align 4
+  %mul1 = mul nsw i32 %load1, %m
+  %add1 = add nsw i32 %mul1, %x.012
+  call void @llvm.stackrestore(i8* %0)
+  %load2 = load i32, i32* %b, align 4
+  %mul2 = mul nsw i32 %load2, %m
+  %add2 = add nsw i32 %mul2, %add1
+  call void @llvm.stackrestore(i8* %0)
+  %inc = add nuw nsw i32 %i.011, 1
+  %exitcond.not = icmp eq i32 %inc, 100
+  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
+
+for.cond.cleanup:
+  ret i32 %add2
+}
+
+; CHECK-LABEL: define i32 @test4(
+; CHECK-NOT: call void @llvm.stackrestore
+; CHECK: ret i32 %add2
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1802,14 +1802,35 @@
       return ClassifyResult::None;
     };
 
-    // If the save is right next to the restore, remove the restore.  This can
-    // happen when variable allocas are DCE'd.
+    // If the stacksave and the stackrestore are in the same BB, and there is
+    // no intervening call, alloca, or stackrestore of a different stacksave,
+    // remove the restore. This can happen when variable allocas are DCE'd.
     if (IntrinsicInst *SS = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) {
-      if (SS->getIntrinsicID() == Intrinsic::stacksave) {
-        // Skip over debug info.
-        if (SS->getNextNonDebugInstruction() == II) {
-          return eraseInstFromFunction(CI);
+      if (SS->getIntrinsicID() == Intrinsic::stacksave &&
+          SS->getParent() == II->getParent()) {
+        BasicBlock::iterator BI(SS);
+        bool CannotRemove = false;
+        for (++BI; &*BI != II; ++BI) {
+          switch (Classify(&*BI)) {
+          case ClassifyResult::None:
+            break; // So far so good, look at next instructions.
+
+          case ClassifyResult::StackRestore:
+            if (cast<IntrinsicInst>(*BI).getArgOperand(0) != SS)
+              CannotRemove = true;
+            break;
+
+          case ClassifyResult::Alloca:
+          case ClassifyResult::CallWithSideEffects:
+            CannotRemove = true;
+            break;
+          }
+          if (CannotRemove)
+            break;
         }
+
+        if (!CannotRemove)
+          return eraseInstFromFunction(CI);
       }
     }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113105.385769.patch
Type: text/x-patch
Size: 3001 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211109/4c6836c3/attachment.bin>


More information about the llvm-commits mailing list