[CodeGen] Don't emit lifetime.end without lifetime.start
authorGeorge Burgess IV <george.burgess.iv@gmail.com>
Tue, 6 Mar 2018 23:07:00 +0000 (23:07 +0000)
committerGeorge Burgess IV <george.burgess.iv@gmail.com>
Tue, 6 Mar 2018 23:07:00 +0000 (23:07 +0000)
EmitLifetimeStart returns a non-null `size` pointer if it actually
emits a lifetime.start. Later in this function, we use `tempSize`'s
nullness to determine whether or not we should emit a lifetime.end.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326844 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp
test/CodeGen/64bit-swiftcall.c

index ebba2501cea302b0f2222b3d9602dcf82202454b..187697ee0b6290ae75cf1deede7bc84b891c7173 100644 (file)
@@ -4010,13 +4010,11 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
         auto scalarSize = CGM.getDataLayout().getTypeAllocSize(scalarType);
         auto scalarAlign = CGM.getDataLayout().getPrefTypeAlignment(scalarType);
 
-        tempSize = llvm::ConstantInt::get(CGM.Int64Ty, scalarSize);
-
         // Materialize to a temporary.
         addr = CreateTempAlloca(RV.getScalarVal()->getType(),
                  CharUnits::fromQuantity(std::max(layout->getAlignment(),
                                                   scalarAlign)));
-        EmitLifetimeStart(scalarSize, addr.getPointer());
+        tempSize = EmitLifetimeStart(scalarSize, addr.getPointer());
 
         Builder.CreateStore(RV.getScalarVal(), addr);
       }
index c5944b99b5965203fb14a348bfa9c89cfa3058b7..2eed2a4b290a929d6c5c6e72ecea84c85cf344ea 100644 (file)
@@ -1032,3 +1032,12 @@ typedef union {
 TEST(union_hom_fp_partial2)
 // X86-64-LABEL: take_union_hom_fp_partial2(i64, float)
 // ARM64-LABEL: take_union_hom_fp_partial2(i64, float)
+
+// At one point, we emitted lifetime.ends without a matching lifetime.begin for
+// CoerceAndExpanded args. Since we're not performing optimizations, neither
+// intrinsic should be emitted.
+// CHECK-LABEL: define void @no_lifetime_markers
+void no_lifetime_markers() {
+  // CHECK-NOT: call void @llvm.lifetime.
+  take_int5(return_int5());
+}