[llvm] r215148 - Fix a case in SROA where lifetime intrinsics could inhibit alloca promotion. In

Owen Anderson resistor at mac.com
Thu Aug 7 14:07:36 PDT 2014


Author: resistor
Date: Thu Aug  7 16:07:35 2014
New Revision: 215148

URL: http://llvm.org/viewvc/llvm-project?rev=215148&view=rev
Log:
Fix a case in SROA where lifetime intrinsics could inhibit alloca promotion.  In
this case, the code path dealing with vector promotion was missing the explicit
checks for lifetime intrinsics that were present on the corresponding integer
promotion path.

Added:
    llvm/trunk/test/Transforms/SROA/vector-lifetime-intrinsic.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/SROA.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=215148&r1=215147&r2=215148&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Thu Aug  7 16:07:35 2014
@@ -1659,6 +1659,10 @@ static bool isVectorPromotionViableForSl
       return false;
     if (!I->isSplittable())
       return false; // Skip any unsplittable intrinsics.
+  } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
+    if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
+        II->getIntrinsicID() != Intrinsic::lifetime_end)
+      return false;
   } else if (U->get()->getType()->getPointerElementType()->isStructTy()) {
     // Disable vector promotion when there are loads or stores of an FCA.
     return false;

Added: llvm/trunk/test/Transforms/SROA/vector-lifetime-intrinsic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SROA/vector-lifetime-intrinsic.ll?rev=215148&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SROA/vector-lifetime-intrinsic.ll (added)
+++ llvm/trunk/test/Transforms/SROA/vector-lifetime-intrinsic.ll Thu Aug  7 16:07:35 2014
@@ -0,0 +1,31 @@
+; RUN: opt -sroa -S < %s | FileCheck %s
+
+target datalayout = "e-p:64:32-i64:32-v32:32-n32-S64"
+
+; Function Attrs: nounwind
+declare void @llvm.lifetime.start(i64, i8* nocapture) #0
+
+; Function Attrs: nounwind
+declare void @llvm.lifetime.end(i64, i8* nocapture) #0
+
+; CHECK: @wombat
+; CHECK-NOT: alloca
+; CHECK: ret void
+define void @wombat(<4 x float> %arg1) {
+bb:
+  %tmp = alloca <4 x float>, align 16
+  %tmp8 = bitcast <4 x float>* %tmp to i8*
+  call void @llvm.lifetime.start(i64 16, i8* %tmp8)
+  store <4 x float> %arg1, <4 x float>* %tmp, align 16
+  %tmp17 = bitcast <4 x float>* %tmp to <3 x float>*
+  %tmp18 = load <3 x float>* %tmp17
+  %tmp20 = bitcast <4 x float>* %tmp to i8*
+  call void @llvm.lifetime.end(i64 16, i8* %tmp20)
+  call void @wombat3(<3 x float> %tmp18)
+  ret void
+}
+
+; Function Attrs: nounwind
+declare void @wombat3(<3 x float>) #0
+
+attributes #0 = { nounwind }





More information about the llvm-commits mailing list