diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2015-04-20 16:11:05 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2015-04-20 16:11:05 +0000 |
commit | 2cc2b63f533cfbda9753711cdf3414f6c26cbe6a (patch) | |
tree | c541a03c10459d9dccc7f9e6b8da6b9912ddc2dc | |
parent | a57cc8bc817f3ff7a48bfd8221562e3cc2a2bc10 (diff) | |
download | bcm5719-llvm-2cc2b63f533cfbda9753711cdf3414f6c26cbe6a.tar.gz bcm5719-llvm-2cc2b63f533cfbda9753711cdf3414f6c26cbe6a.zip |
[InlineFunction] Don't add lifetime markers for zero-sized allocas.
This commit fixes the code which adds lifetime markers in InlineFunction to skip
zero-sized allocas instead of asserting on them.
rdar://problem/20531155
llvm-svn: 235312
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 6 | ||||
-rw-r--r-- | llvm/test/Transforms/Inline/crash-lifetime-marker.ll | 24 |
2 files changed, 29 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index a08ffbeb329..169ebcf5bfc 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1167,7 +1167,11 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, Type *AllocaType = AI->getAllocatedType(); uint64_t AllocaTypeSize = DL.getTypeAllocSize(AllocaType); uint64_t AllocaArraySize = AIArraySize->getLimitedValue(); - assert(AllocaArraySize > 0 && "array size of AllocaInst is zero"); + + // Don't add markers for zero-sized allocas. + if (AllocaArraySize == 0) + continue; + // Check that array size doesn't saturate uint64_t and doesn't // overflow when it's multiplied by type size. if (AllocaArraySize != ~0ULL && diff --git a/llvm/test/Transforms/Inline/crash-lifetime-marker.ll b/llvm/test/Transforms/Inline/crash-lifetime-marker.ll new file mode 100644 index 00000000000..42e926b1f63 --- /dev/null +++ b/llvm/test/Transforms/Inline/crash-lifetime-marker.ll @@ -0,0 +1,24 @@ +; RUN: opt < %s -inline -S | FileCheck %s + +; InlineFunction would assert inside the loop that leaves lifetime markers if +; there was an zero-sized AllocaInst. Check that it doesn't assert and doesn't +; leave lifetime markers in that case. + +declare i32 @callee2(i8*) + +define i32 @callee1(i32 %count) { + %a0 = alloca i8, i32 %count, align 4 + %call0 = call i32 @callee2(i8* %a0) + ret i32 %call0 +} + +; CHECK-LABEL: define i32 @caller1( +; CHECK: [[ALLOCA:%[a-z0-9\.]+]] = alloca i8 +; CHECK-NOT: call void @llvm.lifetime.start( +; CHECK: call i32 @callee2(i8* [[ALLOCA]]) +; CHECK-NOT: call void @llvm.lifetime.end( + +define i32 @caller1(i32 %count) { + %call0 = call i32 @callee1(i32 0) + ret i32 %call0 +} |