[llvm] r265100 - Don't insert lifetime end markers on deoptimizing returns

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 31 19:51:27 PDT 2016


Author: sanjoy
Date: Thu Mar 31 21:51:26 2016
New Revision: 265100

URL: http://llvm.org/viewvc/llvm-project?rev=265100&view=rev
Log:
Don't insert lifetime end markers on deoptimizing returns

They're not necessary (since the lifetime of the alloca is trivially
over due to the return), and the way LLVM inserts the lifetime.end
markers breaks the IR (we get a lifetime end marker between the
deoptimize call and the return).

Modified:
    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
    llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic.ll

Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=265100&r1=265099&r2=265100&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Thu Mar 31 21:51:26 2016
@@ -1703,11 +1703,14 @@ bool llvm::InlineFunction(CallSite CS, I
 
       builder.CreateLifetimeStart(AI, AllocaSize);
       for (ReturnInst *RI : Returns) {
-        // Don't insert llvm.lifetime.end calls between a musttail call and a
-        // return.  The return kills all local allocas.
+        // Don't insert llvm.lifetime.end calls between a musttail or deoptimize
+        // call and a return.  The return kills all local allocas.
         if (InlinedMustTailCalls &&
             RI->getParent()->getTerminatingMustTailCall())
           continue;
+        if (InlinedDeoptimizeCalls &&
+            RI->getParent()->getTerminatingDeoptimizeCall())
+          continue;
         IRBuilder<>(RI).CreateLifetimeEnd(AI, AllocaSize);
       }
     }

Modified: llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic.ll?rev=265100&r1=265099&r2=265100&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic.ll (original)
+++ llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic.ll Thu Mar 31 21:51:26 2016
@@ -88,3 +88,19 @@ normal:
   store i8 %v, i8* %ptr
   ret i32 42
 }
+
+define i8 @callee_with_alloca() alwaysinline {
+  %t = alloca i8
+  %v0 = call i8(...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i8* %t) ]
+  ret i8 %v0
+}
+
+define void @caller_with_lifetime() {
+; CHECK-LABLE: @caller_with_lifetime(
+; CHECK:  call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"(i8* %t.i) ]
+; CHECK-NEXT:  ret void
+
+entry:
+  call i8 @callee_with_alloca();
+  ret void
+}




More information about the llvm-commits mailing list