diff options
author | Martin Nowack <m.nowack@imperial.ac.uk> | 2019-11-04 12:33:28 +0000 |
---|---|---|
committer | Cristian Cadar <c.cadar@imperial.ac.uk> | 2019-11-07 11:51:58 +0000 |
commit | be4fd315655a1be889dc319c7ff3f89e40922e02 (patch) | |
tree | 1c20cee0b0bc15fbe9f6d54e1a3130f4459bb9db /test | |
parent | 5c148a6184adfed5438534b97a88fe10bc1cde37 (diff) | |
download | klee-be4fd315655a1be889dc319c7ff3f89e40922e02.tar.gz |
Handle llvm.objectsize explicitly
llvm.objectsize is used in several optimisation during compile time. Lowering these intrinsics took a conservative approach returning always the value for unknown. Instead, lower to the object's real size, if possible. Otherwise, a conservative value is used. Since LLVM 4.0, the function `llvm::lowerObjectSizeCall()` does exactly this. Use this function or preserve the old behaviour for older LLVM versions.
Diffstat (limited to 'test')
-rw-r--r-- | test/Intrinsics/objectsize.leq80.ll | 9 | ||||
-rw-r--r-- | test/Intrinsics/objectsize.ll | 9 |
2 files changed, 16 insertions, 2 deletions
diff --git a/test/Intrinsics/objectsize.leq80.ll b/test/Intrinsics/objectsize.leq80.ll index f1bcdf62..19a20334 100644 --- a/test/Intrinsics/objectsize.leq80.ll +++ b/test/Intrinsics/objectsize.leq80.ll @@ -20,7 +20,14 @@ continue.block: %2 = load i8*, i8** %a, align 8 %3 = call i64 @llvm.objectsize.i64.p0i8(i8* %2, i1 false, i1 false) %cmp1 = icmp ne i64 %3, -1 - br i1 %cmp1, label %abort.block, label %exit.block + br i1 %cmp1, label %abort.block, label %continue.block2 + +continue.block2: +; allocate one byte + %b = alloca i8, align 8 + %4 = call i64 @llvm.objectsize.i64.p0i8(i8* %b, i1 false, i1 false) + %cmp2 = icmp ne i64 %4, 1 + br i1 %cmp2, label %abort.block, label %exit.block exit.block: ret i32 0 diff --git a/test/Intrinsics/objectsize.ll b/test/Intrinsics/objectsize.ll index af77baa4..9fa84de5 100644 --- a/test/Intrinsics/objectsize.ll +++ b/test/Intrinsics/objectsize.ll @@ -19,7 +19,14 @@ continue.block: %2 = load i8*, i8** %a, align 8 %3 = call i64 @llvm.objectsize.i64.p0i8(i8* %2, i1 false, i1 false, i1 false) %cmp1 = icmp ne i64 %3, -1 - br i1 %cmp1, label %abort.block, label %exit.block + br i1 %cmp1, label %abort.block, label %continue.block2 + +continue.block2: +; allocate one byte + %b = alloca i8, align 8 + %4 = call i64 @llvm.objectsize.i64.p0i8(i8* %b, i1 false, i1 false, i1 false) + %cmp2 = icmp ne i64 %4, 1 + br i1 %cmp2, label %abort.block, label %exit.block exit.block: ret i32 0 |